Module:Sandbox/User:The Gaffer/Modules/Infobox Recipe: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
-- Lua module to replicate the functionality of the Infobox Recipe template with debugging messagebox
local p = {}
local p = {}


Line 7: Line 6:
local currency = require('Module:Currency').parse
local currency = require('Module:Currency').parse


-- Define raw material costs based on Semantic MediaWiki queries
-- get the buy price from the query result
local function getCost(queryResult)
local function getCost(queryResult)
if type(queryResult) == "table" and queryResult[1] then
if type(queryResult) == "table" and queryResult[1]['Shop buy price'] then
return tonumber(queryResult[1]) or 0
return tonumber(queryResult[1]['Shop buy price']) or 0
end
end
return 0
return 0
end
end


-- Get buy prices of raw materials
local rawmat1cost = args.rawmat1 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat1 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
local rawmat1cost = args.rawmat1 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat1 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
local rawmat2cost = args.rawmat2 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat2 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
local rawmat2cost = args.rawmat2 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat2 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
local rawmat3cost = args.rawmat3 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat3 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
local rawmat3cost = args.rawmat3 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat3 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0


-- Calculate total cost and output cost
-- Calculate total cost
local totalCost = (rawmat1cost * (tonumber(args.rawmat1qty) or 1)) +
local totalCost = (rawmat1cost * (tonumber(args.rawmat1qty) or 1)) +
(rawmat2cost * (tonumber(args.rawmat2qty) or 1)) +
(rawmat2cost * (tonumber(args.rawmat2qty) or 1)) +
(rawmat3cost * (tonumber(args.rawmat3qty) or 1))
(rawmat3cost * (tonumber(args.rawmat3qty) or 1))
local output1cost = args.output1 and getCost(mw.smw.ask('[[:+]][[' .. args.output1 .. ']]|?Value|limit=1')) or 0

-- Calculate output cost total and profit
-- Calculate output cost total and profit
local output1costTotal = output1cost * (tonumber(args.output1qty) or 1)
local output1cost = args.output1 and mw.smw.ask('[[:+]][[' .. args.output1 .. ']]|?Value|limit=1')
local output1costTotal = output1cost[1]['Value'] * (tonumber(args.output1qty) or 1)
local profit = output1costTotal - totalCost
local profit = output1costTotal - totalCost


-- Generate the output table
-- Recipe Table Head
local out = {}
local out = {}
table.insert(out, '{| class="wikitable"')
table.insert(out, '{| class="wikitable"')
Line 35: Line 35:
table.insert(out, '|-')
table.insert(out, '|-')
table.insert(out, '! colspan="2" | Facility')
table.insert(out, '! colspan="2" | Facility')
table.insert(out, '! colspan="2" | ' .. (args.facility and '[[' .. args.facility .. ']]' or 'Unknown'))
table.insert(out, '| colspan="2" | ' .. (args.facility and '[[' .. args.facility .. ']]' or 'Unknown'))
table.insert(out, '|-')
table.insert(out, '|-')
table.insert(out, '! colspan="2" | Profession')
table.insert(out, '! colspan="2" | Profession')
Line 41: Line 41:
table.insert(out, '! XP')
table.insert(out, '! XP')
table.insert(out, '|-')
table.insert(out, '|-')
table.insert(out, '| colspan="2" | ' .. (args.profession and '[[' .. args.profession .. ']]' or 'Unknown'))
table.insert(out, '| colspan="2" style="text-align:center;" | ' .. (args.profession and '[[' .. args.profession .. ']]' or 'Unknown'))
table.insert(out, '| style="text-align: center;" | ' .. (args.level or 'Unknown'))
table.insert(out, '| style="text-align: center;" | ' .. (args.level or 'Unknown'))
table.insert(out, '| style="text-align: center;" | ' .. (args.exp or 'Unknown'))
table.insert(out, '| style="text-align: center;" | ' .. (args.exp or 'Unknown'))
table.insert(out, '|-')
table.insert(out, '|-')
-- Add raw materials
-- Headers
table.insert(out, '! colspan="2" | Raw Ingredient')
table.insert(out, '! colspan="2" | Raw Ingredient')
table.insert(out, '! Quantity')
table.insert(out, '! Quantity')
Line 50: Line 53:
table.insert(out, '|-')
table.insert(out, '|-')


