Przejdź do zawartości

Moduł:StatystykiHistoryczne

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

-- =========================================================
-- MODUŁ: STATYSTYKISTORYCZNE
--
-- Łączne statystyki zawodników drużyny koszykarskiej
-- ze wszystkich wprowadzonych sezonów.
--
-- Tabele:
-- 1. Mecze
-- 2. Punkty
-- 3. Asysty
-- 4. Zbiórki
-- 5. Bloki
-- 6. Minuty
--
-- Użycie:
--
-- {{#invoke:StatystykiHistoryczne|main
-- |druzyna=Enea Basket Poznań
-- }}
--
-- Moduł jest uniwersalny dla drużyn koszykarskich.
-- =========================================================


-- =========================================================
-- GŁÓWNA FUNKCJA
-- =========================================================

function p.main(frame)

    -- -----------------------------------------------------
    -- DRUŻYNA
    -- -----------------------------------------------------

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


    if druzyna == "" then

        return
            "''Nie podano drużyny.''"

    end


    -- -----------------------------------------------------
    -- BEZPIECZNE PRZYGOTOWANIE NAZWY DRUŻYNY
    -- -----------------------------------------------------

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


    -- =====================================================
    -- POLA CARGO
    -- =====================================================

    local fields = table.concat({

        "UdzialZawodnika.zawodnik=zawodnik",

        "UdzialZawodnika.druzyna=druzyna",

        "UdzialZawodnika.mecz=mecz",

        "UdzialZawodnika.minuty=minuty",

        "UdzialZawodnika.minuty_format=minuty_format",

        "UdzialZawodnika.gol=gol",

        "UdzialZawodnika.asysta=asysta",

        "UdzialZawodnika.zbiorka=zbiorka",

        "UdzialZawodnika.blok=blok"

    }, ",")


    -- =====================================================
    -- ZAPYTANIE CARGO
    -- =====================================================

    local args = {

        where =
            "UdzialZawodnika.druzyna='"
            .. druzynaSQL
            .. "'",

        limit = 5000

    }


    local rows =
        mw.ext.cargo.query(
            "UdzialZawodnika",
            fields,
            args
        )


    -- =====================================================
    -- BRAK DANYCH
    -- =====================================================

    if not rows or #rows == 0 then

        return
            "''Brak statystyk dla drużyny "
            .. druzyna
            .. " w bazie.''"

    end


    -- =====================================================
    -- STRUKTURA ZAWODNIKA
    -- =====================================================

    local zawodnicy = {}


    -- =====================================================
    -- FUNKCJA NOWEGO REKORDU
    -- =====================================================

    local function nowyZawodnik()

        return {

            mecze = 0,

            punkty = 0,

            asysty = 0,

            zbiorki = 0,

            bloki = 0,

            minuty = 0

        }

    end


    -- =====================================================
    -- POMOCNICZA FUNKCJA LICZBOWA
    -- =====================================================

    local function liczba(wartosc)

        return
            tonumber(wartosc or 0)
            or 0

    end


    -- =====================================================
    -- ZLICZANIE STATYSTYK
    -- =====================================================

    for _, row in ipairs(rows) do

        local zawodnik =
            mw.text.trim(
                row.zawodnik or ""
            )


        if zawodnik ~= "" then

            if not zawodnicy[zawodnik] then

                zawodnicy[zawodnik] =
                    nowyZawodnik()

            end


            local stat =
                zawodnicy[zawodnik]


            -- ---------------------------------------------
            -- MECZ
            -- ---------------------------------------------

            stat.mecze =
                stat.mecze + 1


            -- ---------------------------------------------
            -- PUNKTY
            -- ---------------------------------------------

            stat.punkty =
                stat.punkty
                + liczba(row.gol)


            -- ---------------------------------------------
            -- ASYSTY
            -- ---------------------------------------------

            stat.asysty =
                stat.asysty
                + liczba(row.asysta)


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

            stat.zbiorki =
                stat.zbiorki
                + liczba(row.zbiorka)


            -- ---------------------------------------------
            -- BLOKI
            -- ---------------------------------------------

            stat.bloki =
                stat.bloki
                + liczba(row.blok)


            -- ---------------------------------------------
            -- MINUTY
            --
            -- Cargo przechowuje minuty jako Integer.
            -- Przyjmujemy, że jest to liczba minut.
            -- ---------------------------------------------

            stat.minuty =
                stat.minuty
                + liczba(row.minuty)

        end

    end


    -- =====================================================
    -- LISTA ZAWODNIKÓW
    -- =====================================================

    local lista = {}


    for zawodnik, stat in pairs(zawodnicy) do

        table.insert(
            lista,
            {
                zawodnik = zawodnik,
                stat = stat
            }
        )

    end


    -- =====================================================
    -- FORMATOWANIE MINUT
    -- =====================================================

    local function formatujMinuty(minuty)

        minuty =
            tonumber(minuty)
            or 0


        local godziny =
            math.floor(
                minuty / 60
            )


        local min =
            minuty % 60


        return string.format(
            "%d:%02d",
            godziny,
            min
        )

    end


    -- =====================================================
    -- LINK DO ZAWODNIKA
    --
    -- Zakładamy, że strona zawodnika ma nazwę identyczną
    -- z polem "zawodnik" w Cargo.
    -- =====================================================

    local function linkZawodnika(nazwa)

        return
            "[["
            .. nazwa
            .. "|"
            .. nazwa
            .. "]]"

    end


    -- =====================================================
    -- GENEROWANIE JEDNEJ TABELI
    -- =====================================================

    local function generujTabele(
        tytul,
        pole,
        formatWartosci,
        ikona
    )

        -- ---------------------------------------------
        -- SORTOWANIE
        -- ---------------------------------------------

        table.sort(
            lista,
            function(a, b)

                local wartoscA =
                    a.stat[pole]
                    or 0


                local wartoscB =
                    b.stat[pole]
                    or 0


                if wartoscA ~= wartoscB then

                    return wartoscA > wartoscB

                end


                -- Przy remisie alfabetycznie

                return
                    a.zawodnik
                    < b.zawodnik

            end
        )


        -- ---------------------------------------------
        -- TABELA
        -- ---------------------------------------------

        local wynik = {}


        table.insert(
            wynik,
            "==== "
            .. ikona
            .. " "
            .. tytul
            .. " ===="
        )


        table.insert(
            wynik,
            ""
        )


        table.insert(
            wynik,
            '{| class="wikitable sortable" style="width:100%; text-align:center;"'
        )


        table.insert(
            wynik,
            "! Miejsce"
        )


        table.insert(
            wynik,
            "! Zawodnik"
        )


        table.insert(
            wynik,
            "! "
            .. tytul
        )


        -- ---------------------------------------------
        -- WIERSZE
        -- ---------------------------------------------

        for i, rekord in ipairs(lista) do

            local wartosc =
                rekord.stat[pole]
                or 0


            if formatWartosci then

                wartosc =
                    formatWartosci(
                        wartosc
                    )

            end


            table.insert(
                wynik,
                "|-"
            )


            table.insert(
                wynik,
                "| "
                .. i
            )


            table.insert(
                wynik,
                "| "
                .. linkZawodnika(
                    rekord.zawodnik
                )
            )


            table.insert(
                wynik,
                "| '''"
                .. wartosc
                .. "'''"
            )

        end


        table.insert(
            wynik,
            "|}"
        )


        return
            table.concat(
                wynik,
                "\n"
            )

    end


    -- =====================================================
    -- WYNIK KOŃCOWY
    -- =====================================================

    local wynik = {}


    table.insert(
        wynik,
        "=== Statystyki historyczne – "
        .. druzyna
        .. " ==="
    )


    table.insert(
        wynik,
        ""
    )


    -- =====================================================
    -- UKŁAD 2 KOLUMNY
    --
    -- Każda tabela znajduje się w osobnym bloku.
    -- MediaWiki może je układać obok siebie dzięki CSS.
    -- =====================================================


    table.insert(
        wynik,
        '<div class="statystyki-historyczne">'
    )


    -- =====================================================
    -- 1. MECZE
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Mecze",
            "mecze",
            nil,
            "🏀"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- 2. PUNKTY
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Punkty",
            "punkty",
            nil,
            "🏀"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- 3. ASYSTY
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Asysty",
            "asysty",
            nil,
            "🎯"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- 4. ZBIÓRKI
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Zbiórki",
            "zbiorki",
            nil,
            "🏀"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- 5. BLOKI
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Bloki",
            "bloki",
            nil,
            "🛡️"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- 6. MINUTY
    -- =====================================================

    table.insert(
        wynik,
        '<div class="statystyki-historyczne-tabela">'
    )


    table.insert(
        wynik,
        generujTabele(
            "Minuty",
            "minuty",
            formatujMinuty,
            "⏱️"
        )
    )


    table.insert(
        wynik,
        "</div>"
    )


    table.insert(
        wynik,
        "</div>"
    )


    -- =====================================================
    -- ZWRÓCENIE WYNIKU
    -- =====================================================

    return
        table.concat(
            wynik,
            "\n"
        )

end


return p