Module:StoreLine

From Discord Dungeons Wiki
Revision as of 14:02, 3 April 2022 by Mackan (talk | contribs)
Jump to navigation Jump to search

Documentation for this module may be created at Module:StoreLine/doc

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

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

function dump(o)
	if type(o) == 'table' then
	   local s = '{ '
	   for k,v in pairs(o) do
		  if type(k) ~= 'number' then k = '"'..k..'"' end
		  s = s .. '['..k..'] = ' .. dump(v) .. ','
	   end
	   return s .. '} '
	else
	   return tostring(o)
	end
 end

function p.main(frame)
    local args = frame:getParent().args
    -- Params and defaults
    local name, buyvalue, sellvalue, currency, level = params.defaults{
        {args.name or args.Name, ''},
        {args.buy or args.Buy, ''},
        {args.sell or args.Sell, ''},
		{args.currency or args.Currency, 'Gold'},
		{args.level or args.Level, '?'},
    }
    local itemvalue = ''
    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')

    -- 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
    
    local buymultiplier = var.var('BuyMultiplier', 1)
    local sellmultiplier = var.var('SellMultiplier', 1)
    local currency = var.var('Currency', currency)
    local namenotes = var.var('NameNotes', '')
    local useSmw = yesno(var.var('smw','yes'), true)
    local hideimage = yesno(var.var('hideImage','no'), false)
    local hidesell = yesno(var.var('hideSell','no'), false)
    local hidebuy = yesno(var.var('hideBuy','no'), false)
    local hidelevel = yesno(var.var('hideLevel','no'), false)
    
    buyvalue = commas._strip(buyvalue)
    sellvalue = commas._strip(sellvalue)
    levelvalue = commas._strip(level)
    local buy_smw = tonumber(buyvalue)
    local sell_smw = tonumber(sellvalue) or 1e10
    local level_smw = tonumber(levelvalue) or 1e10
    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)

		mw.log("sellvalue", sellvalue)
		mw.log("sell_smw", sell_smw)
    end
    
    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 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 hidelevel then
        if levelvalue=='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', level_smw or 0)
                    :wikitext(levelvalue)
               :done()
        end
    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 == '(Main)'
    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 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
        mw.smw.subobject(smw_sub) -- add item subobject to page
        
        mw.log("smw", dump(smw_sub))
        
        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)
	mw.log("Show currency amount", amount)
	local formatted = string.format('%s [[%s]]', commas._add(amount), currency)
	
	mw.log("returning", formatted)
	
	return formatted


    -- 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
    -- end
end

return p