Przejdź do zawartości

Moduł:Rekordy sezon: Różnice pomiędzy wersjami

Z Encyklopedia Poznanskiego Sportu
Nie podano opisu zmian
Nie podano opisu zmian
Linia 5: Linia 5:
--
--
-- Jeden moduł dla różnych dyscyplin.
-- Jeden moduł dla różnych 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
-- }}
--
-- =========================================================
-- =========================================================


Linia 184: Linia 201:
--
--
-- WAŻNE:
-- WAŻNE:
-- item.wartosc MUSI być zapisana w elemencie.
-- item.wartosc jest ustawiane tutaj dla KAŻDEGO rekordu.
-- Dzięki temu kolejne rekordy są porównywane
--
-- z rzeczywistą wartością danego rekordu.
-- Dzięki temu:
-- punkty porównują punkty,
-- minuty porównują minuty,
-- asysty porównują asysty,
-- zbiórki porównują zbiórki,
-- EVAL porównuje EVAL,
-- plus/minus porównuje plus/minus.
-- =========================================================
-- =========================================================


Linia 205: Linia 228:
     -- KLUCZOWA POPRAWKA
     -- KLUCZOWA POPRAWKA
     item.wartosc = wartosc
     item.wartosc = wartosc


     if #lista == 0 then
     if #lista == 0 then
Linia 264: Linia 286:


         local roznicaTekst
         local roznicaTekst


         if roznica >= 0 then
         if roznica >= 0 then
Linia 333: Linia 354:


             wartosc =
             wartosc =
                 tostring(item.punkty or 0) ..
                 tostring(item.punkty) ..
                 " pkt"
                 " pkt"


Linia 361: Linia 382:


             wartosc =
             wartosc =
                 tostring(item.asysty or 0) ..
                 tostring(item.asysty) ..
                 " as."
                 " as."


Linia 368: Linia 389:


             wartosc =
             wartosc =
                 tostring(item.zbiorki or 0) ..
                 tostring(item.zbiorki) ..
                 " zb."
                 " zb."


Linia 375: Linia 396:


             wartosc =
             wartosc =
                 tostring(item.eval or 0) ..
                 tostring(item.eval) ..
                 " EVAL"
                 " EVAL"


Linia 383: Linia 404:
             local pm =
             local pm =
                 item.plusminus or 0
                 item.plusminus or 0


             if pm >= 0 then
             if pm >= 0 then
Linia 515: Linia 535:
         wyjazd = {}
         wyjazd = {}
     }
     }


     local najwyzszaPorazka = {
     local najwyzszaPorazka = {
Linia 534: Linia 553:
                 druzyna
                 druzyna
             )
             )


         local zdobyte,
         local zdobyte,
Linia 577: Linia 595:


                 wynik =
                 wynik =
                     tostring(
                     tostring(zdobyte) ..
                        zdobyte
                    ) ..
                     ":" ..
                     ":" ..
                     tostring(
                     tostring(stracone)
                        stracone
                    )


             }
             }
Linia 628: Linia 642:
                     local obecna =
                     local obecna =
                         lista[1].przegrana
                         lista[1].przegrana
                    if obecna == nil then
                        obecna = 0
                    end




Linia 751: Linia 760:
     }
     }


    -- =====================================================
    -- PRZETWARZANIE STATYSTYK
    -- =====================================================


     if zawodnicy then
     if zawodnicy then
Linia 792: Linia 797:
                         row.minuty_format or "",
                         row.minuty_format or "",


                    -- PUNKTY KOSZYKARSKIE
                    -- przechowywane w polu gol
                     punkty =
                     punkty =
                         liczba(row.gol),
                         liczba(row.gol),
Linia 813: Linia 820:




                 -- =========================================
                 -- =================================================
                 -- PUNKTY
                 -- KAŻDY REKORD MA WŁASNĄ WARTOŚĆ
                 -- =========================================
                 -- =================================================


                 dodajRekord(
                 dodajRekord(
Linia 824: Linia 831:
                 )
                 )


                -- =========================================
                -- MINUTY
                -- =========================================


                 dodajRekord(
                 dodajRekord(
Linia 836: Linia 839:
                 )
                 )


                -- =========================================
                -- ASYSTY
                -- =========================================


                 dodajRekord(
                 dodajRekord(
Linia 848: Linia 847:
                 )
                 )


                -- =========================================
                -- ZBIÓRKI
                -- =========================================


                 dodajRekord(
                 dodajRekord(
Linia 860: Linia 855:
                 )
                 )


                -- =========================================
                -- EVAL
                -- =========================================


                 dodajRekord(
                 dodajRekord(
Linia 872: Linia 863:
                 )
                 )


                -- =========================================
                -- PLUS/MINUS
                -- =========================================


                 dodajRekord(
                 dodajRekord(
Linia 942: Linia 929:
                 druzyna
                 druzyna
             )
             )


         local zdobyte,
         local zdobyte,
