<?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%3AProfitable_shops</id>
	<title>Module:Profitable shops - 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%3AProfitable_shops"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Profitable_shops&amp;action=history"/>
	<updated>2026-05-05T16:27:10Z</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:Profitable_shops&amp;diff=35079&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local p = {}  local prices = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;) local limits = mw.loadJsonData(&#039;Module:GELimits/data.json&#039;) local members = mw.loadJsonData(&#039;Module:GEMembers/data.json&#039;) local volumes = mw.loadJsonData(&#039;Module:GEVolumes/data.json&#039;)  local coins = require( &#039;Module:Coins&#039; )._amount  function createPagination(currentPage) 	local ret = mw.html.create(&#039;div&#039;) 	 	if (currentPage &gt; 0) then 		ret:tag(&#039;span&#039;):wikitext(&#039;First Page&#039;):done() 		ret:tag(&#039;span&#039;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Profitable_shops&amp;diff=35079&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:51Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local prices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;) local limits = mw.loadJsonData(&amp;#039;Module:GELimits/data.json&amp;#039;) local members = mw.loadJsonData(&amp;#039;Module:GEMembers/data.json&amp;#039;) local volumes = mw.loadJsonData(&amp;#039;Module:GEVolumes/data.json&amp;#039;)  local coins = require( &amp;#039;Module:Coins&amp;#039; )._amount  function createPagination(currentPage) 	local ret = mw.html.create(&amp;#039;div&amp;#039;) 	 	if (currentPage &amp;gt; 0) then 		ret:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;First Page&amp;#039;):done() 		ret:tag(&amp;#039;span&amp;#039;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local prices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)&lt;br /&gt;
local limits = mw.loadJsonData(&amp;#039;Module:GELimits/data.json&amp;#039;)&lt;br /&gt;
local members = mw.loadJsonData(&amp;#039;Module:GEMembers/data.json&amp;#039;)&lt;br /&gt;
local volumes = mw.loadJsonData(&amp;#039;Module:GEVolumes/data.json&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local coins = require( &amp;#039;Module:Coins&amp;#039; )._amount&lt;br /&gt;
&lt;br /&gt;
function createPagination(currentPage)&lt;br /&gt;
	local ret = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if (currentPage &amp;gt; 0) then&lt;br /&gt;
		ret:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;First Page&amp;#039;):done()&lt;br /&gt;
		ret:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039;Previous&amp;#039;):done()&lt;br /&gt;
	end&lt;br /&gt;
		ret:tag(&amp;#039;span&amp;#039;):wikitext(&amp;#039; Next&amp;#039;):done()&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function createHeader()&lt;br /&gt;
	local ret = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable sortable autosort=5,d sticky-header align-center-1 align-right-3 align-right-4 align-right-5 align-right-6 align-right-7 align-right-8 align-right-9 align-center-10 align-center-11&amp;#039;)&lt;br /&gt;
	ret:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(&amp;#039;Item&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Shop Price&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;GE Price&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Profit&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[wikipedia:Return on investment|ROI%]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Shop stock&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Store price delta&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[Grand Exchange#Trade restrictions|Limit]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[Grand Exchange#Volume|Volume]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Members&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;Shop&amp;#039;):done()&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function buildRow(rowData)&lt;br /&gt;
	local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local membersStr = &amp;#039;?&amp;#039;&lt;br /&gt;
	if(rowData.isMembers) then&lt;br /&gt;
		membersStr = &amp;#039;[[File:Member icon.png|link=Members]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		membersStr = &amp;#039;[[File:Free-to-play icon.png|link=Free-to-play]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	row:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[File:&amp;#039; .. rowData.item .. &amp;#039;.png|link=&amp;#039; .. rowData.item .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[&amp;#039; .. rowData.item  .. &amp;#039;]]&amp;#039;):attr(&amp;#039;data-sort-value&amp;#039;, rowData.item):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(coins(rowData.price)):attr(&amp;#039;data-sort-value&amp;#039;, rowData.price):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(coins(rowData.gePrice)):attr(&amp;#039;data-sort-value&amp;#039;, rowData.gePrice):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(coins(rowData.profit)):attr(&amp;#039;data-sort-value&amp;#039;, rowData.profit):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(rowData.roi):attr(&amp;#039;data-sort-value&amp;#039;, rowData.roi):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(rowData.stock):attr(&amp;#039;data-sort-value&amp;#039;, rowData.stock):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(rowData.delta):attr(&amp;#039;data-sort-value&amp;#039;, rowData.delta):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(rowData.limit):attr(&amp;#039;data-sort-value&amp;#039;, rowData.limit):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(rowData.volume):attr(&amp;#039;data-sort-value&amp;#039;, rowData.volume):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(membersStr):attr(&amp;#039;data-sort-value&amp;#039;, tostring(membersVal)):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):wikitext(&amp;#039;[[&amp;#039; .. rowData.store .. &amp;#039;|view]]&amp;#039;):done()&lt;br /&gt;
	return row&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function getData(currentPage)&lt;br /&gt;
	local items = {}&lt;br /&gt;
	local limit = 10000&lt;br /&gt;
	local params = {&lt;br /&gt;
		&amp;quot;[[Store currency::Coins]]&amp;quot;,&lt;br /&gt;
		&amp;quot;?Sold item#-&amp;quot;,&lt;br /&gt;
		&amp;quot;?Store sell price&amp;quot;,&lt;br /&gt;
		&amp;quot;?Sold by#-&amp;quot;,&lt;br /&gt;
		&amp;quot;?Store stock&amp;quot;,&lt;br /&gt;
		&amp;quot;?Store delta&amp;quot;,&lt;br /&gt;
		&amp;quot;?Store currency&amp;quot;,&lt;br /&gt;
		limit = limit,&lt;br /&gt;
		offset = limit * currentPage&lt;br /&gt;
	}&lt;br /&gt;
	local data = mw.smw.ask(params) or {}&lt;br /&gt;
	&lt;br /&gt;
	for _, item in ipairs(data) do&lt;br /&gt;
		if item ~= nil then&lt;br /&gt;
			table.insert(items, item)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return items&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 currentPage = args.page or 0&lt;br /&gt;
	local data = getData(currentPage)&lt;br /&gt;
	-- local pagination = createPagination(currentPage)&lt;br /&gt;
	local ret = createHeader()&lt;br /&gt;
	&lt;br /&gt;
	for i, item in ipairs(data) do&lt;br /&gt;
		local row = {}&lt;br /&gt;
		row.item = item[&amp;quot;Sold item&amp;quot;]&lt;br /&gt;
		row.store = item[&amp;quot;Sold by&amp;quot;]&lt;br /&gt;
		row.stock = item[&amp;quot;Store stock&amp;quot;]&lt;br /&gt;
		row.price = item[&amp;quot;Store sell price&amp;quot;]&lt;br /&gt;
		row.delta = item[&amp;quot;Store delta&amp;quot;]&lt;br /&gt;
		row.gePrice = prices[row.item]&lt;br /&gt;
		&lt;br /&gt;
		local shouldAcceptItem = false&lt;br /&gt;
		&lt;br /&gt;
		if type(row.stock) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			if (row.stock &amp;gt; 0) then &lt;br /&gt;
				shouldAcceptItem = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if (row.stock == &amp;#039;∞&amp;#039; or row.stock == &amp;#039;N/A&amp;#039;) then&lt;br /&gt;
				shouldAcceptItem = true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- If the item is not in the Grand Exchange dataset then it should be ignored&lt;br /&gt;
		if row.gePrice == nil then&lt;br /&gt;
			shouldAcceptItem = false&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		-- Items that can only be bought have a price of 10,000,000,000 in the wiki, we should ignore those&lt;br /&gt;
		if row.price == 10000000000 then&lt;br /&gt;
			shouldAcceptItem = false&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if shouldAcceptItem then&lt;br /&gt;
			row.profit = row.gePrice - row.price&lt;br /&gt;
			&lt;br /&gt;
			if row.price ~= 0 then&lt;br /&gt;
				row.roi = string.format(&amp;#039;%.2f&amp;#039;, 100 * (row.profit / (row.price))) .. &amp;#039;%&amp;#039; &lt;br /&gt;
			else &lt;br /&gt;
				row.roi = &amp;#039;∞&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			row.isMembers = members[row.item]&lt;br /&gt;
			row.limit = limits[row.item]&lt;br /&gt;
			row.volume = volumes[row.item]&lt;br /&gt;
			ret:node(buildRow(row))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>