Módulo:Get production info

De RuneScape Wiki
Ir para: navegação, pesquisa

A documentação para este módulo pode ser criada em Módulo:Get production info/doc

local p = {}
local geprice = require('Módulo:Mercado')._price
local commas = require('Módulo:Addcommas')
local skillpic = require('Módulo:Ícone')._main
local hc = require('Módulo:Paramtest').has_content
local yesno = require('Módulo:Yesno')
local purge = require('Módulo:Purge')._purge
local lang = mw.getContentLanguage()
local aliases = mw.loadData('Módulo:Get production info/aliases')

local sortskillmap = { ['agilidade']=1000, ['arco e flecha']=2000, ['arqueologia']=3000, ['agricultura']=4000, ['artesanato']=5000, ['arte de fogo']=6000, ['caça']=7000, ['combate à distância']=8000, ['construção']=9000, ['corte de lenha']=10000, ['criação de runas']=11000,  ['culinária']=12000, ['divinação']=13000, ['dungeon']=14000, ['evocação']=15000, ['extermínio']=16000, ['herbologia']=17000,['invenção']=18000, ['magia']=19000, ['melee']=20000, ['metalurgia']=21000, ['mineração']=22000, ['pesca']=23000, ['oração']=24000, ['roubo']=25000}

local function cleanName(name)
	local cleaned = string.gsub(name, "%p", "")
	
	if #cleaned then
		return cleaned
	end
	
	return name
end

local function cleanNameSort(t1, t2)
	local clean1 = cleanName(t1[1])
	local clean2 = cleanName(t2[1])

	return clean1 < clean2
end

function p.main(frame)
	return p._main(frame:getParent())