-- Values
-- Add each raw material to the table
if args.rawmat1 then
if args.rawmat1 then
table.insert(out, '| [[File:' .. args.rawmat1 .. '.png|30px]]')
table.insert(out, '| [[File:' .. args.rawmat1 .. '.png|30px]]')
Line 75: Line 78:
-- Add total raw cost
-- Add total raw cost
table.insert(out, '! colspan="3" | Total Raw cost')
table.insert(out, '! colspan="3" | Total Raw cost')
table.insert(out, '| style="text-align: right;" | ' .. totalCost)
table.insert(out, '| style="text-align: right;" | ' .. currency(totalCost))
table.insert(out, '|-')
table.insert(out, '|-')
Line 88: Line 91:
if args.preparedmat1 then
if args.preparedmat1 then
table.insert(out, '| [[File:' .. args.preparedmat1 .. '.png|30px]]')
table.insert(out, '| [[File:' .. args.preparedmat1 .. '.png|30px]]')
table.insert(out, '[[' .. args.preparedmat1 .. ']]')
table.insert(out, '| [[' .. args.preparedmat1 .. ']]')
table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat1qty or 1))
table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat1qty or 1))
table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat1fac .. '.png|30px]] ' .. args.preparedmat1fac)
table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat1fac .. '.png|30px]] [[' .. args.preparedmat1fac .. ']]')
table.insert(out, '|-')
end
if args.preparedmat2 then
table.insert(out, '| [[File:' .. args.preparedmat2 .. '.png|30px]]')
table.insert(out, '| [[' .. args.preparedmat2 .. ']]')
table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat2qty or 1))
table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat2fac .. '.png|30px]] [[' .. args.preparedmat2fac .. ']]')
table.insert(out, '|-')
end
if args.preparedmat3 then
table.insert(out, '| [[File:' .. args.preparedmat3 .. '.png|30px]]')
table.insert(out, '| [[' .. args.preparedmat3 .. ']]')
table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat3qty or 1))
table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat3fac .. '.png|30px]] [[' .. args.preparedmat3fac .. ']]')
table.insert(out, '|-')
table.insert(out, '|-')
end
end


-- Add output data and profit
-- Add output data
-- Headers
table.insert(out, '! colspan="2" | Output')
table.insert(out, '! colspan="2" | Output')
table.insert(out, '! Quantity')
table.insert(out, '! Quantity')
table.insert(out, '! Value')
table.insert(out, '! Value')
table.insert(out, '|-')
table.insert(out, '|-')
-- Values
table.insert(out, '| [[File:' .. args.output1 .. '.png|30px]]')
table.insert(out, '| ' .. (args.output1 and '[[' .. args.output1 .. ']]' or 'Unknown'))
table.insert(out, '| ' .. (args.output1 and '[[' .. args.output1 .. ']]' or 'Unknown'))
table.insert(out, '| style="text-align: right;" | ' .. (args.output1qty or 1))
table.insert(out, '| style="text-align: right;" | ' .. (args.output1qty or 1))
table.insert(out, '| style="text-align: right;" | ' .. output1costTotal)
table.insert(out, '| style="text-align: right;" | ' .. currency(output1costTotal))
table.insert(out, '|-')
table.insert(out, '|-')
-- Add profit data
table.insert(out, '! colspan="3" | Profit')
table.insert(out, '! colspan="3" | Profit')
table.insert(out, '| style="text-align: right;" | ' .. profit)
table.insert(out, '| style="text-align: right;" | ' .. currency(profit))
table.insert(out, '|}')
table.insert(out, '|}')

-- Add debug information to the output as a simple paragraph
local debugMessage = 'Debug Info:<br>' ..
'rawmat1query: ' .. (rawmat1query or 'nil') .. '<br>' ..
'rawmat1cost: ' .. tostring(rawmat1cost) .. '<br>' ..
'rawmat2query: ' .. (rawmat2query or 'nil') .. '<br>' ..
'rawmat2cost: ' .. tostring(rawmat2cost) .. '<br>' ..
'rawmat3query: ' .. (rawmat3query or 'nil') .. '<br>' ..
'rawmat3cost: ' .. tostring(rawmat3cost) .. '<br>' ..
'totalCost: ' .. tostring(totalCost) .. '<br>' ..
'output1query: ' .. (output1query or 'nil') .. '<br>' ..
'output1cost: ' .. tostring(output1cost) .. '<br>' ..
'output1costTotal: ' .. tostring(output1costTotal) .. '<br>' ..
'profit: ' .. tostring(profit)

table.insert(out, debugMessage)


return table.concat(out, '\n')
return table.concat(out, '\n')

Latest revision as of 14:51, 15 November 2024

Documentation for this module may be created at Module:Sandbox/User:The Gaffer/Modules/Infobox Recipe/doc

local p = {}

