Module:Player
From eSportsAmaze
More actions
Documentation for this module may be created at Module:Player/doc
local p = {}
local cargo = mw.ext.cargo
local html = mw.html
-- Helper to get Rank
local function getKraftonRank(playerName)
local tables = "Krafton_Rankings"
local fields = "rank"
local queryArgs = {
where = "name = '" .. playerName .. "' AND type='Player'",
limit = 1
}
local results = cargo.query(tables, fields, queryArgs)
if #results > 0 then
return "#" .. results[1].rank
else
return "Unranked"
end
end
-- Helper to Build Rows
local function addRow(container, label, value)
if value and value ~= "" then
local row = container:tag('div'):addClass('infobox-row')
row:tag('div'):addClass('infobox-label'):wikitext(label)
row:tag('div'):addClass('infobox-data'):wikitext(value)
end
end
-- MAIN 1: Player Infobox
function p.infobox(frame)
local args = frame:getParent().args
local pageName = mw.title.getCurrentTitle().text
local id = args.id or pageName
local image = args.image or ""
local root = html.create('div'):addClass('infobox')
-- Header
root:tag('div'):addClass('infobox-header'):wikitext(id)
-- Image
if image ~= "" then
root:tag('div'):addClass('infobox-image'):wikitext('[[File:' .. image .. '|200px]]')
end
-- Data Container
local data = root:tag('div'):addClass('infobox-data-container')
-- Basic Info
addRow(data, "Real Name", args.real_name)
addRow(data, "Nationality", args.nationality)
addRow(data, "Born", args.birth_date)
addRow(data, "Game", args.game)
-- Team Info Header
data:tag('div')
:addClass('infobox-header')
:css('font-size','1em')
:css('margin-top','10px')
:css('border-radius','6px')
:wikitext('Team Info')
if args.current_team then
addRow(data, "Current Team", '[[' .. args.current_team .. ']]')
end
-- Status Logic
if args.status then
local color = "#333"
local s = args.status:lower()
if s == "active" then color = "green"
elseif s == "inactive" or s == "banned" then color = "red" end
local row = data:tag('div'):addClass('infobox-row')
row:tag('div'):addClass('infobox-label'):wikitext("Status")
row:tag('div'):addClass('infobox-data'):css('font-weight','bold'):css('color', color):wikitext(args.status)
end
-- Auto-Rank
addRow(data, "Krafton Rank", getKraftonRank(id))
addRow(data, "Role", args.role)
-- History Section (Auto-Generated)
data:tag('div')
:addClass('infobox-header')
:css('font-size','1em')
:css('margin-top','10px')
:css('border-radius','6px')
:wikitext('History')
local historyDiv = data:tag('div'):css('padding','5px 10px'):css('font-size','0.9em')
-- Query Former Teams
local hTables = "Player_Former_Teams"
local hFields = "team, join_date, leave_date"
local hArgs = {
where = "player_id = '" .. pageName .. "'",
orderBy = "join_date DESC",
limit = 20
}
local history = cargo.query(hTables, hFields, hArgs)
if #history > 0 then
local tbl = historyDiv:tag('table'):css('width','100%'):css('border-collapse','collapse')
for _, hRow in ipairs(history) do
local tr = tbl:tag('tr'):css('border-bottom','1px solid var(--border-light)')
tr:tag('td')
:css('text-align','left'):css('font-weight','bold'):css('padding','4px 0')
:wikitext('[[' .. hRow.team .. ']]')
tr:tag('td')
:css('text-align','right'):css('color','var(--text-muted)'):css('font-size','0.85em')
:wikitext( (hRow.join_date and mw.getContentLanguage():formatDate('M Y', hRow.join_date) or '?') .. ' – ' .. (hRow.leave_date and mw.getContentLanguage():formatDate('M Y', hRow.leave_date) or 'Present') )
end
else
historyDiv:css('text-align','center'):css('color','#888'):wikitext('No history recorded')
end
-- Social Media
if args.instagram or args.youtube then
data:tag('div'):addClass('infobox-header'):css('font-size','1em'):css('margin-top','10px'):css('border-radius','6px'):wikitext('Social Media')
local socialRow = data:tag('div'):addClass('infobox-row'):css('justify-content','center'):css('gap','10px')
if args.instagram then socialRow:wikitext('• [' .. args.instagram .. ' Instagram]') end
if args.youtube then socialRow:wikitext('• [' .. args.youtube .. ' YouTube]') end
end
return tostring(root)
end
-- MAIN 2: Team Former Players Table
function p.formerPlayers(frame)
local args = frame:getParent().args
local team = args.team or mw.title.getCurrentTitle().text
local tables = "Player_Former_Teams, Players"
local join = "Player_Former_Teams.player_id = Players._pageName"
local fields = "Player_Former_Teams.player_id=id, Players.real_name=Name, Player_Former_Teams.role=role, Player_Former_Teams.join_date=join_date, Player_Former_Teams.leave_date=leave_date"
local queryArgs = {
joinOn = join,
where = "Player_Former_Teams.team = '" .. team .. "' AND Player_Former_Teams.leave_date != ''",
orderBy = "Player_Former_Teams.leave_date DESC"
}
local results = cargo.query(tables, fields, queryArgs)
local root = html.create('table'):addClass('wikitable sortable'):css('width','100%')
local header = root:tag('tr')
header:tag('th'):wikitext('ID')
header:tag('th'):wikitext('Name')
header:tag('th'):wikitext('Role')
header:tag('th'):wikitext('Duration')
if #results > 0 then
for _, row in ipairs(results) do
local tr = root:tag('tr')
tr:tag('td'):css('font-weight','bold'):wikitext('[[' .. row.id .. ']]')
tr:tag('td'):wikitext(row.Name)
tr:tag('td'):wikitext(row.role)
local joinStr = row.join_date and mw.getContentLanguage():formatDate('M Y', row.join_date) or '?'
local leaveStr = row.leave_date and mw.getContentLanguage():formatDate('M Y', row.leave_date) or '?'
tr:tag('td'):attr('data-sort-value', row.leave_date):wikitext(joinStr .. ' – ' .. leaveStr)
end
else
return '<div style="font-style:italic; color:var(--text-muted);">No former players found for this team.</div>'
end
return tostring(root)
end
return p