Przejdź do zawartości

Moduł:HistoriaSpotkanDruzyny

Z Encyklopedia Poznanskiego Sportu

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

local p = {}

local function trim(v)
    if v == nil then
        return ""
    end

    return mw.text.trim(tostring(v))
end


local function esc(v)
    return mw.ustring.gsub(
        trim(v),
        "'",
        "''"
    )
end


local function num(v)
    if v == nil or trim(v) == "" then
        return 0
    end

    local text = mw.ustring.gsub(
        trim(v),
        ",",
        "."
    )

    return tonumber(text) or 0
end


local function location(row, team)

    if trim(row.druzyna1) == team then
        return "dom"
    end

    if trim(row.druzyna2) == team then
        return "wyjazd"
    end

    return nil
end


-- =========================================================
-- PRZECIWNIK
-- =========================================================
-- Jeżeli nasza drużyna jest drużyną 1,
-- przeciwnik znajduje się w nazwa_statystyki2.
--
-- Jeżeli nasza drużyna jest drużyną 2,
-- przeciwnik znajduje się w nazwa_statystyki1.
-- =========================================================

local function opponent(row, team)

    local loc = location(
        row,
        team
    )

    if loc == "dom" then
        return trim(row.nazwa_statystyki2)
    end

    if loc == "wyjazd" then
        return trim(row.nazwa_statystyki1)
    end

    return ""
end


-- =========================================================
-- PAUZA
-- =========================================================
-- Pauza nie jest meczem i nie może być liczona
-- do żadnych statystyk.
-- =========================================================

local function isPause(row)

    local values = {
        row.wynik,
        row.druzyna1,
        row.druzyna2,
        row.nazwa_statystyki1,
        row.nazwa_statystyki2
    }


    for _, value in ipairs(values) do

        local text =
            mw.ustring.lower(
                trim(value)
            )


        if text == "pauza" then
            return true
        end


        if mw.ustring.find(
            text,
            "pauza",
            1,
            true
        ) ~= nil then

            return true
        end
    end


    return false
end


-- =========================================================
-- DOGRYWKI
-- =========================================================
-- Liczymy bezpośrednio pola dogrywka1/2/3.
--
-- Dzięki temu:
--
-- dogrywka1 = 1
-- dogrywka2 = 1
-- dogrywka3 = 1
--
-- daje 3 dogrywki.
--
-- Nie próbujemy już zgadywać liczby dogrywek
-- na podstawie kwart i wyniku końcowego.
-- =========================================================

local function overtime(row)

    local count = 0


    if trim(row.dogrywka1) ~= "" then
        count = count + 1
    end


    if trim(row.dogrywka2) ~= "" then
        count = count + 1
    end


    if trim(row.dogrywka3) ~= "" then
        count = count + 1
    end


    return count
end


local function pct(
    wins,
    games
)

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


    local value =
        wins / games * 100


    local text =
        string.format(
            "%.1f",
            value
        )


    text =
        mw.ustring.gsub(
            text,
            "%.",
            ","
        )


    return text .. "%"
end


local function matchLink(row)

    local title =
        trim(row.strona_meczu)

    local date =
        trim(row.data)


    if title == "" then
        return date
    end


    if date == "" then
        return "[[" .. title .. "]]"
    end


    return (
        "[["
        .. title
        .. "|"
        .. date
        .. "]]"
    )
end


local function recordText(record)

    if record == nil then
        return "—"
    end


    local place


    if record.location == "dom" then
        place = "dom"
    else
        place = "wyjazd"
    end


    return (
        matchLink(record.row)
        .. " – "
        .. record.opponent
        .. " "
        .. tostring(record.forScore)
        .. ":"
        .. tostring(record.againstScore)
        .. " ("
        .. place
        .. ", +"
        .. tostring(record.diff)
        .. ")"
    )
end


local function betterRecord(
    oldRecord,
    newRecord
)

    if oldRecord == nil then
        return true
    end


    if newRecord.diff > oldRecord.diff then
        return true
    end


    if newRecord.diff < oldRecord.diff then
        return false
    end


    return trim(newRecord.row.data)
        < trim(oldRecord.row.data)
end


