Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:PrizePool: Difference between revisions

From eSportsAmaze
No edit summary
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local _id_counter = 0
local html = mw.html
local html = mw.html
local cargo = mw.ext.cargo
local cargo = mw.ext.cargo
Line 11: Line 12:
     if not amount then return "0" end
     if not amount then return "0" end
     local n = tostring(math.floor(tonumber(amount) or 0))
     local n = tostring(math.floor(tonumber(amount) or 0))
    if #n <= 3 then return n end
     local last3 = n:sub(-3)
     local last3 = n:sub(-3)
     local rest = n:sub(1, -4)
     local rest = n:sub(1, -4)
     local formattedRest = rest:reverse():gsub("(%d%d)", "%1,"):reverse()
    -- Indian format: group remaining digits in pairs (from right)
    if formattedRest ~= "" then last3 = "," .. last3 end
     local formattedRest = rest:reverse():gsub("(%d%d)", "%1,"):reverse():gsub("^,", "")
     return formattedRest .. last3
     return formattedRest .. "," .. last3
end
end


Line 34: Line 36:
     end
     end


     local val = tonumber(amount) or 0
     local val = 0
     local r = tonumber(rate) or 1
     local r = tonumber(rate) or 1
     local symbol = currency or "₹"
     local symbol = currency or "₹"
   
    if type(amount) == "string" then
        val = tonumber((amount:gsub(",", ""))) or 0
    else
        val = tonumber(amount) or 0
    end
      
      
     -- Case 1: Input is INR (Primary = INR, Secondary = USD)
     -- Case 1: Input is INR (Primary = INR, Secondary = USD)
Line 105: Line 113:
     local tournamentName = args.tournament or mw.title.getCurrentTitle().subpageText
     local tournamentName = args.tournament or mw.title.getCurrentTitle().subpageText
      
      
    -- PRE-CHECK: Are there any awards?
    local hasAnyAwards = false
    for i = 1, 20 do
        if args['award_' .. i] and args['award_' .. i] ~= "" then
            hasAnyAwards = true
            break
        end
    end
     -- Unique IDs for Toggling
     -- Unique IDs for Toggling
     local uniqueID = tostring(os.time()) .. tostring(math.random(100, 999))
    _id_counter = _id_counter + 1
     local uniqueID = "pp-" .. _id_counter
     local idContent = 'content-' .. uniqueID
     local idContent = 'content-' .. uniqueID
     local idBtnShow = 'btn-show-' .. uniqueID
     local idBtnShow = 'btn-show-' .. uniqueID
Line 112: Line 130:
      
      
     local grid = html.create('div'):addClass('prize-section-grid')
     local grid = html.create('div'):addClass('prize-section-grid')
   
    -- Adjust grid columns if no awards (Full width ranking)
    if not hasAnyAwards then
        grid:css('grid-template-columns', '1fr')
    end
      
      
     -- ==========================================
     -- ==========================================
