Module:SourcesQuery

From IdleOn MMO Wiki
Revision as of 19:48, 22 September 2023 by Kiokurashi (talk | contribs)

Documentation for this module may be created at Module:SourcesQuery/doc

local p = {}
local cargo = mw.ext.cargo

function p.Main( frame )
	local item = frame.args.item
	local result = ''
	local fullresult = ''
	local recipe = ''
	local drops = ''
	local quests = ''
	local shops = ''
	local postoff = ''
	local other = ''
	recipe  = SmithingSources(item)
	drops   = DropTableSources(item)
	quests  = QuestSources(item)
	shops   = VendorSources(item)
	--postoff = PostOfficeSources(item)
	other   = CustomSources(item)
	
	if (#recipe + #drops + #quests + #shops + #postoff + #other) == 0 then 
		result = 'Unobtainable'
		fullresult = 'Unobtainable' 
	else
		if #recipe > 0 then
			result = result .. recipe
			fullresult = fullresult .. recipe
		end
		if #drops > 0 then
    		if #result > 0 then
    			result = result .. ', ' 
    			fullresult = fullresult .. ', ' 
    		end -- If there was other sources, then insert divider.
			if #drops < 150 then
				result = result .. drops
			else
				result = result .. "Many Drop Tables (Check Item Page)"
			end
			fullresult = fullresult .. drops
		end
		if #quests > 0 then
    		if #result > 0 then
    			result = result .. ', ' 
    			fullresult = fullresult .. ', ' 
    		end -- If there was other sources, then insert divider.
			if #quests < 150 then
				result = result .. quests
			else
				result = result .. "Many Quest Rewards (Check Item Page)"
			end
			fullresult = fullresult .. quests
		end
		if #shops > 0 then
    		if #result > 0 then
    			result = result .. ', ' 
    			fullresult = fullresult .. ', ' 
    		end -- If there was other sources, then insert divider.
			result = result .. shops
			fullresult = fullresult .. shops
		end
		if #postoff > 0 then
    		if #result > 0 then
    			result = result .. ', ' 
    			fullresult = fullresult .. ', ' 
    		end -- If there was other sources, then insert divider.
			result = result .. postoff
			fullresult = fullresult .. postoff
		end
		if #other > 0 then
    		if #result > 0 then
    			result = result .. ', ' 
    			fullresult = fullresult .. ', ' 
    		end -- If there was other sources, then insert divider.
			if #other < 200 then
				result = result .. other
			else
				result = result .. "A lot of other sources (Check Item Page)"
			end
			fullresult = fullresult .. other
		end
	end
	mw.ext.VariablesLua.vardefine('Sources', fullresult) -- Set LuaVar variable Sources so that we don't need to re-query on the same page.
	
	return result
end

function SmithingSources(item)
	local tables = 'AnvilCraft'
    local fields = 'RecipeFrom'
    local temp = ''
    -- _pageName LIKE "{{{1|{{PAGENAME}}}}}"
    local args = {
        where = 'AnvilCraft.Item="'.. item ..'"',
        orderBy = 'AnvilCraft.Item'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    for r = 1, #results do
    	if r > 1 then temp = temp .. ', ' end
    	local from = ' '
        if 'Start' ~= results[r].RecipeFrom then
        	from = ' (' .. results[r].RecipeFrom .. ')'
        end
        temp = temp .. '[[Smithing]]' .. from
    end
    
    return temp
end

function DropTableSources(item)
	local tables = 'DropTables'
    local fields = 'DropSourceEntity'
    local temp = ''
    -- DropItem="{{{1|{{PAGENAME}}}}}" AND NOT DropSourceEntity LIKE "%DropTable%"
    local args = {
        where = 'DropTables.DropItem="'.. item ..'" AND NOT DropTables.DropSourceEntity LIKE "%DropTable%"',
        groupBy = 'DropTables.DropSourceEntity',
        orderBy = 'DropTables.DropSourceEntity ASC'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    for r = 1, #results do
    	if r > 1 then temp = temp .. ', ' end
        local source = results[r].DropSourceEntity
        temp = temp .. '[[' .. source .. ']]'
    end
    
    return temp
end

function QuestSources(item)
	local tables = 'Quests'
    local fields = '_pageName'
    local temp = ''
    -- Rewards HOLDS LIKE "%>{{{1|{{PAGENAME}}}}}<%"
    local args = {
        where = 'Quests.Rewards HOLDS LIKE "%>'.. item ..'<%"',
        groupBy = 'Quests._pageName',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    for r = 1, #results do
    	if r > 1 then temp = temp .. ', ' end
        local source = results[r]._pageName
        temp = temp .. '[[' .. source .. ']]'
    end
    
    return temp
end

function VendorSources(item)
	local tables = 'VendorItems'
    local fields = 'Vendor'
    local temp = ''
    -- Item="{{{1|{{PAGENAME}}}}}"
    local args = {
        where = 'VendorItems.Item="'.. item ..'"',
        orderBy = 'VendorItems.Vendor',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    for r = 1, #results do
    	if r > 1 then temp = temp .. ', ' end
        local vendor = results[r].Vendor
        temp = temp .. '[[Vendors#' .. vendor .. '|' .. vendor .. ']]'
    end
    
    return temp
end

function PostOfficeSources(item)
	local companies = {'Simple Shippin', 'Plan-it Express', 'Dudes Next Door', 'Down Undelivery', 'Alpine Suppliers', 'Cosmic Carrier'}
	local shortNames = {'SS', 'PE', 'DND', 'DU', 'AS', 'CC'} -- Handling it this way so we can control the order.
	local boolTracker = {0, 0, 0, 0, 0, 0} --Used to track which Company offers the same item as a reward.
	local tables = 'PORewards'
    local fields = 'Company'
    local temp = ''
    local args = {
        where = 'PORewards.Item="'.. item ..'"',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    for r = 1, #results do
        local company = results[r].Company
        for c = 1, #companies do
	        if comapny == companies[c] then boolTracker[c] = 1 end
	    end
    end
    temp = temp .. 'Post Office ('
    for b = 1, #boolTracker do
    	if b > 1 then temp = temp .. ', ' end
    	if boolTrackerr[b] == 1 then temp = temp .. '[[Post Office#' .. companies[b] .. '|' .. shortNames[b] .. ']]' end
    end
    temp = temp .. ')'
    
    return temp
end

function CustomSources(item)
	local tables = 'Sources'
    local fields = 'Link, SpecialText, EventRules'
    local temp = ''
    -- Item="{{{1|{{PAGENAME}}}}}"
    local args = {
        where = 'Sources.Item="'.. item ..'"',
        orderBy = 'Sources.Source',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return temp end -- if no results, return original string and continue.
    local EventRulesCounter = 0
    for r = 1, #results do
    	if r > 1 then temp = temp .. ', ' end
        local link = results[r].Link
        local sText = results[r].SpecialText
        EventRulesCounter = EventRulesCounter + results[r].EventRules
        temp = temp .. '[[' .. link .. ']]'
        if sText ~= 'None' then temp = temp .. ' (' .. sText .. ')' end
    end
    if EventRulesCounter > 0 then temp = temp .. "<br/>''Additional Event drop.''" end
    
    return temp
end

-- This one is just to get the Drop Chance value for an Item.
function p.DropChance(frame)
	local item = frame.args.item
	local result = ''
	local tables = 'DropTables'
    local fields = 'DropItem, DropRate'
    -- DropItem="{{{1|{{PAGENAME}}}}}" AND NOT DropSourceEntity LIKE "%DropTable%"
    local args = {
        where = 'DropTables.DropItem = "'.. item ..'" AND NOT DropSourceEntity LIKE "%DropTable%"',
        orderBy = 'DropTables.DropRate DESC'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then result = 0 else result = '' .. results[1].DropRate end -- Gets the highest drop rate.
    mw.ext.VariablesLua.vardefine('Chance', result)
    
    return result
end

return p