Module:Sandbox/User:Alsang: Difference between revisions

From Brighter Shores Wiki
Jump to navigation Jump to search
Content added Content deleted
No edit summary
No edit summary
 
(15 intermediate revisions by the same user not shown)
Line 1: Line 1:
require('strict')
require('strict')
require('Module:Mw.html extension')
require('Module:Mw.html extension')
local editbutton = require('Module:Edit button')
local param = require( 'Module:Paramtest' )
local edit = editbutton("'''?''' (edit)")
local hc = require('Module:Param Parse').has_content
local yn = require('Module:Yesno')
local qty = require('Module:Quantity box')._main
local pcp = require('Module:Profession clickpic')._main
local currency = require('Module:Currency')
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local album_xp_data = mw.loadData('Module:Experience/data').album
local xpdata = mw.loadData('Module:Experience/data')
local lang = mw.language.getContentLanguage()
local tooltip = require('Module:Tooltip')


local p = {}
local p = {}


-- non dynamic module, no inputs
function p.main(frame)
function p.main()
local args = frame:getParent().args
local albumxp = album_xp_data[tonumber(args.level)]
-- returns only directly needed parameter needed for the row,
-- other parameters are determined by subqueries of chained pages
local query = {
'[[Activity JSON::~*]]',
'? = name',
'?Activity JSON = activityJSON',
'limit = 1500'
}
local results = mw.smw.ask(query)
results = p.screenResults(results)


return p.displayTable(results)
if albumxp then
albumxp = lang:formatNum(albumxp)..' xp'
end
--for debugging
--Checks if the recipe has been flagged as passive, defaults to no.
--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'
local passive = yn(args.passive or 'no', false)

local quant = 1
end
if passive then