function p._main(frame)
    local args = frame:getParent().args
    local mw = require('mw')
    local currency = require('Module:Currency').parse

     -- get the buy price from the query result
    local function getCost(queryResult)
        if type(queryResult) == "table" and queryResult[1]['Shop buy price'] then
            return tonumber(queryResult[1]['Shop buy price']) or 0
        end
        return 0
    end

	-- Get buy prices of raw materials
    local rawmat1cost = args.rawmat1 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat1 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
    local rawmat2cost = args.rawmat2 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat2 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0
    local rawmat3cost = args.rawmat3 and getCost(mw.smw.ask('[[:+]][[Sold item::' .. args.rawmat3 .. ']]|?Shop buy price|sort=Shop buy price|order=asc|limit=1')) or 0

    -- Calculate total cost
    local totalCost = (rawmat1cost * (tonumber(args.rawmat1qty) or 1)) +
                      (rawmat2cost * (tonumber(args.rawmat2qty) or 1)) +
                      (rawmat3cost * (tonumber(args.rawmat3qty) or 1))
    
    -- Calculate output cost total and profit
    local output1cost = args.output1 and mw.smw.ask('[[:+]][[' .. args.output1 .. ']]|?Value|limit=1')
    local output1costTotal = output1cost[1]['Value'] * (tonumber(args.output1qty) or 1)
    local profit = output1costTotal - totalCost

    -- Recipe Table Head 
    local out = {}
    table.insert(out, '{| class="wikitable"')
    table.insert(out, '! colspan="4" | Requirements')
    table.insert(out, '|-')
    table.insert(out, '! colspan="2" | Facility')
    table.insert(out, '| colspan="2" | ' .. (args.facility and '[[' .. args.facility .. ']]' or 'Unknown'))
    table.insert(out, '|-')
    table.insert(out, '! colspan="2" | Profession')
    table.insert(out, '! Level')
    table.insert(out, '! XP')
    table.insert(out, '|-')
    table.insert(out, '| colspan="2" style="text-align:center;" | ' .. (args.profession and '[[' .. args.profession .. ']]' or 'Unknown'))
    table.insert(out, '| style="text-align: center;" | ' .. (args.level or 'Unknown'))
    table.insert(out, '| style="text-align: center;" | ' .. (args.exp or 'Unknown'))
    table.insert(out, '|-')
    
    -- Add raw materials
    -- Headers
    table.insert(out, '! colspan="2" | Raw Ingredient')
    table.insert(out, '! Quantity')
    table.insert(out, '! Cost')
    table.insert(out, '|-')

    -- Values
    if args.rawmat1 then
        table.insert(out, '| [[File:' .. args.rawmat1 .. '.png|30px]]')
        table.insert(out, '| [[' .. args.rawmat1 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.rawmat1qty or 1))
        table.insert(out, '| style="text-align: right;" | ' .. currency(rawmat1cost))
        table.insert(out, '|-')
    end
    if args.rawmat2 then
        table.insert(out, '| [[File:' .. args.rawmat2 .. '.png|30px]]')
        table.insert(out, '| [[' .. args.rawmat2 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.rawmat2qty or 1))
        table.insert(out, '| style="text-align: right;" | ' .. currency(rawmat2cost))
        table.insert(out, '|-')
    end
    if args.rawmat3 then
        table.insert(out, '| [[File:' .. args.rawmat3 .. '.png|30px]]')
        table.insert(out, '| [[' .. args.rawmat3 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.rawmat3qty or 1))
        table.insert(out, '| style="text-align: right;" | ' .. currency(rawmat3cost))
        table.insert(out, '|-')
    end

    -- Add total raw cost
    table.insert(out, '! colspan="3" | Total Raw cost')
    table.insert(out, '| style="text-align: right;" | ' .. currency(totalCost))
    table.insert(out, '|-')
    
    -- Add Intermediate steps if required
    -- Headers
    table.insert(out, '! colspan="2" | Intermediate Ingredient')
    table.insert(out, '! Quantity')
    table.insert(out, '! Facility')
    table.insert(out, '|-')
    
    -- Values
    if args.preparedmat1 then
    	table.insert(out, '| [[File:' .. args.preparedmat1 .. '.png|30px]]')
    	table.insert(out, '| [[' .. args.preparedmat1 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat1qty or 1))
        table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat1fac .. '.png|30px]] [[' .. args.preparedmat1fac .. ']]')
        table.insert(out, '|-')
    end
    if args.preparedmat2 then
    	table.insert(out, '| [[File:' .. args.preparedmat2 .. '.png|30px]]')
    	table.insert(out, '| [[' .. args.preparedmat2 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat2qty or 1))
        table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat2fac .. '.png|30px]] [[' .. args.preparedmat2fac .. ']]')
        table.insert(out, '|-')
    end
    if args.preparedmat3 then
    	table.insert(out, '| [[File:' .. args.preparedmat3 .. '.png|30px]]')
    	table.insert(out, '| [[' .. args.preparedmat3 .. ']]')
        table.insert(out, '| style="text-align: right;" | ' .. (args.preparedmat3qty or 1))
        table.insert(out, '| style="text-align: right;" | [[File:' .. args.preparedmat3fac .. '.png|30px]] [[' .. args.preparedmat3fac .. ']]')
        table.insert(out, '|-')
    end

    -- Add output data
    -- Headers
    table.insert(out, '! colspan="2" | Output')
    table.insert(out, '! Quantity')
    table.insert(out, '! Value')
    table.insert(out, '|-')
    
    -- Values
    table.insert(out, '| [[File:' .. args.output1 .. '.png|30px]]')
    table.insert(out, '| ' .. (args.output1 and '[[' .. args.output1 .. ']]' or 'Unknown'))
    table.insert(out, '| style="text-align: right;" | ' .. (args.output1qty or 1))
    table.insert(out, '| style="text-align: right;" | ' .. currency(output1costTotal))
    table.insert(out, '|-')
    
    -- Add profit data
    table.insert(out, '! colspan="3" | Profit')
    table.insert(out, '| style="text-align: right;" | ' .. currency(profit))
    table.insert(out, '|}')

    return table.concat(out, '\n')
end

return p