end
function p._main(frame)
	local args = frame.args
	local material = args[1] or args.material or mw.title.getCurrentTitle().text
	local showxp = yesno(args.xp) or false
	local skillsort =  false
	if hc(args.skillsort) then
		skillsort = args.skillsort
	end
	local methodfilter = 'no method filter'
	if hc(args.exclude) then
		methodfilter = args.exclude
	end

    local query = {
        '[[Made from item::'..material..']]',
        '[[Production JSON::+]]',
        '?=#',
        '?Production JSON',
        limit = args.limit or 100,
        sort = args.sort,
        order = args.order
    }
    local smwdata = mw.smw.ask(query)
    
    local alias = ''
    if aliases[material] then
    	alias = string.lower(aliases[material].name)
    	
    	local aQuery = {
	        '[[Made from item::'..aliases[material].name..']]',
	        '?=#',
	        '?Production JSON',
	        limit = args.limit or 100,
	        sort = args.sort,
	        order = args.order
	    }
	    local aSmwdata = mw.smw.ask(aQuery)
	    
	    if aSmwdata then
	    	if not smwdata then
	    		smwdata = {}
	    	end
	    	for i,v in pairs(aSmwdata) do
	    		v.isalias = true
	    		v.amtadj = aliases[material].adj
	    		table.insert(smwdata, v)
	    	end
	    else
	    	if not smwdata then
		        return string.format('Falha ao encontrar produtos com esse material ou seu alias, verifique se está escrito corretamente. [[Categoria:Lista de usos vazia]]', aliases[material].name)
		    end
	    end
    end
    
    if not smwdata then
        return 'Falha ao encontrar produtos com esse material ou seu alias, verifique se está escrito corretamente. [[Categoria:Lista de usos vazia]]'
    end

    local intro = string.format(":''Esta lista foi criada dinamicamente e mostra os primeiros %s itens em ordem alfabética.''\n:''Para forçar uma atualização desta lista, clique em %s.''\n:''Para obter uma lista completa de itens, clique em <span class='plainlinks'>[%s aqui]</span>.''", (args.limit or 100), purge('Products', 'aqui', 'span'), tostring(mw.uri.fullUrl('Special:Ask', { q = '[[Made from item::'..material..']]', ['p[format]'] = 'table', ['p[limit]'] = 500, ['p[intro]'] = 'Todos os objetos são feitos de: '..material })))

    local mat = string.lower(material)
    local t = mw.html.create('table')
    t   :addClass('wikitable sortable products-list align-right-2 align-right-4 align-right-5 sticky-header')
    local ttlrow = t:tag('tr')
            :tag('th')
                :wikitext('Objeto')
            :done()
            :tag('th')
                :wikitext('Habilidades')
            :done()
            :tag('th')
                :wikitext('Materiais')
            :done()
            :tag('th')
                :wikitext('Preço do MG')
            :done()
    if showxp then
    	ttlrow:tag('th')
    		:wikitext('EXP')
    	:done()
    end

    local rows = 0
    
    table.sort(smwdata, cleanNameSort)

    for _,smw_item in ipairs(smwdata) do
        local prod = smw_item['Production JSON']
        if type(prod) == 'string' then
            prod = { prod }
        end
        for _,prod_json in ipairs(prod) do
            local json_good, prod_t = pcall(mw.text.jsonDecode, mw.text.decode(prod_json))
            if json_good then
                local _found = false
                for _,mat_info in ipairs(prod_t.mats) do
                    if smw_item.isalias and mat_info.name:lower() == alias then
                    	_found = true
                        break
                    elseif mat_info.name:lower() == mat then
                        _found = true
                        break
                    end
                end
                if _found and methodfilter ~= 'no method filter' then
                	if prod_t.method == methodfilter then
                		_found = false
                	end
                end
                if _found then
                    local namestr
                    local prodLink = prod_t.link or prod_t.product
                    local editbtn = '['..tostring(mw.uri.fullUrl(prod_t.product,'action=edit'))..' '..('edit')..']'
                    if (prod_t.quantity or 1) > 1 then
                        namestr = string.format('%s&nbsp;[[%s|%s]] × %s', prod_t.image, prodLink, prod_t.product, prod_t.quantity)
                    else
                        namestr = string.format('%s&nbsp;[[%s|%s]]', prod_t.image, prodLink, prod_t.product)
                    end
                    if (tonumber(prod_t.improved) or 0) > 0 then
                    	namestr = namestr..string.format('<br /><i>(Improved +%s recipe)</i>', prod_t.improved)
                    elseif string.find(prod_t.method or '', '%S') then
                    	namestr = namestr..string.format('<br /><i>(%s)</i>', prod_t.method)
                    end
                    local skills_cell = mw.html.create('td')
                    local skills_ul = skills_cell:tag('ul')
                    skills_ul:addClass('skills-list')
                        :css({
                        	['text-align']='center',
                            ['list-style-type'] = 'none',
                            ['list-style-image'] = 'none',
                            margin = 0
                        })
                    local lvlsort = 0
                    if prod_t.skill == '?' then
                		local skill_li = skills_ul:tag('li')
                		skill_li:wikitext('<small>Desconhecido</small></br>'..editbtn)
                    elseif prod_t.skill ~= 'no' then
                    	local skill_li = skills_ul:tag('li')
                    	skill_li:wikitext(string.format('%s&nbsp;%s', prod_t.level, skillpic(lang:ucfirst(prod_t.skill))))
                    	if skillsort and string.lower(skillsort) == string.lower(prod_t.skill) then
                			lvlsort = prod_t.level
                		elseif not skillsort and tonumber(prod_t.level) then
                			lvlsort = prod_t.level + (sortskillmap[string.lower(prod_t.skill)] or 0)
                		end
                	else
                		local skill_li = skills_ul:tag('li')
                		skills_cell:addClass('table-na')
                		skill_li:wikitext(string.format('None'))
                	end
                    if prod_t.level2 and prod_t.level2 ~= '?' then
                    	local skill_li = skills_ul:tag('li')
                        skill_li:wikitext(string.format('%s&nbsp;%s', prod_t.level2, skillpic(lang:ucfirst(prod_t.skill2))))
                        if skillsort and skillsort == prod_t.skill2 then
                			lvlsort = prod_t.level2
                		end
                    end
                    skills_cell:attr('data-sort-value', lvlsort)
                    local mats_ul = mw.html.create('ul')
                    mats_ul:addClass('products-materials')
                        :css({
                            ['list-style-type'] = 'none',
                            ['list-style-image'] = 'none',
                            margin = 0
                        })
                    local mats_sort = 0
                    for _, mat_info in ipairs(prod_t.mats) do
                        local mat_li = mats_ul:tag('li')
                        local qty = string.gsub(mat_info.quantity, '%-', '–')
                        local matnm = mat_info.name
                        if mat_info.name:lower() == mat then
                            mat_li:addClass('production-selected')
                            mats_sort = tonumber(qty) or 0
                        elseif smw_item.isalias and mat_info.name:lower() == alias then
                        	mat_li:addClass('production-selected')
                        	if tonumber(qty, 10) then
                            	qty = tonumber(qty, 10) * smw_item.amtadj
                            end
                            matnm = material
                            mats_sort = tonumber(qty) or 0
                        end
                        mat_li:wikitext(string.format('%s × [[%s]]', qty, matnm))
                    end
                    local price_cell = mw.html.create('td')
                    local no_price_err, price_raw = pcall(geprice, prod_t.product)
                    if no_price_err then
                        price_cell:wikitext(commas._add(price_raw * (prod_t.quantity or 1)))
                        	:attr('data-sort-value', price_raw * (prod_t.quantity or 1))
                    else
                        price_cell:wikitext('N/D')
                        	:addClass('table-na')
                        	:css({['text-align']='center'})
                        	:attr({ ['title']='Este item não possuí valor disponível no MG.', ['data-sort-value']=0 })
                    end

                    local prow = t:tag('tr')
                        :tag('td')
                        	:attr('data-sort-value', cleanName(prod_t.product))
                            :wikitext(namestr)
                        :done()
                        :node(skills_cell)
                        :tag('td')
                        	:attr('data-sort-value', mats_sort)
                            :node(mats_ul)
                        :done()
                        :node(price_cell)
                    rows = rows + 1
                    
                    if showxp then
                    	local xpul = mw.html.create('ul')
                    	local hasxp, unknownxp = false, false
                    	xpul:addClass('skills-list')
	                    	:css({
	                            ['list-style-type'] = 'none',
	                            ['list-style-image'] = 'none',
	                            margin = 0
	                        })
	                    local xpsort = 0
                    	if prod_t.exp and prod_t.exp ~= '?' then
                    		hasxp = true
                    		xpul:tag('li')
                    			:wikitext( string.format( '%s&nbsp;%s', prod_t.exp, skillpic(lang:ucfirst(prod_t.skill)) ) )
                    		if skillsort and skillsort == prod_t.skill then
                    			xpsort = prod_t.exp
                    		elseif not skillsort and tonumber(prod_t.exp) then
                    			xpsort = xpsort + prod_t.exp
                    		end
                		elseif prod_t.exp == '?' then
                			unknownxp = true
                    	end
                    	if prod_t.exp2 and prod_t.exp2 ~= '?' then
                    		hasxp = true
                    		xpul:tag('li')
                    			:wikitext( string.format( '%s&nbsp;%s', prod_t.exp2, skillpic(lang:ucfirst(prod_t.skill2)) ) )
                    		if skillsort and skillsort == prod_t.skill2 then
                    			xpsort = prod_t.exp2
                    		elseif not skillsort and tonumber(prod_t.exp2) then
                    			xpsort = xpsort + prod_t.exp2
                    		end
                		elseif prod_t.exp2 == '?' then
                			unknownxp = true
                    	end
                    	if hasxp then
	                    	prow:tag('td')
	                    		:attr('data-sort-value', xpsort)
	                    		:node(xpul)
	                    	:done()
	                    elseif unknownxp then
                    		prow:tag('td')
                    			:wikitext('<small>Desconhecido</small></br>'..editbtn)
                			:done()
            			else
	                    	prow:tag('td')
	                    		:addClass('table-na')
	                    		:css({['text-align']='center'})
	                    		:attr({ ['title']='Este item não concede experiência.', ['data-sort-value']=0 })
	                    		:wikitext('N/D')
	                    	:done()
	                    end
                    end
                end
            end
        end
    end

    if rows == 0 then
        return 'Falha ao encontrar produtos com esse material ou seu alias, verifique se está escrito corretamente.[[Categoria:Lista de usos vazia]]'
    end

    return intro..'\n'..tostring(t)
end

return p