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

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

local p = {}
local cargo = mw.ext.cargo

local function sqlEscape(s)
    if not s then return "" end
    s = s:gsub("\\", "\\\\")
    s = s:gsub("'", "\\'")
    return s
end

function p.store(frame)
    local args = frame:getParent().args
    local pageTitle = mw.title.getCurrentTitle().text
    local tournament = args.tournament

    if not tournament or tournament == "" then
        local parts = mw.text.split(pageTitle, '/')
        if parts[2] == "Tournaments" and parts[3] then
            tournament = parts[3]
        else
            tournament = mw.title.getCurrentTitle().baseText
        end
    end

    local date = args.date or ""
    local stage = args.stage or ""
    
    -- TIMEZONE LOGIC
    local timezone = args.timezone or "IST"
    local tz_offset = "+00:00"
    if timezone == "IST" then tz_offset = "+05:30"
    elseif timezone == "JST" then tz_offset = "+09:00"
    elseif timezone == "PST" then tz_offset = "-08:00"
    elseif timezone == "EST" then tz_offset = "-05:00"
    elseif timezone == "CET" then tz_offset = "+01:00"
    elseif timezone:match("^[%+%-]%d%d:%d%d$") then tz_offset = timezone
    end

    if date == "" then return "Error: Date is required." end

    local game = "BGMI" 
    local match_type = "BR" 

    if cargo and cargo.query then
        local tData = cargo.query("Tournaments", "game", { where = "name='" .. sqlEscape(tournament) .. "'", limit = 1 })
        if tData and #tData > 0 and tData[1].game then
            game = tData[1].game
            local gLower = game:lower()
            local vs_games = {"pokemon", "mlbb", "mobile legends", "honor of kings", "hok", "league of legends", "lol", "dota", "counter-strike", "cs2", "valorant", "rainbow six", "r6", "overwatch", "ow2", "rocket league", "ea sports fc", "fifa", "street fighter", "tekken", "fatal fury", "starcraft", "crossfire", "chess", "black ops", "modern warfare"}
            for _, v in ipairs(vs_games) do
                if gLower:find(v) then match_type = "VS"; break end
            end
        end
    end

    -- MULTIPLE STREAMS LOGIC
    local streams = {}
    for k, v in pairs(args) do
        if type(k) == "string" and k:match("^stream") and v ~= "" then
            local label = "Watch"
            if k:match("^stream_(.+)$") then
                label = k:match("^stream_(.+)$")
                label = label:gsub("_", " ") -- Convert underscores to spaces (e.g., Watch_Party -> Watch Party)
            end
            streams[label] = v
        end
    end
    
    local stream_json = ""
    if next(streams) ~= nil then
        stream_json = mw.text.jsonEncode(streams)
    end

    -- MATCH DATA LOGIC
    local matches = {}
    for i = 1, 15 do
        local mTime = args['m'..i..'_time']
        if mTime and mTime ~= "" then
            local match = {}
            match.time = date .. "T" .. mTime .. ":00" .. tz_offset
            
            if match_type == "BR" then
                match.map = args['m'..i..'_map'] or "TBD"
                match.group = args['m'..i..'_group'] or ""
            else
                match.t1 = args['m'..i..'_t1'] or "TBD"
                match.t2 = args['m'..i..'_t2'] or "TBD"
                match.group = args['m'..i..'_group'] or ""
            end
            table.insert(matches, match)
        end
    end

    local json_data = mw.text.jsonEncode(matches)

    if cargo and cargo.store then
        cargo.store("Tournament_Schedule", {
            tournament = tournament,
            game = game,
            match_type = match_type,
            date = date,
            stage = stage,
            stream = stream_json,
            day_data = json_data
        })
    end

    return "<div style='display:none;'>Schedule saved.</div>"
end

return p