Module:Profitable alchemy
Module documentation
This documentation is transcluded from Module:Profitable alchemy/doc. [edit] [history] [purge]
Module:Profitable alchemy requires Module:Addcommas.
Module:Profitable alchemy requires Module:Paramtest.
Module:Profitable alchemy requires Module:Yesno.
Module:Profitable alchemy loads data from Module:GELimits/data.json.
Module:Profitable alchemy loads data from Module:GEMembers/data.json.
Module:Profitable alchemy loads data from Module:GEPrices/data.json.
Module:Profitable alchemy loads data from Module:GEValues/data.json.
Module:Profitable alchemy loads data from Module:GEVolumes/data.json.
The Profitable alchemy Module is used to display profitable items when alchemising them or selling to shops.
Usage
{{#invoke:Profitable alchemy|main
|alchtype    = <!-- The action type to use in profit calculations. See below. Defaults to 'fire staff' -->
|minbuylimit = <!-- The minimum buy limit items should have for them to be listed. Defaults to 0 -->
}}
| alchtype | Cost | Items per hour | Item value multiplier | Column 4 text | 
|---|---|---|---|---|
| general store | 0 | 50,000 | 0.1 | Sell price | 
| general store single | 0 | 300 | 0.6 | Sell price | 
| low alch | 1 Nature rune 208 | 2,000 | 0.4 | Low Alch | 
| fire staff | 1 Nature rune 208 | 1,200 | 0.6 | High Alch | 
| no staff | 1 Nature rune 5 Fire runes 233 | 1,200 | 0.6 | High Alch | 
Example
{{#invoke:Profitable alchemy|main|alchtype=low alch|minbuylimit=0}}
| Item | GE Price | Low Alch | Profit | ROI% | Limit | Volume | Max profit | Profit per Minute | Members | Details | |
|---|---|---|---|---|---|---|---|---|---|---|---|
|  | Magic stone | 6,154 | 300,000 | 293,638 | 4615.50% | 11,000 | 666 | 32,593,818 | 9,787,933 |  | view | 
|  | Black d'hide shield | 6,500 | 11,333 | 4,625 | 68.95% | 125 | 2,645 | 578,125 | 154,166 |  | view | 
Quick copy
{{#invoke:Profitable alchemy|main|alchtype='fire staff'|minbuylimit=0}}
local p = {}
local prices = mw.loadJsonData('Module:GEPrices/data.json')
local values = mw.loadJsonData('Module:GEValues/data.json')
local limits = mw.loadJsonData('Module:GELimits/data.json')
local volumes = mw.loadJsonData('Module:GEVolumes/data.json')
local members = mw.loadJsonData('Module:GEMembers/data.json')
local natureRunePrice = prices['Nature rune']
local fireRunePrice = prices['Fire rune']
local commas = require('Module:Addcommas')._add
local paramTest = require('Module:Paramtest')
local yesNo = require('Module:Yesno')
local AlchemyTypes = {
	['general store'] = { cost = 0, perHour = 50000, mult = 0.1, label = "Sell price"},
	['general store single'] = { cost = 0, perHour = 300, mult = 0.6, label = "Sell price"},
	['low alch'] = { cost = natureRunePrice, perHour = 2000, mult = 0.4, label = "[[Low Alch]]"},
	['fire staff'] = { cost = natureRunePrice, perHour = 1200, mult = 0.6, label = "[[High Alch]]"},
	['no staff'] = { cost = natureRunePrice + 5 * fireRunePrice, perHour = 1200, mult = 0.6, label = "[[High Alch]]"},
}
function buildRow(item, price, alch, profit, roi, limit, volume, profitMax, profitPerMinute, membersStr, membersVal)
	local row = mw.html.create('tr')
	row:tag('td'):wikitext('[[File:' .. item .. '.png|link=' .. item .. ']]'):done()
		:tag('td'):wikitext('[[' .. item  .. ']]'):attr('data-sort-value', item):done()
		:tag('td'):wikitext(commas(price)):attr('data-sort-value', price):done()
		:tag('td'):wikitext(commas(alch)):attr('data-sort-value', alch):done()
		:tag('td'):wikitext(commas(profit)):attr('data-sort-value', profit):done()
		:tag('td'):wikitext(roi):attr('data-sort-value', roi):done()
		:tag('td'):wikitext(commas(limit)):attr('data-sort-value', limit):done()
		:tag('td'):wikitext(commas(volume)):attr('data-sort-value', volume):done()
		:tag('td'):wikitext(commas(profitMax)):attr('data-sort-value', profitMax):done()
		:tag('td'):wikitext(commas(profitPerMinute)):attr('data-sort-value', profitPerMinute):done()
		:tag('td'):wikitext(membersStr):attr('data-sort-value', tostring(membersVal)):done()
		:tag('td'):wikitext('[[Exchange:' .. item .. '|view]]'):done()
	return row
end
function createHeader(label)
	local ret = mw.html.create('table'):addClass('wikitable sortable 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')
	ret:tag('tr'):tag('th'):attr('colspan', '2'):wikitext('Item'):done()
		:tag('th'):wikitext('GE Price'):done()
		:tag('th'):wikitext(label):done()
		:tag('th'):wikitext('Profit'):done()
		:tag('th'):wikitext('[[wikipedia:Return on investment|ROI%]]'):done()
		:tag('th'):wikitext('[[Grand Exchange#Trade restrictions|Limit]]'):done()
		:tag('th'):wikitext('[[Grand Exchange#Volume|Volume]]'):done()
		:tag('th'):wikitext('Max profit'):done()
		:tag('th'):wikitext('Profit per Minute'):done()
		:tag('th'):wikitext('Members'):done()
		:tag('th'):wikitext('Details'):done()
	return ret
end
function sortByProfit(profitsOne, profitsTwo)
	return profitsOne[2] > profitsTwo[2]
end
function getData(minBuyLimit, costToAlch, mult)
	local profits = {}
	for item, price in pairs(prices) do
		if(tonumber(price)) then
			-- If limit is above the requested minimum and the item has a value
			if(((tonumber(limits[item]) or 5000) > minBuyLimit) and values[item]) then
				local profit = math.floor(values[item] * mult) - (price + costToAlch)
				if(profit > 0) then
					table.insert(profits, { item, profit })
				end
			end
		end
	end
	table.sort(profits, sortByProfit)
	return profits
end
function p._main(args)
	local minBuyLimit = paramTest.default_to(tonumber(args.minbuylimit), -1)
	local alchType = paramTest.default_to(string.lower(args.alchtype), 'fire staff')
	alchType = AlchemyTypes[alchType]
	
	data = getData(minBuyLimit, alchType.cost, alchType.mult)
	
	if #data == 0 then
		return '\'\'\'No items are currently profitable.\'\'\''
	end
	
	local ret = createHeader(alchType.label)
	for i, itemData in ipairs(data) do
		local item = itemData[1]
		local profit = itemData[2]
		local price = prices[item]
		local alch = math.floor(values[item] * alchType.mult)
		local limit = limits[item] or 0
		local volume = volumes[item]
		local roi = string.format('%.2f', 100 * (profit / (price + natureRunePrice))) .. '%'
		local profitMax = limit and (math.min(alchType.perHour * 4, math.floor(math.min(limit, volume / 24 * 4))) * profit) or (alchType.perHour * 4 * profit)
		local profitPerMinute = math.floor(profit * (alchType.perHour / 60))
		
		local membersStr = '?'
		if(members[item]) then
			membersStr = '[[File:Member icon.png|link=Members]]'
		elseif(not members[item]) then
			membersStr = '[[File:Free-to-play icon.png|link=Free-to-play]]'
		end
		
		ret:node(buildRow(item, price, alch, profit, roi, limit, volume, profitMax, profitPerMinute, membersStr, members[item]))
	end
	
	return ret
end
function p.main(frame)
	return p._main(frame.args)
end
return p
