Module:Sandbox/User:Riblet15/StoreLine

From Old School RuneScape Wiki
Jump to navigation Jump to search
Module documentation
This documentation is transcluded from Template:Module sandbox/doc. [edit] [history] [purge]
Module:Sandbox/User:Riblet15/StoreLine requires Module:Addcommas.
Module:Sandbox/User:Riblet15/StoreLine requires Module:Currency Image.
Module:Sandbox/User:Riblet15/StoreLine requires Module:Exchange.
Module:Sandbox/User:Riblet15/StoreLine requires Module:Paramtest.
Module:Sandbox/User:Riblet15/StoreLine requires Module:Yesno.
Module:Sandbox/User:Riblet15/StoreLine loads data from Module:DropsLine/itemData.
Module:Sandbox/User:Riblet15/StoreLine loads data from Module:GEHighAlch/data.
Module:Sandbox/User:Riblet15/StoreLine loads data from Module:GEPrices/data.

This module is a sandbox for Riblet15. It can be used to test changes to existing modules, prototype new modules, or just experimenting with lua features.

Invocations of this sandbox should be kept in userspace; if the module is intended for use in other namespaces, it should be moved out of the sandbox into a normal module and template.

This default documentation can be overridden by creating the /doc subpage of this module, as normal.

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.loadData('Module:GEPrices/data')

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 .. 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 = params.defaults{
        {args.name, ''},
        {args.stock, ''},
        {args.buy, ''},
        {args.sell, ''},
        {args.geprice, ''}
    }
    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,name)
    local image = 'File:' .. params.default_to(args.image, name .. '.png')
    local gemw = yesno(args.gemw or 'yes', false)
    local restock = params.default_to(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.loadData('Module:DropsLine/itemData')
        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.loadData('Module:GEHighAlch/data')
        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 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 is_twisted = args.twisted or var.var('is_twisted', 'No')
    
    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))
            :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'
    if onMain and useSmw then
        local smw = {}
        local smw_sub = {}
        local source = pgTitle
        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'] = displayname
        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['Is twisted'] = is_twisted
        mw.smw.subobject(smw_sub) -- 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