quant = 0.005
-- goes through a list of results and culls the ones which are not needed for this table
end
function p.screenResults(results)
local resultsScreened = {}
-- iterate through products
local function exparg(xp)
for _, item in ipairs(results) do
if hc(xp) then
return qty(xp)
-- if theres only one activity, wrap in table
else
if type(item.activityJSON)=='string' then
return qty(0)..edit..'[[Category:Needs experience info]]'
item.activityJSON = { item.activityJSON }
end
end
end
for j,json in ipairs(item.activityJSON) do
local function levelarg(profession, level)
local activityJSON = mw.text.jsonDecode(json)
if hc(profession) and hc(level) then
return pcp(profession, level)
if activityJSON.duration and tonumber(activityJSON.duration)==20 then
else
local itemNew = {}
return edit..'[[Category:Needs level info]]'
itemNew.name = item.name
itemNew.XP = activityJSON.xp
itemNew.lvl = activityJSON.level
itemNew.profession = activityJSON.profession
itemNew.duration = activityJSON.duration
itemNew.product = activityJSON.output[1].name
itemNew.XPperHour = itemNew.XP and tonumber(itemNew.XP) and itemNew.duration and tonumber(itemNew.duration) and tonumber(itemNew.XP) * 3600 / tonumber(itemNew.duration)
itemNew.fitXP = xpdata.knowledge[itemNew.lvl]*4*0.0005
if itemNew.lvl>=200 then
itemNew.fitXP = itemNew.fitXP * 4
end
itemNew.fitXP = math.floor(itemNew.fitXP * 100 ) / 100
local query = mw.smw.ask('[[Sold item::' .. itemNew.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
if type(query)=='table' then
-- price is returned as a number
itemNew.productSellPrice = tonumber(query[1].data)*0.005
else
-- will return nil if the item is not in a shop, or if it is in a shop but can only be sold to the shop
itemNew.productSellPrice = nil
end
table.insert(resultsScreened,itemNew)
end
end
end
end
end
-- sort the results by recipe level
local function durationarg(duration)
table.sort(resultsScreened, function(item1, item2)
if hc(duration) then
local lvl1 = item1.lvl
return duration..' seconds'
local lvl2 = item2.lvl
else
if (lvl1 == nil) ~= (lvl2 == nil) then --one of two are empty
return edit..'[[Category:Needs duration info]]'
return lvl2 == nil -- true if lvl2 is nil but not lvl1, false if lvl1 is nil but not lvl2
end
end
if lvl1 == nil then
end
return false -- Both empty, equivalent
end
local smw_properties = {
return lvl1 < lvl2 -- normal comparison
['Skill node name'] = args.name,
end)
['Uses profession'] = args.profession,

['Profession level'] = args.level,
return resultsScreened
['Activity XP'] = args.xp,

['Activity album XP'] = album_xp_data[tonumber(args.level)],
end
['Activity KP'] = args.kp,

['Activity duration'] = args.duration,
-- make the table
['Activity coins'] = args.coins,
function p.displayTable(results)
['Activity input'] = args.input,
['Activity container'] = 'test',
-- straight copy from Infobox Recipe, its good to have a standard format
['Activity JSON'] = mw.text.jsonEncode({test = true})
}
mw.smw.set(smw_properties)
local out = mw.html.create('table')
local out = mw.html.create('table')
:addClass('wikitable')
:addClass('wikitable sortable')
:tag('tr')
:tag('tr')
:tag('th')
:tag('th')
:attr{ colspan = '2' }
:wikitext('Page')
:wikitext(args.name)
:done()
:done()
:done()
:tag('tr')
:tag('th')
:tag('th')
:wikitext('Level required')
:wikitext('Product')
:done()
:done()
:tag('td')
:tag('th')
:wikitext(levelarg(args.profession, args.level))
:wikitext('Profession')
:done()
:done()
:done()
:tag('tr')
:tag('th')
:tag('th')
:IF(passive)
:wikitext('Level')
:wikitext('[[File:Passive small icon.png|20x20px|link=Passive Activity]] [['..args.profession..'|'..args.profession..' XP]] ')
:node(tooltip._span{ 'passive' })
:node(tooltip._div{ name = 'passive', content = 'Passive activities give reduced experience when a players level is high enough to perform a new passive activity for that profession. The number shown here is the full experience.' })
:ELSE()
:wikitext('[['..args.profession..'|'..args.profession..' XP]]')
:END()
:done()
:done()
:tag('td')
:tag('th')
:wikitext(exparg(args.xp))
:wikitext('XP')
:done()
:done()
:done()
:tag('tr')
:tag('th')
:tag('th')
:wikitext('[[Album|Album XP]]')
:wikitext('0.0005 of levelup XP')
:done()
:done()
:tag('td')
:tag('th')
:wikitext(albumxp or 'Unknown')
:wikitext('sell price<br>per action')
:done()
:done()
:done()
:tag('tr')
:tag('th')
:tag('th')
:wikitext('Duration')
:wikitext('Duration')
:done()
:done()
:tag('td')
:tag('th')
:wikitext(durationarg(args.duration))
:wikitext('XP/hr')
:done()
:done()
:done()
:done()

for i, item in ipairs(results) do
if hc(args.respawn) then
local row = out:tag('tr')
out
:tag('tr')
:tag('th')
--level
:wikitext('Respawn time')
:tag('td')
:done()
:wikitext(item.name)
:tag('td')
:wikitext(durationarg(args.respawn))
:done()
:done()
:done()
:tag('td')
end
:wikitext('[[' .. item.product .. ']]')
if hc(args.tool) then
out
:tag('tr')
:tag('th')
:wikitext('Required tool')
:done()
:tag('td')
:wikitext(args.tool)
:done()
:done()
:done()
:tag('td')
end
:wikitext('[[' .. item.profession .. ']]')
if hc(args.input) then
out
:tag('tr')
:tag('th')
:wikitext('Required input')
:done()
:tag('td')
:wikitext(args.input)
:done()
:done()
:done()
:tag('td')
:wikitext(item.lvl)
:done()
:tag('td')
:wikitext(item.XP)
:done()
:tag('td')
:wikitext(item.fitXP)
:done()
:tag('td')
:wikitext(item.productSellPrice)
:done()
:tag('td')
:wikitext(item.duration)
:done()
:tag('td')
:wikitext(item.XPperHour)
:done()

:done()
end
end

return out
end

function p.fisherPages()

local query = {
'[[Variant of::Flounder||Eel||Pufferfish||Gurnard||Bass||Ray||Cod]]',
'? #- = name',
'?Profession Level A = level',
'?Variant of = variant',
'sort = Variant of,Profession Level A',
'limit = 500'
}
local results = mw.smw.ask(query)
for _,page in ipairs(results) do
if hc(args.container) then
local result = mw.smw.ask('[['..page.name..' (skill node)]]|?Activity JSON = data')
out
page.JSON = (result and result[1] and result[1].data) or ''
:tag('tr')
if type(page.JSON)=='table' then
:tag('th')
page.JSON = table.concat(page.JSON,'<br>')
:wikitext('Required container')
end
:done()
:tag('td')
:wikitext(args.container)
:done()
:done()
end
end
local out = mw.html.create('table')
if hc(args.coins) then
:addClass('wikitable sortable')
out
:tag('tr')
:tag('tr')
:tag('th')
:tag('th')
:wikitext('Coins')
:wikitext('Variant')
:done()
:tag('td')
:wikitext(currency.parse(args.coins))
:done()
:done()
:done()
:tag('th')
:wikitext('Level')
:done()
:tag('th')
:wikitext('Page')
:done()
:tag('th')
:wikitext('Node')
:done()
:tag('th')
:wikitext('Node JSON')
:done()
:done()

for i, item in ipairs(results) do
local row = out:tag('tr')
--level
:tag('td')
:wikitext(item.variant)
:done()
:tag('td')
:wikitext(item.level)
:done()
:tag('td')
:wikitext('[['..item.name..']]')
:done()
:tag('td')
:wikitext('[['..item.name..' (skill node)]]')
:done()
:tag('td')
:wikitext(item.JSON)
:done()
end
end
return out
return out

end
end



Latest revision as of 16:40, 20 December 2024

Module documentation
This documentation is transcluded from Module:Sandbox/User:Alsang/doc. [edit] [history] [purge]
This module does not have any documentation. Please consider adding documentation at Module:Sandbox/User:Alsang/doc. [edit]
Module:Sandbox/User:Alsang's function main is invoked by Template:Sandbox/User:Alsang.
Module:Sandbox/User:Alsang requires Module:Currency.
Module:Sandbox/User:Alsang requires Module:Mw.html extension.
Module:Sandbox/User:Alsang requires Module:Paramtest.
Module:Sandbox/User:Alsang requires strict.
Module:Sandbox/User:Alsang loads data from Module:Experience/data.

require('strict')
require('Module:Mw.html extension')
local param = require( 'Module:Paramtest' )
local currency = require('Module:Currency')
local lang = mw.getContentLanguage()
local xpdata = mw.loadData('Module:Experience/data')

local p = {}

-- non dynamic module, no inputs
function p.main()
	
	-- returns only directly needed parameter needed for the row,
	-- other parameters are determined by subqueries of chained pages
	local query = {
		'[[Activity JSON::~*]]',
		'? = name',
		'?Activity JSON = activityJSON',
		'limit = 1500'
	}
	local results = mw.smw.ask(query)
	
	results = p.screenResults(results)

	return p.displayTable(results)
	
	--for debugging
	--return '<pre>'..mw.text.jsonEncode(results, mw.text.JSON_PRETTY)..'</pre>'

end

-- goes through a list of results and culls the ones which are not needed for this table
function p.screenResults(results)
	local resultsScreened = {}
	
	-- iterate through products
	for _, item in ipairs(results) do
		
		-- if theres only one activity, wrap in table
		if type(item.activityJSON)=='string' then
			item.activityJSON = { item.activityJSON }
		end
		
		for j,json in ipairs(item.activityJSON) do
		
			local activityJSON = mw.text.jsonDecode(json)
			
			if activityJSON.duration and tonumber(activityJSON.duration)==20 then
				local itemNew = {}
				itemNew.name = item.name
				itemNew.XP = activityJSON.xp
				itemNew.lvl = activityJSON.level
				itemNew.profession = activityJSON.profession
				itemNew.duration = activityJSON.duration
				itemNew.product = activityJSON.output[1].name
				
				itemNew.XPperHour = itemNew.XP and tonumber(itemNew.XP) and itemNew.duration and tonumber(itemNew.duration) and tonumber(itemNew.XP) * 3600 / tonumber(itemNew.duration)
				
				itemNew.fitXP = xpdata.knowledge[itemNew.lvl]*4*0.0005
				if itemNew.lvl>=200 then
					itemNew.fitXP = itemNew.fitXP * 4
				end
				itemNew.fitXP = math.floor(itemNew.fitXP * 100 ) / 100
				
				local query = mw.smw.ask('[[Sold item::' .. itemNew.product .. ']][[Shop sell price::!~N/A]]|?Shop sell price=data|mainlabel=-')
					if type(query)=='table' then
					-- price is returned as a number
					itemNew.productSellPrice = tonumber(query[1].data)*0.005
				else
					-- will return nil if the item is not in a shop, or if it is in a shop but can only be sold to the shop
					itemNew.productSellPrice = nil
				end
				
				table.insert(resultsScreened,itemNew)
			end
		end
	end
	
	-- sort the results by recipe level
	table.sort(resultsScreened, function(item1, item2)
		local lvl1 = item1.lvl
		local lvl2 = item2.lvl
		if (lvl1 == nil) ~= (lvl2 == nil) then --one of two are empty
			return lvl2 == nil -- true if lvl2 is nil but not lvl1, false if lvl1 is nil but not lvl2
		end
		if lvl1 == nil then
			return false  -- Both empty, equivalent
		end
		return lvl1 < lvl2 -- normal comparison
	end)

	return resultsScreened

end

-- make the table
function p.displayTable(results)
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('Page')
			:done()
			:tag('th')
				:wikitext('Product')
			:done()
			:tag('th')
				:wikitext('Profession')
			:done()
			:tag('th')
				:wikitext('Level')
			:done()
			:tag('th')
				:wikitext('XP')
			:done()
			:tag('th')
				:wikitext('0.0005 of levelup XP')
			:done()
			:tag('th')
				:wikitext('sell price<br>per action')
			:done()
			:tag('th')
				:wikitext('Duration')
			:done()
			:tag('th')
				:wikitext('XP/hr')
			:done()
		:done()

	for i, item in ipairs(results) do
		local row = out:tag('tr')
		
			--level
			:tag('td')
				:wikitext(item.name)
			:done()
			:tag('td')
				:wikitext('[[' .. item.product .. ']]')
			:done()
			:tag('td')
				:wikitext('[[' .. item.profession .. ']]')
			:done()
			:tag('td')
				:wikitext(item.lvl)
			:done()
			:tag('td')
				:wikitext(item.XP)
			:done()
			:tag('td')
				:wikitext(item.fitXP)
			:done()
			:tag('td')
				:wikitext(item.productSellPrice)
			:done()
			:tag('td')
				:wikitext(item.duration)
			:done()
			:tag('td')
				:wikitext(item.XPperHour)
			:done()

		:done()
	end

	return out
end

function p.fisherPages()

	local query = {
		'[[Variant of::Flounder||Eel||Pufferfish||Gurnard||Bass||Ray||Cod]]',
		'? #- = name',
		'?Profession Level A = level',
		'?Variant of = variant',
		'sort = Variant of,Profession Level A',
		'limit = 500'
	}
	local results = mw.smw.ask(query)
	
	for _,page in ipairs(results) do
		 local result = mw.smw.ask('[['..page.name..' (skill node)]]|?Activity JSON = data')
		 page.JSON = (result and result[1] and result[1].data) or ''
		 if type(page.JSON)=='table' then
		 	page.JSON = table.concat(page.JSON,'<br>')
		 end
	end
	
	local out = mw.html.create('table')
		:addClass('wikitable sortable')
		:tag('tr')
			:tag('th')
				:wikitext('Variant')
			:done()
			:tag('th')
				:wikitext('Level')
			:done()
			:tag('th')
				:wikitext('Page')
			:done()
			:tag('th')
				:wikitext('Node')
			:done()
			:tag('th')
				:wikitext('Node JSON')
			:done()
		:done()

	for i, item in ipairs(results) do
		local row = out:tag('tr')
		
			--level
			:tag('td')
				:wikitext(item.variant)
			:done()
			:tag('td')
				:wikitext(item.level)
			:done()
			:tag('td')
				:wikitext('[['..item.name..']]')
			:done()
			:tag('td')
				:wikitext('[['..item.name..' (skill node)]]')
			:done()
			:tag('td')
				:wikitext(item.JSON)
			:done()
			
	end
	
	return out

end

return p