Module:SourcesQuery: Difference between revisions

From IdleOn MMO Wiki
mNo edit summary
mNo edit summary
 
(28 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local cargo = mw.ext.cargo
local cargo = mw.ext.cargo
local fullList = {}
local Utility = require('Module:Utility')


function p.Main( frame )
local function concatSourceStings(...)
local item = frame.args.item
local strings = {...}
local result = ''
local fullString = ''
-- SmithingSources(item)
DropTableSources(item)
-- QuestSources(item)
-- VendorSources(item)
-- PostOfficeSources(item)
-- CustomSources(item)
if #fullList == 0 then  
for n=1, #strings do
result = 'Unobtainable'
if strings[n] ~= '' then
else
if fullString ~= '' then fullString = fullString .. ', ' end
result = table.concat(fullList, ', ')
fullString = fullString .. strings[n]
end
end
end
mw.ext.VariablesLua.vardefine('Sources', result) -- Set LuaVar variable Sources so that we don't need to re-query on the same page.
return result
return fullString ~= '' and fullString or 'Unobtainable'
end
end


function SmithingSources(item)
local function SmithingSources(item)
local tables = 'AnvilCraft'
local tables = 'AnvilCraft'
     local fields = 'RecipeFrom'
     local fields = 'RecipeFrom'
Line 33: Line 27:
     if #results == 0 then return end -- if no results, return original string and continue.
     if #results == 0 then return end -- if no results, return original string and continue.
     local from = ''
     local from = ''
    -- Unless there are two recipes for an item, this should only have one entry.
if 'Start' ~= results[1].RecipeFrom then
from = string.format(' (%s)', results[1].RecipeFrom)
end
    return string.format('[[Smithing]]%s', from)
end
local function NormalDropTableSources(item)
local fullList = {}
local tables = 'NormalDropTables'
    local fields = 'DropSource'
    local args = {
        where = 'NormalDropTables.DroppedItem="'.. item .. '"',
        groupBy = 'NormalDropTables.DropSource',
        orderBy = 'NormalDropTables.DropSource ASC'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local source = ''
     for r = 1, #results do
     for r = 1, #results do
    if 'Start' ~= result[r].RecipeFrom then
        source = results[r].DropSource
    from = string.format(' (%)', results[r].RecipeFrom)
         fullList[r] = string.format('[[%s]]', source)
    end
         fullList[#fullList+1] = string.format('[[Smithing]]%s', from)
     end
     end
      
      
    return table.concat(fullList, ", ")
end
local function EnemiesByRareTable(rareTableName, rarityID)
local results = {}
-- Find all Enemies that append the rare table denoted by rareTableName and return a list of their page links.
if rarityID == 'R' then
-- Query NormalDropTables for every source that 'drops' the table.
local tables = 'NormalDropTables'
    local fields = 'DropSource'
    local args = {
        where = 'DroppedItem IN ('.. rareTableName ..')',
        groupBy = 'DropSource',
    }
    local sources = cargo.query( tables, fields, args )
    if #sources == 0 then return '' end
    local source = ''
    for r = 1, #sources do
        results[r] = sources[r].DropSource
    end
    return table.concat(results, ", ")
elseif rarityID == 'MR' then
-- Query RareDropTables for every source that 'drops' the table. Then get every enemy in the NormalDropTables that drops that table.
local tables = 'RareDropTables'
    local fields = 'DropSourceEntity'
    local args = {
        where = 'DropItem='.. rareTableName,
        groupBy = 'DropSourceEntity',
    }
    local sources = cargo.query( tables, fields, args )
    if #sources == 0 then return '' end
    local source = ''
    for r = 1, #sources do
    source = sources[r].DropSourceEntity
        results[r] = string.format('"%s"', source)
    end
    -- Return the values generated by the Rare tables that call this Super Drop Table.
    return EnemiesByRareTable(table.concat(results, ", "), "R")
else
return "Enemy Lookup Error. Unknown Table Structure for table: " .. rareTableName
end
end
end


function DropTableSources(item)
local function RareDropTableSources(item)
local tables = 'DropTables'
local fullList = {}
local tables = 'RareDropTables'
     local fields = 'DropSourceEntity'
     local fields = 'DropSourceEntity'
     local args = {
     local args = {
         where = 'DropTables.DropItem="'.. item ..'" AND NOT DropTables.DropSourceEntity LIKE "%DropTable%"',
         where = 'RareDropTables.DropItem="'.. item ..'" AND NOT (DropSourceEntity LIKE "DropTable%" AND TableType="Mega")',
         groupBy = 'DropTables.DropSourceEntity',
         groupBy = 'RareDropTables.DropSourceEntity',
         orderBy = 'DropTables.DropSourceEntity ASC'
         orderBy = 'RareDropTables.DropSourceEntity ASC'
     }
     }
     local results = cargo.query( tables, fields, args )
     local results = cargo.query( tables, fields, args )
     if #results == 0 then return end -- if no results, return original string and continue.
     if #results == 0 then return end -- if no results, return original string and continue.
     local source = ''
     local source = ''
    local prettytext = ''
    local enemylist = ''
    local prefix = ''
     for r = 1, #results do
     for r = 1, #results do
         source = results[r].DropSourceEntity
         source = results[r].DropSourceEntity
         fullList[#fullList+1] = string.format('[[%s]]', source)
        prefix = source:sub(1, 1) == 'S' and 'MR' or 'R' -- If first letter is S then MR, else R for prefix.
        -- Get Substring of source that is a digit followed by any letters,
        prettytext = prefix .. '-' .. source:sub(source:find("(%d+)(%a*)"))
        enemylist = EnemiesByRareTable('"'..source..'"', prefix)
         fullList[r] = string.format('[[%s|%s]] (%s)', source, prettytext, string.format(Utility.tooltipstruct, enemylist, "Sources"))
     end
     end
      
      
    return table.concat(fullList, ", ")
end
end


function QuestSources(item)
local function QuestSources(item)
local fullList = {}
local tables = 'Quests'
local tables = 'Quests'
     local fields = '_pageName'
     local fields = '_pageName'
Line 72: Line 135:
     for r = 1, #results do
     for r = 1, #results do
     source = results[r]._pageName
     source = results[r]._pageName
         fullList[#fullList+1] = string.format('[[%s]]', source)
         fullList[r] = string.format('[[%s]]', source)
     end
     end
      
      
    return table.concat(fullList, ", ")
end
end


function VendorSources(item)
local function VendorSources(item)
local fullList = {}
local tables = 'VendorItems'
local tables = 'VendorItems'
     local fields = 'Vendor'
     local fields = 'Vendor'
Line 89: Line 154:
     for r = 1, #results do
     for r = 1, #results do
         vendor = results[r].Vendor
         vendor = results[r].Vendor
         fullList[#fullList+1] = string.format('[[Vendors#%s|%s]] (Shop)', vendor, vendor)
         fullList[r] = string.format('[[Vendors#%s|%s]] (Shop)', vendor, vendor)
     end
     end
      
      
    return table.concat(fullList, ", ")
end
end


function PostOfficeSources(item)
local function PostOfficeSources(item)
local fullList = {}
local companies = {'Simple Shippin', 'Plan-it Express', 'Dudes Next Door', 'Down Undelivery', 'Alpine Suppliers', 'Cosmic Carrier'}
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 shortNames = {'SS', 'PE', 'DND', 'DU', 'AS', 'CC'} -- Handling it this way so we can control the order.
Line 112: Line 179:
    end
    end
     end
     end
    temp = temp .. '[[Post Office#Companies & Rewards|Post Office]] ('
     local compTable = {}
     local compTable = {}
     for b = 1, #boolTracker do
     for b = 1, #boolTracker do
Line 119: Line 185:
     end
     end
     end
     end
    fullList[#fullList+1] = string.format('[[Post Office#Companies & Rewards|Post Office]] (%s)', table.concat(compTable, ", "))
      
      
    return string.format('[[Post Office#Companies & Rewards|Post Office]] (%s)', table.concat(compTable, ", "))
end
end


function CustomSources(item)
local function CustomSources(item)
local tables = 'Sources'
local fullList = {}
local tables = 'ExtraSourceData'
     local fields = 'Link, SpecialText, EventRules'
     local fields = 'Link, SpecialText, EventRules'
     local args = {
     local args = {
         where = 'Sources.Item="'.. item ..'"',
         where = 'ExtraSourceData.Item="'.. item ..'"',
         orderBy = 'Sources.Source',
         orderBy = 'ExtraSourceData.Source',
     }
     }
     local results = cargo.query( tables, fields, args )
     local results = cargo.query( tables, fields, args )
Line 135: Line 202:
     local link = ''
     local link = ''
     local sText = ''
     local sText = ''
    local tableSize = #fullList
     for r = 1, #results do
     for r = 1, #results do
     link = results[r].Link
     link = results[r].Link
Line 144: Line 212:
         sText = ''
         sText = ''
         end
         end
         fullList[#fullList+1] = string.format('[[%s]]%s', link, sText)
         fullList[tableSize+r] = string.format('[[%s]]%s', link, sText)
     end
     end
     -- If item is a special drop then append the following to the last entry so it isn't split by commas later.
     -- If item is a special drop then append the following to the last entry so it isn't split by commas later.
     if EventRulesCounter > 0 then fullList[#fullList] = fullList[#fullList] .. "<br/>''Additional Event drop.''" end
     if EventRulesCounter > 0 then fullList[#fullList] = fullList[#fullList] .. "<br/>''Additional Event drop.''" end
   
    return table.concat(fullList, ", ")
end
local function RareDropChance(item)
local tables = 'RareDropTables'
    local fields = 'DropRate'
    local args = {
        where = 'RareDropTables.DropItem  = "'.. item ..'"',
        orderBy = 'RareDropTables.DropRate  DESC'
    }
    local results = cargo.query( tables, fields, args )
   
    return results
end
function p.PullSourcesFromList(frame)
local item = frame.args.item
local tables = 'ItemSources'
    local fields = 'SourcesList'
    local args = {
        where = 'ItemSources.Item="'.. item ..'"',
        orderBy = 'ItemSources.Item'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
   
    -- There should only ever be one option if it exists so return that.
    return results[1].SourcesList
      
      
end
end
Line 155: Line 252:
local item = frame.args.item
local item = frame.args.item
local result = ''
local result = ''
local tables = 'DropTables'
local raretext = ''
     local fields = 'DropItem, DropRate'
local tables = 'NormalDropTables'
    -- DropItem="{{{1|{{PAGENAME}}}}}" AND NOT DropSourceEntity LIKE "%DropTable%"
     local fields = 'DropRate'
     local args = {
     local args = {
         where = 'DropTables.DropItem = "'.. item ..'" AND NOT DropSourceEntity LIKE "%DropTable%"',
         where = 'NormalDropTables.DroppedItem  = "'.. item ..'"',
         orderBy = 'DropTables.DropRate DESC'
         orderBy = 'NormalDropTables.DropRate DESC'
     }
     }
     local results = cargo.query( tables, fields, args )
     local results = cargo.query( tables, fields, args )
     if #results == 0 then result = 0 else result = '' .. results[1].DropRate end -- Gets the highest drop rate.
    -- If no results in the Normal tables, then query the rare tables.
    if #results == 0 then
    results = RareDropChance(item)
    raretext = '|raretip=y'
    end
     if #results == 0 then result = 0; raretext = '' else result = tostring(results[1].DropRate) end -- Gets the highest drop rate.
     mw.ext.VariablesLua.vardefine('Chance', result)
     mw.ext.VariablesLua.vardefine('Chance', result)
      
      
     return result
     return result .. raretext
end
 
function p.Main( frame )
local item = frame.args.item
local smith = SmithingSources(item) or ''
local drops = NormalDropTableSources(item) or ''
local rdrop = RareDropTableSources(item) or ''
local quest = QuestSources(item) or ''
local shops = VendorSources(item) or ''
local posts = PostOfficeSources(item) or ''
local custm = CustomSources(item) or ''
local result = concatSourceStings(smith, drops, rdrop, quest, shops, posts, custm)
return result
end
end


return p
return p

Latest revision as of 18:37, 28 March 2024

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

local p = {}
local cargo = mw.ext.cargo
local Utility = require('Module:Utility')

local function concatSourceStings(...)
	local strings = {...}
	local fullString = ''
	
	for n=1, #strings do
		if strings[n] ~= '' then
			if fullString ~= '' then fullString = fullString .. ', ' end
			fullString = fullString .. strings[n]
		end
	end
	
	return fullString ~= '' and fullString or 'Unobtainable'
end

local function SmithingSources(item)
	local tables = 'AnvilCraft'
    local fields = 'RecipeFrom'
    local args = {
        where = 'AnvilCraft.Item="'.. item ..'"',
        orderBy = 'AnvilCraft.Item'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local from = ''
    -- Unless there are two recipes for an item, this should only have one entry.
	if 'Start' ~= results[1].RecipeFrom then 
		from = string.format(' (%s)', results[1].RecipeFrom) 
	end
	
    return string.format('[[Smithing]]%s', from)
end

local function NormalDropTableSources(item)
	local fullList = {}
	local tables = 'NormalDropTables'
    local fields = 'DropSource'
    local args = {
        where = 'NormalDropTables.DroppedItem="'.. item .. '"',
        groupBy = 'NormalDropTables.DropSource',
        orderBy = 'NormalDropTables.DropSource ASC'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local source = ''
    for r = 1, #results do
        source = results[r].DropSource
        fullList[r] = string.format('[[%s]]', source)
    end
    
    return table.concat(fullList, ", ")
end

local function EnemiesByRareTable(rareTableName, rarityID)
	local results = {}
	-- Find all Enemies that append the rare table denoted by rareTableName and return a list of their page links.
	if rarityID == 'R' then
		-- Query NormalDropTables for every source that 'drops' the table.
		local tables = 'NormalDropTables'
	    local fields = 'DropSource' 
	    local args = {
	        where = 'DroppedItem IN ('.. rareTableName ..')',
	        groupBy = 'DropSource',
	    }
	    local sources = cargo.query( tables, fields, args )
	    if #sources == 0 then return '' end 
	    local source = ''
	    for r = 1, #sources do
	        results[r] = sources[r].DropSource
    	end
    	return table.concat(results, ", ")
	elseif rarityID == 'MR' then
		-- Query RareDropTables for every source that 'drops' the table. Then get every enemy in the NormalDropTables that drops that table.
		local tables = 'RareDropTables'
	    local fields = 'DropSourceEntity' 
	    local args = {
	        where = 'DropItem='.. rareTableName,
	        groupBy = 'DropSourceEntity',
	    }
	    local sources = cargo.query( tables, fields, args )
	    if #sources == 0 then return '' end 
	    local source = ''
	    for r = 1, #sources do
	    	source = sources[r].DropSourceEntity
	        results[r] = string.format('"%s"', source)
    	end
    	-- Return the values generated by the Rare tables that call this Super Drop Table.
    	return EnemiesByRareTable(table.concat(results, ", "), "R") 
	else 
		return "Enemy Lookup Error. Unknown Table Structure for table: " .. rareTableName
	end
end

local function RareDropTableSources(item)
	local fullList = {}
	local tables = 'RareDropTables'
    local fields = 'DropSourceEntity'
    local args = {
        where = 'RareDropTables.DropItem="'.. item ..'" AND NOT (DropSourceEntity LIKE "DropTable%" AND TableType="Mega")',
        groupBy = 'RareDropTables.DropSourceEntity',
        orderBy = 'RareDropTables.DropSourceEntity ASC'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local source = ''
    local prettytext = ''
    local enemylist = ''
    local prefix = ''
    for r = 1, #results do
        source = results[r].DropSourceEntity
        prefix = source:sub(1, 1) == 'S' and 'MR' or 'R' -- If first letter is S then MR, else R for prefix.
        -- Get Substring of source that is a digit followed by any letters,
        prettytext = prefix .. '-' .. source:sub(source:find("(%d+)(%a*)"))
        enemylist = EnemiesByRareTable('"'..source..'"', prefix)
        fullList[r] = string.format('[[%s|%s]] (%s)', source, prettytext, string.format(Utility.tooltipstruct, enemylist, "Sources"))
    end
    
    return table.concat(fullList, ", ")
end

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

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

local function PostOfficeSources(item)
	local fullList = {}
	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 args = {
        where = 'PORewards.Item="'.. item ..'"',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local company = ''
    for r = 1, #results do
        company = results[r].Company
        for c = 1, #companies do
	        if company == companies[c] then boolTracker[c] = 1 end
	    end
    end
    local compTable = {}
    for b = 1, #boolTracker do
    	if boolTracker[b] == 1 then 
    		compTable[#compTable+1] = string.format('<span class="simple-tooltip simple-tooltip-inline tooltipstered" style="color: #b847cb;" data-simple-tooltip="%s">[[Post Office#%s|%s]]</span>', companies[b], companies[b], shortNames[b])
    	end
    end
    
    return string.format('[[Post Office#Companies & Rewards|Post Office]] (%s)', table.concat(compTable, ", "))
end

local function CustomSources(item)
	local fullList = {}
	local tables = 'ExtraSourceData'
    local fields = 'Link, SpecialText, EventRules'
    local args = {
        where = 'ExtraSourceData.Item="'.. item ..'"',
        orderBy = 'ExtraSourceData.Source',
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    local EventRulesCounter = 0
    local link = ''
    local sText = ''
    local tableSize = #fullList
    for r = 1, #results do
    	link = results[r].Link
        sText = results[r].SpecialText
        EventRulesCounter = EventRulesCounter + results[r].EventRules
        if sText ~= 'None' then
        	sText = string.format(' (%s)', sText)
        else
        	sText = ''
        end
        fullList[tableSize+r] = string.format('[[%s]]%s', link, sText)
    end
    -- If item is a special drop then append the following to the last entry so it isn't split by commas later.
    if EventRulesCounter > 0 then fullList[#fullList] = fullList[#fullList] .. "<br/>''Additional Event drop.''" end
    
    return table.concat(fullList, ", ")
end

local function RareDropChance(item)
	local tables = 'RareDropTables'
    local fields = 'DropRate'
    local args = {
        where = 'RareDropTables.DropItem  = "'.. item ..'"',
        orderBy = 'RareDropTables.DropRate  DESC'
    }
    local results = cargo.query( tables, fields, args )
    
    return results
end

function p.PullSourcesFromList(frame)
	local item = frame.args.item
	local tables = 'ItemSources'
    local fields = 'SourcesList'
    local args = {
        where = 'ItemSources.Item="'.. item ..'"',
        orderBy = 'ItemSources.Item'
    }
    local results = cargo.query( tables, fields, args )
    if #results == 0 then return end -- if no results, return original string and continue.
    
    -- There should only ever be one option if it exists so return that.
    return results[1].SourcesList
    
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 raretext = ''
	local tables = 'NormalDropTables'
    local fields = 'DropRate'
    local args = {
        where = 'NormalDropTables.DroppedItem  = "'.. item ..'"',
        orderBy = 'NormalDropTables.DropRate DESC'
    }
    local results = cargo.query( tables, fields, args )
    -- If no results in the Normal tables, then query the rare tables.
    if #results == 0 then 
    	results = RareDropChance(item)
    	raretext = '|raretip=y'
    end
    if #results == 0 then result = 0; raretext = '' else result = tostring(results[1].DropRate) end -- Gets the highest drop rate.
    mw.ext.VariablesLua.vardefine('Chance', result)
    
    return result .. raretext
end

function p.Main( frame )
	local item = frame.args.item
	local smith = SmithingSources(item) or ''
	local drops = NormalDropTableSources(item) or ''
	local rdrop = RareDropTableSources(item) or ''
	local quest = QuestSources(item) or ''
	local shops = VendorSources(item) or ''
	local posts = PostOfficeSources(item) or ''
	local custm = CustomSources(item) or ''
	
	local result = concatSourceStings(smith, drops, rdrop, quest, shops, posts, custm)
	
	return result
end

return p