Przejdź do zawartości

Moduł:H2H

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

-- =========================================================
-- MODUŁ:H2H
--
-- Historia bezpośrednich spotkań dwóch drużyn.
--
-- team1 = drużyna analizowana
-- team2 = przeciwnik
--
-- Wykorzystuje nazwa_statystyki1 / nazwa_statystyki2,
-- dzięki czemu zmiana nazwy sponsorskiej nie rozbija H2H.
--
-- Zawiera:
-- 1. Bilans ogółem / dom / wyjazd
-- 2. Trenerów team1 w rywalizacji
-- 3. Najlepszych strzelców obu drużyn
-- 4. Rekordy indywidualne team1
-- 5. Serie zwycięstw / porażek
-- 6. Analizę kwart
-- 7. Wszystkie mecze
-- 8. Dogrywkę 1, 2 i 3
-- =========================================================


function p.main(frame)

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

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

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


    -- =====================================================
    -- BEZPIECZEŃSTWO SQL
    -- =====================================================

    local function sql(value)
        return mw.ustring.gsub(value, "'", "''")
    end

    local team1SQL = sql(team1)
    local team2SQL = sql(team2)


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

    local function liczba(value)

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

        return tonumber(
            mw.ustring.gsub(
                tostring(value),
                "%s+",
                ""
            )
        ) or 0

    end


    local function procent(wygrane, mecze)

        if mecze == 0 then
            return "0,0%"
        end

        return string.format(
            "%.1f%%",
            (wygrane / mecze) * 100
        ):gsub("%.", ",")

    end


    local function wynikDruzyny(row)

        local g1 = liczba(row.gole1)
        local g2 = liczba(row.gole2)

        if row.ns1 == team1 then

            return g1, g2

        elseif row.ns2 == team1 then

            return g2, g1

        end

        return nil, nil

    end


    local function miejsce(row)

        if row.ns1 == team1 then
            return "dom"
        end

        if row.ns2 == team1 then
            return "wyjazd"
        end

        return 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 parseWynikCzesciowy(value)

        if not value or value == "" then
            return nil, nil
        end

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

        if not a or not b then
            return nil, nil
        end

        return tonumber(a), tonumber(b)

    end


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

    local fieldsMecze = table.concat({

        "Mecze.id=mecz",
        "Mecze.data=data",
        "Mecze.sezon=sezon",

        "Mecze.druzyna1=druzyna1",
        "Mecze.druzyna2=druzyna2",

        "Mecze.nazwa_statystyki1=ns1",
        "Mecze.nazwa_statystyki2=ns2",

        "Mecze.gole1=gole1",
        "Mecze.gole2=gole2",

        "Mecze.wynik=wynik",
        "Mecze.wynik_do_przerwy=wynik_do_przerwy",

        "Mecze.kwart1=kwart1",
        "Mecze.kwart2=kwart2",
        "Mecze.kwart3=kwart3",
        "Mecze.kwart4=kwart4",

        "Mecze.dogrywka1=dogrywka1",
        "Mecze.dogrywka2=dogrywka2",
        "Mecze.dogrywka3=dogrywka3",

        "Mecze.hala=hala",
        "Mecze.widzowie=widzowie",
        "Mecze.sedziowie=sedziowie",
        "Mecze.strona_meczu=strona_meczu"

    }, ",")


    local mecze =
        mw.ext.cargo.query(
            "Mecze",
            fieldsMecze,
            {
                where =
                    "(" ..
                    "Mecze.nazwa_statystyki1='" ..
                    team1SQL ..
                    "' AND " ..
                    "Mecze.nazwa_statystyki2='" ..
                    team2SQL ..
                    "')" ..
                    " OR (" ..
                    "Mecze.nazwa_statystyki1='" ..
                    team2SQL ..
                    "' AND " ..
                    "Mecze.nazwa_statystyki2='" ..
                    team1SQL ..
                    "')",

                orderBy =
                    "Mecze.data ASC",

                limit = 5000
            }
        )


    if not mecze or #mecze == 0 then

        return
            "'''Brak meczów pomiędzy ''" ..
            team1 ..
            "'' a ''" ..
            team2 ..
            "''.'''"

    end


    -- =====================================================
    -- BILANS
    -- =====================================================

    local bilans = {

        wszystkie = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        },

        dom = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        },

        wyjazd = {
            mecze = 0,
            wygrane = 0,
            przegrane = 0,
            punktyZdobyte = 0,
            punktyStracone = 0
        }

    }


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

    local serie = {

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

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

        wyjazd = {
            W = 0,
            P = 0
        }

    }


    local aktualnaSeria = {

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

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

        wyjazd = {
            W = 0,
            P = 0
        }

    }


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

    local rekordyMeczowe = {

        zwyciestwo = {
            dom = {},
            wyjazd = {}
        },

        porazka = {
            dom = {},
            wyjazd = {}
        }

    }


    local function dodajRekordMeczowy(
        lista,
        roznica,
        item,
        typ
    )

        if #lista == 0 then

            item.wartosc = roznica

            table.insert(
                lista,
                item
            )

            return

        end


        local obecna =
            lista[1].wartosc


        if roznica > obecna then

            item.wartosc = roznica

            lista[1] = item

        elseif roznica == obecna then

            item.wartosc = roznica

            table.insert(
                lista,
                item
            )

        end

    end


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

    for _, row in ipairs(mecze) do

        local zdobyte, stracone =
            wynikDruzyny(row)

        local miejsceMeczu =
            miejsce(row)

        if zdobyte and stracone and miejsceMeczu then

            local wynikMeczu

            if zdobyte > stracone then
                wynikMeczu = "W"
            elseif zdobyte < stracone then
                wynikMeczu = "P"
            else
                wynikMeczu = "R"
            end


            -- =============================================
            -- BILANS OGÓŁEM
            -- =============================================

            bilans.wszystkie.mecze =
                bilans.wszystkie.mecze + 1

            bilans.wszystkie.punktyZdobyte =
                bilans.wszystkie.punktyZdobyte +
                zdobyte

            bilans.wszystkie.punktyStracone =
                bilans.wszystkie.punktyStracone +
                stracone


            if wynikMeczu == "W" then

                bilans.wszystkie.wygrane =
                    bilans.wszystkie.wygrane + 1

            elseif wynikMeczu == "P" then

                bilans.wszystkie.przegrane =
                    bilans.wszystkie.przegrane + 1

            end


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

            local b =
                bilans[miejsceMeczu]

            b.mecze =
                b.mecze + 1

            b.punktyZdobyte =
                b.punktyZdobyte +
                zdobyte

            b.punktyStracone =
                b.punktyStracone +
                stracone


            if wynikMeczu == "W" then

                b.wygrane =
                    b.wygrane + 1

            elseif wynikMeczu == "P" then

                b.przegrane =
                    b.przegrane + 1

            end


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

            local item = {

                tek