Przejdź do zawartości

Moduł:Rekordy sezon

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Rekordy sezon/opis

local p = {}

-- =========================================================
-- Module:Rekordy_sezon
--
-- Jeden moduł dla wielu dyscyplin.
--
-- Wywołanie:
--
-- {{#invoke:Rekordy_sezon|main
--  |sezon=2026/2027
--  |druzyna=Lech Poznań
--  |dyscyplina=piłka nożna
-- }}
--
-- lub:
--
-- {{#invoke:Rekordy_sezon|main
--  |sezon=2026/2027
--  |druzyna=Enea Basket Poznań
--  |dyscyplina=koszykówka
-- }}
--
-- Opcjonalnie:
--
-- |rozgrywki=Ekstraklasa
--
-- =========================================================


function p.main(frame)

    -- =====================================================
    -- PARAMETRY
    -- =====================================================

    local sezon =
        mw.text.trim(frame.args.sezon or "")

    local druzyna =
        mw.text.trim(frame.args.druzyna or "")

    local dyscyplina =
        mw.text.trim(frame.args.dyscyplina or "koszykówka")

    local rozgrywki =
        mw.text.trim(frame.args.rozgrywki or "")


    if sezon == "" then
        return "'''Błąd:''' nie podano sezonu."
    end

    if druzyna == "" then
        return "'''Błąd:''' nie podano drużyny."
    end


    -- =====================================================
    -- ESCAPOWANIE SQL
    -- =====================================================

    local sezonSQL =
        mw.ustring.gsub(sezon, "'", "''")

    local druzynaSQL =
        mw.ustring.gsub(druzyna, "'", "''")

    local rozgrywkiSQL =
        mw.ustring.gsub(rozgrywki, "'", "''")


    -- =====================================================
    -- FUNKCJE POMOCNICZE
    -- =====================================================

    local function liczba(value)

        if value == nil or value == "" then
            return 0
        end

        value = tostring(value)

        value =
            mw.ustring.gsub(
                value,
                "%s+",
                ""
            )

        return tonumber(value) or 0

    end


    local function miejsceMeczu(row)

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        if d1 == druzyna then
            return "dom"
        end

        if d2 == druzyna then
            return "wyjazd"
        end

        return nil

    end


    local function wynikMeczu(row)

        local g1 =
            tonumber(row.gole1 or "")

        local g2 =
            tonumber(row.gole2 or "")

        if g1 and g2 then
            return g1, g2
        end

        local wynik =
            row.wynik or ""

        local a, b =
            wynik:match(
                "(%d+)%s*:%s*(%d+)"
            )

        if a and b then
            return tonumber(a), tonumber(b)
        end

        return nil, nil

    end


    local function nazwaMeczu(row)

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local strona =
            row.strona_meczu or ""

        local tekst =
            d1 .. " – " .. d2

        if strona ~= "" then

            return "[[" ..
                strona ..
                "|" ..
                tekst ..
                "]]"

        end

        return tekst

    end


    local function kopiuj(item)

        local nowy = {}

        for k, v in pairs(item) do
            nowy[k] = v
        end

        return nowy

    end


    local function dodajRekord(
        tabela,
        miejsce,
        wartosc,
        item
    )

        local lista =
            tabela[miejsce]

        local nowy =
            kopiuj(item)

        nowy.wartosc =
            wartosc

        if #lista == 0 then

            table.insert(
                lista,
                nowy
            )

            return

        end

        local obecna =
            lista[1].wartosc

        if wartosc > obecna then

            tabela[miejsce] = {
                nowy
            }

        elseif wartosc == obecna then

            table.insert(
                lista,
                nowy
            )

        end

    end


    -- =====================================================
    -- WYBÓR DYSCYPLINY
    -- =====================================================

    if mw.ustring.lower(dyscyplina)
        == "piłka nożna"
        or
        mw.ustring.lower(dyscyplina)
        == "pilka nozna"
    then

        return p.pilka(
            sezon,
            druzyna,
            sezonSQL,
            druzynaSQL,
            rozgrywki,
            rozgrywkiSQL
        )

    end


    -- Domyślnie koszykówka
    return p.koszykowka(
        sezon,
        druzyna,
        sezonSQL,
        druzynaSQL,
        rozgrywki,
        rozgrywkiSQL
    )

