Przejdź do zawartości

Moduł:H2H: Różnice pomiędzy wersjami

Z Encyklopedia Poznanskiego Sportu
Nie podano opisu zmian
Nie podano opisu zmian
 
Linia 1122: Linia 1122:


     -- =====================================================
     -- =====================================================
    -- NAJLEPSI STRZELCY
  -- =====================================================
    -- OBU DRUŻYN
-- NAJLEPSI STRZELCY
    -- =====================================================
-- OBU DRUŻYN
--
-- Drużyna jest ustalana na podstawie strony meczu:
--
-- ns1 = team1:
--  druzyna1 = team1
--  druzyna2 = team2
--
-- ns2 = team1:
--  druzyna2 = team1
--  druzyna1 = team2
--
-- Dzięki temu działa również przy zmianach nazw sponsorskich.
-- =====================================================


    local strzelcy = {
local strzelcy = {
    [team1] = {},
    [team2] = {}
}


        [team1] = {},
        [team2] = {}


     }
local function dodajStrzelca(
     tabela,
    zawodnik,
    punkty
)


    if not zawodnik or zawodnik == "" then
        return
    end


     local function dodajStrzelca(
     tabela[zawodnik] =
         tabela,
         (tabela[zawodnik] or 0)
         zawodnik,
         +
         punkty
         punkty
    )


        if zawodnik == nil or
end
            zawodnik == "" then


            return


        end
-- =====================================================
-- JEDNO ZAPYTANIE DLA OBU DRUŻYN
-- =====================================================


local zawodnicyStrzelcy =
    mw.ext.cargo.query(
        "UdzialZawodnika=U,Mecze=M",


         tabela[zawodnik] =
         table.concat({
            (
                tabela[zawodnik] or 0
            )
            +
            punkty


    end
            "U.zawodnik=zawodnik",
            "U.druzyna=druzyna",
            "U.gol=gol",
            "U.minuty=minuty",


            "M.id=mecz",
            "M.druzyna1=druzyna1",
            "M.druzyna2=druzyna2",


    -- =====================================================
            "M.nazwa_statystyki1=ns1",
    -- ZAWODNICY OBU DRUŻYN
            "M.nazwa_statystyki2=ns2"
    -- =====================================================


    local zawodnicyWszyscy =
         }, ","),
         mw.ext.cargo.query(
            "UdzialZawodnika=U,Mecze=M",


             table.concat({
        {
             join =
                "U.mecz=M.id",


                "U.zawodnik=zawodnik",
            where =
                 "U.druzyna=druzyna",
                 "(" ..
                "U.gol=gol",
                "U.minuty=minuty",


                 "M.id=mecz",
                "(" ..
                 "M.druzyna1=druzyna1",
                 "M.nazwa_statystyki1='" ..
                 "M.druzyna2=druzyna2",
                team1SQL ..
                "' AND " ..
                 "M.nazwa_statystyki2='" ..
                team2SQL ..
                 "' AND " ..


                 "M.nazwa_statystyki1=ns1",
                 "(" ..
                 "M.nazwa_statystyki2=ns2"
                "U.druzyna=M.druzyna1" ..
                " OR " ..
                 "U.druzyna=M.druzyna2" ..
                ")" ..


            }, ","),
                ")" ..


            {
                 " OR " ..
                 join =
                    "U.mecz=M.id",


                 where =
                 "(" ..
                    "(" ..
                "M.nazwa_statystyki1='" ..
                team2SQL ..
                "' AND " ..
                "M.nazwa_statystyki2='" ..
                team1SQL ..
                "' AND " ..


                    "(" ..
                "(" ..
                    "M.nazwa_statystyki1='" ..
                "U.druzyna=M.druzyna1" ..
                    team1SQL ..
                " OR " ..
                    "' AND " ..
                "U.druzyna=M.druzyna2" ..
                    "M.nazwa_statystyki2='" ..
                ")" ..
                    team2SQL ..
                    "' AND " ..
                    "U.druzyna=M.druzyna1" ..
                    ")" ..


                    " OR " ..
                ")" ..


                    "(" ..
                ")" ..
                    "M.nazwa_statystyki1='" ..
                    team2SQL ..
                    "' AND " ..
                    "M.nazwa_statystyki2='" ..
                    team1SQL ..
                    "' AND " ..
                    "U.druzyna=M.druzyna2" ..
                    ")" ..


                    ")" ..
                " AND U.minuty > 0",


                    " AND U.minuty > 0",
            limit = 20000
        }
    )


                limit = 20000
            }
        )


-- =====================================================
-- PRZYPISANIE ZAWODNIKA DO TEAM1 / TEAM2
-- NA PODSTAWIE STRONY MECZU
-- =====================================================


    if zawodnicyWszyscy then
