| 
				     | 
				
| Line 1: | 
Line 1: | 
 | -- Note: This module is not meant to be invoked directly, and instead is intended to be used from other modules.
  |  | 
 | local exchange = require('Module:Exchange')
  |  | 
 | local yesno = require('Module:Yesno')
  |  | 
 | 
  |  | 
 | local p = {}  |  | local p = {}  | 
 | 
  |  | 
  | 
 | -- Obtain information about which version of an item is the default version of the item
  |  | 
 | -- if no switch infoobox is present, the item name itself will be returned.
  |  | 
 | -- The second return value is the actual pagename of the page that is retrieved in the SMW call, taking redirects into account.
  |  | 
 | function p.defaultVersion(itemname)  |  | function p.defaultVersion(itemname)  | 
 | 	if not itemname or itemname == '' then
  |  |     -- For obtaining default version, you don't need to query SMW.  | 
 | 		return nil
  |  |     return itemname  | 
 | 	end
  |  | 
 | 	local item = mw.smw.ask({"[[" .. itemname .. "]]", "?Default version"})
  |  | 
 | 	if not item then
  |  | 
 | 		return nil
  |  | 
 | 	end
  |  | 
 | 	item = item[1]
  |  | 
 | 	local defver = item['Default version']
  |  | 
 | 	if defver then
  |  | 
 | 		return itemname .. '#' .. defver, item[1]
  |  | 
 | 	else
  |  | 
 | 		return itemname, item[1]
  |  | 
 | 	end
  |  | 
 | end  |  | end  | 
 | 
  |  | 
  | 
 | -- Get item value from its page based on name.
  |  | 
 | -- If a switch infobox is present on the entered page, the price for the item version that is shown by default is fetched.
  |  | 
 | function p.value(itemname)  |  | function p.value(itemname)  | 
 | 	if not itemname or itemname == '' then
  |  |     -- For obtaining value, you don't need to query SMW.  | 
 | 		return 0
  |  |     -- Instead, directly return the item name.  | 
 | 	end
  |  |     return itemname  | 
 | 	local item = mw.smw.ask({"[[" .. itemname .. "]]", "?Default version", "?Value"})
  |  | 
 | 	if not item then
  |  | 
 | 		return -1
  |  | 
 | 	end
  |  | 
 | 	item = item[1]
  |  | 
 | 	local value = 0
  |  | 
 | 	if item['Value'] == nil then
  |  | 
 | 	    local itemversion = item['Default version']
  |  | 
 | 	    if not itemversion then
  |  | 
 | 	    	return 0
  |  | 
 | 	    end
  |  | 
 | 	    local default = mw.smw.ask({"[[" .. itemname .. "#" .. itemversion .. "]]", "?Value"})[1]
  |  | 
 | 	    if default['Value'] ~= nil then
  |  | 
 | 	        value = default['Value']
  |  | 
 | 	    end
  |  | 
 | 	else
  |  | 
 | 	    value = item['Value']
  |  | 
 | 	end
  |  | 
 | 	return value
  |  | 
 | end
  |  | 
 |    |  | 
 | function undoSort(pages, statslist)
  |  | 
 | 	local lookup = {}
  |  | 
 | 	for i, page in ipairs(pages) do
  |  | 
 | 		lookup[string.lower(page)] = i
  |  | 
 | 	end
  |  | 
 | 	local ret = {}
  |  | 
 | 	for _, stats in ipairs(statslist) do
  |  | 
 | 		local i = lookup[string.lower(stats[1])]
  |  | 
 | 		-- if i==nil then an item was referred to by their redirect page; cannot undo sorting
  |  | 
 | 		assert(i ~= nil, string.format("Cannot use `sort=no` for redirect pages. Ensure the item \"%s\" is a direct link to the page", stats[1]))
  |  | 
 | 		ret[i] = stats
  |  | 
 | 	end
  |  | 
 | 	return ret
  |  | 
 | end  |  | end  | 
 | 
  |  | 
  | 
 | -- Fetches equipment stats, image, and weight for a list of pages. 
  |  | function p.getImage(itemname)  | 
 | -- First argument: a list of pages
  |  |      -- Just return the item name for fetching the image.  | 
 | -- Second argument: the sort keys for the returned data (array of keys); if equal to {'no'} the order used in the first parameter is used.
  |  |      return itemname  | 
 | -- Third argument: the order in which these sort keys should be (asc / desc / reverse / random)
  |  | 
 | function p.equipmentStats(pages, keys, orders)  |  | 
 | 	-- mw.logObject(keys)
  |  | 
 | 	if keys == nil then
  |  | 
 | 		keys = {}
  |  | 
 | 		orders = {}
  |  | 
 | 	elseif orders == nil then
  |  | 
 | 		orders = {}
  |  | 
 | 	end
  |  | 
 |     local prop = {
  |  | 
 |         astab  = 'Stab attack bonus',
  |  | 
 |         aslash = 'Slash attack bonus',
  |  | 
 |         acrush = 'Crush attack bonus',
  |  | 
 |         amagic = 'Magic attack bonus',
  |  | 
 |         arange = 'Range attack bonus',
  |  | 
 |         dstab  = 'Stab defence bonus',
  |  | 
 |         dslash = 'Slash defence bonus',
  |  | 
 |         dcrush = 'Crush defence bonus',
  |  | 
 |         dmagic = 'Magic defence bonus',
  |  | 
 |         drange = 'Range defence bonus',
  |  | 
 |         str    = 'Strength bonus',
  |  | 
 |         mdmg   = 'Magic Damage bonus',
  |  | 
 |         rstr   = 'Ranged Strength bonus',
  |  | 
 |         prayer = 'Prayer bonus',
  |  | 
 |         weight = 'Weight',
  |  | 
 |         image  = 'Image',
  |  | 
 |         subobj = 'Has subobject',
  |  | 
 |         membs  = "Is members only"
  |  | 
 |     }
  |  | 
 |    |  | 
 |     local query = {}
  |  | 
 |    |  | 
 |      -- Build query  |  | 
 |     table.insert(query, string.format('[[%s]]', table.concat(pages, ' || ')))
  |  | 
 |     table.insert(query, '?=#-')
  |  | 
 |     for k, p in pairs(prop) do
  |  | 
 |         table.insert(query, string.format('?%s #- = %s', p, k))
  |  | 
 |     end
  |  | 
 |     if #keys > 0 and yesno(keys[1], true) then -- do not sort if keys[1] is 'no'
  |  | 
 |         local sprops = {}
  |  | 
 |         for _, k in ipairs(keys) do
  |  | 
 |             table.insert(sprops, prop[k])
  |  | 
 |         end
  |  | 
 |         query.sort = table.concat(sprops, ', ')
  |  | 
 |     end
  |  | 
 |     if #orders > 0 then
  |  | 
 |         query.order = table.concat(orders, ', ')
  |  | 
 |     end
  |  | 
 |     query.offset = 0
  |  | 
 |     query.limit = 500
  |  | 
 |    |  | 
 |     -- Fetch the data
  |  | 
 |     -- mw.logObject(query)
  |  | 
 |     local t1 = os.clock()
  |  | 
 |     local smwdata = mw.smw.ask(query)
  |  | 
 |     local t2 = os.clock()
  |  | 
 |    |  | 
 |     local smw_max_conditions = 16
  |  | 
 |    |  | 
 |     if not smwdata or #smwdata == 0 then
  |  | 
 |         if #pages > smw_max_conditions then
  |  | 
 |             error('smw query failed (your table probably have too many items)')
  |  | 
 |         end
  |  | 
 |     
  |  | 
 |         smwdata = {}
  |  | 
 |     end
  |  | 
 |    |  | 
 |     -- Post-process the data
  |  | 
 |     if keys[1] and not yesno(keys[1], true) then
  |  | 
 |     	smwdata = undoSort(pages, smwdata)
  |  | 
 | 	end
  |  | 
 |    |  | 
 |     local data = {}
  |  | 
 |    |  | 
 |     for _, i in ipairs(smwdata) do 
  |  | 
 |         local dl = i
  |  | 
 |         dl.name = dl[1]
  |  | 
 |         dl[1] = nil
  |  | 
 |         if type(dl.image) == 'table' then
  |  | 
 |             dl.image = dl.image[1]
  |  | 
 |         end
  |  | 
 |         table.insert(data, dl)
  |  | 
 |     end
  |  | 
 |    |  | 
 |     -- Statistics
  |  | 
 |     local smwstats = {
  |  | 
 |         offset = query.offset,
  |  | 
 |         limit  = query.limit,
  |  | 
 |         found  = #smwdata,
  |  | 
 |         time   = (t2 - t1) * 1000
  |  | 
 |     }
  |  | 
 |    |  | 
 |     --[[ mw.log(string.format('SMW: Found %i, offset %i, limit %i, time elapsed %.3f ms.', 
  |  | 
 |         smwstats.found, smwstats.offset, smwstats.limit, smwstats.time))
  |  | 
 |         --]]
  |  | 
 |    |  | 
 |      return data  |  | 
 | end  |  | end  | 
 | 
  |  | 
  | 
 | return p  |  | return p  |