Line 221: Line 244:
      
      
     -- ==========================================
     -- ==========================================
     -- COLUMN 2: SPECIAL AWARDS
     -- COLUMN 2: SPECIAL AWARDS (Conditionally Rendered)
     -- ==========================================
     -- ==========================================
     local colAward = grid:tag('div'):addClass('prize-col-award')
     if hasAnyAwards then
    colAward:tag('div'):addClass('prize-header'):wikitext('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
        local awardList = colAward:tag('div'):addClass('prize-list')
   
    for i = 1, 10 do
        local awardName = args['award_'..i]
        local winner = args['award_'..i..'_winner']
        local team = args['award_'..i..'_team']
        local rawPrize = args['award_'..i..'_prize']
          
          
         if awardName and awardName ~= "" then
         for i = 1, 20 do
             hasAwardData = true
            local awardName = args['award_'..i]
            local winner = args['award_'..i..'_winner']
            local team = args['award_'..i..'_team']
             local rawPrize = args['award_'..i..'_prize']
              
              
             local moneyData = processMoney(rawPrize, currency, rate)
             if awardName and awardName ~= "" then
           
               
            if (winner or team) and cargo and cargo.store then
                local moneyData = processMoney(rawPrize, currency, rate)
                cargo.store('PrizeMoney', {
               
                    tournament = tournamentName,
                if (winner or team) and cargo and cargo.store then
                    placement = '',
                    cargo.store('PrizeMoney', {
                    team = team or '',
                        tournament = tournamentName,
                    player = winner or '',
                        placement = '',
                    prize = moneyData.dbValue, -- STORES INR
                        team = team or '',
                    award = awardName
                        player = winner or '',
                })
                        prize = moneyData.dbValue, -- STORES INR
            end
                        award = awardName
           
                    })
            local row = awardList:tag('div'):addClass('award-row')
                end
           
               
            local info = row:tag('div'):addClass('award-info')
                local row = awardList:tag('div'):addClass('award-row')
            info:tag('div'):addClass('award-name'):wikitext(awardName)
               
           
                local info = row:tag('div'):addClass('award-info')
            local winDiv = info:tag('div'):addClass('award-winner')
                info:tag('div'):addClass('award-name'):wikitext(awardName)
           
               
            if winner and winner ~= "" then
                local winDiv = info:tag('div'):addClass('award-winner')
                if team and team ~= "" then winDiv:wikitext(getLogo(team)) end
               
                winDiv:wikitext('[[' .. winner .. ']]')
                if winner and winner ~= "" then
            elseif team and team ~= "" then
                    if team and team ~= "" then winDiv:wikitext(getLogo(team)) end
                winDiv:wikitext(getLogo(team))
                    winDiv:wikitext('[[' .. winner .. ']]')
                winDiv:wikitext('[[' .. team .. ']]')
                elseif team and team ~= "" then
            else
                    winDiv:wikitext(getLogo(team))
                winDiv:wikitext("TBD"):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
                    winDiv:wikitext('[[' .. team .. ']]')
            end
                else
           
                    winDiv:wikitext("TBD"):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
            if rawPrize and rawPrize ~= "" then
                end
                row:tag('div'):addClass('award-prize'):wikitext(moneyData.display)
               
                if rawPrize and rawPrize ~= "" then
                    row:tag('div'):addClass('award-prize'):wikitext(moneyData.display)
                end
             end
             end
         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
     end
      
      

Latest revision as of 14:36, 12 March 2026

Documentation for this module may be created at Module:PrizePool/doc

local p = {}
local _id_counter = 0
local html = mw.html
local cargo = mw.ext.cargo

-- ============================================================
-- HELPER: Number Formatters
-- ============================================================

-- Indian Format (1,00,000)
local function formatINR(amount)
    if not amount then return "0" end
    local n = tostring(math.floor(tonumber(amount) or 0))
    if #n <= 3 then return n end
    local last3 = n:sub(-3)
    local rest = n:sub(1, -4)
    -- Indian format: group remaining digits in pairs (from right)
    local formattedRest = rest:reverse():gsub("(%d%d)", "%1,"):reverse():gsub("^,", "")
    return formattedRest .. "," .. last3
end

-- Standard Format (100,000) - For USD, Yen, etc.
local function formatStd(amount)
    if not amount then return "0" end
    local n = tostring(math.floor(tonumber(amount) or 0))
    return n:reverse():gsub("(%d%d%d)", "%1,"):reverse():gsub("^,", "")
end

-- ============================================================
-- HELPER: Dual Currency Display & Calc
-- ============================================================
-- Returns: { displayHTML, valueForDatabase (INR) }
local function processMoney(amount, currency, rate)
    if not amount or amount == "" or amount == "0" then 
        return { display = "TBD", dbValue = 0 } 
    end

    local val = 0
    local r = tonumber(rate) or 1
    local symbol = currency or "₹"
    
    if type(amount) == "string" then
        val = tonumber((amount:gsub(",", ""))) or 0
    else
        val = tonumber(amount) or 0
    end
    
    -- Case 1: Input is INR (Primary = INR, Secondary = USD)
    if symbol == "₹" or symbol == "INR" or symbol == "Rs" then
        local inrVal = val
        local usdVal = val * r -- Rate should be e.g. 0.011
        
        local mainStr = "₹ " .. formatINR(inrVal)
        local subStr = ""
        
        if r ~= 1 then
            subStr = '<br><small style="color:var(--text-muted); font-size:0.85em;">≈ $ ' .. formatStd(usdVal) .. '</small>'
        end
        
        return { 
            display = '<span class="pz-val">' .. mainStr .. subStr .. '</span>',
            dbValue = inrVal
        }
    
    -- Case 2: Input is Foreign (Primary = Foreign, Secondary = INR)
    else
        local localVal = val
        local inrVal = val * r -- Rate should be e.g. 90 (1 Unit = 90 INR)
        
        local mainStr = symbol .. " " .. formatStd(localVal)
        local subStr = '<br><small style="color:var(--text-muted); font-size:0.85em;">≈ ₹ ' .. formatINR(inrVal) .. '</small>'
        
        return { 
            display = '<span class="pz-val">' .. mainStr .. subStr .. '</span>',
            dbValue = inrVal
        }
    end
end

-- Helper: Get Logo
local function getLogo(teamName)
    if not teamName or teamName == "" or teamName == "TBD" 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
    
    -- Global Settings
    local currency = args.currency or "₹"
    local rate = tonumber(args.rate) or 1
    
    local tournamentName = args.tournament or mw.title.getCurrentTitle().subpageText
    
    -- PRE-CHECK: Are there any awards?
    local hasAnyAwards = false
    for i = 1, 20 do
        if args['award_' .. i] and args['award_' .. i] ~= "" then
            hasAnyAwards = true
            break
        end
    end

    -- Unique IDs for Toggling
    _id_counter = _id_counter + 1
    local uniqueID = "pp-" .. _id_counter
    local idContent = 'content-' .. uniqueID
    local idBtnShow = 'btn-show-' .. uniqueID
    local idBtnHide = 'btn-hide-' .. uniqueID
    
    local grid = html.create('div'):addClass('prize-section-grid')
    
    -- Adjust grid columns if no awards (Full width ranking)
    if not hasAnyAwards then
        grid:css('grid-template-columns', '1fr')
    end
    
    -- ==========================================
    -- COLUMN 1: RANKINGS (TEAMS)
    -- ==========================================
    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
    
    for i = 1, 64 do
        if (args['team_'..i] and args['team_'..i] ~= "") or (args['prize_'..i] and args['prize_'..i] ~= "") then 
            rankCount = rankCount + 1 
        end
    end
    
    local collapseLimit = 10 
    local isCollapsible = (rankCount > collapseLimit)
    
    local hiddenDiv = nil
    if isCollapsible then
        hiddenDiv = html.create('div')
            :addClass('mw-collapsible mw-collapsed')
            :attr('id', 'mw-customcollapsible-' .. idContent)
    end
    
    for i = 1, 64 do
        local place = args['place_'..i] or (i .. '.')
        local team = args['team_'..i]
        local rawPrize = args['prize_'..i]
        local seed = args['seed_'..i]
        
        if (team and team ~= "") or (rawPrize and rawPrize ~= "") then
            hasRankData = true
            
            -- Process Money (Display + DB Value)
            local moneyData = processMoney(rawPrize, currency, rate)
            
            -- DATABASE STORE (Always store INR value)
            if team and team ~= "" and cargo and cargo.store then
                cargo.store('PrizeMoney', {
                    tournament = tournamentName,
                    placement = i,
                    team = team,
                    prize = moneyData.dbValue, -- STORES INR
                    award = ''
                })
            end
            
            local targetContainer = rankList
            if isCollapsible and i > collapseLimit then
                targetContainer = hiddenDiv
            end
            
            local row = targetContainer:tag('div'):addClass('prize-row')
            
            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)
            
            local teamDiv = row:tag('div'):addClass('pz-team')
            
            if team and team ~= "" then
                teamDiv:wikitext(getLogo(team))
                teamDiv:wikitext('[[' .. team .. ']]')
            else
                teamDiv:wikitext('TBD'):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
            end
            
            local infoDiv = row:tag('div'):addClass('pz-info')
            
            -- Prize Display
            if rawPrize and rawPrize ~= "" then
                infoDiv:tag('div'):addClass('pz-prize'):wikitext(moneyData.display)
            end
            
            if seed and seed ~= "" then
                infoDiv:tag('span'):addClass('pz-seed'):wikitext(seed)
            end
        end
    end
    
    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
            rankList:wikitext(tostring(hiddenDiv))
            local toggleTargets = 'mw-customtoggle-' .. idContent .. ' mw-customtoggle-' .. idBtnShow .. ' mw-customtoggle-' .. idBtnHide
            
            colRank:tag('div')
                :attr('id', 'mw-customcollapsible-' .. idBtnShow)
                :addClass('prize-show-more mw-collapsible ' .. toggleTargets) 
                :wikitext('View Full Distribution <i class="fa-solid fa-chevron-down"></i>')
                
            colRank:tag('div')
                :attr('id', 'mw-customcollapsible-' .. idBtnHide)
                :addClass('prize-show-more mw-collapsible mw-collapsed ' .. toggleTargets) 
                :wikitext('Show Less <i class="fa-solid fa-chevron-up"></i>')
        end
    end
    
    -- ==========================================
    -- COLUMN 2: SPECIAL AWARDS (Conditionally Rendered)
    -- ==========================================
    if hasAnyAwards then
        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')
        
        for i = 1, 20 do
            local awardName = args['award_'..i]
            local winner = args['award_'..i..'_winner']
            local team = args['award_'..i..'_team']
            local rawPrize = args['award_'..i..'_prize']
            
            if awardName and awardName ~= "" then
                
                local moneyData = processMoney(rawPrize, currency, rate)
                
                if (winner or team) and cargo and cargo.store then
                    cargo.store('PrizeMoney', {
                        tournament = tournamentName,
                        placement = '',
                        team = team or '',
                        player = winner or '',
                        prize = moneyData.dbValue, -- STORES INR
                        award = awardName
                    })
                end
                
                local row = awardList:tag('div'):addClass('award-row')
                
                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 winner and winner ~= "" then
                    if team and team ~= "" then winDiv:wikitext(getLogo(team)) end
                    winDiv:wikitext('[[' .. winner .. ']]')
                elseif team and team ~= "" then
                    winDiv:wikitext(getLogo(team))
                    winDiv:wikitext('[[' .. team .. ']]')
                else
                    winDiv:wikitext("TBD"):css('color', 'var(--text-muted)'):css('font-weight', 'normal')
                end
                
                if rawPrize and rawPrize ~= "" then
                    row:tag('div'):addClass('award-prize'):wikitext(moneyData.display)
                end
            end
        end
    end
    
    return tostring(grid)
end

return p