if zawodnicyStrzelcy then


        for _, row
    for _, row in ipairs(zawodnicyStrzelcy) do
            in ipairs(zawodnicyWszyscy) do


            local druzyna = ""
        local druzynaH2H = nil




            if row.ns1 == team1 and
        -- -------------------------------------------------
                row.druzyna == row.druzyna1 then
        -- Wariant 1:
        -- team1 jest drużyną 1
        -- -------------------------------------------------


                druzyna = team1
        if row.ns1 == team1 and
            row.ns2 == team2 then


             elseif row.ns2 == team1 and
             if row.druzyna == row.druzyna1 then
                row.druzyna == row.druzyna2 then


                 druzyna = team1
                 druzynaH2H = team1


             elseif row.ns1 == team2 and
             elseif row.druzyna == row.druzyna2 then
                row.druzyna == row.druzyna1 then


                 druzyna = team2
                 druzynaH2H = team2


             elseif row.ns2 == team2 and
             end
                row.druzyna == row.druzyna2 then


                druzyna = team2


            end
        -- -------------------------------------------------
        -- Wariant 2:
        -- team2 jest drużyną 1
        -- -------------------------------------------------


        elseif row.ns1 == team2 and
            row.ns2 == team1 then


             if druzyna == team1 then
             if row.druzyna == row.druzyna1 then


                 dodajStrzelca(
                 druzynaH2H = team2
                    strzelcy[team1],
                    row.zawodnik,
                    liczba(row.gol)
                )


            elseif row.druzyna == row.druzyna2 then


            elseif druzyna == team2 then
                druzynaH2H = team1
 
                dodajStrzelca(
                    strzelcy[team2],
                    row.zawodnik,
                    liczba(row.gol)
                )


             end
             end
Linia 1272: Linia 1288:
         end
         end


    end


        -- -------------------------------------------------
        -- Dodanie punktów
        -- -------------------------------------------------


    local function uporzadkujStrzelcow(tablica)
        if druzynaH2H == team1 then


        local wynik = {}
            dodajStrzelca(
                strzelcy[team1],
                row.zawodnik,
                liczba(row.gol)
            )




         for zawodnik, punkty
         elseif druzynaH2H == team2 then
            in pairs(tablica) do


             table.insert(
             dodajStrzelca(
                 wynik,
                 strzelcy[team2],
                 {
                 row.zawodnik,
                    zawodnik = zawodnik,
                 liczba(row.gol)
                    punkty = punkty
                 }
             )
             )


         end
         end


    end


         table.sort(
end
 
 
-- =====================================================
-- SORTOWANIE STRZELCÓW
-- =====================================================
 
local function uporzadkujStrzelcow(
    tablica
)
 
    local wynik = {}
 
 
    for zawodnik, punkty
        in pairs(tablica) do
 
         table.insert(
             wynik,
             wynik,
             function(a, b)
             {
                zawodnik = zawodnik,
                punkty = punkty
            }
        )
 
    end
 


                if a.punkty ==
    table.sort(
                    b.punkty then
        wynik,


                    return a.zawodnik <
        function(a, b)
                        b.zawodnik


                end
            if a.punkty == b.punkty then


                 return a.punkty >
                 return a.zawodnik <
                     b.punkty
                     b.zawodnik


             end
             end
        )


            return a.punkty >
                b.punkty


         return wynik
         end
    )


    end


    return wynik
end


    local strzelcy1 =
        uporzadkujStrzelcow(
            strzelcy[team1]
        )


local strzelcy1 =
    uporzadkujStrzelcow(
        strzelcy[team1]
    )


    local strzelcy2 =
        uporzadkujStrzelcow(
            strzelcy[team2]
        )


local strzelcy2 =
    uporzadkujStrzelcow(
        strzelcy[team2]
    )


     -- =====================================================
     -- =====================================================

Aktualna wersja na dzień 11:14, 18 sie 2026

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
--
-- nazwa_statystyki1 / nazwa_statystyki2 służą do identyfikacji
-- drużyn niezależnie od historycznych nazw sponsorskich.
--
-- 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. Dogrywki 1, 2 i 3
-- =========================================================


