Przejdź do zawartości

Moduł:HistoriaWystepow

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

function p.main(frame)

    local zawodnik = frame.args.zawodnik

    if not zawodnik or zawodnik == "" then
        zawodnik = mw.title.getCurrentTitle().text
    end

    -- =====================================================
    -- BEZPIECZNE PRZYGOTOWANIE NAZWY ZAWODNIKA
    -- =====================================================

    local zawodnikSQL = mw.ustring.gsub(zawodnik, "'", "''")

    -- =====================================================
    -- POLA POBIERANE Z CARGO
    -- =====================================================

    local fields = table.concat({
        "UdzialZawodnika.mecz=mecz",
        "UdzialZawodnika.druzyna=druzyna",
        "UdzialZawodnika.minuty=minuty",
        "UdzialZawodnika.minuty_format=minuty_format",
        "UdzialZawodnika.gol=gol",
        "UdzialZawodnika.eval=eval",
        "UdzialZawodnika.plusminus=plusminus",

        "Mecze.data=data",
        "Mecze.sezon=sezon",
        "Mecze.druzyna1=druzyna1",
        "Mecze.druzyna2=druzyna2",
        "Mecze.wynik=wynik",
        "Mecze.strona_meczu=strona_meczu"
    }, ",")

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

    local args = {
        join = "UdzialZawodnika.mecz=Mecze.id",
        where = "UdzialZawodnika.zawodnik='" .. zawodnikSQL .. "' AND UdzialZawodnika.minuty > 0",
        orderBy = "Mecze.data ASC",
        limit = 5000
    }

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

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

    if not rows or #rows == 0 then
        return "''Brak wprowadzonych występów w bazie.''"
    end

    -- =====================================================
    -- FUNKCJA TWORZĄCA PODSUMOWANIE
    -- =====================================================

    local function nowePodsumowanie()

        return {
            wystepy = 0,
            zwyciestwa = 0,
            porazki = 0,
            remisy = 0,
            punkty = 0,
            minuty = 0,
            eval = 0,
            plusminus = 0
        }

    end

    -- =====================================================
    -- PODSUMOWANIA
    -- =====================================================

    local suma = nowePodsumowanie()
    local dom = nowePodsumowanie()
    local wyjazd = nowePodsumowanie()

    -- podsumowania poszczególnych sezonów
    local sezony = {}

    -- =====================================================
    -- OKREŚLENIE WYNIKU MECZU
    -- =====================================================

    local function okreslWynik(row)

        local d1 = row.druzyna1 or ""
        local d2 = row.druzyna2 or ""
        local druzyna = row.druzyna or ""
        local wynikMeczu = row.wynik or ""

        local g1, g2 = wynikMeczu:match("(%d+)%s*:%s*(%d+)")

        if not g1 or not g2 then
            return nil
        end

        g1 = tonumber(g1)
        g2 = tonumber(g2)

        if druzyna == d1 then

            if g1 > g2 then
                return "W"
            elseif g1 < g2 then
                return "P"
            else
                return "R"
            end

        elseif druzyna == d2 then

            if g2 > g1 then
                return "W"
            elseif g2 < g1 then
                return "P"
            else
                return "R"
            end

        end

        return nil
    end

    -- =====================================================
    -- DODANIE MECZU DO PODSUMOWANIA
    -- =====================================================

    local function dodajDoPodsumowania(stat, row)

        stat.wystepy = stat.wystepy + 1

        stat.punkty =
            stat.punkty +
            tonumber(row.gol or 0)

        stat.minuty =
            stat.minuty +
            tonumber(row.minuty or 0)

        stat.eval =
            stat.eval +
            tonumber(row.eval or 0)

        stat.plusminus =
            stat.plusminus +
            tonumber(row.plusminus or 0)

        local wynik = okreslWynik(row)

        if wynik == "W" then

            stat.zwyciestwa =
                stat.zwyciestwa + 1

        elseif wynik == "P" then

            stat.porazki =
                stat.porazki + 1

        elseif wynik == "R" then

            stat.remisy =
                stat.remisy + 1

        end

    end

    -- =====================================================
    -- PRZEJŚCIE PRZEZ WSZYSTKIE MECZE
    -- =====================================================

    for _, row in ipairs(rows) do

        -- -----------------------------------------------
        -- WSZYSTKIE MECZE
        -- -----------------------------------------------

        dodajDoPodsumowania(
            suma,
            row
        )

        -- -----------------------------------------------
        -- DOM / WYJAZD
        -- -----------------------------------------------

        local d1 = row.druzyna1 or ""
        local d2 = row.druzyna2 or ""
        local druzyna = row.druzyna or ""

        if druzyna == d1 then

            dodajDoPodsumowania(
                dom,
                row
            )

        elseif druzyna == d2 then

            dodajDoPodsumowania(
                wyjazd,
                row
            )

        end

        -- -----------------------------------------------
        -- SEZON
        -- -----------------------------------------------

        local sezon = row.sezon or ""

        if sezon == "" then
            sezon = "Brak sezonu"
        end

        if not sezony[sezon] then
            sezony[sezon] = nowePodsumowanie()
        end

        dodajDoPodsumowania(
            sezony[sezon],
            row
        )

    end

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

    local function formatujMinuty(minuty)

        local godziny =
            math.floor(minuty / 60)

        local min =
            minuty % 60

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

    end

    -- =====================================================
    -- SORTOWANIE SEZONÓW
    -- =====================================================

    local listaSezonow = {}

    for sezon, _ in pairs(sezony) do
        table.insert(
            listaSezonow,
            sezon
        )
    end

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

            return a > b

        end
    )

    -- =====================================================
    -- WYNIK
    -- =====================================================

    local wynik = {}

    table.insert(
        wynik,
        "== Historia występów =="
    )

    table.insert(wynik, "")

    -- =====================================================
    -- PODSUMOWANIE WSZYSTKICH / DOM / WYJAZD
    -- =====================================================

    table.insert(
        wynik,
        "=== Podsumowanie wszystkich spotkań ==="
    )

    table.insert(wynik, "")

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

    table.insert(
        wynik,
        "! "
    )

    table.insert(
        wynik,
        "! Wszystkie spotkania"
    )

    table.insert(
        wynik,
        "! 🏠 Mecze domowe"
    )

    table.insert(
        wynik,
        "! ✈️ Mecze wyjazdowe"
    )

    -- Występy

    table.insert(wynik, "|-")
    table.insert(wynik, "! Występy")
    table.insert(wynik, "| '''" .. suma.wystepy .. "'''")
    table.insert(wynik, "| '''" .. dom.wystepy .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.wystepy .. "'''")

    -- Zwycięstwa

    table.insert(wynik, "|-")
    table.insert(wynik, "! Zwycięstwa")
    table.insert(wynik, "| '''" .. suma.zwyciestwa .. "'''")
    table.insert(wynik, "| '''" .. dom.zwyciestwa .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.zwyciestwa .. "'''")

    -- Porażki

    table.insert(wynik, "|-")
    table.insert(wynik, "! Porażki")
    table.insert(wynik, "| '''" .. suma.porazki .. "'''")
    table.insert(wynik, "| '''" .. dom.porazki .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.porazki .. "'''")

    -- Remisy

    table.insert(wynik, "|-")
    table.insert(wynik, "! Remisy")
    table.insert(wynik, "| '''" .. suma.remisy .. "'''")
    table.insert(wynik, "| '''" .. dom.remisy .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.remisy .. "'''")

    -- Punkty

    table.insert(wynik, "|-")
    table.insert(wynik, "! Punkty")
    table.insert(wynik, "| '''" .. suma.punkty .. "'''")
    table.insert(wynik, "| '''" .. dom.punkty .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.punkty .. "'''")

    -- Minuty

    table.insert(wynik, "|-")
    table.insert(wynik, "! Minuty")
    table.insert(wynik, "| '''" .. formatujMinuty(suma.minuty) .. "'''")
    table.insert(wynik, "| '''" .. formatujMinuty(dom.minuty) .. "'''")
    table.insert(wynik, "| '''" .. formatujMinuty(wyjazd.minuty) .. "'''")

    -- EVAL

    table.insert(wynik, "|-")
    table.insert(wynik, "! EVAL")
    table.insert(wynik, "| '''" .. suma.eval .. "'''")
    table.insert(wynik, "| '''" .. dom.eval .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.eval .. "'''")

    -- Plus/minus

    table.insert(wynik, "|-")
    table.insert(wynik, "! +/-")
    table.insert(wynik, "| '''" .. suma.plusminus .. "'''")
    table.insert(wynik, "| '''" .. dom.plusminus .. "'''")
    table.insert(wynik, "| '''" .. wyjazd.plusminus .. "'''")

    table.insert(
        wynik,
        "|}"
    )

    table.insert(wynik, "")

    -- =====================================================
    -- PODSUMOWANIE POSZCZEGÓLNYCH SEZONÓW
    -- =====================================================

    table.insert(
        wynik,
        "=== Podsumowanie sezonów ==="
    )

    table.insert(wynik, "")

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

    table.insert(
        wynik,
        "! Sezon"
    )

    table.insert(
        wynik,
        "! Występy"
    )

    table.insert(
        wynik,
        "! Zwycięstwa"
    )

    table.insert(
        wynik,
        "! Porażki"
    )

    table.insert(
        wynik,
        "! Remisy"
    )

    table.insert(
        wynik,
        "! Punkty"
    )

    table.insert(
        wynik,
        "! Minuty"
    )

    table.insert(
        wynik,
        "! EVAL"
    )

    table.insert(
        wynik,
        "! +/-"
    )

    for _, sezon in ipairs(listaSezonow) do

        local stat = sezony[sezon]

        table.insert(
            wynik,
            "|-"
        )

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

        table.insert(
            wynik,
            "| " .. stat.wystepy
        )

        table.insert(
            wynik,
            "| " .. stat.zwyciestwa
        )

        table.insert(
            wynik,
            "| " .. stat.porazki
        )

        table.insert(
            wynik,
            "| " .. stat.remisy
        )

        table.insert(
            wynik,
            "| " .. stat.punkty
        )

        table.insert(
            wynik,
            "| " .. formatujMinuty(stat.minuty)
        )

        table.insert(
            wynik,
            "| " .. stat.eval
        )

        table.insert(
            wynik,
            "| " .. stat.plusminus
        )

    end

    table.insert(
        wynik,
        "|}"
    )

    table.insert(wynik, "")

    -- =====================================================
    -- TABELA WSZYSTKICH WYSTĘPÓW
    -- =====================================================

    table.insert(
        wynik,
        "=== Mecze ==="
    )

    table.insert(wynik, "")

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

    table.insert(
        wynik,
        "! Nr"
    )

    table.insert(
        wynik,
        "! Sezon"
    )

    table.insert(
        wynik,
        "! Data"
    )

    table.insert(
        wynik,
        "! Miejsce"
    )

    table.insert(
        wynik,
        "! Przeciwnik"
    )

    table.insert(
        wynik,
        "! Wynik"
    )

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

    table.insert(
        wynik,
        "! Pkt"
    )

    table.insert(
        wynik,
        "! EVAL"
    )

    table.insert(
        wynik,
        "! +/-"
    )

    table.insert(
        wynik,
        "! Jubileusz"
    )

    -- =====================================================
    -- POSZCZEGÓLNE MECZE
    -- =====================================================

    for i, row in ipairs(rows) do

        local data =
            row.data or ""

        local sezon =
            row.sezon or ""

        local d1 =
            row.druzyna1 or ""

        local d2 =
            row.druzyna2 or ""

        local druzyna =
            row.druzyna or ""

        local wynikMeczu =
            row.wynik or ""

        local strona =
            row.strona_meczu or ""

        local minutyFormat =
            row.minuty_format or ""

        local pkt =
            row.gol or "0"

        local eval =
            row.eval or "0"

        local plusminus =
            row.plusminus or "0"

        -- =================================================
        -- DOM / WYJAZD
        -- =================================================

        local miejsce = ""

        if druzyna == d1 then

            miejsce = "🏠 Dom"

        elseif druzyna == d2 then

            miejsce = "✈️ Wyjazd"

        end

        -- =================================================
        -- PRZECIWNIK
        -- =================================================

        local przeciwnik = ""

        if druzyna == d1 then

            przeciwnik = d2

        elseif druzyna == d2 then

            przeciwnik = d1

        else

            przeciwnik = d1

        end

        -- =================================================
        -- LINK DO MECZU
        -- =================================================

        local meczTekst =
            przeciwnik

        if strona ~= "" then

            meczTekst =
                "[["
                .. strona
                .. "|"
                .. przeciwnik
                .. "]]"

        end

        -- =================================================
        -- JUBILEUSZ
        -- =================================================

        local jubileusz = ""

        if i % 50 == 0 then

            jubileusz =
                "'''🏆 "
                .. i
                .. ". występ'''"

        end

        -- =================================================
        -- WIERSZ
        -- =================================================

        table.insert(
            wynik,
            "|-"
        )

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

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

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

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

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

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

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

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

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

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

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

    end

    -- =====================================================
    -- KONIEC TABELI
    -- =====================================================

    table.insert(
        wynik,
        "|}"
    )

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

end

return p