Module:Mmgtable/display: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
-- <nowiki> | -- <nowiki> | ||
local arr = require('Module:Array') | |||
local timefunc = require('Module:Time') | local timefunc = require('Module:Time') | ||
local exg = require('Module:Exchange')._price | local exg = require('Module:Exchange')._price | ||
Line 10: | Line 11: | ||
local MEMBERS_ICON = { | local MEMBERS_ICON = { | ||
[false] = "[[File:Free-to-play icon.png|center|link=Free-to-play]]", | [false] = "[[File:Free-to-play icon.png|center|link=Free-to-play|alt=Free-to-play]]", | ||
[true] = "[[File:Member icon.png|center|link=Members]]" | [true] = "[[File:Member icon.png|center|link=Members|alt=Members]]" | ||
} | |||
local TAX_EXEMPT = arr{ | |||
unpack( | |||
arr.map( | |||
mw.smw.ask{'[[Category:Items exempt from Grand Exchange tax]]', '?#-'}, | |||
function(x) return x[1] end | |||
) | |||
) | |||
} | } | ||
Line 44: | Line 54: | ||
end | end | ||
function calc_value(args, kph) | function calc_value(args, kph, deduct_tax) | ||
local total = 0 | local total = 0 | ||
for i,v in ipairs(args) do | for i,v in ipairs(args) do | ||
Line 51: | Line 61: | ||
val = v.qty * v.value | val = v.qty * v.value | ||
elseif v.pricetype == 'gemw' then | elseif v.pricetype == 'gemw' then | ||
local _v = gep(v.name) | |||
if deduct_tax and _v > 99 and not TAX_EXEMPT:contains(v.name) then | |||
_v = _v - math.min(math.floor(_v * 0.01), 5000000) | |||
end | |||
val = _v * v.qty | |||
end | end | ||
if kph>0 and not v.isph then | if kph>0 and not v.isph then | ||
Line 78: | Line 92: | ||
local val, c_class | local val, c_class | ||
local inputval = calc_value(data.inputs, data.prices.default_kph or 0) | local inputval = calc_value(data.inputs, data.prices.default_kph or 0, false) | ||
local outputval = calc_value(data.outputs, data.prices.default_kph or 0) | local outputval = calc_value(data.outputs, data.prices.default_kph or 0, true) | ||
val = outputval - inputval | val = outputval - inputval | ||
if val > 0 then | if val > 0 then | ||
Line 126: | Line 140: | ||
table.insert(query, 2, '[[Category:'..args[1]..']]') | table.insert(query, 2, '[[Category:'..args[1]..']]') | ||
end | end | ||
local data = mw.smw.ask(query) | |||
local t = mw.html.create('table') | local t = mw.html.create('table') | ||
Line 156: | Line 171: | ||
local methods = {} | local methods = {} | ||
for i,v in ipairs(data) do | |||
if(string.find(v[1], 'Money making guide/')) then | |||
if type(v['MMG JSON']) == 'table' then | |||
for j,u in ipairs(v['MMG JSON']) do | |||
table.insert(methods, { make_row(v[1], u, true) }) | |||
end | |||
else | |||
table.insert(methods, { make_row(v[1], v['MMG JSON'], false) }) | |||
end | |||
end | |||
end | |||
table.sort(methods, function(a,b) return a[1]>b[1] end) | table.sort(methods, function(a,b) return a[1]>b[1] end) | ||
for i,v in ipairs(methods) do | for i,v in ipairs(methods) do | ||
Line 181: | Line 204: | ||
end | end | ||
local val = calc_value(data.outputs, 0) - calc_value(data.inputs, 0) | local val = calc_value(data.outputs, 0, true) - calc_value(data.inputs, 0, false) | ||
local c_class | local c_class | ||
if val > 0 then | if val > 0 then |
Latest revision as of 18:11, 20 August 2024
Documentation for this module may be created at Module:Mmgtable/display/doc
-- <nowiki>
local arr = require('Module:Array')
local timefunc = require('Module:Time')
local exg = require('Module:Exchange')._price
local p = {}
local lang = mw.getContentLanguage()
function gep(x)
return exg(x, 1, nil, nil, 0)
end
local MEMBERS_ICON = {
[false] = "[[File:Free-to-play icon.png|center|link=Free-to-play|alt=Free-to-play]]",
[true] = "[[File:Member icon.png|center|link=Members|alt=Members]]"
}
local TAX_EXEMPT = arr{
unpack(
arr.map(
mw.smw.ask{'[[Category:Items exempt from Grand Exchange tax]]', '?#-'},
function(x) return x[1] end
)
)
}
function round1k(x, f)
if not tonumber(x) then
return x
end
local _x = math.abs(x)
_x = 1000 * math.floor(_x / 1000 + 0.5)
if x < 0 then
_x = _x * -1
end
if f then
return lang:formatNum(_x)
end
return _x
end
function round1dp(x, f)
if not tonumber(x) then
return x
end
local _x = math.abs(x)
_x = math.floor(_x * 10 + 0.5) / 10
if x < 0 then
_x = _x * -1
end
if f then
return lang:formatNum(_x)
end
return _x
end
function calc_value(args, kph, deduct_tax)
local total = 0
for i,v in ipairs(args) do
local val
if v.pricetype == 'value' then
val = v.qty * v.value
elseif v.pricetype == 'gemw' then
local _v = gep(v.name)
if deduct_tax and _v > 99 and not TAX_EXEMPT:contains(v.name) then
_v = _v - math.min(math.floor(_v * 0.01), 5000000)
end
val = _v * v.qty
end
if kph>0 and not v.isph then
val = val * kph
end
total = total + val
end
return total
end
function make_row(fullpagename, raw_data, ismulti)
local data = mw.text.jsonDecode(mw.text.decode(raw_data))
local tr = mw.html.create('tr')
local pagename, pagelink
pagelink = fullpagename..'|'..string.match(fullpagename, '/(.*)')
if ismulti and data.version then
pagename = '[['..pagelink..' ('..data.version..')]]'
else
pagename = '[['..pagelink..']]'
end
local rowcat = data.category
if data.skillcategory then
rowcat = rowcat .. '/' .. data.skillcategory
end
local val, c_class
local inputval = calc_value(data.inputs, data.prices.default_kph or 0, false)
local outputval = calc_value(data.outputs, data.prices.default_kph or 0, true)
val = outputval - inputval
if val > 0 then
c_class = 'coins-pos'
elseif val < 0 then
c_class = 'coins-neg'
else
c_class = ''
end
local intensity = (data.intensity == 'High') and 3 or (data.intensity == 'Moderate') and 2 or (data.intensity == 'Low') and 1 or 0
tr :tag('td')
:wikitext(pagename)
:done()
:tag('td')
:attr('data-sort-value', val)
:tag('span')
:addClass('coins')
:addClass(c_class)
:wikitext(round1k(val, true))
:done()
:done()
:tag('td')
:addClass('plainlist')
:newline()
:wikitext(data.skill)
:done()
:tag('td')
:wikitext(rowcat)
:done()
:tag('td')
:wikitext(data.intensity)
:attr('data-sort-value', intensity)
:done()
:tag('td')
:wikitext(MEMBERS_ICON[data.members])
:done()
return val, data.category, tr
end
function p.main(frame)
local args = frame:getParent().args
local query = {'[[Category:Worthwhile money making guides]]', '[[MMG JSON::+]]', '?MMG JSON', '?=#', limit=10000}
if args[1] then
table.insert(query, 2, '[[Category:'..args[1]..']]')
end
local data = mw.smw.ask(query)
local t = mw.html.create('table')
t :addClass('wikitable sortable sticky-header align-right-2 align-center-4 align-center-5 align-center-6')
:tag('caption')
:wikitext('[[Money making guide|All guides]] • [[Money making guide/Collecting|Collecting]] • [[Money making guide/Combat|Combat]] • [[Money making guide/Processing|Processing]] • [[Money making guide/Skilling|Skilling]] • [[Money making guide/Recurring|Recurring]] • [[Money making guide/Free-to-play|Free-to-play]] ')
:done()
:tag('tr')
:tag('th')
:wikitext('Method')
:done()
:tag('th')
:wikitext('Hourly profit')
:done()
:tag('th')
:wikitext('Skills')
:done()
:tag('th')
:wikitext('Category')
:done()
:tag('th')
:wikitext('Intensity')
:css('width', '65px')
:done()
:tag('th')
:wikitext('Members')
:css('width', '65px')
:done()
local methods = {}
for i,v in ipairs(data) do
if(string.find(v[1], 'Money making guide/')) then
if type(v['MMG JSON']) == 'table' then
for j,u in ipairs(v['MMG JSON']) do
table.insert(methods, { make_row(v[1], u, true) })
end
else
table.insert(methods, { make_row(v[1], v['MMG JSON'], false) })
end
end
end
table.sort(methods, function(a,b) return a[1]>b[1] end)
for i,v in ipairs(methods) do
if v[1] > 0 then
t:newline():node(v[3])
end
end
return t
end
function make_rec_row(fullpagename, raw_data, ismulti)
local data = mw.text.jsonDecode(mw.text.decode(raw_data))
local tr = mw.html.create('tr')
local pagename, pagelink
pagelink = fullpagename..'|'..string.match(fullpagename, '/(.*)')
if ismulti and data.version then
pagename = '[['..pagelink..' ('..data.version..')]]'
else
pagename = '[['..pagelink..']]'
end
local val = calc_value(data.outputs, 0, true) - calc_value(data.inputs, 0, false)
local c_class
if val > 0 then
c_class = 'coins-pos'
elseif val < 0 then
c_class = 'coins-neg'
else
c_class = ''
end
tr :tag('td')
:wikitext(pagename)
:done()
:tag('td')
:attr('data-sort-value', val)
:tag('span')
:addClass('coins')
:addClass(c_class)
:wikitext(round1k(val, true))
:done()
:done()
:tag('td')
:wikitext(timefunc._m_to_c(tostring(data.time)))
:done()
:tag('td')
:attr('data-sort-value', val*60/data.time)
:tag('span')
:addClass('coins')
:addClass(c_class)
:wikitext(round1k(val*60/data.time, true))
:done()
:done()
:tag('td')
:attr('data-sort-value', timefunc._w_to_c(tostring(data.recurrence)))
:wikitext(timefunc._w_to_c(tostring(data.recurrence)))
:done()
:tag('td')
:addClass('plainlist')
:newline()
:wikitext(data.skill)
:done()
:tag('td')
:wikitext(data.category)
:done()
:tag('td')
:wikitext(MEMBERS_ICON[data.members])
:done()
return val, tr
end
function p.rec(frame)
local data = mw.smw.ask({'[[MMG recurring JSON::+]]', '[[MMG value::+]]', '?MMG recurring JSON', '?=#', limit=10000})
local t = mw.html.create('table')
t :addClass('wikitable sortable sticky-header align-right-2 align-right-3 align-right-4 align-right-5 align-center-7 align-center-8')
:tag('caption')
:wikitext('[[Money making guide|All guides]] • [[Money making guide/Collecting|Collecting]] • [[Money making guide/Combat|Combat]] • [[Money making guide/Processing|Processing]] • [[Money making guide/Skilling|Skilling]] • [[Money making guide/Recurring|Recurring]] • [[Money making guide/Free-to-play|Free-to-play]]')
:done()
:tag('tr')
:tag('th')
:wikitext('Method')
:done()
:tag('th')
:wikitext('Profit')
:done()
:tag('th')
:wikitext('Time')
:done()
:tag('th')
:wikitext('Effective<br>profit')
:done()
:tag('th')
:wikitext('Recurrence<br>time')
:done()
:tag('th')
:wikitext('Skills')
:done()
:tag('th')
:wikitext('Category')
:done()
:tag('th')
:wikitext('Members')
:css('width', '65px')
:done()
local methods = {}
for i,v in ipairs(data) do
if type(v['MMG recurring JSON']) == 'table' then
for j,u in ipairs(v['MMG recurring JSON']) do
table.insert(methods, { make_rec_row(v[1], u, true) })
end
else
table.insert(methods, { make_rec_row(v[1], v['MMG recurring JSON'], false) })
end
end
table.sort(methods, function(a,b) return a[1]>b[1] end)
for i,v in ipairs(methods) do
t:newline()
t:node(v[2])
end
t:newline()
return t
end
return p
-- </nowiki>