function p.main(frame)

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

    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(
            tostring(value or ""),
            "'",
            "''"
        )

    end


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


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

    local function liczba(value)

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

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

        return tonumber(tekst) or 0

    end


    local function procent(wygrane, mecze)

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

        local wartosc =
            (wygrane / mecze) * 100

        return string.format(
            "%.1f%%",
            wartosc
        ):gsub("%.", ",")

    end


    -- =====================================================
    -- IDENTYFIKACJA STRONY TEAM1
    -- =====================================================

    local function miejsce(row)

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

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

        return nil

    end


    -- =====================================================
    -- WYNIK TEAM1
    -- =====================================================

    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


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

    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


    -- =====================================================
    -- PARSOWANIE CZĘŚCI WYNIKU
    -- =====================================================

    local function parseWynikCzesciowy(value)

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

        local tekst =
            tostring(value)

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

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

        return
            tonumber(a),
            tonumber(b)

    end


    -- =====================================================
    -- WARUNEK H2H
    -- =====================================================

    local whereH2H =
        "(" ..
        "(Mecze.nazwa_statystyki1='" ..
        team1SQL ..
        "' AND " ..
        "Mecze.nazwa_statystyki2='" ..
        team2SQL ..
        "')" ..

        " OR " ..

        "(Mecze.nazwa_statystyki1='" ..
        team2SQL ..
        "' AND " ..
        "Mecze.nazwa_statystyki2='" ..
        team1SQL ..
        "')" ..

        ")"


    -- =====================================================
    -- POBRANIE MECZÓW
    --
    -- UWAGA:
    -- pola nazywają się KWARTA1, KWARTA2 itd.
    -- a nie KWART1.
    -- =====================================================

    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.kwarta1=kwarta1",
        "Mecze.kwarta2=kwarta2",
        "Mecze.kwarta3=kwarta3",
        "Mecze.kwarta4=kwarta4",

        "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 = whereH2H,

                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,
        wartosc,
        item
    )

        if #lista == 0 then

            item.wartosc =
                wartosc

            table.insert(
                lista,
                item
            )

            return

        end


        local obecna =
            lista[1].wartosc


        if wartosc > obecna then

            lista = {
                item
            }

            item.wartosc =
                wartosc

            return lista


        elseif wartosc == obecna then

            item.wartosc =
                wartosc

            table.insert(
                lista,
                item
            )

        end


        return lista

    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


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

            local b =
                bilans.wszystkie


            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


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

            local bd =
                bilans[miejsceMeczu]


            bd.mecze =
                bd.mecze + 1

            bd.punktyZdobyte =
                bd.punktyZdobyte +
                zdobyte

            bd.punktyStracone =
                bd.punktyStracone +
                stracone


            if wynikMeczu == "W" then

                bd.wygrane =
                    bd.wygrane + 1

            elseif wynikMeczu == "P" then

                bd.przegrane =
                    bd.przegrane + 1

            end


            -- =============================================
            -- REKORD MECZOWY
            -- =============================================

            local itemMeczu = {

                tekst =
                    nazwaMeczu(row),

                wynik =
                    tostring(
                        liczba(row.gole1)
                    ) ..
                    ":" ..
                    tostring(
                        liczba(row.gole2)
                    ),

                data =
                    row.data or "",

                miejsce =
                    miejsceMeczu

            }


            local roznica =
                zdobyte - stracone


            if roznica > 0 then

                local lista =
                    rekordyMeczowe
                        .zwyciestwo
                        [miejsceMeczu]

                if #lista == 0 then

                    itemMeczu.wartosc =
                        roznica

                    table.insert(
                        lista,
                        itemMeczu
                    )

                elseif roznica >
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        roznica

                    rekordyMeczowe
                        .zwyciestwo
                        [miejsceMeczu] = {
                            itemMeczu
                        }

                elseif roznica ==
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        roznica

                    table.insert(
                        lista,
                        itemMeczu
                    )

                end


            elseif roznica < 0 then

                local wartosc =
                    math.abs(roznica)

                local lista =
                    rekordyMeczowe
                        .porazka
                        [miejsceMeczu]


                if #lista == 0 then

                    itemMeczu.wartosc =
                        wartosc

                    table.insert(
                        lista,
                        itemMeczu
                    )

                elseif wartosc >
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        wartosc

                    rekordyMeczowe
                        .porazka
                        [miejsceMeczu] = {
                            itemMeczu
                        }

                elseif wartosc ==
                    lista[1].wartosc then

                    itemMeczu.wartosc =
                        wartosc

                    table.insert(
                        lista,
                        itemMeczu
                    )

                end

            end


            -- =============================================
            -- SERIA OGÓŁEM
            -- =============================================

            local so =
                aktualnaSeria.wszystkie


            if wynikMeczu == "W" then

                so.W =
                    so.W + 1

                so.P = 0

                if so.W >
                    serie.wszystkie.W then

                    serie.wszystkie.W =
                        so.W

                end

            elseif wynikMeczu == "P" then

                so.P =
                    so.P + 1

                so.W = 0

                if so.P >
                    serie.wszystkie.P then

                    serie.wszystkie.P =
                        so.P

                end

            end


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

            local ss =
                aktualnaSeria[miejsceMeczu]

            local sr =
                serie[miejsceMeczu]


            if wynikMecz