Module:StoreLine

From RuneRealm Wiki
Jump to navigation Jump to search
Module documentation
This documentation is transcluded from Template:No documentation/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:StoreLine/doc. [edit]
Module:StoreLine's function main is invoked by Template:StoreLine.
Module:StoreLine requires Module:Addcommas.
Module:StoreLine requires Module:Currency Image.
Module:StoreLine requires Module:Exchange.
Module:StoreLine requires Module:Paramtest.
Module:StoreLine requires Module:Yesno.
Module:StoreLine loads data from Module:DropsLine/itemData.json.
Module:StoreLine loads data from Module:GEHighAlchs/data.json.
Module:StoreLine loads data from Module:GEPrices/data.json.

local p = {}
local lang = mw.language.getContentLanguage()
local var = mw.ext.VariablesLua
local params = require('Module:Paramtest')
local yesno = require('Module:Yesno')
local currency_image = require("Module:Currency Image")
local commas = require("Module:Addcommas")

local exchange = require('Module:Exchange')
local find_gevalue = exchange._value
local find_geprice = exchange._price

local geprices_data = mw.loadJsonData('Module:GEPrices/data.json')
local var = mw.ext.VariablesLua

local ptitle = mw.title.getCurrentTitle()
local ns = ptitle.nsText
local title = ptitle.fullText
local pgTitle = ptitle.text

local function ticktime(ticks)
    local ret = ''
    local days = math.floor(ticks/144000)
    local hours = math.floor(ticks%144000/6000)
    local minutes = math.floor(ticks%6000/100)
    local seconds = ticks%100*0.6
    if days > 0 then
        ret = ret .. commas._add(days) .. 'd '
    end
    if hours > 0 then
        ret = ret .. hours .. 'h '
    end
    if minutes > 0 then
        ret = ret .. minutes .. 'm '
    end
    if seconds > 0 then
        ret = ret .. seconds .. 's'
    end
    return ret
end