Linia 1113: Linia 1099:




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


     table.insert(
     table.insert(
Linia 1192: Linia 1176:




     -- =====================================================
     -- INDYWIDUALNE
    -- REKORDY INDYWIDUALNE
    -- =====================================================


     table.insert(
     table.insert(
Linia 1221: Linia 1203:
     )
     )


    -- =====================================================
    -- KOLEJNOŚĆ STATYSTYK ZACHOWANA
    -- =====================================================


     local rekordyLista = {
     local rekordyLista = {
Linia 1303: Linia 1289:




    -- =====================================================
     -- SERIE
     -- SERIE
    -- =====================================================


     table.insert(
     table.insert(
Linia 1504: Linia 1488:
         wyjazd = {}
         wyjazd = {}
     }
     }


     local najwyzszaPorazka = {
     local najwyzszaPorazka = {
Linia 1569: Linia 1552:
                 druzyna
                 druzyna
             )
             )


         local zdobyte,
         local zdobyte,
Linia 1588: Linia 1570:




            -- =============================================
             -- WYNIK Z PERSPEKTYWY DRUŻYNY
             -- WYNIK Z PERSPEKTYWY DRUŻYNY
            -- =============================================


             local wynikPerspektywa =
             local wynikPerspektywa =
                 tostring(scobyte or zdobyte) ..
                 tostring(zdobyte) ..
                 ":" ..
                 ":" ..
                 tostring(stracone)
                 tostring(stracone)




            -- =============================================
             -- NAJCZĘSTSZE WYNIKI
             -- NAJCZĘSTSZE WYNIKI
            -- =============================================


             najczestszeWyniki[
             najczestszeWyniki[
Linia 1606: Linia 1592:




            -- =============================================
             -- ROZGRYWKI
             -- ROZGRYWKI
            -- =============================================


             local rozgrywki =
             local rozgrywki =
Linia 1612: Linia 1600:
                     row.rozgrywki or ""
                     row.rozgrywki or ""
                 )
                 )


             if rozgrywki == "" then
             if rozgrywki == "" then
Linia 1663: Linia 1650:




            -- =============================================
             -- REZULTAT
             -- REZULTAT
            -- =============================================


             local rezultat
             local rezultat
Linia 1723: Linia 1712:




             -- NAJWYŻSZE ZWYCIĘSTWO
             -- =============================================
            -- REKORD NAJWYŻSZEGO ZWYCIĘSTWA
            -- =============================================


             if rezultat == "W" then
             if rezultat == "W" then
Linia 1769: Linia 1760:




             -- NAJWYŻSZA PORAŻKA
             -- =============================================
            -- REKORD NAJWYŻSZEJ PORAŻKI
            -- =============================================


             if rezultat == "P" then
             if rezultat == "P" then
Linia 1822: Linia 1815:




            -- =============================================
             -- SERIA BEZ PORAŻKI
             -- SERIA BEZ PORAŻKI
            -- =============================================


             if rezultat == "W"
             if rezultat == "W"
Linia 1854: Linia 1849:




             -- SERIE
            -- =============================================
             -- SERIE WYGRANYCH / BEZ WYGRANEJ / PORAŻEK
            -- =============================================


             local obszary = {
             local obszary = {
Linia 1977: Linia 1974:




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


     table.insert(
     table.insert(
Linia 2060: Linia 2059:




    -- =====================================================
     -- SERIE
     -- SERIE
    -- =====================================================


     table.insert(
     table.insert(
Linia 2129: Linia 2130:




     -- NAJCZĘSTSZE WYNIKI
     -- =====================================================
    -- WYNIKI
    -- =====================================================


     table.insert(
     table.insert(
Linia 2190: Linia 2193:




    -- =====================================================
     -- ROZGRYWKI
     -- ROZGRYWKI
    -- =====================================================


     table.insert(
     table.insert(
Linia 2324: Linia 2329:
             frame.args.sezon or ""
             frame.args.sezon or ""
         )
         )


     local druzyna =
     local druzyna =
Linia 2330: Linia 2334:
             frame.args.druzyna or ""
             frame.args.druzyna or ""
         )
         )


     local dyscyplina =
     local dyscyplina =
Linia 2356: Linia 2359:




    -- =====================================================
     -- PIŁKA NOŻNA
     -- PIŁKA NOŻNA
    -- =====================================================


     if dyscyplina == "piłka nożna"
     if dyscyplina == "piłka nożna"
Linia 2373: Linia 2378:




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


     if dyscyplina == "koszykówka"
     if dyscyplina == "koszykówka"
Linia 2388: Linia 2395:
     end
     end


    -- =====================================================
    -- BRAK ROZPOZNANIA
    -- =====================================================


     return
     return

Wersja z 14:45, 20 sie 2026

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

local p = {}

-- =========================================================
-- Moduł:Rekordy_sezon
--
-- Jeden moduł dla różnych 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
-- }}
--
-- =========================================================


-- =========================================================
-- FUNKCJE WSPÓLNE
-- =========================================================

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 escapeSQL(value)

    value = tostring(value or "")

    return mw.ustring.gsub(
        value,
        "'",
        "''"
    )

end


-- =========================================================
-- ROZPOZNANIE MIEJSCA MECZU
-- =========================================================

local function miejsceMeczu(row, druzyna)

    local d1 =
        tostring(row.druzyna1 or "")

    local d2 =
        tostring(row.druzyna2 or "")

    if d1 == druzyna then
        return "dom"
    end

    if d2 == druzyna then
        return "wyjazd"
    end

    return nil

end


-- =========================================================
-- WYNIK MECZU
-- =========================================================

local function wynikMeczu(row)

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

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

    if g1 ~= nil and g2 ~= nil then
        return g1, g2
    end


    local wynik =
        tostring(row.wynik or "")

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

    if a and b then

        return
            tonumber(a),
            tonumber(b)

    end


    return nil, nil

end


-- =========================================================
-- WYNIK Z PERSPEKTYWY DRUŻYNY
-- =========================================================

local function wynikZPerspektywy(row, druzyna)

    local g1, g2 =
        wynikMeczu(row)

    if g1 == nil or g2 == nil then
        return nil, nil
    end

    local miejsce =
        miejsceMeczu(
            row,
            druzyna
        )

    if miejsce == "dom" then

        return g1, g2

    elseif miejsce == "wyjazd" then

        return g2, g1

    end

    return nil, nil

end


-- =========================================================
-- NAZWA MECZU
-- =========================================================

local function nazwaMeczu(row)

    local d1 =
        tostring(row.druzyna1 or "")

    local d2 =
        tostring(row.druzyna2 or "")

    local strona =
        tostring(row.strona_meczu or "")

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


    if strona ~= "" then

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

    end

    return tekst

end


-- =========================================================
-- FUNKCJA DODAWANIA REKORDU
--
-- WAŻNE:
-- item.wartosc jest ustawiane tutaj dla KAŻDEGO rekordu.
--
-- Dzięki temu:
-- punkty porównują punkty,
-- minuty porównują minuty,
-- asysty porównują asysty,
-- zbiórki porównują zbiórki,
-- EVAL porównuje EVAL,
-- plus/minus porównuje plus/minus.
-- =========================================================

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

    if wartosc == nil then
        return
    end

    local lista =
        tabela[miejsce]

    -- KLUCZOWA POPRAWKA
    item.wartosc = wartosc

    if #lista == 0 then

        table.insert(
            lista,
            item
        )

        return

    end


    local obecna =
        lista[1].wartosc


    if obecna == nil then
        obecna = 0
    end


    if wartosc > obecna then

        tabela[miejsce] = {
            item
        }

    elseif wartosc == obecna then

        table.insert(
            lista,
            item
        )

    end

end


-- =========================================================
-- FORMAT REKORDÓW MECZOWYCH
-- =========================================================

local function tekstMeczow(lista)

    if not lista or #lista == 0 then
        return "—"
    end

    local wynik = {}

    for _, item in ipairs(lista) do

        local roznica =
            item.roznica or 0

        local roznicaTekst

        if roznica >= 0 then

            roznicaTekst =
                "+" ..
                tostring(roznica)

        else

            roznicaTekst =
                tostring(roznica)

        end


        table.insert(
            wynik,

            item.tekst ..
            " (" ..
            item.wynik ..
            ", " ..
            roznicaTekst ..
            ")"

        )

    end


    return table.concat(
        wynik,
        "<br>"
    )

end


-- =========================================================
-- FORMAT REKORDÓW ZAWODNIKÓW
-- =========================================================

local function tekstZawodnikow(
    lista,
    typ
)

    if not lista or #lista == 0 then
        return "—"
    end

    local wynik = {}


    for _, item in ipairs(lista) do

        local zawodnikLink =
            "[[" ..
            tostring(item.zawodnik or "") ..
            "]]"


        local wartosc = ""


        if typ == "punkty" then

            wartosc =
                tostring(item.punkty) ..
                " pkt"


        elseif typ == "minuty" then

            wartosc =
                tostring(
                    item.minuty_format or ""
                )

            if wartosc == "" then

                wartosc =
                    tostring(
                        item.minuty or 0
                    )

            end

            wartosc =
                wartosc ..
                " min"


        elseif typ == "asysty" then

            wartosc =
                tostring(item.asysty) ..
                " as."


        elseif typ == "zbiorki" then

            wartosc =
                tostring(item.zbiorki) ..
                " zb."


        elseif typ == "eval" then

            wartosc =
                tostring(item.eval) ..
                " EVAL"


        elseif typ == "plusminus" then

            local pm =
                item.plusminus or 0

            if pm >= 0 then

                wartosc =
                    "+" ..
                    tostring(pm)

            else

                wartosc =
                    tostring(pm)

            end

            wartosc =
                wartosc ..
                " +/-"

        end


        table.insert(
            wynik,

            zawodnikLink ..
            " — " ..
            wartosc ..
            "<br>" ..
            tostring(item.tekst or "") ..
            " (" ..
            tostring(item.wynik or "") ..
            ")"

        )

    end


    return table.concat(
        wynik,
        "<br>"
    )

end


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

local function koszykowka(
    frame,
    sezon,
    druzyna
)

    local sezonSQL =
        escapeSQL(sezon)

    local druzynaSQL =
        escapeSQL(druzyna)


    -- =====================================================
    -- MECZE
    -- =====================================================

    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 mecze =
        mw.ext.cargo.query(

            "Mecze",

            fieldsMecze,

            {
                where =
                    "(" ..
                    "Mecze.druzyna1='" ..
                    druzynaSQL ..
                    "'" ..
                    " OR " ..
                    "Mecze.druzyna2='" ..
                    druzynaSQL ..
                    "'" ..
                    ")" ..
                    " AND Mecze.sezon='" ..
                    sezonSQL ..
                    "'",

                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 = {}
    }


    -- =====================================================
    -- PRZETWARZANIE MECZÓW
    -- =====================================================

    for _, row in ipairs(mecze) do

        local miejsce =
            miejsceMeczu(
                row,
                druzyna
            )

        local zdobyte,
            stracone =
                wynikZPerspektywy(
                    row,
                    druzyna
                )


        if miejsce
            and zdobyte ~= nil
            and stracone ~= nil then


            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(zdobyte) ..
                    ":" ..
                    tostring(stracone)

            }


            -- ZWYCIĘSTWO

            if roznica > 0 then

                dodajRekord(
                    najwyzszeZwyciestwo,
                    miejsce,
                    roznica,
                    item
                )

            end


            -- PORAŻKA

            if roznica < 0 then

                item.wartosc =
                    math.abs(roznica)

                item.przegrana =
                    math.abs(roznica)


                local lista =
                    najwyzszaPorazka[miejsce]


                if #lista == 0 then

                    table.insert(
                        lista,
                        item
                    )

                else

                    local obecna =
                        lista[1].przegrana


                    if item.przegrana > obecna then

                        najwyzszaPorazka[miejsce] = {
                            item
                        }

                    elseif item.przegrana == obecna then

                        table.insert(
                            lista,
                            item
                        )

                    end

                end

            end

        end

    end


    -- =====================================================
    -- STATYSTYKI ZAWODNIKÓW
    -- =====================================================

    local fieldsZawodnicy =
        table.concat({

            "UdzialZawodnika.zawodnik=zawodnik",
            "UdzialZawodnika.druzyna=druzyna_zawodnika",
            "UdzialZawodnika.gol=gol",
            "UdzialZawodnika.minuty=minuty",
            "UdzialZawodnika.minuty_format=minuty_format",
            "UdzialZawodnika.asysta=asysta",
            "UdzialZawodnika.zbiorka=zbiorka",
            "UdzialZawodnika.eval=eval",
            "UdzialZawodnika.plusminus=plusminus",

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

        }, ",")


    local zawodnicy =
        mw.ext.cargo.query(

            "UdzialZawodnika,Mecze",

            fieldsZawodnicy,

            {
                join =
                    "UdzialZawodnika.mecz=Mecze.id",

                where =
                    "UdzialZawodnika.druzyna='" ..
                    druzynaSQL ..
                    "'" ..
                    " AND Mecze.sezon='" ..
                    sezonSQL ..
                    "'" ..
                    " AND UdzialZawodnika.minuty > 0",

                orderBy =
                    "Mecze.data ASC",

                limit = 10000
            }

        )


    local rekordy = {

        punkty = {
            dom = {},
            wyjazd = {}
        },

        minuty = {
            dom = {},
            wyjazd = {}
        },

        asysty = {
            dom = {},
            wyjazd = {}
        },

        zbiorki = {
            dom = {},
            wyjazd = {}
        },

        eval = {
            dom = {},
            wyjazd = {}
        },

        plusminus = {
            dom = {},
            wyjazd = {}
        }

    }


    if zawodnicy then

        for _, row in ipairs(zawodnicy) do

            local miejsce =
                miejsceMeczu(
                    row,
                    druzyna
                )


            if miejsce then

                local item = {

                    zawodnik =
                        row.zawodnik or "",

                    mecz =
                        row.mecz or "",

                    data =
                        row.data or "",

                    miejsce =
                        miejsce,

                    tekst =
                        nazwaMeczu(row),

                    wynik =
                        row.wynik or "",

                    minuty_format =
                        row.minuty_format or "",

                    -- PUNKTY KOSZYKARSKIE
                    -- przechowywane w polu gol
                    punkty =
                        liczba(row.gol),

                    minuty =
                        liczba(row.minuty),

                    asysty =
                        liczba(row.asysta),

                    zbiorki =
                        liczba(row.zbiorka),

                    eval =
                        liczba(row.eval),

                    plusminus =
                        liczba(row.plusminus)

                }


                -- =================================================
                -- KAŻDY REKORD MA WŁASNĄ WARTOŚĆ
                -- =================================================

                dodajRekord(
                    rekordy.punkty,
                    miejsce,
                    item.punkty,
                    item
                )


                dodajRekord(
                    rekordy.minuty,
                    miejsce,
                    item.minuty,
                    item
                )


                dodajRekord(
                    rekordy.asysty,
                    miejsce,
                    item.asysty,
                    item
                )


                dodajRekord(
                    rekordy.zbiorki,
                    miejsce,
                    item.zbiorki,
                    item
                )


                dodajRekord(
                    rekordy.eval,
                    miejsce,
                    item.eval,
                    item
                )


                dodajRekord(
                    rekordy.plusminus,
                    miejsce,
                    item.plusminus,
                    item
                )

            end

        end

    end


    -- =====================================================
    -- SERIE
    -- =====================================================

    local serie = {

        wszystkie = {
            wygrane = 0,
            przegrane = 0
        },

        dom = {
            wygrane = 0,
            przegrane = 0
        },

        wyjazd = {
            wygrane = 0,
            przegrane = 0
        }

    }


    local aktualna = {

        wszystkie = {
            W = 0,
            P = 0
        },

        dom = {
            W = 0,
            P = 0
        },

        wyjazd = {
            W = 0,
            P = 0
        }

    }


    for _, row in ipairs(mecze) do

        local miejsce =
            miejsceMeczu(
                row,
                druzyna
            )

        local zdobyte,
            stracone =
                wynikZPerspektywy(
                    row,
                    druzyna
                )


        if miejsce
            and zdobyte ~= nil
            and stracone ~= nil then


            local wynik


            if zdobyte > stracone then

                wynik = "W"

            elseif zdobyte < stracone then

                wynik = "P"

            else

                wynik = "R"

            end


            -- OGÓŁEM

            if wynik == "W" then

                aktualna.wszystkie.W =