Module:Store locations list
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Store locations list/doc
--------------------------
-- Module for [[Template:Store_locations_list]]
--
--
------------------------
-- <pre>
local p = {}
local commas = require("Module:Addcommas")._add
local params = require('Module:Paramtest')
local yesNo = require("Module:Yesno")
local purge = require("Module:Purge")._purge
local inspect = require("Module:Inspect")
--local p2pIcon = '[[File:Member icon.png|frameless|link=Pay-to-play]]'
--local f2pIcon = '[[File:Free-to-play icon.png|frameless|link=Free-to-play]]'
local p2pIcon = 'Yes'
local f2pIcon = 'No'
function p.main(frame)
return p._main(frame:getParent().args)
end
function p._main(args)
local item, limit = params.defaults{
{args[1], mw.title.getCurrentTitle().text},
{args.Limit, 500}
}
mw.log(string.format('Searching for shops that sell: %s', item))
-- Get parsed smw data
local data = p.getData(item, limit)
-- Create the header of the output
local headerText = "<div class=\"seealso\">This list was created dynamically. For help, see [[Template:Store locations list/FAQ|the FAQ]]. "
.. "To force an update of this list, click " .. purge('res', 'here', 'span') .. ".</div>\n"
local restbl = mw.html.create('table')
restbl:addClass('wikitable sortable align-center-3 align-center-4 align-center-5 align-center-6 align-center-7')
:tag('tr')
:tag('th'):wikitext('Seller'):done()
:tag('th'):wikitext('Location'):done()
:tag('th'):wikitext('Buyable for'):attr('data-sort-type', 'number'):done()
:tag('th'):wikitext('Sellable for'):attr('data-sort-type', 'number'):done()
:tag('th'):wikitext('Members?'):done()
:done()
local function addShopRow(shop, location)
restbl:tag('tr')
:tag('td'):wikitext(shop.seller):done()
:tag('td'):wikitext(location):done()
:tag('td')
:attr({['data-sort-value']=shop.buySortValue})
:wikitext(shop.buyvalue)
:done()
:tag('td')
:attr({['data-sort-value']=shop.sellSortValue})
:wikitext(shop.sellvalue)
:done()
:tag('td')
:attr({['data-sort-value']=shop.membersSortValue})
:wikitext(shop.members):done()
:done()
end
-- Create the rows for the output table
for _, shop in ipairs(data) do
for i, location in ipairs(shop.location) do
addShopRow(shop, location)
end
if #shop.location == 0 then
addShopRow(shop, 'N/A')
end
end
return headerText .. tostring(restbl)
end
function p.getData(itemName, limit)
-- Query smw
local q = {
'[[Sold item::'..itemName..']]',
'?Sold by',
'?Sold by.Store Is members only = Store Is members only',
'?Sold by.Store location = Store location',
'?Sold by.Has subobject.Store location=Store location subobj',
'?Sold by.Is members only = Is members only',
'?Sold by.NPC location = NPC location',
'?Sold item Members',
'?Sold by.Has subobject.NPC location=NPC location subobj',
'?Sold item image',
'?Sold item',
'?Sold item text',
'?Store sell price #',
'?Store buy price #',
'?Store currency #',
'?Store notes',
'?Members #',
'?Is members only #',
offset = 0,
limit = limit or 500,
}
local t1 = os.clock()
local smwdata = mw.smw.ask(q)
local t2 = os.clock()
local data = {}
if smwdata == nil then
error('The item "' .. itemName .. '" is not sold in any shop, please check for typos[[Category:Empty store lists]]', 0)
end
mw.log(string.format('SMW (store locations list): entries: %d, time elapsed: %.3f ms.', #smwdata, (t2 - t1) * 1000))
table.sort(smwdata, function(a, b) return b['Store sell price'] < a['Store sell price'] end)
-- Iterate through each shop instance of item
for _, item in ipairs(smwdata) do
local members, location, region = {}, {}, {}
if type(item['Store Is members only']) == 'boolean' then
table.insert(members, item['Store Is members only'])
elseif type(item['Is members only']) == 'boolean' then
table.insert(members, item['Is members only'])
elseif type(item['Is members only']) == 'string' then
table.insert(members, item['Is members only'])
end
if type(item['Store location subobj']) == 'table' then
for _, v in ipairs(item['Store location subobj']) do
table.insert(location, v)
end
elseif type(item['Store location']) == 'string' then
table.insert(location, item['Store location'])
elseif type(item['NPC location subobj']) == 'table' then
for _, v in ipairs(item['NPC location subobj']) do
table.insert(location, v)
end
elseif type(item['NPC location']) == 'string' then
table.insert(location, item['NPC location'])
end
item['Location'] = location
-- item['Region'] = region
if #members == 1 then
item['Members'] = members[1]
else
item['Members'] = members
end
-- Loop over smw return items
-- item['Store location'] = 'x'
-- item['Store Is members only'] = 'Yes'
-- Process the item and add it to the final data table
local dataline = p.processData(item, editbtn)
table.insert(data, dataline)
end
return data
end
function p.processData(item, editbtn)
local seller = item['Sold by'] or ""
local namenotes = item['Store notes']
if namenotes then
seller = seller .. ' ' .. namenotes
end
local location = item['Location']
--local region = item['Region']
if type(location) == 'table' and #location == 0 then
location = {editbtn}
end
if type(region) == 'table' and #region == 0 then
region = {editbtn}
end
local currency = item['Store currency']
local sellvalue = item['Store sell price'] or ''
local sellSortValue = 0
mw.log("sellvalue", sellvalue)
mw.log("sell is 1e10", tonumber(sellvalue) == 1e10)
if not(sellvalue =='N/A') and not(tonumber(sellvalue) == 1e10) then
sellvalue = tonumber(sellvalue)
if sellvalue then
sellSortValue = sellvalue
sellvalue = commas(sellvalue)
local currencyImg = ''
sellvalue = string.format('%s [[%s]]', sellvalue, currency)
-- if(params.has_content(currencyImg)) then
-- currencyImg = string.format('[[File:%s|link=%s]] ', currencyImg, currency)
-- sellvalue = currencyImg .. sellvalue
-- end
else
sellvalue = editbtn -- If sellvalue can't be converted to a number it will default to the edit button
end
else
sellSortValue = sellvalue
sellvalue = 'N/A'
end
mw.log("sellvalue 2", sellvalue)
local buyvalue = item['Store buy price'] or ''
local buySortValue = 0
mw.log("buyvalue", buyvalue)
mw.log("buy is 1e10", tonumber(buyvalue) == 1e10)
if not(buyvalue == 'N/A') and not(tonumber(buyvalue) == 1e10) then
buyvalue = tonumber(buyvalue)
mw.log("buyvalue 2", buyvalue)
if buyvalue then
buySortValue = buyvalue
buyvalue = commas(buyvalue)
buyvalue = string.format('%s [[%s]]', buyvalue, currency)
-- local currencyImg = ''
-- if(params.has_content(currencyImg)) then
-- currencyImg = string.format('[[File:%s|link=%s]] ', currencyImg, currency)
-- buyvalue = currencyImg .. buyvalue
-- end
else
buyvalue = editbtn -- If buyvalue can't be converted to a number it will default to the edit button
end
else
buySortValue = buyvalue
buyvalue = 'N/A'
end
-- members only?
local members = item['Members']
if type(members) == 'table' then
-- contains yes and/or no
local hasYes, hasNo = false, false
for _, value in ipairs(members) do
if yesNo(value) then
hasYes = true
elseif not(yesNo(value)) then
hasNo = true
end
end
if hasYes and hasNo then
members = f2pIcon.."/"..p2pIcon
elseif hasYes then
members = p2pIcon
elseif hasNo then
members = f2pIcon
else
members = editbtn -- Unsupported type for yesNo, default to editbtn
end
elseif yesNo(members) then
members = p2pIcon
elseif not(yesNo(members)) then
members = f2pIcon
else -- Unsupported type for yesNo, default to editbtn
members = editbtn
end
return {
seller = seller,
location = location,
region = region,
sellvalue = sellvalue,
sellSortValue = sellSortValue,
buyvalue = buyvalue,
buySortValue = buySortValue,
members = members
}
end
function editbutton(title)
local link = string.gsub(mw.title.getCurrentTitle():fullUrl("action=edit"), mw.title.getCurrentTitle().fullText, title)
link = string.gsub(link, ' ', '_')
link = string.format("<span class='plainlinks'>[%s '''?''' (edit)]</span>", link)
return link
end
return p