function p.main(frame)
    local args = frame:getParent().args

    -- Params and defaults
    local name, stock, buyvalue, sellvalue, geprice, rowShopVersion = params.defaults{
        {args.name or args.Name, ''},
        {args.stock or args.Stock, ''},
        {args.buy or args.Buy, ''},
        {args.sell or args.Sell, ''},
        {args.geprice or args.geprice, ''},
        {args.shopversion, ''}
    }
    local itemvalue = ''
    local gemwname = params.default_to(args.gemwname,name)
    local smwname = params.default_to(args.smwname,name)
    local displayname = params.default_to(args.displayname or args.DisplayName,name)
    local image = 'File:' .. params.default_to(args.image or args.Image, name .. '.png')
    local gemw = yesno(args.gemw or 'yes', false)
    local restock = params.default_to(args.restock or args.Restock,-1)

    -- Check precached Module:GEPrices/data
    if gemw and geprice == '' then
        local cached_price = geprices_data[gemwname]
        if type(cached_price) == 'number' and cached_price > 0 then
            geprice = cached_price
        end
    end

    -- Lookup GE price
    if gemw and geprice == '' then
        local has_geprice, geprice_check = pcall(find_geprice,gemwname)
        if has_geprice and geprice_check > -1 then
            geprice = geprice_check
        end
    end

    -- Lookup GE value
    if gemw and itemvalue == '' then
        local has_gevalue, gevalue = pcall(find_gevalue,gemwname)
        if has_gevalue and gevalue > -1 then
            itemvalue = gevalue
        end
    end

    -- Lookup SMW value
    if itemvalue == ''  then
        itemvalue = getSMWInfo(smwname) or ''
    end

    -- Check precached Module:DropsLine/itemData - gets GE alch so inaccurate
    if itemvalue == '' then
        local droppeditem_data = mw.loadJsonData('Module:DropsLine/itemData.json')
        local cached_dropdata = droppeditem_data[name]
        if type(cached_dropdata) == 'table' and type(cached_dropdata[2]) == 'number' then
            itemvalue = cached_dropdata[2]/.6
        end
    end

    -- Check precached Module:GEHighAlch/data - gets GE alch so inaccurate
    if itemvalue == '' then
        local highalch_data = mw.loadJsonData('Module:GEHighAlchs/data.json')
        local cached_data = highalch_data[name]
        if type(cached_data) == 'number' and cached_data > -1 then
            itemvalue = cached_data/.6
        end
    end

    local buymultiplier = var.var('BuyMultiplier', 1000)
    local sellmultiplier = var.var('SellMultiplier', 1000)
    local currency = var.var('Currency', 'Coins')
    local namenotes = var.var('NameNotes', '')
    local delta = var.var('Delta', 10)
    local useSmw = yesno(var.var('smw','yes'), true)
    local hideimage = yesno(var.var('hideImage','no'), false)
    local hidege = yesno(var.var('hideGE','no'), false)
    local hidesell = yesno(var.var('hideSell','no'), false)
    local hidebuy = yesno(var.var('hideBuy','no'), false)
    local hidestock = yesno(var.var('hideStock','no'), false)
    local hiderestock = yesno(var.var('hideRestock','no'), false)
    local tableShopVersion = var.var('ShopVersion', '')

    buyvalue = commas._strip(buyvalue)
    sellvalue = commas._strip(sellvalue)
    local buy_smw = tonumber(buyvalue)
    local sell_smw = tonumber(sellvalue) or 1e10
    local ge_sort = tonumber(geprice)
    local buyCurrency = ''
    local sellCurrency = ''

    if buyvalue ~= 'N/A' then
        if buyvalue == '' and itemvalue ~= '' then
            buyvalue = math.floor(math.max(itemvalue*buymultiplier/1000,itemvalue*0.1))
            buy_smw = buyvalue
        end
        buyvalue = showCurrencyAmount(currency, buyvalue)
    end
    if sellvalue ~= 'N/A' then
        if sellvalue == '' and itemvalue ~= '' then
            sellvalue = math.floor(math.max(itemvalue*sellmultiplier/1000,1))
            sell_smw = sellvalue
        end
        sellvalue = showCurrencyAmount(currency, sellvalue)
    end

    if gemw and tonumber(geprice) ~= nil then
        geprice = showCurrencyAmount('coins', geprice)
    else
        ge_sort = 0
        geprice = 'Not sold'
    end

    if stock=='inf' then stock='∞' end --inf is easier to type
    if stock=='∞' then restock='N/A' end --self-documenting code

    local ret = mw.html.create('tr'):css('text-align','center')
    if not hideimage then
        ret:tag('td'):wikitext(mw.ustring.format('[[%s|link=%s]]', image, name))
    end
    -- no hideXXX parameter for the column that lists the actual items.
    ret:tag('td'):css('text-align','left'):wikitext(mw.ustring.format('[[%s|%s]]', name, displayname))
    if not hidestock then
        if stock=='N/A' then
            ret:tag('td'):attr('data-sort-value', 0):attr('class','table-na'):wikitext('<small>N/A</small>'):done()
        elseif stock=='∞' then
            ret:tag('td'):wikitext('<span style="font-size:120%;">∞</span>'):done()
        else
            ret:tag('td')
                :wikitext(stock)
            :done()
        end
    end
    if not hiderestock then
        if restock=='N/A' or stock=='N/A' or stock=='∞' then
            ret:tag('td'):attr('data-sort-value', 0):attr('class','table-na'):wikitext('<small>N/A</small>'):done()
        elseif restock == -1 then
            ret:tag('td'):attr('data-sort-value', -1):wikitext('<small>unknown</small>[[Category:Needs restock time]]'):done()
        else
            ret:tag('td'):attr('data-sort-value', restock)
                :wikitext(ticktime(tonumber(restock) or 0) .. ' (' .. commas._add(restock) .. 't)')
            :done()
        end
    else
        restock='N/A' -- Set restock to N/A if hideRestock is set to true in the header
    end
    if not hidesell then
        if sellvalue == 'N/A' then
            ret:tag('td'):attr('data-sort-value', 0):attr('class','table-na'):wikitext('<small>N/A</small>'):done()
        elseif sell_smw == 0 then
            ret:tag('td')
                :attr('data-sort-value', 0)
                :wikitext('<small>Free</small>')
            :done()
        else
            ret:tag('td')
                :attr('data-sort-value', sell_smw)
                :wikitext(sellvalue)
            :done()
        end
    end
    if not hidebuy then
        if buyvalue=='N/A' then
            ret:tag('td'):attr('data-sort-value', 0):attr('class','table-na'):wikitext('<small>N/A</small>'):done()
        else
            ret:tag('td')
                    :attr('data-sort-value', buy_smw or 0)
                    :wikitext(buyvalue)
               :done()
        end
    end
    if not hidege then
        ret:tag('td')
                :attr('data-sort-value', ge_sort)
                :wikitext(geprice)
            :done()
    end

    local i = 1
    while args['column' .. i] do
        if args['column' .. i]=='N/A' then
            ret:tag('td'):attr('data-sort-value', 0):attr('class','table-na'):wikitext('<small>N/A</small>'):done()
        else
        ret:tag('td'):wikitext(args['column' .. i]):done()
        end
        i = i+1
    end

    local onMain = ns == '' or ns == 'RuneScape'
    local unrecognizedShopVersionCategory = ''
    if onMain and useSmw then

        local smw = {}
        local smw_sub = {}
        local source = title

        local subobjectCount = 1
        if var.varexists('SoldItemCount') then
            subobjectCount = var.var('SoldItemCount', 1)
            subobjectCount = subobjectCount + 1
            var.vardefine('SoldItemCount', subobjectCount)
        else
            var.vardefine('SoldItemCount', 1)
        end
        local subobjectName = 'SOLDITEM_'..subobjectCount..'_'..smwname

        -- shop versions
        local shopVersionKeys = 'DEFAULT'
        if params.has_content(tableShopVersion) then
            -- versions applied to the entire table
           shopVersionKeys = tableShopVersion
        end
        if params.has_content(rowShopVersion) then
            -- versions applied to this row
            shopVersionKeys = rowShopVersion
        end

        local shopVersions = {}
        local membersValues = {}
        local locationsValues = {}
        for shopVersion in string.gmatch(shopVersionKeys, ' *([^,]+) *') do
            table.insert(shopVersions, shopVersion)

            local membersVar = string.format("ShopInfo_members_%s", shopVersion)
            local locationsVar = string.format("ShopInfo_location_%s", shopVersion)
            if (not var.varexists(membersVar) or not var.varexists(locationsVar)) and shopVersion ~= 'DEFAULT' then
                unrecognizedShopVersionCategory = unrecognizedShopVersionCategory..'[[Category:Uses unrecognized shop version]]'
            end
            local curMembersValues = var.var(membersVar)
            local curLocationsValues = var.var(locationsVar)
            table.insert(membersValues, curMembersValues)
            table.insert(locationsValues, curLocationsValues)
        end

        if #shopVersions == 1 then
            membersValues = membersValues[1]
            locationsValues = locationsValues[1]
        end

        local tableWideMembersOverride = var.var('StoreTable_MembersOverride')
        local tableWideLocationOverride = var.var('StoreTable_LocationOverride')
        if tableWideMembersOverride ~= '' then
            membersValues = tableWideMembersOverride
        end
        if tableWideLocationOverride ~= '' then
            locationsValues = tableWideLocationOverride
        end

        local rowWideMembersOverride = args.members or ''
        local rowWideLocationsOverride = args.location or ''
        if rowWideMembersOverride ~= '' then
            membersValues = rowWideMembersOverride
        end
        if rowWideLocationsOverride ~= '' then
            locationsValues = rowWideLocationsOverride
        end

        local smw_json = {
            ['Sold by'] = source,
            ['Sold item image'] = image,
            ['Sold item'] = name,
            ['Display name'] = displayname,
            ['Store stock'] = stock,
            ['Restock time'] = restock,
            ['Store sell price'] = sell_smw,
            ['Store buy price'] = buy_smw or 'N/A',
            ['Store currency'] = currency,
            ['Store notes'] = namenotes,
            ['Store delta'] = delta,
            ['Members'] = membersValues,
            ['Location'] = locationsValues,
        }

        if shopVersionKeys ~= 'DEFAULT' then
            smw_json['Shop version'] = shopVersions
        end

        smw['Sells item'] = name
        smw_sub['Sold by'] = source
        smw_sub['Sold item image'] = image
        smw_sub['Sold item'] = name
        smw_sub['Sold item text'] = name
        smw_sub['Store stock'] = stock
        smw_sub['Restock time'] = restock
        smw_sub['Store sell price'] = sell_smw --type = number for sorting purposes
        smw_sub['Store buy price'] = buy_smw or 'N/A'
        smw_sub['Store currency'] = currency
        smw_sub['Store notes'] = namenotes
        smw_sub['Store delta'] = delta
        smw_sub['Sold item JSON'] = mw.text.jsonEncode(smw_json)
        mw.smw.subobject(smw_sub, subobjectName) -- add item subobject to page
        mw.smw.set(smw) -- add data to page
    end
    return tostring(ret)
end

local smwData = nil
function getSMWInfo(item)
    if smwData ~= nil then
        return smwData
    end
    local smw = mw.smw.ask({
        '[['..item..']]',
        '?Value'
    })
    if smw and smw[1] then
        smwData = smw[1]['Value']
    else
        smwData = ''
    end
    return smwData
end

function showCurrencyAmount(currency, amount)
    local image = currency and currency_image(currency, amount) or ''
    if image ~= '' and currency and tonumber(amount) then
        return string.format('[[File:%s|link=%s]] %s', image, currency, commas._add(amount))
    else
        return amount
    end
end

return p