Module:Records: Difference between revisions
From eSportsAmaze
More actions
Esportsamaze (talk | contribs) No edit summary |
Esportsamaze (talk | contribs) No edit summary |
||
| Line 17: | Line 17: | ||
local tournamentName = args.tournament or mw.title.getCurrentTitle().text | local tournamentName = args.tournament or mw.title.getCurrentTitle().text | ||
local whereClause = string.format("tournament = '%s'", sqlEscape(tournamentName)) | local whereClause = string.format("tournament = '%s'", sqlEscape(tournamentName)) | ||
-- TOGGLES (Default: true. Set to "false" to hide) | |||
local show_damage = args.show_damage ~= "false" | |||
local show_long_elim = args.show_long_elim ~= "false" | |||
local show_rescues = args.show_rescues ~= "false" | |||
local show_maps = args.show_maps ~= "false" | |||
local show_daily = args.show_daily ~= "false" | |||
local show_single = args.show_single ~= "false" | |||
local show_mvp = args.show_mvp ~= "false" and args.show_mvps ~= "false" | |||
local show_fragger = args.show_fragger ~= "false" | |||
-- ========================================== | -- ========================================== | ||
| Line 24: | Line 34: | ||
local playerMatch = cargo.query("MatchStats_Player", "tournament_day, player, team, player_elims, damage, mvp, long_elim, rescues", { where = whereClause, limit = 5000 }) | local playerMatch = cargo.query("MatchStats_Player", "tournament_day, player, team, player_elims, damage, mvp, long_elim, rescues", { where = whereClause, limit = 5000 }) | ||
local d_team = {}; local d_player = {}; local o_player = {}; local map_rec = {}; local daySet = {} | |||
local d_team = {} | |||
local rec = { | local rec = { | ||
| Line 37: | Line 42: | ||
} | } | ||
if teamMatch then | if teamMatch then | ||
for _, r in ipairs(teamMatch) do | for _, r in ipairs(teamMatch) do | ||
| Line 45: | Line 49: | ||
local map = r.map | local map = r.map | ||
if pts > rec.t_pts.v then rec.t_pts = {n=r.team, v=pts} end | if pts > rec.t_pts.v then rec.t_pts = {n=r.team, v=pts} end | ||
if elims > rec.t_elims.v then rec.t_elims = {n=r.team, v=elims} end | if elims > rec.t_elims.v then rec.t_elims = {n=r.team, v=elims} end | ||
if map and map ~= "" then | if map and map ~= "" then | ||
if not map_rec[map] or pts > map_rec[map].v then map_rec[map] = {n=r.team, v=pts} end | if not map_rec[map] or pts > map_rec[map].v then map_rec[map] = {n=r.team, v=pts} end | ||
end | end | ||
if day and day ~= "" then | if day and day ~= "" then | ||
daySet[day] = true | daySet[day] = true | ||
| Line 65: | Line 66: | ||
end | end | ||
if playerMatch then | if playerMatch then | ||
for _, r in ipairs(playerMatch) do | for _, r in ipairs(playerMatch) do | ||
| Line 76: | Line 76: | ||
local p = r.player | local p = r.player | ||
if elims > rec.p_elims.v then rec.p_elims = {n=p, t=r.team, v=elims} end | if elims > rec.p_elims.v then rec.p_elims = {n=p, t=r.team, v=elims} end | ||
if dmg > rec.p_dmg.v then rec.p_dmg = {n=p, t=r.team, v=dmg} end | if dmg > rec.p_dmg.v then rec.p_dmg = {n=p, t=r.team, v=dmg} end | ||
| Line 82: | Line 81: | ||
if res > rec.rescues.v then rec.rescues = {n=p, t=r.team, v=res} end | if res > rec.rescues.v then rec.rescues = {n=p, t=r.team, v=res} end | ||
if not o_player[p] then o_player[p] = {t=r.team, elims=0, mvp=0} end | if not o_player[p] then o_player[p] = {t=r.team, elims=0, mvp=0} end | ||
o_player[p].elims = o_player[p].elims + elims | o_player[p].elims = o_player[p].elims + elims | ||
o_player[p].mvp = o_player[p].mvp + mvp | o_player[p].mvp = o_player[p].mvp + mvp | ||
if day and day ~= "" then | if day and day ~= "" then | ||
daySet[day] = true | daySet[day] = true | ||
| Line 101: | Line 98: | ||
-- 2. DETERMINE WINNERS | -- 2. DETERMINE WINNERS | ||
-- ========================================== | -- ========================================== | ||
local top_fragger = {n="-", t="-", v=-1} | local top_fragger = {n="-", t="-", v=-1} | ||
local top_mvp = {n="-", t="-", v=-1} | local top_mvp = {n="-", t="-", v=-1} | ||
| Line 109: | Line 105: | ||
end | end | ||
local dayList = {} | local dayList = {} | ||
for day in pairs(daySet) do table.insert(dayList, day) end | for day in pairs(daySet) do table.insert(dayList, day) end | ||
| Line 117: | Line 112: | ||
for _, day in ipairs(dayList) do | for _, day in ipairs(dayList) do | ||
dailyWinners[day] = { t_pts = {n="-", v=-1}, p_elims = {n="-", t="-", v=-1} } | dailyWinners[day] = { t_pts = {n="-", v=-1}, p_elims = {n="-", t="-", v=-1} } | ||
if d_team[day] then | if d_team[day] then | ||
for t, d in pairs(d_team[day]) do | for t, d in pairs(d_team[day]) do if d.pts > dailyWinners[day].t_pts.v then dailyWinners[day].t_pts = {n=t, v=d.pts} end end | ||
end | end | ||
if d_player[day] then | if d_player[day] then | ||
for p, d in pairs(d_player[day]) do | for p, d in pairs(d_player[day]) do if d.elims > dailyWinners[day].p_elims.v then dailyWinners[day].p_elims = {n=p, t=d.t, v=d.elims} end end | ||
end | end | ||
end | end | ||
local mapOrder = {} | local mapOrder = {} | ||
for m in pairs(map_rec) do table.insert(mapOrder, m) end | for m in pairs(map_rec) do table.insert(mapOrder, m) end | ||
| Line 138: | Line 127: | ||
-- 3. BUILD UI | -- 3. BUILD UI | ||
-- ========================================== | -- ========================================== | ||
if rec.t_pts.v == -1 then return "" end | if rec.t_pts.v == -1 then return "" end | ||
local root = html.create('div'):addClass('rec-wrapper') | local root = html.create('div'):addClass('rec-wrapper') | ||
root:tag('div'):addClass('rec-header'):wikitext('🏆 Tournament Records') | root:tag('div'):addClass('rec-header'):wikitext('🏆 Tournament Records') | ||
-- BANNER | -- BANNER | ||
local banner = | local bannerItems = 0 | ||
if top_fragger.v > 0 then | local banner = html.create('div'):addClass('rec-banner') | ||
if show_fragger and top_fragger.v > 0 then | |||
bannerItems = bannerItems + 1 | |||
local b1 = banner:tag('div'):addClass('rec-ban-item') | local b1 = banner:tag('div'):addClass('rec-ban-item') | ||
b1:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament Top Fragger') | b1:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament Top Fragger') | ||
| Line 151: | Line 142: | ||
b1:tag('div'):addClass('rec-ban-stat'):wikitext(top_fragger.v .. ' Elims') | b1:tag('div'):addClass('rec-ban-stat'):wikitext(top_fragger.v .. ' Elims') | ||
end | end | ||
if top_mvp.v > 0 then | if show_mvp and top_mvp.v > 0 then | ||
bannerItems = bannerItems + 1 | |||
local b2 = banner:tag('div'):addClass('rec-ban-item') | local b2 = banner:tag('div'):addClass('rec-ban-item') | ||
b2:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament MVP Leader') | b2:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament MVP Leader') | ||
| Line 157: | Line 149: | ||
b2:tag('div'):addClass('rec-ban-stat'):wikitext(top_mvp.v .. ' Match MVPs') | b2:tag('div'):addClass('rec-ban-stat'):wikitext(top_mvp.v .. ' Match MVPs') | ||
end | end | ||
if bannerItems > 0 then root:node(banner) end | |||
local grid = | local grid = html.create('div'):addClass('rec-grid') | ||
local colCount = 0 | |||
local function addRecord(parent, icon, title, name, subname, val, suffix) | local function addRecord(parent, icon, title, name, subname, val, suffix) | ||
| Line 172: | Line 166: | ||
end | end | ||
-- COL 1: Single Match | -- COL 1: Single Match | ||
local col1 = grid:tag('div'):addClass('rec-col') | if show_single then | ||
colCount = colCount + 1 | |||
local col1 = grid:tag('div'):addClass('rec-col') | |||
col1:tag('div'):addClass('rec-col-title'):wikitext('Single Match Records') | |||
addRecord(col1, '🔥', 'Highest Team Points', rec.t_pts.n, nil, rec.t_pts.v, 'pts') | |||
addRecord(col1, '⚔️', 'Highest Team Elims', rec.t_elims.n, nil, rec.t_elims.v, 'elims') | |||
addRecord(col1, '💀', 'Highest Player Elims', rec.p_elims.n, rec.p_elims.t, rec.p_elims.v, 'elims') | |||
if show_damage then addRecord(col1, '💥', 'Highest Player Dmg', rec.p_dmg.n, rec.p_dmg.t, rec.p_dmg.v, 'dmg') end | |||
end | |||
-- COL 2: Maps & Highlights | -- COL 2: Maps & Highlights | ||
local col2 = grid:tag('div'):addClass('rec-col') | local hasCol2 = false | ||
if show_maps and #mapOrder > 0 then hasCol2 = true end | |||
if show_long_elim and rec.long.v > 0 then hasCol2 = true end | |||
if show_rescues and rec.rescues.v > 0 then hasCol2 = true end | |||
if hasCol2 then | |||
colCount = colCount + 1 | |||
local col2 = grid:tag('div'):addClass('rec-col') | |||
col2:tag('div'):addClass('rec-col-title'):wikitext('Map Highs & Highlights') | |||
if show_maps then | |||
for _, m in ipairs(mapOrder) do addRecord(col2, '🗺️', m .. ' Record', map_rec[m].n, nil, map_rec[m].v, 'pts') end | |||
end | |||
if show_long_elim then addRecord(col2, '🔭', 'Longest Elimination', rec.long.n, rec.long.t, rec.long.v, 'm') end | |||
if show_rescues then addRecord(col2, '⛑️', 'Most Rescues', rec.rescues.n, rec.rescues.t, rec.rescues.v, 'revives') end | |||
end | end | ||
-- COL 3: Daily Leaders | -- COL 3: Daily Leaders | ||
local col3 = grid:tag('div'):addClass('rec-col') | if show_daily and #dayList > 0 then | ||
colCount = colCount + 1 | |||
local col3 = grid:tag('div'):addClass('rec-col') | |||
col3:tag('div'):addClass('rec-col-title'):wikitext('Daily Top Performers') | |||
local dayListContainer = col3:tag('div'):addClass('rec-day-list') | |||
local dStats = dayRow:tag('div'):addClass('rec-day-stats') | for _, day in ipairs(dayList) do | ||
local d = dailyWinners[day] | |||
local dayRow = dayListContainer:tag('div'):addClass('rec-day-row') | |||
dayRow:tag('div'):addClass('rec-day-name'):wikitext(day) | |||
local dStats = dayRow:tag('div'):addClass('rec-day-stats') | |||
if d.t_pts.v > 0 then dStats:tag('div'):wikitext("🛡️ [[" .. d.t_pts.n .. "]] <span class='rec-dim'>(" .. d.t_pts.v .. " pts)</span>") end | |||
if d.p_elims.v > 0 then dStats:tag('div'):wikitext("🎯 [[" .. d.p_elims.n .. "]] <span class='rec-dim'>(" .. d.p_elims.v .. " elims)</span>") end | |||
end | end | ||
end | |||
-- If there are columns to show, add the grid and apply the dynamic column class | |||
if colCount > 0 then | |||
grid:addClass('cols-' .. colCount) | |||
root:node(grid) | |||
end | end | ||
Revision as of 06:50, 21 May 2026
Documentation for this module may be created at Module:Records/doc
local p = {}
local cargo = mw.ext.cargo
local html = mw.html
local function sqlEscape(s)
if not s then return "" end
return s:gsub("\\", "\\\\"):gsub("'", "\\'")
end
local function getNum(s)
if not s then return 0 end
return tonumber(s:match("%d+")) or 0
end
function p.main(frame)
local args = frame:getParent().args
local tournamentName = args.tournament or mw.title.getCurrentTitle().text
local whereClause = string.format("tournament = '%s'", sqlEscape(tournamentName))
-- TOGGLES (Default: true. Set to "false" to hide)
local show_damage = args.show_damage ~= "false"
local show_long_elim = args.show_long_elim ~= "false"
local show_rescues = args.show_rescues ~= "false"
local show_maps = args.show_maps ~= "false"
local show_daily = args.show_daily ~= "false"
local show_single = args.show_single ~= "false"
local show_mvp = args.show_mvp ~= "false" and args.show_mvps ~= "false"
local show_fragger = args.show_fragger ~= "false"
-- ==========================================
-- 1. DATA FETCHING (Single Pass)
-- ==========================================
local teamMatch = cargo.query("MatchStats_Team", "tournament_day, team, map, total_pts, elim_pts", { where = whereClause, limit = 5000 })
local playerMatch = cargo.query("MatchStats_Player", "tournament_day, player, team, player_elims, damage, mvp, long_elim, rescues", { where = whereClause, limit = 5000 })
local d_team = {}; local d_player = {}; local o_player = {}; local map_rec = {}; local daySet = {}
local rec = {
t_pts = {n="-", v=-1}, t_elims = {n="-", v=-1},
p_elims = {n="-", t="-", v=-1}, p_dmg = {n="-", t="-", v=-1},
long = {n="-", t="-", v=-1}, rescues = {n="-", t="-", v=-1}
}
if teamMatch then
for _, r in ipairs(teamMatch) do
local pts = tonumber(r.total_pts) or 0
local elims = tonumber(r.elim_pts) or 0
local day = r.tournament_day
local map = r.map
if pts > rec.t_pts.v then rec.t_pts = {n=r.team, v=pts} end
if elims > rec.t_elims.v then rec.t_elims = {n=r.team, v=elims} end
if map and map ~= "" then
if not map_rec[map] or pts > map_rec[map].v then map_rec[map] = {n=r.team, v=pts} end
end
if day and day ~= "" then
daySet[day] = true
if not d_team[day] then d_team[day] = {} end
if not d_team[day][r.team] then d_team[day][r.team] = {pts=0, elims=0} end
d_team[day][r.team].pts = d_team[day][r.team].pts + pts
d_team[day][r.team].elims = d_team[day][r.team].elims + elims
end
end
end
if playerMatch then
for _, r in ipairs(playerMatch) do
local elims = tonumber(r.player_elims) or 0
local dmg = tonumber(r.damage) or 0
local mvp = tonumber(r.mvp) or 0
local long = tonumber(r.long_elim) or 0
local res = tonumber(r.rescues) or 0
local day = r.tournament_day
local p = r.player
if elims > rec.p_elims.v then rec.p_elims = {n=p, t=r.team, v=elims} end
if dmg > rec.p_dmg.v then rec.p_dmg = {n=p, t=r.team, v=dmg} end
if long > rec.long.v then rec.long = {n=p, t=r.team, v=long} end
if res > rec.rescues.v then rec.rescues = {n=p, t=r.team, v=res} end
if not o_player[p] then o_player[p] = {t=r.team, elims=0, mvp=0} end
o_player[p].elims = o_player[p].elims + elims
o_player[p].mvp = o_player[p].mvp + mvp
if day and day ~= "" then
daySet[day] = true
if not d_player[day] then d_player[day] = {} end
if not d_player[day][p] then d_player[day][p] = {t=r.team, elims=0, dmg=0} end
d_player[day][p].elims = d_player[day][p].elims + elims
d_player[day][p].dmg = d_player[day][p].dmg + dmg
end
end
end
-- ==========================================
-- 2. DETERMINE WINNERS
-- ==========================================
local top_fragger = {n="-", t="-", v=-1}
local top_mvp = {n="-", t="-", v=-1}
for p, d in pairs(o_player) do
if d.elims > top_fragger.v then top_fragger = {n=p, t=d.t, v=d.elims} end
if d.mvp > top_mvp.v then top_mvp = {n=p, t=d.t, v=d.mvp} end
end
local dayList = {}
for day in pairs(daySet) do table.insert(dayList, day) end
table.sort(dayList, function(a, b) return getNum(a) < getNum(b) end)
local dailyWinners = {}
for _, day in ipairs(dayList) do
dailyWinners[day] = { t_pts = {n="-", v=-1}, p_elims = {n="-", t="-", v=-1} }
if d_team[day] then
for t, d in pairs(d_team[day]) do if d.pts > dailyWinners[day].t_pts.v then dailyWinners[day].t_pts = {n=t, v=d.pts} end end
end
if d_player[day] then
for p, d in pairs(d_player[day]) do if d.elims > dailyWinners[day].p_elims.v then dailyWinners[day].p_elims = {n=p, t=d.t, v=d.elims} end end
end
end
local mapOrder = {}
for m in pairs(map_rec) do table.insert(mapOrder, m) end
table.sort(mapOrder)
-- ==========================================
-- 3. BUILD UI
-- ==========================================
if rec.t_pts.v == -1 then return "" end
local root = html.create('div'):addClass('rec-wrapper')
root:tag('div'):addClass('rec-header'):wikitext('🏆 Tournament Records')
-- BANNER
local bannerItems = 0
local banner = html.create('div'):addClass('rec-banner')
if show_fragger and top_fragger.v > 0 then
bannerItems = bannerItems + 1
local b1 = banner:tag('div'):addClass('rec-ban-item')
b1:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament Top Fragger')
b1:tag('div'):addClass('rec-ban-val'):wikitext('🥇 [[' .. top_fragger.n .. ']] <span class="rec-dim">(' .. top_fragger.t .. ')</span>')
b1:tag('div'):addClass('rec-ban-stat'):wikitext(top_fragger.v .. ' Elims')
end
if show_mvp and top_mvp.v > 0 then
bannerItems = bannerItems + 1
local b2 = banner:tag('div'):addClass('rec-ban-item')
b2:tag('div'):addClass('rec-ban-lbl'):wikitext('Tournament MVP Leader')
b2:tag('div'):addClass('rec-ban-val'):wikitext('⭐ [[' .. top_mvp.n .. ']] <span class="rec-dim">(' .. top_mvp.t .. ')</span>')
b2:tag('div'):addClass('rec-ban-stat'):wikitext(top_mvp.v .. ' Match MVPs')
end
if bannerItems > 0 then root:node(banner) end
local grid = html.create('div'):addClass('rec-grid')
local colCount = 0
local function addRecord(parent, icon, title, name, subname, val, suffix)
if val <= 0 then return end
local box = parent:tag('div'):addClass('rec-box')
box:tag('div'):addClass('rec-icon'):wikitext(icon)
local info = box:tag('div'):addClass('rec-info')
info:tag('div'):addClass('rec-title'):wikitext(title)
local nameStr = "'''[[" .. name .. "]]'''"
if subname and subname ~= "-" then nameStr = nameStr .. " <span class='rec-dim'>(" .. subname .. ")</span>" end
info:tag('div'):addClass('rec-name'):wikitext(nameStr)
box:tag('div'):addClass('rec-val'):wikitext(math.floor(val) .. '<span>' .. suffix .. '</span>')
end
-- COL 1: Single Match
if show_single then
colCount = colCount + 1
local col1 = grid:tag('div'):addClass('rec-col')
col1:tag('div'):addClass('rec-col-title'):wikitext('Single Match Records')
addRecord(col1, '🔥', 'Highest Team Points', rec.t_pts.n, nil, rec.t_pts.v, 'pts')
addRecord(col1, '⚔️', 'Highest Team Elims', rec.t_elims.n, nil, rec.t_elims.v, 'elims')
addRecord(col1, '💀', 'Highest Player Elims', rec.p_elims.n, rec.p_elims.t, rec.p_elims.v, 'elims')
if show_damage then addRecord(col1, '💥', 'Highest Player Dmg', rec.p_dmg.n, rec.p_dmg.t, rec.p_dmg.v, 'dmg') end
end
-- COL 2: Maps & Highlights
local hasCol2 = false
if show_maps and #mapOrder > 0 then hasCol2 = true end
if show_long_elim and rec.long.v > 0 then hasCol2 = true end
if show_rescues and rec.rescues.v > 0 then hasCol2 = true end
if hasCol2 then
colCount = colCount + 1
local col2 = grid:tag('div'):addClass('rec-col')
col2:tag('div'):addClass('rec-col-title'):wikitext('Map Highs & Highlights')
if show_maps then
for _, m in ipairs(mapOrder) do addRecord(col2, '🗺️', m .. ' Record', map_rec[m].n, nil, map_rec[m].v, 'pts') end
end
if show_long_elim then addRecord(col2, '🔭', 'Longest Elimination', rec.long.n, rec.long.t, rec.long.v, 'm') end
if show_rescues then addRecord(col2, '⛑️', 'Most Rescues', rec.rescues.n, rec.rescues.t, rec.rescues.v, 'revives') end
end
-- COL 3: Daily Leaders
if show_daily and #dayList > 0 then
colCount = colCount + 1
local col3 = grid:tag('div'):addClass('rec-col')
col3:tag('div'):addClass('rec-col-title'):wikitext('Daily Top Performers')
local dayListContainer = col3:tag('div'):addClass('rec-day-list')
for _, day in ipairs(dayList) do
local d = dailyWinners[day]
local dayRow = dayListContainer:tag('div'):addClass('rec-day-row')
dayRow:tag('div'):addClass('rec-day-name'):wikitext(day)
local dStats = dayRow:tag('div'):addClass('rec-day-stats')
if d.t_pts.v > 0 then dStats:tag('div'):wikitext("🛡️ [[" .. d.t_pts.n .. "]] <span class='rec-dim'>(" .. d.t_pts.v .. " pts)</span>") end
if d.p_elims.v > 0 then dStats:tag('div'):wikitext("🎯 [[" .. d.p_elims.n .. "]] <span class='rec-dim'>(" .. d.p_elims.v .. " elims)</span>") end
end
end
-- If there are columns to show, add the grid and apply the dynamic column class
if colCount > 0 then
grid:addClass('cols-' .. colCount)
root:node(grid)
end
return tostring(root)
end
return p