Module:RankedWars: Difference between revisions

From NPOWiki
Jump to navigation Jump to search
derp
add clear
Line 1: Line 1:
--todo: handle ongoing wars (end = 0). Display war.note if present. War lookup without faction (special case for internal).
--todo: handle ongoing wars (end = 0). Display war.note if present. War lookup without faction (special case for internal).
--todo: use clear template (need to make it)
--local data = mw.loadData('Module:RankedWars/data')
--local data = mw.loadData('Module:RankedWars/data')
local jsonData = mw.loadJsonData('Module:RankedWars/data.json')
local jsonData = mw.loadJsonData('Module:RankedWars/data.json')
Line 71: Line 72:
local out = ''
local out = ''
--The JSON sorts the wars numerically, we want newest first
--The JSON sorts the wars numerically and pairs is random, we want newest first
for warID, warData in pairs(wars) do
for warID, warData in pairs(wars) do
table.insert(warIDs, 1, warID)
table.insert(warIDs, 1, warID)
Line 114: Line 115:
end
end
out = out .. '*[https://www.torn.com/war.php?step=rankreport&rankID=' .. warData.id .. ' War report on Torn]\n'
out = out .. '*[https://www.torn.com/war.php?step=rankreport&rankID=' .. warData.id .. ' War report on Torn]\n'
out = out .. '<br style="clear:both" />\n'
out = out .. '\n'
out = out .. '\n'
end
end

Revision as of 14:13, 16 October 2025

Documentation [edit]

This page is a stub - it only covers the very basics of its subject. More information should be added to make the page informative and useful. If no more information is available, the page should be considered for a merge, redirect, or deletion.

Details: documentation to be written

If you can correct the issue, please edit the page to do so, then remove this notice.

Please see Template:Ranked war for usage information. Use the template rather than invoking the module. Data for this module is imported from Module:RankedWars/data and Module:RankedWars/data.json.

For how to update data, please see Module:RankedWars/data/doc.

The above documentation is transcluded from Module:RankedWars/doc.

--todo: handle ongoing wars (end = 0). Display war.note if present. War lookup without faction (special case for internal).
--todo: use clear template (need to make it)
--local data = mw.loadData('Module:RankedWars/data')
local jsonData = mw.loadJsonData('Module:RankedWars/data.json')

local p = {}

local function factionName(facKey)
	return mw.ustring.upper(mw.ustring.sub(facKey, 1, 1)) .. mw.ustring.sub(facKey, 2)
end

local function displayFactionStats(faction)
	local capName = factionName(faction)
	local overall = jsonData.wars.overall[faction]
		
	return table.concat({
		'NPO - ' .. capName,
		'has participated in',
		overall.wars,
		'ranked wars, winning',
		overall.wins,
		'(' .. overall.termedWins .. ' termed)',
		'and losing',
		overall.losses,
		'(' .. overall.termedLosses .. ' termed).',
	}, ' ')
end

local function displayWarData(faction, warId)
	local capName = factionName(faction)
	local warData = jsonData.wars[faction][warId]
		
	local outcome = 'fought'
	if warData.win then
		outcome = 'won against'
	else
		outcome = 'lost to'
	end
	local terms = 'war'
	if warData.termed then
		terms = 'termed war'
	end
	local opponent = mw.getCurrentFrame():expandTemplate({
		title = 'Tornp',
		args = { warData.oppName }
	})
	
	return table.concat({
		'NPO - ' .. capName,
		outcome,
		opponent,
		'in a',
		terms,
		'that started at',
		os.date('!%F %T TCT', warData.start),
		'and lasted',
		string.format('%.0f', (warData['end'] - warData['start']) / 3600),
		'hours. With a lead target of',
		warData.target .. ',',
		capName,
		'scored',
		warData.ourScore,
		'while the opponent scored',
		warData.oppScore .. '.',
	}, ' ')
end

local function displayWarHistory(faction, args)
	local warIDs = {}
	local repeats = {}
	local wars = jsonData.wars[faction]
	local out = ''
	
	--The JSON sorts the wars numerically and pairs is random, we want newest first
	for warID, warData in pairs(wars) do
		table.insert(warIDs, 1, warID)
		if repeats[warData.oppName] then
			repeats[warData.oppName] = repeats[warData.oppName] + 1
		else
			repeats[warData.oppName] = 1
		end
	end
	table.sort(warIDs, function(wa, wb)
		return wb < wa
	end)
	
	for _, id in ipairs(warIDs) do
		local warData = wars[id]

		local heading = warData.oppName
		local disambig
		if repeats[warData.oppName] > 1 then
			disambig = os.date('!%b %Y', warData.start)
			heading = heading .. ' (' .. disambig .. ')'
		end
		out = out .. '===' .. heading .. '===\n'
		out = out .. '[' .. '[' .. 'File:' .. faction .. ' vs ' .. warData.oppName .. ' ranked war graph.png|right|400px|alt=Ranked war graph]]\n'
		local warpage
		if mw.ustring.find(args['has page'], ',' .. warData.id .. ',', 1, true) then
			warpage = warData.oppName .. ' Ranked War'
			if disambig then
				warpage = warpage .. ' (' .. disambig .. ')'
			end
		end
		if warpage then
			out = out .. mw.getCurrentFrame():expandTemplate({
				title = 'main',
				args = { warpage }
			}) .. '\n'
		end
		out = out .. displayWarData(faction, warData.id) .. '\n'
		local blurb = args[tostring(warData.id)]
		if blurb then
			out = out .. '\n' .. blurb .. '\n'
		end
		out = out .. '*[https://www.torn.com/war.php?step=rankreport&rankID=' .. warData.id .. ' War report on Torn]\n'
		out = out .. '<br style="clear:both" />\n'
		out = out .. '\n'
	end
	
	return out
end

function p.main(frame)
	return p.call(frame:getParent().args)
end

function p.call(args)
	local faction, war, mode
	
	if args[1] then
		faction = mw.ustring.lower(args[1])
	end
	if args[2] then
		war = tonumber(args[2])
	end
	mode = args.mode
	args['has page'] = mw.ustring.gsub(
		',' .. (args['has page'] or '') .. ',',
		' ',
		''
	)
	
	if not faction then
		return '<span class="error">faction is currently required</span>'
	end
	
	if faction and not jsonData.factions[faction] then
		return '<span class="error">incorrect faction name</span>'
	end
	if faction and war and not jsonData.wars[faction][war] then
		return '<span class="error">specified war not found for the given faction</span>'
	end
	
	if mode == 'history' then
		return displayWarHistory(faction,  args)
	elseif mode == 'overall' then
		return displayFactionStats(faction)
	elseif mode == 'war' then
		if not war then
			return '<span class="error">war id must be specified for war lookup</span>'
		end
		return displayWarData(faction, war)
	else
		return '<span class="error">mode is currently required</span>'
	end
end

return p