function p.main(frame)

    local team =
        trim(frame.args.druzyna)


    if team == "" then

        local title =
            mw.title.getCurrentTitle()


        if title ~= nil then

            team =
                trim(
                    title.prefixedText
                )

        end
    end


    if team == "" then

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

    end


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

    local fields = table.concat(
        {

            "Mecze.id=mecz",

            "Mecze.data=data",

            "Mecze.sezon=sezon",

            "Mecze.druzyna1=druzyna1",

            "Mecze.druzyna2=druzyna2",

            "Mecze.nazwa_statystyki1=nazwa_statystyki1",

            "Mecze.nazwa_statystyki2=nazwa_statystyki2",

            "Mecze.gole1=gole1",

            "Mecze.gole2=gole2",

            "Mecze.wynik=wynik",

            "Mecze.strona_meczu=strona_meczu",

            "Mecze.kwarta1=kwarta1",

            "Mecze.kwarta2=kwarta2",

            "Mecze.kwarta3=kwarta3",

            "Mecze.kwarta4=kwarta4",

            "Mecze.dogrywka1=dogrywka1",

            "Mecze.dogrywka2=dogrywka2",

            "Mecze.dogrywka3=dogrywka3"

        },
        ","
    )


    local teamSQL =
        esc(team)


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

    local rows =
        mw.ext.cargo.query(
            "Mecze",
            fields,
            {

                where =
                    "(Mecze.druzyna1='"
                    .. teamSQL
                    .. "' OR Mecze.druzyna2='"
                    .. teamSQL
                    .. "')",

                orderBy =
                    "Mecze.data ASC",

                limit = 10000

            }
        )


    if not rows
        or #rows == 0 then

        return (
            "''Brak wprowadzonych spotkań dla drużyny: "
            .. team
            .. ".''"
        )

    end


    local groups = {}


    local records = {

        win = {

            dom = nil,

            wyjazd = nil

        },

        loss = {

            dom = nil,

            wyjazd = nil

        }

    }


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

    for _, row in ipairs(rows) do


        -- =================================================
        -- POMIJAMY PAUZĘ
        -- =================================================

        if not isPause(row) then


            local g1 =
                num(row.gole1)


            local g2 =
                num(row.gole2)


            local loc =
                location(
                    row,
                    team
                )


            local opp =
                opponent(
                    row,
                    team
                )


            if loc and opp ~= "" then


                -- =========================================
                -- GRUPA PRZECIWNIKA
                -- =========================================

                local item =
                    groups[opp]


                if not item then

                    item = {

                        nazwa = opp,

                        mecze = 0,

                        wygrane = 0,

                        porazki = 0,

                        dogrywki = 0,

                        forScore = 0,

                        againstScore = 0

                    }


                    groups[opp] =
                        item

                end


                -- =========================================
                -- NASZE PUNKTY / PUNKTY PRZECIWNIKA
                -- =========================================

                local gf
                local ga


                if loc == "dom" then

                    gf = g1

                    ga = g2

                else

                    gf = g2

                    ga = g1

                end


                -- =========================================
                -- MECZ
                -- =========================================

                item.mecze =
                    item.mecze + 1


                -- =========================================
                -- KOSZE
                -- =========================================

                item.forScore =
                    item.forScore + gf


                item.againstScore =
                    item.againstScore + ga


                -- =========================================
                -- DOGRYWKI
                -- =========================================

                item.dogrywki =
                    item.dogrywki
                    + overtime(row)


                -- =========================================
                -- WYGRANA / PORAŻKA
                -- =========================================

                local kind = nil


                if gf > ga then

                    item.wygrane =
                        item.wygrane + 1

                    kind = "win"


                elseif gf < ga then

                    item.porazki =
                        item.porazki + 1

                    kind = "loss"

                end


                -- =========================================
                -- NAJWIĘKSZA WYGRANA / PORAŻKA
                -- =========================================

                if kind ~= nil then

                    local old =
                        records[kind][loc]


                    local current = {

                        row = row,

                        opponent = opp,

                        location = loc,

                        forScore = gf,

                        againstScore = ga,

                        diff = math.abs(
                            gf - ga
                        )

                    }


                    if betterRecord(
                        old,
                        current
                    ) then

                        records[kind][loc] =
                            current

                    end

                end

            end

        end

    end


    -- =====================================================
    -- LISTA PRZECIWNIKÓW
    -- =====================================================

    local list = {}


    for _, item in pairs(groups) do

        table.insert(
            list,
            item
        )

    end


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

            if a.mecze ~= b.mecze then

                return a.mecze >
                    b.mecze

            end


            return mw.ustring.lower(
                a.nazwa
            )
            <
            mw.ustring.lower(
                b.nazwa
            )

        end
    )


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

    local out = {}


    table.insert(
        out,
        "== Historia spotkań =="
    )


    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "Historia spotkań drużyny "
        .. team
        .. " ze wszystkimi przeciwnikami wprowadzonymi do bazy."
    )


    table.insert(
        out,
        ""
    )


    -- =====================================================
    -- TABELA HISTORII
    -- =====================================================

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


    table.insert(
        out,
        "! Przeciwnik !! Mecze ogółem !! Wygrane !! Porażki !! Dogrywki !! % wygranych !! Kosze rzucone !! Kosze stracone"
    )


    for _, item in ipairs(list) do


        table.insert(
            out,
            "|-"
        )


        table.insert(
            out,
            '| style="text-align:left;" | '
            .. item.nazwa
        )


        table.insert(
            out,
            "| "
            .. tostring(item.mecze)
            .. " || "
            .. tostring(item.wygrane)
            .. " || "
            .. tostring(item.porazki)
            .. " || "
            .. tostring(item.dogrywki)
            .. " || "
            .. pct(
                item.wygrane,
                item.mecze
            )
            .. " || "
            .. tostring(item.forScore)
            .. " || "
            .. tostring(item.againstScore)
        )

    end


    table.insert(
        out,
        "|}"
    )


    table.insert(
        out,
        ""
    )


    -- =====================================================
    -- REKORDY
    -- =====================================================

    table.insert(
        out,
        "== Największa wygrana i największa porażka =="
    )


    table.insert(
        out,
        ""
    )


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


    table.insert(
        out,
        "! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
    )


    table.insert(
        out,
        "|-"
    )


    table.insert(
        out,
        "! 🏆 Największa wygrana"
    )


    table.insert(
        out,
        "| "
        .. recordText(
            records.win.dom
        )
        .. " || "
        .. recordText(
            records.win.wyjazd
        )
    )


    table.insert(
        out,
        "|-"
    )


    table.insert(
        out,
        "! 📉 Największa porażka"
    )


    table.insert(
        out,
        "| "
        .. recordText(
            records.loss.dom
        )
        .. " || "
        .. recordText(
            records.loss.wyjazd
        )
    )


    table.insert(
        out,
        "|}"
    )


    table.insert(
        out,
        ""
    )


    table.insert(
        out,
        "''Dogrywki są liczone na podstawie pól dogrywka1, dogrywka2 i dogrywka3 zapisanych przy meczu.''"
    )


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

end


return p