Module:PrizePool: Difference between revisions
From eSportsAmaze
More actions
Esportsamaze (talk | contribs) Created page with "local p = {} local cargo = mw.ext.cargo local html = mw.html local lang = mw.getLanguage('en') -- Helper: Format Number with Commas (Indian Locale is handled by your JS, we just output raw number wrapped in span) local function formatCurrency(amount) if not amount then return "0" end -- We output the raw number inside the span. Your MediaWiki:Common.js 'indian-currency' script -- picks this up and adds the ₹ symbol and correct commas automatically. re..." |
Esportsamaze (talk | contribs) No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local html = mw.html | |||
local cargo = mw.ext.cargo | local cargo = mw.ext.cargo | ||
-- Helper: Format | -- Helper: Format Money (10000 -> 10,000) | ||
local function | local function formatMoney(amount) | ||
if not amount then return "0" end | if not amount then return "0" end | ||
local formatted = amount | |||
while true do | |||
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2') | |||
if (k==0) then break end | |||
end | |||
return formatted | |||
end | end | ||
-- | -- Helper: Get Logo | ||
function | local function getLogo(teamName) | ||
if not teamName or teamName == "" then return "" end | |||
local clean = teamName:gsub("'", "") | |||
local light = clean .. '.png' | |||
local | local dark = clean .. '_dark.png' | ||
local | |||
local | |||
local container = html.create('span') | |||
local | |||
if mw.title.new('File:' .. | if mw.title.new('File:' .. light).exists then | ||
container:wikitext('[[File:' .. light .. '|link=|class=logo-lightmode]]') | |||
else | else | ||
container:wikitext('[[File:Shield_team.png|link=|class=logo-lightmode]]') | |||
end | end | ||
if mw.title.new('File:' .. dark).exists then | |||
if | container:wikitext('[[File:' .. dark .. '|link=|class=logo-darkmode]]') | ||
elseif mw.title.new('File:' .. light).exists then | |||
container:wikitext('[[File:' .. light .. '|link=|class=logo-darkmode]]') | |||
else | else | ||
container:wikitext('[[File:Shield_team_dark.png|link=|class=logo-darkmode]]') | |||
end | end | ||
return tostring( | return tostring(container) | ||
end | end | ||
function p.main(frame) | |||
function p. | |||
local args = frame:getParent().args | local args = frame:getParent().args | ||
local | local currency = args.currency or "₹" | ||
local tournamentName = args.tournament or mw.title.getCurrentTitle().text | |||
-- Main Grid Wrapper | |||
local grid = html.create('div'):addClass('prize-section-grid') | |||
-- ========================================== | |||
-- COLUMN 1: RANKINGS | |||
-- ========================================== | |||
local colRank = grid:tag('div'):addClass('prize-col-rank') | |||
colRank:tag('div'):addClass('prize-header'):wikitext('Prize Pool Distribution') | |||
local rankList = colRank:tag('div'):addClass('prize-list') | |||
local hasRankData = false | |||
local rankCount = 0 | |||
-- Count Total Entries first to decide on collapsing | |||
for i = 1, 64 do | |||
if args['team_'..i] and args['team_'..i] ~= "" then rankCount = rankCount + 1 end | |||
end | |||
local collapseLimit = 7 | |||
local isCollapsible = (rankCount > collapseLimit) | |||
local | |||
local | |||
local | -- Collapsible Container (for ranks 5+) | ||
local hiddenDiv = nil | |||
if isCollapsible then | |||
hiddenDiv = html.create('div') | |||
:addClass('mw-collapsible mw-collapsed') | |||
:attr('id', 'mw-customcollapsible-prizepool') | |||
end | |||
local | for i = 1, 64 do | ||
local place = args['place_'..i] or (i .. '.') | |||
local team = args['team_'..i] | |||
local prize = args['prize_'..i] | |||
local seed = args['seed_'..i] | |||
if team and team ~= "" then | |||
hasRankData = true | |||
-- Store in Cargo | |||
if cargo and cargo.store then | |||
cargo.store('PrizeMoney', { | |||
tournament = tournamentName, | |||
placement = i, | |||
team = team, | |||
prize = prize, | |||
award = '' | |||
}) | |||
end | |||
-- Determine if this row goes in the main list or the hidden list | |||
local targetContainer = rankList | |||
if isCollapsible and i > 4 then | |||
targetContainer = hiddenDiv | |||
end | |||
-- Create Row | |||
local row = targetContainer:tag('div'):addClass('prize-row') | |||
-- Rank Badge (1=Gold, 2=Silver, 3=Bronze) | |||
local rankClass = 'rank-other' | |||
local rankIcon = place | |||
if i == 1 then rankClass = 'rank-1'; rankIcon = '🥇' end | |||
if i == 2 then rankClass = 'rank-2'; rankIcon = '🥈' end | |||
if i == 3 then rankClass = 'rank-3'; rankIcon = '🥉' end | |||
row:addClass(rankClass) | |||
row:tag('div'):addClass('pz-rank'):wikitext(rankIcon) | |||
-- Team Info | |||
local teamDiv = row:tag('div'):addClass('pz-team') | |||
teamDiv:wikitext(getLogo(team)) | |||
teamDiv:wikitext('[[' .. team .. ']]') | |||
-- Info (Prize + Seed) | |||
local infoDiv = row:tag('div'):addClass('pz-info') | |||
if prize and prize ~= "" then | |||
infoDiv:tag('span'):addClass('pz-prize'):wikitext(currency .. ' ' .. formatMoney(prize)) | |||
end | |||
if seed and seed ~= "" then | |||
infoDiv:tag('span'):addClass('pz-seed'):wikitext(seed) | |||
end | |||
end | |||
end | |||
-- | -- Assemble the lists | ||
if not hasRankData then | |||
if | rankList:tag('div'):addClass('prize-empty') | ||
:wikitext('<i class="fa-solid fa-trophy"></i><br>Prize Pool TBD') | |||
else | |||
if isCollapsible then | |||
-- Append the hidden div to the main list | |||
rankList:wikitext(tostring(hiddenDiv)) | |||
-- Add the Toggle Button OUTSIDE the list (visually connected via CSS) | |||
colRank:tag('div') | |||
:addClass('prize-show-more mw-customtoggle-prizepool') | |||
:wikitext('View Full Standings <i class="fa-solid fa-chevron-down"></i>') | |||
end | end | ||
end | end | ||
-- | -- ========================================== | ||
-- COLUMN 2: SPECIAL AWARDS | |||
-- ========================================== | |||
local colAward = grid:tag('div'):addClass('prize-col-award') | |||
colAward:tag('div'):addClass('prize-header'):wikitext('Special Awards') | |||
local awardList = colAward:tag('div'):addClass('prize-list') | |||
local hasAwardData = false | |||
for i = 1, 10 do | |||
local awardName = args['award_'..i] | |||
local winner = args['award_'..i..'_winner'] | |||
local team = args['award_'..i..'_team'] | |||
local prize = args['award_'..i..'_prize'] | |||
if awardName and awardName ~= "" then | |||
hasAwardData = true | |||
-- Store in Cargo | |||
if cargo and cargo.store then | |||
cargo.store('PrizeMoney', { | |||
tournament = tournamentName, | |||
placement = '', | |||
team = team or '', | |||
player = winner, | |||
prize = prize, | |||
award = awardName | |||
}) | |||
end | |||
local row = awardList:tag('div'):addClass('award-row') | |||
-- Left Side: Name | |||
local info = row:tag('div'):addClass('award-info') | |||
info:tag('div'):addClass('award-name'):wikitext(awardName) | |||
local winDiv = info:tag('div'):addClass('award-winner') | |||
if team and team ~= "" then | |||
winDiv:wikitext(getLogo(team)) | |||
end | |||
winDiv:wikitext(winner or "TBD") | |||
-- Right Side: Prize | |||
if prize and prize ~= "" then | |||
row:tag('div'):addClass('award-prize'):wikitext(currency .. formatMoney(prize)) | |||
end | |||
end | |||
end | |||
if | if not hasAwardData then | ||
awardList:tag('div'):addClass('prize-empty') | |||
:wikitext('<i class="fa-solid fa-medal"></i><br>Awards TBD') | |||
end | end | ||
return tostring( | return tostring(grid) | ||
end | end | ||
return p | return p | ||
Revision as of 05:20, 27 January 2026
Documentation for this module may be created at Module:PrizePool/doc
local p = {}
local html = mw.html
local cargo = mw.ext.cargo
-- Helper: Format Money (10000 -> 10,000)
local function formatMoney(amount)
if not amount then return "0" end
local formatted = amount
while true do
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
if (k==0) then break end
end
return formatted
end
-- Helper: Get Logo
local function getLogo(teamName)
if not teamName or teamName == "" then return "" end
local clean = teamName:gsub("'", "")
local light = clean .. '.png'
local dark = clean .. '_dark.png'
local container = html.create('span')
if mw.title.new('File:' .. light).exists then
container:wikitext('[[File:' .. light .. '|link=|class=logo-lightmode]]')
else
container:wikitext('[[File:Shield_team.png|link=|class=logo-lightmode]]')
end
if mw.title.new('File:' .. dark).exists then
container:wikitext('[[File:' .. dark .. '|link=|class=logo-darkmode]]')
elseif mw.title.new('File:' .. light).exists then
container:wikitext('[[File:' .. light .. '|link=|class=logo-darkmode]]')
else
container:wikitext('[[File:Shield_team_dark.png|link=|class=logo-darkmode]]')
end
return tostring(container)
end
function p.main(frame)
local args = frame:getParent().args
local currency = args.currency or "₹"
local tournamentName = args.tournament or mw.title.getCurrentTitle().text
-- Main Grid Wrapper
local grid = html.create('div'):addClass('prize-section-grid')
-- ==========================================
-- COLUMN 1: RANKINGS
-- ==========================================
local colRank = grid:tag('div'):addClass('prize-col-rank')
colRank:tag('div'):addClass('prize-header'):wikitext('Prize Pool Distribution')
local rankList = colRank:tag('div'):addClass('prize-list')
local hasRankData = false
local rankCount = 0
-- Count Total Entries first to decide on collapsing
for i = 1, 64 do
if args['team_'..i] and args['team_'..i] ~= "" then rankCount = rankCount + 1 end
end
local collapseLimit = 7
local isCollapsible = (rankCount > collapseLimit)
-- Collapsible Container (for ranks 5+)
local hiddenDiv = nil
if isCollapsible then
hiddenDiv = html.create('div')
:addClass('mw-collapsible mw-collapsed')
:attr('id', 'mw-customcollapsible-prizepool')
end
for i = 1, 64 do
local place = args['place_'..i] or (i .. '.')
local team = args['team_'..i]
local prize = args['prize_'..i]
local seed = args['seed_'..i]
if team and team ~= "" then
hasRankData = true
-- Store in Cargo
if cargo and cargo.store then
cargo.store('PrizeMoney', {
tournament = tournamentName,
placement = i,
team = team,
prize = prize,
award = ''
})
end
-- Determine if this row goes in the main list or the hidden list
local targetContainer = rankList
if isCollapsible and i > 4 then
targetContainer = hiddenDiv
end
-- Create Row
local row = targetContainer:tag('div'):addClass('prize-row')
-- Rank Badge (1=Gold, 2=Silver, 3=Bronze)
local rankClass = 'rank-other'
local rankIcon = place
if i == 1 then rankClass = 'rank-1'; rankIcon = '🥇' end
if i == 2 then rankClass = 'rank-2'; rankIcon = '🥈' end
if i == 3 then rankClass = 'rank-3'; rankIcon = '🥉' end
row:addClass(rankClass)
row:tag('div'):addClass('pz-rank'):wikitext(rankIcon)
-- Team Info
local teamDiv = row:tag('div'):addClass('pz-team')
teamDiv:wikitext(getLogo(team))
teamDiv:wikitext('[[' .. team .. ']]')
-- Info (Prize + Seed)
local infoDiv = row:tag('div'):addClass('pz-info')
if prize and prize ~= "" then
infoDiv:tag('span'):addClass('pz-prize'):wikitext(currency .. ' ' .. formatMoney(prize))
end
if seed and seed ~= "" then
infoDiv:tag('span'):addClass('pz-seed'):wikitext(seed)
end
end
end
-- Assemble the lists
if not hasRankData then
rankList:tag('div'):addClass('prize-empty')
:wikitext('<i class="fa-solid fa-trophy"></i><br>Prize Pool TBD')
else
if isCollapsible then
-- Append the hidden div to the main list
rankList:wikitext(tostring(hiddenDiv))
-- Add the Toggle Button OUTSIDE the list (visually connected via CSS)
colRank:tag('div')
:addClass('prize-show-more mw-customtoggle-prizepool')
:wikitext('View Full Standings <i class="fa-solid fa-chevron-down"></i>')
end
end
-- ==========================================
-- COLUMN 2: SPECIAL AWARDS
-- ==========================================
local colAward = grid:tag('div'):addClass('prize-col-award')
colAward:tag('div'):addClass('prize-header'):wikitext('Special Awards')
local awardList = colAward:tag('div'):addClass('prize-list')
local hasAwardData = false
for i = 1, 10 do
local awardName = args['award_'..i]
local winner = args['award_'..i..'_winner']
local team = args['award_'..i..'_team']
local prize = args['award_'..i..'_prize']
if awardName and awardName ~= "" then
hasAwardData = true
-- Store in Cargo
if cargo and cargo.store then
cargo.store('PrizeMoney', {
tournament = tournamentName,
placement = '',
team = team or '',
player = winner,
prize = prize,
award = awardName
})
end
local row = awardList:tag('div'):addClass('award-row')
-- Left Side: Name
local info = row:tag('div'):addClass('award-info')
info:tag('div'):addClass('award-name'):wikitext(awardName)
local winDiv = info:tag('div'):addClass('award-winner')
if team and team ~= "" then
winDiv:wikitext(getLogo(team))
end
winDiv:wikitext(winner or "TBD")
-- Right Side: Prize
if prize and prize ~= "" then
row:tag('div'):addClass('award-prize'):wikitext(currency .. formatMoney(prize))
end
end
end
if not hasAwardData then
awardList:tag('div'):addClass('prize-empty')
:wikitext('<i class="fa-solid fa-medal"></i><br>Awards TBD')
end
return tostring(grid)
end
return p