end



-- =========================================================
-- =========================================================
-- KOSZYKÓWKA
-- =========================================================
-- =========================================================


function p.koszykowka(
    sezon,
    druzyna,
    sezonSQL,
    druzynaSQL,
    rozgrywki,
    rozgrywkiSQL
)


    -- =====================================================
    -- POBRANIE MECZÓW
    -- =====================================================

    local fieldsMecze =
        table.concat({

            "Mecze.id=mecz",
            "Mecze.data=data",
            "Mecze.sezon=sezon",
            "Mecze.rozgrywki=rozgrywki",
            "Mecze.druzyna1=druzyna1",
            "Mecze.druzyna2=druzyna2",
            "Mecze.gole1=gole1",
            "Mecze.gole2=gole2",
            "Mecze.wynik=wynik",
            "Mecze.strona_meczu=strona_meczu"

        }, ",")


    local whereMecze =
        "(Mecze.druzyna1='" ..
        druzynaSQL ..
        "' OR Mecze.druzyna2='" ..
        druzynaSQL ..
        "')" ..
        " AND Mecze.sezon='" ..
        sezonSQL ..
        "'"


    if rozgrywki ~= "" then

        whereMecze =
            whereMecze ..
            " AND Mecze.rozgrywki='" ..
            rozgrywkiSQL ..
            "'"

    end


    local mecze =
        mw.ext.cargo.query(
            "Mecze",
            fieldsMecze,
            {
                where = whereMecze,
                orderBy = "Mecze.data ASC",
                limit = 5000
            }
        )


    if not mecze or #mecze == 0 then

        return
            "''Brak wprowadzonych meczów dla tej drużyny w podanym sezonie.''"

    end


    -- =====================================================
    -- REKORDY MECZOWE
    -- =====================================================

    local najwyzszeZwyciestwo = {
        dom = {},
        wyjazd = {}
    }

    local najwyzszaPorazka = {
        dom = {},
        wyjazd = {}
    }


    for _, row in ipairs(mecze) do

        local g1, g2 =
            wynikMeczu(row)

        local miejsce =
            miejsceMeczu(row)

        if g1 and g2 and miejsce then

            local zdobyte
            local stracone

            if miejsce == "dom" then

                zdobyte = g1
                stracone = g2

            else

                zdobyte = g2
                stracone = g1

            end

            local roznica =
                zdobyte - stracone


            local item = {

                mecz = row.mecz or "",
                data = row.data or "",
                miejsce = miejsce,

                zdobyte = zdobyte,
                stracone = stracone,
                roznica = roznica,

                tekst =
                    nazwaMeczu(row),

                wynik =
                    tostring(g1) ..
                    ":" ..
                    tostring(g2)

            }


            if roznica > 0 then

                local lista =
                    najwyzszeZwyciestwo[miejsce]

                if #lista == 0 then

                    table.insert(
                        lista,
                        item
                    )

                elseif roznica >
                    lista[1].roznica then

                    najwyzszeZwyciestwo[miejsce] = {
                        item
                    }

                elseif roznica ==
                    lista[1].roznica then

                    table.insert(
                        lista,
                        item
                    )

                end

            end


            if roznica < 0 then

                local przegrana =
                    math.abs(roznica)

                item.przegrana =
                    przegrana

                local lista =
                    najwyzszaPorazka[miejsce]

                if #lista == 0 then

                    table.insert(
                        lista,
                        item
                    )

                elseif przegrana >
                    lista[1].przegrana then

                    najwyzszaPorazka