Module:RankedWars
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.
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)
-- War lookup without faction (special case for internal) - remember to use faction name not shell name.
-- 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 displayDataJson(ugly)
local flag = mw.text.JSON_PRETTY
if ugly and ugly ~= '' then
flag = 0
end
return mw.text.jsonEncode(data, flag)
end
local function displayFactionStats(faction)
local capName = factionName(faction)
local overall = jsonData.wars.overall[faction]
local warplural = 'wars'
if overall.wars == 1 then
warplural = 'war'
end
return table.concat({
'NPO - ' .. capName,
'has participated in',
overall.wars,
'ranked ' .. warplural .. ', 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 }
})
local hours = string.format('%.0f', (warData['end'] - warData['start']) / 3600)
local hourplural = 'hours'
if tonumber(hours) == 1 then
hourplural = 'hour'
end
return mw.text.trim(table.concat({
'NPO - ' .. capName,
outcome,
opponent,
'in a',
terms,
'that started at',
os.date('!%F %T TCT', warData.start),
'and lasted',
hours .. ' ' .. hourplural .. '.',
'With a lead target of',
warData.target .. ',',
capName,
'scored',
warData.ourScore,
'while the opponent scored',
warData.oppScore .. '.',
warData.note or '',
}, ' '))
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'
local filename = faction .. ' vs ' .. warData.oppName
if disambig then
filename = filename .. ' (' .. disambig .. ')'
end
filename = filename .. ' ranked war graph.png'
out = out .. '[' .. '[' .. 'File:' .. filename .. '|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 and not (mode == 'json') then
return '<span class="error">faction is currently required</span>'
end
if faction and not data.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)
elseif mode == 'json' then
return displayDataJson(args.ugly)
elseif mode then
return '<span class="error">unrecognized mode</span>'
else
return '<span class="error">mode is currently required</span>'
end
end
return p