Moduł:Rekordy sezon
Wygląd
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Rekordy sezon/opis
local p = {}
-- =========================================================
-- Module:Rekordy_sezon
--
-- Rekordy drużyny w danym sezonie:
-- - najwyższe zwycięstwo dom / wyjazd
-- - najwyższa porażka dom / wyjazd
-- - najwięcej punktów zawodnika dom / wyjazd
-- - najwięcej minut dom / wyjazd
-- - najwięcej asyst dom / wyjazd
-- - najwięcej zbiórek dom / wyjazd
-- - najwyższy EVAL dom / wyjazd
-- - najwyższy +/- dom / wyjazd
-- - najdłuższa seria zwycięstw ogółem / dom / wyjazd
-- - najdłuższa seria porażek ogółem / dom / wyjazd
--
-- Dane pobierane są wyłącznie z istniejących wpisów Cargo.
-- =========================================================
function p.main(frame)
-- =====================================================
-- PARAMETRY
-- =====================================================
local sezon = frame.args.sezon or ""
local druzyna = frame.args.druzyna or ""
if sezon == "" then
return "'''Błąd:''' nie podano sezonu."
end
if druzyna == "" then
return "'''Błąd:''' nie podano drużyny."
end
-- Bezpieczne SQL
local sezonSQL =
mw.ustring.gsub(sezon, "'", "''")
local druzynaSQL =
mw.ustring.gsub(druzyna, "'", "''")
-- =====================================================
-- FUNKCJE POMOCNICZE
-- =====================================================
local function liczba(value)
if value == nil or value == "" then
return 0
end
value = tostring(value)
-- usuwamy ewentualne spacje
value = mw.ustring.gsub(value, "%s+", "")
return tonumber(value) or 0
end
local function wynikMeczu(row)
local g1 = tonumber(row.gole1 or "")
local g2 = tonumber(row.gole2 or "")
if g1 and g2 then
return g1, g2
end
local wynik = row.wynik or ""
local a, b =
wynik:match("(%d+)%s*:%s*(%d+)")
if a and b then
return tonumber(a), tonumber(b)
end
return nil, nil
end
local function miejsceMeczu(row)
local d1 = row.druzyna1 or ""
local d2 = row.druzyna2 or ""
if d1 == druzyna then
return "dom"
end
if d2 == druzyna 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 = ""
if d1 == druzyna then
tekst =
druzyna .. " – " .. d2
elseif d2 == druzyna then
tekst =
d1 .. " – " .. druzyna
else
tekst =
d1 .. " – " .. d2
end
if strona ~= "" then
if d1 == druzyna then
return "[[" .. strona .. "|" ..
druzyna .. " – " .. d2 .. "]]"
elseif d2 == druzyna then
return "[[" .. strona .. "|" ..
d1 .. " – " .. druzyna .. "]]"
else
return "[[" .. strona .. "|" ..
tekst .. "]]"
end
end
return tekst
end
local function rekordowyWpis(lista, wartosc)
local wynik = {}
for _, item in ipairs(lista) do
if item.wartosc == wartosc then
table.insert(
wynik,
item
)
end
end
return wynik
end
local function dodajDoRekordu(lista, item)
table.insert(
lista,
item
)
end
-- =====================================================
-- POBRANIE MECZÓW
-- =====================================================
local fieldsMecze = table.concat({
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.sezon=sezon",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik",
"Mecze.strona_meczu=strona_meczu"
}, ",")
local argsMecze = {
where =
"(Mecze.druzyna1='" ..
druzynaSQL ..
"' OR Mecze.druzyna2='" ..
druzynaSQL ..
"')" ..
" AND Mecze.sezon='" ..
sezonSQL ..
"'",
orderBy = "Mecze.data ASC",
limit = 5000
}
local mecze =
mw.ext.cargo.query(
"Mecze",
fieldsMecze,
argsMecze
)
if not mecze or #mecze == 0 then
return
"''Brak wprowadzonych meczów dla tej drużyny w podanym sezonie.''"
end
-- =====================================================
-- REKORDY MECZOWE
-- =====================================================
local najwyzszeZwyciestwo = {
dom = {},
wyjazd = {}
}
local najwyzszaPorazka = {
dom = {},
wyjazd = {}
}
-- =====================================================
-- PRZETWARZANIE MECZÓW
-- =====================================================
for _, row in ipairs(mecze) do
local g1, g2 =
wynikMeczu(row)
local miejsce =
miejsceMeczu(row)
if g1 and g2 and miejsce then
local zdobyte = 0
local stracone = 0
if miejsce == "dom" then
zdobyte = g1
stracone = g2
else
zdobyte = g2
stracone = g1
end
local roznica =
zdobyte - stracone
local item = {
mecz = row.mecz or "",
data = row.data or "",
miejsce = miejsce,
zdobyte = zdobyte,
stracone = stracone,
roznica = roznica,
tekst =
nazwaMeczu(row),
wynik =
tostring(g1) ..
":" ..
tostring(g2)
}
-- =============================================
-- ZWYCIĘSTWO
-- =============================================
if roznica > 0 then
local lista =
najwyzszeZwyciestwo[miejsce]
if #lista == 0 then
table.insert(
lista,
item
)
else
local obecna =
lista[1].roznica
if roznica > obecna then
najwyzszeZwyciestwo[miejsce] = {
item
}
elseif roznica == obecna then
table.insert(
lista,
item
)
end
end
end
-- =============================================
-- PORAŻKA
-- =============================================
if roznica < 0 then
local lista =
najwyzszaPorazka[miejsce]
local przegrana =
math.abs(roznica)
item.przegrana =
przegrana
if #lista == 0 then
table.insert(
lista,
item
)
else
local obecna =
lista[1].przegrana
if przegrana > obecna then
najwyzszaPorazka[miejsce] = {
item
}
elseif przegrana == obecna then
table.insert(
lista,
item
)
end
end
end
end
end
-- =====================================================
-- POBRANIE STATYSTYK ZAWODNIKÓW
-- =====================================================
local fieldsZawodnicy = table.concat({
"UdzialZawodnika.zawodnik=zawodnik",
"UdzialZawodnika.druzyna=druzyna_zawodnika",
"UdzialZawodnika.gol=gol",
"UdzialZawodnika.minuty=minuty",
"UdzialZawodnika.minuty_format=minuty_format",
"UdzialZawodnika.asysta=asysta",
"UdzialZawodnika.zbiorka=zbiorka",
"UdzialZawodnika.eval=eval",
"UdzialZawodnika.plusminus=plusminus",
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik",
"Mecze.strona_meczu=strona_meczu"
}, ",")
local argsZawodnicy = {
join =
"UdzialZawodnika.mecz=Mecze.id",
where =
"UdzialZawodnika.druzyna='" ..
druzynaSQL ..
"'" ..
" AND Mecze.sezon='" ..
sezonSQL ..
"'" ..
" AND UdzialZawodnika.minuty > 0",
orderBy =
"Mecze.data ASC",
limit = 10000
}
local zawodnicy =
mw.ext.cargo.query(
"UdzialZawodnika,Mecze",
fieldsZawodnicy,
argsZawodnicy
)
-- =====================================================
-- REKORDY INDYWIDUALNE
-- =====================================================
local rekordy = {
punkty = {
dom = {},
wyjazd = {}
},
minuty = {
dom = {},
wyjazd = {}
},
asysty = {
dom = {},
wyjazd = {}
},
zbiorki = {
dom = {},
wyjazd = {}
},
eval = {
dom = {},
wyjazd = {}
},
plusminus = {
dom = {},
wyjazd = {}
}
}
-- =====================================================
-- FUNKCJA DODAJĄCA REKORD INDYWIDUALNY
-- =====================================================
local function dodajRekord(
tabela,
miejsce,
wartosc,
item
)
local lista =
tabela[miejsce]
if #lista == 0 then
item.wartosc =
wartosc
table.insert(
lista,
item
)
return
end
local obecna =
lista[1].wartosc
if wartosc > obecna then
item.wartosc =
wartosc
tabela[miejsce] = {
item
}
elseif wartosc == obecna then
item.wartosc =
wartosc
table.insert(
lista,
item
)
end
end
-- =====================================================
-- PRZETWARZANIE STATYSTYK ZAWODNIKÓW
-- =====================================================
if zawodnicy then
for _, row in ipairs(zawodnicy) do
local miejsce =
miejsceMeczu(row)
if miejsce then
local wartoscPunktow =
liczba(row.gol)
local wartoscMinut =
liczba(row.minuty)
local wartoscAsyst =
liczba(row.asysta)
local wartoscZbiorek =
liczba(row.zbiorka)
local wartoscEval =
liczba(row.eval)
local wartoscPlusminus =
liczba(row.plusminus)
local item = {
zawodnik =
row.zawodnik or "",
mecz =
row.mecz or "",
data =
row.data or "",
miejsce =
miejsce,
tekst =
nazwaMeczu(row),
wynik =
row.wynik or "",
minuty_format =
row.minuty_format or "",
punkty =
wartoscPunktow,
minuty =
wartoscMinut,
asysty =
wartoscAsyst,
zbiorki =
wartoscZbiorek,
eval =
wartoscEval,
plusminus =
wartoscPlusminus
}
-- =========================================
-- PUNKTY
-- =========================================
dodajRekord(
rekordy.punkty,
miejsce,
wartoscPunktow,
item
)
-- =========================================
-- MINUTY
-- =========================================
dodajRekord(
rekordy.minuty,
miejsce,
wartoscMinut,
item
)
-- =========================================
-- ASYSTY
-- =========================================
dodajRekord(
rekordy.asysty,
miejsce,
wartoscAsyst,
item
)
-- =========================================
-- ZBIÓRKI
-- =========================================
dodajRekord(
rekordy.zbiorki,
miejsce,
wartoscZbiorek,
item
)
-- =========================================
-- EVAL
-- =========================================
dodajRekord(
rekordy.eval,
miejsce,
wartoscEval,
item
)
-- =========================================
-- PLUS / MINUS
-- =========================================
dodajRekord(
rekordy.plusminus,
miejsce,
wartoscPlusminus,
item
)
end
end
end
-- =====================================================
-- SERIE
-- =====================================================
local serie = {
wszystkie = {
wygrane = 0,
przegrane = 0
},
dom = {
wygrane = 0,
przegrane = 0
},
wyjazd = {
wygrane = 0,
przegrane = 0
}
}
local aktualna = {
wszystkie = {
W = 0,
P = 0
},
dom = {
W = 0,
P = 0
},
wyjazd = {
W = 0,
P = 0
}
}
-- =====================================================
-- OBLICZANIE SERII
-- =====================================================
for _, row in ipairs(mecze) do
local g1, g2 =
wynikMeczu(row)
local miejsce =
miejsceMeczu(row)
if g1 and g2 and miejsce then
local wynik
if miejsce == "dom" then
if g1 > g2 then
wynik = "W"
elseif g1 < g2 then
wynik = "P"
else
wynik = "R"
end
else
if g2 > g1 then
wynik = "W"
elseif g2 < g1 then
wynik = "P"
else
wynik = "R"
end
end
-- =============================================
-- OGÓŁEM
-- =============================================
if wynik == "W" then
aktualna.wszystkie.W =
aktualna.wszystkie.W + 1
aktualna.wszystkie.P = 0
if aktualna.wszystkie.W >
serie.wszystkie.wygrane then
serie.wszystkie.wygrane =
aktualna.wszystkie.W
end
elseif wynik == "P" then
aktualna.wszystkie.P =
aktualna.wszystkie.P + 1
aktualna.wszystkie.W = 0
if aktualna.wszystkie.P >
serie.wszystkie.przegrane then
serie.wszystkie.przegrane =
aktualna.wszystkie.P
end
else
aktualna.wszystkie.W = 0
aktualna.wszystkie.P = 0
end
-- =============================================
-- DOM
--
-- UWAGA:
-- seria domowa liczona jest tylko z meczów
-- domowych.
-- =============================================
if miejsce == "dom" then
if wynik == "W" then
aktualna.dom.W =
aktualna.dom.W + 1
aktualna.dom.P = 0
if aktualna.dom.W >
serie.dom.wygrane then
serie.dom.wygrane =
aktualna.dom.W
end
elseif wynik == "P" then
aktualna.dom.P =
aktualna.dom.P + 1
aktualna.dom.W = 0
if aktualna.dom.P >
serie.dom.przegrane then
serie.dom.przegrane =
aktualna.dom.P
end
else
aktualna.dom.W = 0
aktualna.dom.P = 0
end
end
-- =============================================
-- WYJAZD
--
-- Seria wyjazdowa liczona tylko z meczów
-- wyjazdowych.
-- =============================================
if miejsce == "wyjazd" then
if wynik == "W" then
aktualna.wyjazd.W =
aktualna.wyjazd.W + 1
aktualna.wyjazd.P = 0
if aktualna.wyjazd.W >
serie.wyjazd.wygrane then
serie.wyjazd.wygrane =
aktualna.wyjazd.W
end
elseif wynik == "P" then
aktualna.wyjazd.P =
aktualna.wyjazd.P + 1
aktualna.wyjazd.W = 0
if aktualna.wyjazd.P >
serie.wyjazd.przegrane then
serie.wyjazd.przegrane =
aktualna.wyjazd.P
end
else
aktualna.wyjazd.W = 0
aktualna.wyjazd.P = 0
end
end
end
end
-- =====================================================
-- FORMATOWANIE REKORDÓW MECZOWYCH
-- =====================================================
local function tekstMeczow(lista)
if not lista or #lista == 0 then
return "—"
end
local wynik = {}
for _, item in ipairs(lista) do
table.insert(
wynik,
item.tekst ..
" (" ..
item.wynik ..
", " ..
(item.roznica >= 0
and ("+" .. item.roznica)
or tostring(item.roznica)) ..
")"
)
end
return table.concat(
wynik,
"<br>"
)
end
-- =====================================================
-- FORMATOWANIE REKORDÓW ZAWODNIKÓW
-- =====================================================
local function tekstZawodnikow(
lista,
typ
)
if not lista or #lista == 0 then
return "—"
end
local wynik = {}
for _, item in ipairs(lista) do
local zawodnikLink =
"[[" ..
item.zawodnik ..
"]]"
local wartosc = ""
if typ == "punkty" then
wartosc =
tostring(item.punkty) ..
" pkt"
elseif typ == "minuty" then
wartosc =
item.minuty_format
if wartosc == "" then
wartosc =
tostring(item.minuty)
end
wartosc =
wartosc ..
" min"
elseif typ == "asysty" then
wartosc =
tostring(item.asysty) ..
" as."
elseif typ == "zbiorki" then
wartosc =
tostring(item.zbiorki) ..
" zb."
elseif typ == "eval" then
wartosc =
tostring(item.eval) ..
" EVAL"
elseif typ == "plusminus" then
if item.plusminus >= 0 then
wartosc =
"+" ..
tostring(item.plusminus)
else
wartosc =
tostring(item.plusminus)
end
wartosc =
wartosc ..
" +/-"
end
table.insert(
wynik,
zawodnikLink ..
" — " ..
wartosc ..
"<br>" ..
item.tekst ..
" (" ..
item.wynik ..
")"
)
end
return table.concat(
wynik,
"<br>"
)
end
-- =====================================================
-- GENEROWANIE WYNIKU
-- =====================================================
local wynik = {}
table.insert(
wynik,
"=== Rekordy sezonu ==="
)
table.insert(
wynik,
""
)
-- =====================================================
-- REKORDY MECZOWE
-- =====================================================
table.insert(
wynik,
"==== Rekordy meczowe ===="
)
table.insert(
wynik,
""
)
table.insert(
wynik,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
table.insert(
wynik,
"! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
)
-- -----------------------------------------------------
-- NAJWYŻSZE ZWYCIĘSTWO
-- -----------------------------------------------------
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"! 🏆 Najwyższe zwycięstwo"
)
table.insert(
wynik,
"| " ..
tekstMeczow(
najwyzszeZwyciestwo.dom
)
)
table.insert(
wynik,
"| " ..
tekstMeczow(
najwyzszeZwyciestwo.wyjazd
)
)
-- -----------------------------------------------------
-- NAJWYŻSZA PORAŻKA
-- -----------------------------------------------------
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"! ❌ Najwyższa porażka"
)
table.insert(
wynik,
"| " ..
tekstMeczow(
najwyzszaPorazka.dom
)
)
table.insert(
wynik,
"| " ..
tekstMeczow(
najwyzszaPorazka.wyjazd
)
)
table.insert(
wynik,
"|}"
)
table.insert(
wynik,
""
)
-- =====================================================
-- REKORDY INDYWIDUALNE
-- =====================================================
table.insert(
wynik,
"==== Rekordy indywidualne ===="
)
table.insert(
wynik,
""
)
table.insert(
wynik,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
table.insert(
wynik,
"! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
)
local rekordyLista = {
{
nazwa = "🏀 Najwięcej punktów",
tabela = rekordy.punkty,
typ = "punkty"
},
{
nazwa = "⏱️ Najwięcej minut",
tabela = rekordy.minuty,
typ = "minuty"
},
{
nazwa = "🎯 Najwięcej asyst",
tabela = rekordy.asysty,
typ = "asysty"
},
{
nazwa = "🏀 Najwięcej zbiórek",
tabela = rekordy.zbiorki,
typ = "zbiorki"
},
{
nazwa = "⭐ Najwyższy EVAL",
tabela = rekordy.eval,
typ = "eval"
},
{
nazwa = "➕ Najwyższy +/-",
tabela = rekordy.plusminus,
typ = "plusminus"
}
}
for _, rekord in ipairs(rekordyLista) do
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"! " .. rekord.nazwa
)
table.insert(
wynik,
"| " ..
tekstZawodnikow(
rekord.tabela.dom,
rekord.typ
)
)
table.insert(
wynik,
"| " ..
tekstZawodnikow(
rekord.tabela.wyjazd,
rekord.typ
)
)
end
table.insert(
wynik,
"|}"
)
table.insert(
wynik,
""
)
-- =====================================================
-- SERIE
-- =====================================================
table.insert(
wynik,
"==== Serie ===="
)
table.insert(
wynik,
""
)
table.insert(
wynik,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
table.insert(
wynik,
"! Seria !! Wszystkie mecze !! 🏠 Dom !! ✈️ Wyjazd"
)
-- -----------------------------------------------------
-- SERIA WYGRANYCH
-- -----------------------------------------------------
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"! 🔥 Najdłuższa seria zwycięstw"
)
table.insert(
wynik,
"| " ..
tostring(
serie.wszystkie.wygrane
)
)
table.insert(
wynik,
"| " ..
tostring(
serie.dom.wygrane
)
)
table.insert(
wynik,
"| " ..
tostring(
serie.wyjazd.wygrane
)
)
-- -----------------------------------------------------
-- SERIA PORAŻEK
-- -----------------------------------------------------
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"! 📉 Najdłuższa seria porażek"
)
table.insert(
wynik,
"| " ..
tostring(
serie.wszystkie.przegrane
)
)
table.insert(
wynik,
"| " ..
tostring(
serie.dom.przegrane
)
)
table.insert(
wynik,
"| " ..
tostring(
serie.wyjazd.przegrane
)
)
table.insert(
wynik,
"|}"
)
-- =====================================================
-- KONIEC
-- =====================================================
return table.concat(
wynik,
"\n"
)
end
return p