<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AExchangeShop</id>
	<title>Module:ExchangeShop - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AExchangeShop"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:ExchangeShop&amp;action=history"/>
	<updated>2026-04-28T09:52:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:ExchangeShop&amp;diff=21647&amp;oldid=prev</id>
		<title>Hefner at 10:44, 8 May 2024</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:ExchangeShop&amp;diff=21647&amp;oldid=prev"/>
		<updated>2024-05-08T10:44:18Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 10:44, 8 May 2024&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l61&quot;&gt;Line 61:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 61:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local data_module_names = {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;local data_module_names = {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	price = &#039;Module:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;GEPrices&lt;/del&gt;/data.json&#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	price = &#039;Module:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ShopPrices&lt;/ins&gt;/data.json&#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	volume = &amp;#039;Module:GEVolumes/data.json&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	volume = &amp;#039;Module:GEVolumes/data.json&amp;#039;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	lastPrice = &amp;#039;Module:LastPrices/data.json&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;	lastPrice = &amp;#039;Module:LastPrices/data.json&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:ExchangeShop&amp;diff=21646&amp;oldid=prev</id>
		<title>Hefner: Created page with &quot;--fuse2=Gets the value of item named arg }} -- -- &lt;nowiki&gt; -- -- Implements various exchange templates -- See Individual method docs for more details -- -- See also: -- - Module:ExchangeData -- - Module:ExchangeDefault -- -- Original version: http://runescape.wiki/w/Module:Exchange  local p = {}  -- only...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:ExchangeShop&amp;diff=21646&amp;oldid=prev"/>
		<updated>2024-05-08T10:44:02Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[[ {{Helper module|name=Exchange |fname1=_price(arg) |ftype1=String |fuse1=Gets the current median price of item named arg |fname2=_value(arg) |ftype2=String |fuse2=Gets the value of item named arg }} --]] -- &amp;lt;nowiki&amp;gt; -- -- Implements various exchange templates -- See Individual method docs for more details -- -- See also: -- - &lt;a href=&quot;/Module:ExchangeData&quot; title=&quot;Module:ExchangeData&quot;&gt;Module:ExchangeData&lt;/a&gt; -- - &lt;a href=&quot;/index.php?title=Module:ExchangeDefault&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module:ExchangeDefault (page does not exist)&quot;&gt;Module:ExchangeDefault&lt;/a&gt; -- -- Original version: http://runescape.wiki/w/Module:Exchange  local p = {}  -- only...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
{{Helper module|name=Exchange&lt;br /&gt;
|fname1=_price(arg)&lt;br /&gt;
|ftype1=String&lt;br /&gt;
|fuse1=Gets the current median price of item named arg&lt;br /&gt;
|fname2=_value(arg)&lt;br /&gt;
|ftype2=String&lt;br /&gt;
|fuse2=Gets the value of item named arg&lt;br /&gt;
}}&lt;br /&gt;
--]]&lt;br /&gt;
-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Implements various exchange templates&lt;br /&gt;
-- See Individual method docs for more details&lt;br /&gt;
--&lt;br /&gt;
-- See also:&lt;br /&gt;
-- - [[Module:ExchangeData]]&lt;br /&gt;
-- - [[Module:ExchangeDefault]]&lt;br /&gt;
--&lt;br /&gt;
-- Original version: http://runescape.wiki/w/Module:Exchange&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- only load commonly used modules here&lt;br /&gt;
local yesno = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
local addcommas = require( &amp;#039;Module:Addcommas&amp;#039; )._add&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Makes sure first letter of item is uppercase&lt;br /&gt;
-- Automatically handles any redirects&lt;br /&gt;
--&lt;br /&gt;
function p.checkTitle( item )&lt;br /&gt;
    -- upper case first letter to make sure we can find a valid item page&lt;br /&gt;
    item = mw.ustring.gsub( item, &amp;#039;&amp;amp;#0?39;&amp;#039;, &amp;quot;&amp;#039;&amp;quot; )&lt;br /&gt;
    item = mw.ustring.gsub( item, &amp;#039;&amp;amp;#0?38;&amp;#039;, &amp;quot;&amp;amp;&amp;quot; )&lt;br /&gt;
    item = mw.ustring.gsub( item, &amp;#039;_&amp;#039;, &amp;#039; &amp;#039; )&lt;br /&gt;
    item = mw.ustring.gsub( item, &amp;#039;  +&amp;#039;, &amp;#039; &amp;#039; )&lt;br /&gt;
    item = item:sub(1, 1):upper() .. item:sub(2, -1)&lt;br /&gt;
&lt;br /&gt;
    return item&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
-- Simple mw.loadData wrapper used to access data located on module subpages&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to retrieve data for&lt;br /&gt;
-- @param suppress_err {boolean} (optional) If true and item data can not be loaded, return nil instead of error()&lt;br /&gt;
-- @return {table} Table of item data&lt;br /&gt;
--&lt;br /&gt;
local function load( item, suppress_err )&lt;br /&gt;
    item = p.checkTitle( item )&lt;br /&gt;
    local noErr, ret = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return ret&lt;br /&gt;
    elseif suppress_err then&lt;br /&gt;
    	return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    error( ret )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local data_module_names = {&lt;br /&gt;
	price = &amp;#039;Module:GEPrices/data.json&amp;#039;,&lt;br /&gt;
	volume = &amp;#039;Module:GEVolumes/data.json&amp;#039;,&lt;br /&gt;
	lastPrice = &amp;#039;Module:LastPrices/data.json&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
local data_historical_keys = {&lt;br /&gt;
	price = &amp;#039;price&amp;#039;,&lt;br /&gt;
	lastPrice = &amp;#039;last&amp;#039;,&lt;br /&gt;
	limit = &amp;#039;limit&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local loaded_data_modules = {}&lt;br /&gt;
&lt;br /&gt;
function p.loadBulkData( key, data_type, suppress_err )&lt;br /&gt;
	local module_name = data_module_names[data_type]&lt;br /&gt;
	if loaded_data_modules[module_name] == nil then&lt;br /&gt;
		loaded_data_modules[module_name] = mw.loadJsonData(module_name)&lt;br /&gt;
	end&lt;br /&gt;
	if key ~= &amp;#039;%LAST_UPDATE_F%&amp;#039; then&lt;br /&gt;
		key = p.checkTitle( key )&lt;br /&gt;
	end&lt;br /&gt;
	if loaded_data_modules[module_name][key] then&lt;br /&gt;
		return loaded_data_modules[module_name][key]&lt;br /&gt;
	end&lt;br /&gt;
	if not data_historical_keys[data_type] then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local exchange_data = load(key, true)&lt;br /&gt;
	if exchange_data and exchange_data.historical then&lt;br /&gt;
		return exchange_data[data_historical_keys[data_type]]&lt;br /&gt;
	end&lt;br /&gt;
	if suppress_err then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	error(&amp;#039;price not found for &amp;#039; .. key)&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
-- Returns the price of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get current price of&lt;br /&gt;
-- @param multi {number} (optional) Multiplies the output price by the specified number&lt;br /&gt;
-- @param format {boolean} (optional) Format the result with commas (defaults to false)&lt;br /&gt;
-- @param round {number} (optional) Round the result to a number of decimal places&lt;br /&gt;
-- @param default Any non-nil value to return as the price if item&amp;#039;s data can not be found.&lt;br /&gt;
-- @return {number|string} Price of item. Will return a string if formatted, else a number.&lt;br /&gt;
--&lt;br /&gt;
function p._price( item, multi, format, round, default )&lt;br /&gt;
    local price = p.loadBulkData( item, &amp;#039;price&amp;#039;, default ~= nil )&lt;br /&gt;
    local multi = type( multi ) == &amp;#039;number&amp;#039; and multi or 1&lt;br /&gt;
    local format = type( format ) == &amp;#039;boolean&amp;#039; and format or false&lt;br /&gt;
    local ret&lt;br /&gt;
    &lt;br /&gt;
    if price then&lt;br /&gt;
    	ret = price * multi&lt;br /&gt;
    &lt;br /&gt;
	    -- round the number to X d.p.&lt;br /&gt;
	    if round ~= nil then&lt;br /&gt;
	        local multi = 10^( round )&lt;br /&gt;
	        ret = math.floor( ret * multi + 0.5 ) / multi&lt;br /&gt;
	    end&lt;br /&gt;
	&lt;br /&gt;
	    if format then&lt;br /&gt;
	        return addcommas( ret )&lt;br /&gt;
	    end&lt;br /&gt;
	    &lt;br /&gt;
	    return ret&lt;br /&gt;
    else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the limit of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the limit of&lt;br /&gt;
-- @return {number} Limit of item&lt;br /&gt;
--&lt;br /&gt;
function p._limit( item )&lt;br /&gt;
    return load( item ).limit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the volume of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the limit of&lt;br /&gt;
-- @return {number} Volume of item&lt;br /&gt;
--&lt;br /&gt;
function p._volume( item )&lt;br /&gt;
    return p.loadBulkData(item, &amp;#039;volume&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the value of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the value for&lt;br /&gt;
-- @return {number} Value of item&lt;br /&gt;
--&lt;br /&gt;
function p._value( item )&lt;br /&gt;
    return load( item ).value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the itemId of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the itemId for&lt;br /&gt;
-- @return {number} itemId of item&lt;br /&gt;
--&lt;br /&gt;
function p._itemId( item )&lt;br /&gt;
    return load( item ).itemId&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the alchability of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the alchability of&lt;br /&gt;
-- @return {boolean} Alchability&lt;br /&gt;
--&lt;br /&gt;
function p._alchable( item )&lt;br /&gt;
	local a = load( item ).alchable&lt;br /&gt;
	if a == nil or a == true then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif a == false then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the alch multiplier of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the multiplier or&lt;br /&gt;
-- @return {number} Multiplier&lt;br /&gt;
--&lt;br /&gt;
function p._alchmultiplier( item )&lt;br /&gt;
	local a = load( item ).alchmultiplier&lt;br /&gt;
	if type(a) == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return a&lt;br /&gt;
	end&lt;br /&gt;
	return 0.6&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Internal function for alch values&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the high alch for&lt;br /&gt;
-- @param item {string} Alchemy multiplier&lt;br /&gt;
-- @return {number} Alch value of item&lt;br /&gt;
--&lt;br /&gt;
function alchval(item, mul)&lt;br /&gt;
	if p._alchable(item) then&lt;br /&gt;
		local v = p._value(item)&lt;br /&gt;
		local m = p._alchmultiplier(item)&lt;br /&gt;
		if v then&lt;br /&gt;
			return math.floor(v * m * mul)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return  -1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the high alch value of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the high alch for&lt;br /&gt;
-- @return {number} High alch of item&lt;br /&gt;
--&lt;br /&gt;
function p._highalch( item )&lt;br /&gt;
	return alchval(item, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the low alch value of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the low alch for&lt;br /&gt;
-- @return {number} Low alch of item&lt;br /&gt;
--&lt;br /&gt;
function p._lowalch( item )&lt;br /&gt;
	return alchval(item, 2/3)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Calculates the difference between the current price and the last price of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to calculate price difference for&lt;br /&gt;
-- @param format {boolean} `true` if the output is to be formatted with commas&lt;br /&gt;
--                         Defaults to `false`&lt;br /&gt;
-- @return {number|string} The price difference as a number&lt;br /&gt;
--                         If `format` is set to `true` then this returns a string&lt;br /&gt;
--                         If either of the prices to calculate the diff from are unavailable, this returns `0` (number)&lt;br /&gt;
--&lt;br /&gt;
function p._diff( item, format )&lt;br /&gt;
    local diff = 0&lt;br /&gt;
	local price = p.loadBulkData(item, &amp;#039;price&amp;#039;)&lt;br /&gt;
	local lastPrice = p.loadBulkData(item, &amp;#039;lastPrice&amp;#039;)&lt;br /&gt;
    if price and lastPrice then&lt;br /&gt;
        diff = price - lastPrice&lt;br /&gt;
&lt;br /&gt;
        if format then&lt;br /&gt;
            diff = addcommas( diff )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return diff&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEItem}} internal method&lt;br /&gt;
--&lt;br /&gt;
-- @todo merge into p.table&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get data for&lt;br /&gt;
-- @return {string}&lt;br /&gt;
--&lt;br /&gt;
function p._table( item )&lt;br /&gt;
    -- load data and any required modules&lt;br /&gt;
    local item = p.checkTitle( item )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
	local bulkData = {&lt;br /&gt;
		price = p.loadBulkData(item, &amp;#039;price&amp;#039;),&lt;br /&gt;
		date = p.loadBulkData(&amp;#039;%LAST_UPDATE_F%&amp;#039;, &amp;#039;price&amp;#039;),&lt;br /&gt;
		last = p.loadBulkData(item, &amp;#039;lastPrice&amp;#039;),&lt;br /&gt;
		lastDate = p.loadBulkData(&amp;#039;%LAST_UPDATE_F%&amp;#039;, &amp;#039;lastPrice&amp;#039;),&lt;br /&gt;
		volume = p.loadBulkData(item, &amp;#039;volume&amp;#039;),&lt;br /&gt;
	}&lt;br /&gt;
	local timeago = require( &amp;#039;Module:TimeAgo&amp;#039; )._ago&lt;br /&gt;
    local changeperday = require( &amp;#039;Module:ChangePerDay&amp;#039; )._change&lt;br /&gt;
    local coins = require( &amp;#039;Module:Coins&amp;#039; )._amount&lt;br /&gt;
&lt;br /&gt;
    -- set variables here to make the row building easier to follow&lt;br /&gt;
    local div = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local limit = data.limit and addcommas( data.limit ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local volume = bulkData.volume and addcommas( bulkData.volume ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local members = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if bulkData.last then&lt;br /&gt;
        local link = &amp;#039;http://services.runescape.com/m=itemdb_oldschool/viewitem.ws?obj=&amp;#039; .. data.itemId&lt;br /&gt;
        local change = math.abs( changeperday( {bulkData.price, bulkData.last, bulkData.date, bulkData.lastDate} ) )&lt;br /&gt;
&lt;br /&gt;
        if bulkData.price &amp;gt; bulkData.last then&lt;br /&gt;
            arrow = &amp;#039;[[File:Up.svg|20px|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        elseif bulkData.price &amp;lt; bulkData.last then&lt;br /&gt;
            arrow = &amp;#039;[[File:Down.svg|20px|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            arrow = &amp;#039;[[File:Unchanged.svg|40px|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if change &amp;gt;= 0.04 then&lt;br /&gt;
            arrow = arrow  .. arrow .. arrow&lt;br /&gt;
        elseif change &amp;gt;= 0.02 then&lt;br /&gt;
            arrow = arrow .. arrow&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        div = mw.html.create( &amp;#039;div&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
            :wikitext( arrow )&lt;br /&gt;
&lt;br /&gt;
        div = tostring( div )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if data.members == true then&lt;br /&gt;
        members = &amp;#039;[[File:Member icon.png|link=Members]]&amp;#039;&lt;br /&gt;
    elseif data.members == false then&lt;br /&gt;
        members = &amp;#039;[[File:Free-to-play icon.png|link=Free-to-play]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- build table row&lt;br /&gt;
    local tr = mw.html.create( &amp;#039;tr&amp;#039; )&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
        	:addClass( &amp;#039;inventory-image&amp;#039; )&lt;br /&gt;
            :wikitext( &amp;#039;[[File:&amp;#039; .. item .. &amp;#039;.png|&amp;#039; .. item .. &amp;#039;]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( {&lt;br /&gt;
                [&amp;#039;width&amp;#039;] = &amp;#039;15%&amp;#039;,&lt;br /&gt;
                [&amp;#039;text-align&amp;#039;] = &amp;#039;left&amp;#039;&lt;br /&gt;
            } )&lt;br /&gt;
            :wikitext( &amp;#039;[[&amp;#039; .. item .. &amp;#039;]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( coins( bulkData.price ) )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( div )&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    if data.alchable == nil or yesno( data.alchable ) then&lt;br /&gt;
        local low, high = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;, &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        if data.value then&lt;br /&gt;
            low = coins( p._lowalch(item) )&lt;br /&gt;
            high = coins( p._highalch(item) )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tr&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :wikitext( low )&lt;br /&gt;
                :done()&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :wikitext( high )&lt;br /&gt;
                :done()&lt;br /&gt;
    else&lt;br /&gt;
        tr&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :attr( &amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039; )&lt;br /&gt;
                :wikitext( &amp;#039;&amp;lt;i&amp;gt;Cannot be alchemised&amp;lt;/i&amp;gt;&amp;#039; )&lt;br /&gt;
                :done()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tr&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( limit )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( volume )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( members )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
            :wikitext( &amp;#039;[[Exchange:&amp;#039; .. item .. &amp;#039;|view]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;font-size&amp;#039;, &amp;#039;85%&amp;#039; )&lt;br /&gt;
            :wikitext( timeago{bulkData.date} )&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    return tostring( tr )&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEExists}}&lt;br /&gt;
--&lt;br /&gt;
function p.exists( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = p.checkTitle( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
    local noErr, data = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return &amp;#039;1&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;0&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- GEExists for modules&lt;br /&gt;
--&lt;br /&gt;
function p._exists( arg )&lt;br /&gt;
    local item = p.checkTitle( arg or &amp;#039;&amp;#039; )&lt;br /&gt;
    local noErr, data = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEP}}&lt;br /&gt;
-- {{GEPrice}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{GEPrice|&amp;lt;item&amp;gt;|&amp;lt;format&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
-- @example {{GEPrice|&amp;lt;item&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
-- @example {{GEP|&amp;lt;item&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.price( frame )&lt;br /&gt;
    -- usage: {{foo|item|format|multi}} or {{foo|item|multi}}&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local item = pargs[1]&lt;br /&gt;
    local expr = mw.ext.ParserFunctions.expr&lt;br /&gt;
    local round = tonumber( pargs.round )&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- default to formatted for backwards compatibility with old GE templates&lt;br /&gt;
    local format = true&lt;br /&gt;
    local multi = 1&lt;br /&gt;
&lt;br /&gt;
    -- format is set with #invoke&lt;br /&gt;
    -- so set it first to allow it to be overridden by template args&lt;br /&gt;
    if args.format ~= nil then&lt;br /&gt;
        format = yesno( args.format )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if tonumber( pargs[2] ) ~= nil then&lt;br /&gt;
        multi = tonumber( pargs[2] )&lt;br /&gt;
&lt;br /&gt;
    -- indicated someone is trying to pass an equation as a mulitplier&lt;br /&gt;
    -- known use cases are fractions, but pass it to #expr to make sure it&amp;#039;s handled correctly&lt;br /&gt;
    elseif pargs[2] ~= nil and mw.ustring.find( pargs[2], &amp;#039;[/*+-]&amp;#039; ) then&lt;br /&gt;
        multi = tonumber( expr( pargs[2] ) )&lt;br /&gt;
    end &lt;br /&gt;
&lt;br /&gt;
    return p._price( item, multi, format, round, pargs.dflt )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEItem}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{GEItem|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.table( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = args[1]&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p._table( item )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- experimental limit method for [[Grand Exchange/Buying Limits]]&lt;br /&gt;
--&lt;br /&gt;
function p.gemwlimit( frame )&lt;br /&gt;
    local item  = frame:getParent().args[1]&lt;br /&gt;
    local data = mw.loadData( &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
    &lt;br /&gt;
    return data.limit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{ExchangeItem}}&lt;br /&gt;
-- {{GEDiff}}&lt;br /&gt;
-- {{GELimit}}&lt;br /&gt;
-- {{ItemValue}}&lt;br /&gt;
-- {{GEId}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{ExchangeItem|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GEDiff|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GELimit|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{ItemValue|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GEId|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.view( frame )&lt;br /&gt;
    local fargs = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local item = pargs[1] or fargs.item&lt;br /&gt;
    local view = fargs.view or &amp;#039;&amp;#039;&lt;br /&gt;
    local loadView = {&lt;br /&gt;
    	itemId=true, price=true, last=true, volume=true, value=true, limit=true, members=true,&lt;br /&gt;
    	date=true, lastDate=true, volumeDate=true, icon=true, item=true, examine=true&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    view = mw.ustring.lower( view )&lt;br /&gt;
&lt;br /&gt;
    if view == &amp;#039;itemid&amp;#039; then&lt;br /&gt;
        view = &amp;#039;itemId&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if view == &amp;#039;volume&amp;#039; then&lt;br /&gt;
		return p._volume(item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    if view == &amp;#039;diff&amp;#039; then&lt;br /&gt;
        return p._diff( item )&lt;br /&gt;
&lt;br /&gt;
    elseif view == &amp;#039;hialch&amp;#039; or view == &amp;#039;highalch&amp;#039; or view == &amp;#039;high_alch&amp;#039; or view == &amp;#039;high alch&amp;#039; then&lt;br /&gt;
		return p._highalch(item)&lt;br /&gt;
		&lt;br /&gt;
    elseif view == &amp;#039;lowalch&amp;#039; or view == &amp;#039;low_alch&amp;#039; or view == &amp;#039;low alch&amp;#039; then&lt;br /&gt;
    	return p._lowalch(item)&lt;br /&gt;
    	&lt;br /&gt;
    elseif view == &amp;#039;members&amp;#039; then&lt;br /&gt;
    	if load( item )[view] then return 1 else return 0 end&lt;br /&gt;
&lt;br /&gt;
    elseif loadView[view] then&lt;br /&gt;
        return load( item )[view]&lt;br /&gt;
    end&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>Hefner</name></author>
	</entry>
</feed>