<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AMmgtable%2Fjson</id>
	<title>Module:Mmgtable/json - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AMmgtable%2Fjson"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Mmgtable/json&amp;action=history"/>
	<updated>2026-05-05T16:27:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Mmgtable/json&amp;diff=35054&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;nowiki&gt; local timefunc = require(&#039;Module:Time&#039;) local exg = require(&#039;Module:Exchange&#039;)._price local p = {} local lang = mw.getContentLanguage()  function gep(x) 	return exg(x, 1, nil, nil, 0) end  local MEMBERS_ICON = { 	[false] = &quot;link=Free-to-play&quot;, 	[true]  = &quot;link=Members&quot; }  function round1k(x, f) 	if not tonumber(x) then 		return x 	end 	local _x = math.abs(x) 	_x = 1000 * math.floor(_x / 100...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Mmgtable/json&amp;diff=35054&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:42Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local timefunc = require(&amp;#039;Module:Time&amp;#039;) local exg = require(&amp;#039;Module:Exchange&amp;#039;)._price local p = {} local lang = mw.getContentLanguage()  function gep(x) 	return exg(x, 1, nil, nil, 0) end  local MEMBERS_ICON = { 	[false] = &amp;quot;&lt;a href=&quot;/w/File:Free-to-play_icon.png&quot; title=&quot;File:Free-to-play icon.png&quot;&gt;center|link=Free-to-play&lt;/a&gt;&amp;quot;, 	[true]  = &amp;quot;&lt;a href=&quot;/w/File:Member_icon.png&quot; title=&quot;File:Member icon.png&quot;&gt;center|link=Members&lt;/a&gt;&amp;quot; }  function round1k(x, f) 	if not tonumber(x) then 		return x 	end 	local _x = math.abs(x) 	_x = 1000 * math.floor(_x / 100...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local timefunc = require(&amp;#039;Module:Time&amp;#039;)&lt;br /&gt;
local exg = require(&amp;#039;Module:Exchange&amp;#039;)._price&lt;br /&gt;
local p = {}&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
function gep(x)&lt;br /&gt;
	return exg(x, 1, nil, nil, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local MEMBERS_ICON = {&lt;br /&gt;
	[false] = &amp;quot;[[File:Free-to-play icon.png|center|link=Free-to-play]]&amp;quot;,&lt;br /&gt;
	[true]  = &amp;quot;[[File:Member icon.png|center|link=Members]]&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function round1k(x, f)&lt;br /&gt;
	if not tonumber(x) then&lt;br /&gt;
		return x&lt;br /&gt;
	end&lt;br /&gt;
	local _x = math.abs(x)&lt;br /&gt;
	_x = 1000 * math.floor(_x / 1000 + 0.5)&lt;br /&gt;
	if x &amp;lt; 0 then&lt;br /&gt;
		_x = _x * -1&lt;br /&gt;
	end&lt;br /&gt;
	if f then&lt;br /&gt;
		return lang:formatNum(_x)&lt;br /&gt;
	end&lt;br /&gt;
	return _x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function round1dp(x, f)&lt;br /&gt;
	if not tonumber(x) then&lt;br /&gt;
		return x&lt;br /&gt;
	end&lt;br /&gt;
	local _x = math.abs(x)&lt;br /&gt;
	_x = math.floor(_x * 10 + 0.5) / 10&lt;br /&gt;
	if x &amp;lt; 0 then&lt;br /&gt;
		_x = _x * -1&lt;br /&gt;
	end&lt;br /&gt;
	if f then&lt;br /&gt;
		return lang:formatNum(_x)&lt;br /&gt;
	end&lt;br /&gt;
	return _x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function calc_value(args, kph)&lt;br /&gt;
	local total = 0&lt;br /&gt;
	for i,v in ipairs(args) do&lt;br /&gt;
		local val&lt;br /&gt;
		if v.pricetype == &amp;#039;value&amp;#039; then&lt;br /&gt;
			val = v.qty * v.value&lt;br /&gt;
		elseif v.pricetype == &amp;#039;gemw&amp;#039; then&lt;br /&gt;
			val = gep(v.name) * v.qty&lt;br /&gt;
		end&lt;br /&gt;
		if kph&amp;gt;0 and not v.isph then&lt;br /&gt;
			val = val * kph&lt;br /&gt;
		end&lt;br /&gt;
		total = total + val&lt;br /&gt;
	end&lt;br /&gt;
	return total&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function make_json_row(fullpagename, raw_data, ismulti)&lt;br /&gt;
    local data = mw.text.jsonDecode(mw.text.decode(raw_data))&lt;br /&gt;
    local row = {}&lt;br /&gt;
&lt;br /&gt;
    -- Extract the method name from the full page name&lt;br /&gt;
    local pagename = string.match(fullpagename, &amp;#039;Money making guide/(.*)&amp;#039;)&lt;br /&gt;
    if ismulti and data.version then&lt;br /&gt;
        pagename = pagename .. &amp;#039; (&amp;#039; .. data.version .. &amp;#039;)&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    row[&amp;quot;Method&amp;quot;] = pagename&lt;br /&gt;
    row[&amp;quot;Category&amp;quot;] = data.category or &amp;quot;&amp;quot;&lt;br /&gt;
    row[&amp;quot;Intensity&amp;quot;] = data.intensity or &amp;quot;&amp;quot;&lt;br /&gt;
    row[&amp;quot;Members&amp;quot;] = data.members&lt;br /&gt;
&lt;br /&gt;
    local inputval = calc_value(data.inputs, data.prices.default_kph or 0)&lt;br /&gt;
    local outputval = calc_value(data.outputs, data.prices.default_kph or 0)&lt;br /&gt;
    local val = outputval - inputval&lt;br /&gt;
    row[&amp;quot;Hourly profit&amp;quot;] = round1k(val, true)&lt;br /&gt;
&lt;br /&gt;
    return row&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function parse_profit(profit_str)&lt;br /&gt;
    -- Remove commas and convert to number for sorting&lt;br /&gt;
    return tonumber((profit_str:gsub(&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local query = {&amp;#039;[[Category:Worthwhile money making guides]]&amp;#039;, &amp;#039;[[MMG JSON::+]]&amp;#039;, &amp;#039;?MMG JSON&amp;#039;, &amp;#039;?=#&amp;#039;, limit=10000}&lt;br /&gt;
    if args[1] then&lt;br /&gt;
        table.insert(query, 2, &amp;#039;[[Category:&amp;#039;..args[1]..&amp;#039;]]&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    local data = mw.smw.ask(query)&lt;br /&gt;
&lt;br /&gt;
    local methods = {}&lt;br /&gt;
    for _, v in ipairs(data) do&lt;br /&gt;
        if string.find(v[1], &amp;#039;Money making guide/&amp;#039;) then&lt;br /&gt;
            if type(v[&amp;#039;MMG JSON&amp;#039;]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
                for _, u in ipairs(v[&amp;#039;MMG JSON&amp;#039;]) do&lt;br /&gt;
                    table.insert(methods, make_json_row(v[1], u, true))&lt;br /&gt;
                end&lt;br /&gt;
            else&lt;br /&gt;
                table.insert(methods, make_json_row(v[1], v[&amp;#039;MMG JSON&amp;#039;], false))&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	table.sort(methods, function(a, b)&lt;br /&gt;
        return parse_profit(a[&amp;quot;Hourly profit&amp;quot;]) &amp;gt; parse_profit(b[&amp;quot;Hourly profit&amp;quot;])&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(methods)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rec(frame)&lt;br /&gt;
    local data = mw.smw.ask({&amp;#039;[[MMG recurring JSON::+]]&amp;#039;, &amp;#039;[[MMG value::+]]&amp;#039;, &amp;#039;?MMG recurring JSON&amp;#039;, &amp;#039;?=#&amp;#039;, limit=10000})&lt;br /&gt;
&lt;br /&gt;
    local methods = {}&lt;br /&gt;
    for _, v in ipairs(data) do&lt;br /&gt;
        if type(v[&amp;#039;MMG recurring JSON&amp;#039;]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
            for _, u in ipairs(v[&amp;#039;MMG recurring JSON&amp;#039;]) do&lt;br /&gt;
                table.insert(methods, make_json_row(v[1], u, true))&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(methods, make_json_row(v[1], v[&amp;#039;MMG recurring JSON&amp;#039;], false))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.sort(methods, function(a, b)&lt;br /&gt;
        return parse_profit(a[&amp;quot;Hourly profit&amp;quot;]) &amp;gt; parse_profit(b[&amp;quot;Hourly profit&amp;quot;])&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return mw.text.jsonEncode(methods)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>