Moduł:Rekordy sezon: Różnice pomiędzy wersjami
Wygląd
Utworzono nową stronę "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…" |
Nie podano opisu zmian |
||
| Linia 18: | Linia 18: | ||
-- Dane pobierane są wyłącznie z istniejących wpisów Cargo. | -- Dane pobierane są wyłącznie z istniejących wpisów Cargo. | ||
-- ========================================================= | -- ========================================================= | ||
function p.main(frame) | function p.main(frame) | ||
| Linia 37: | Linia 36: | ||
end | end | ||
local sezonSQL = | local sezonSQL = | ||
mw.ustring.gsub(sezon, "'", "''") | mw.ustring.gsub(sezon, "'", "''") | ||
| Linia 56: | Linia 54: | ||
value = tostring(value) | value = tostring(value) | ||
value = mw.ustring.gsub(value, "%s+", "") | value = mw.ustring.gsub(value, "%s+", "") | ||
| Linia 105: | Linia 101: | ||
end | end | ||
-- ===================================================== | |||
-- NAZWA MECZU | |||
-- | |||
-- WAŻNE: | |||
-- zawsze zachowujemy faktyczną kolejność gospodarze – | |||
-- goście. | |||
-- ===================================================== | |||
local function nazwaMeczu(row) | local function nazwaMeczu(row) | ||
| Linia 112: | Linia 116: | ||
local strona = row.strona_meczu or "" | local strona = row.strona_meczu or "" | ||
local tekst = | local tekst = | ||
d1 .. " – " .. d2 | |||
if strona ~= "" then | if strona ~= "" then | ||
return "[[" .. | |||
strona .. | |||
"|" .. | |||
tekst .. | |||
"]]" | |||
end | end | ||
| Linia 157: | Linia 134: | ||
-- ===================================================== | |||
-- KOPIOWANIE TABELI | |||
-- | |||
-- Dzięki temu każdy rekord indywidualny otrzymuje | |||
-- własną tabelę i własne pole "wartosc". | |||
-- ===================================================== | |||
local function kopiujItem(item) | |||
local nowy = {} | |||
for klucz, wartosc in pairs(item) do | |||
nowy[klucz] = wartosc | |||
end | end | ||
return | return nowy | ||
end | end | ||
| Linia 272: | Linia 237: | ||
if g1 and g2 and miejsce then | if g1 and g2 and miejsce then | ||
local zdobyte | local zdobyte | ||
local stracone | local stracone | ||
if miejsce == "dom" then | if miejsce == "dom" then | ||
| Linia 286: | Linia 251: | ||
end | end | ||
local roznica = | local roznica = | ||
| Linia 300: | Linia 264: | ||
zdobyte = zdobyte, | zdobyte = zdobyte, | ||
stracone = stracone, | stracone = stracone, | ||
roznica = roznica, | roznica = roznica, | ||
| Linia 505: | Linia 468: | ||
-- ===================================================== | -- ===================================================== | ||
-- FUNKCJA DODAJĄCA REKORD INDYWIDUALNY | -- FUNKCJA DODAJĄCA REKORD INDYWIDUALNY | ||
-- | |||
-- KLUCZOWA POPRAWKA: | |||
-- każdy rekord dostaje kopię itemu. | |||
-- ===================================================== | -- ===================================================== | ||
| Linia 516: | Linia 482: | ||
local lista = | local lista = | ||
tabela[miejsce] | tabela[miejsce] | ||
-- Tworzymy osobną kopię dla tej kategorii | |||
local nowy = | |||
kopiujItem(item) | |||
nowy.wartosc = | |||
wartosc | |||
-- Pierwszy rekord | |||
if #lista == 0 then | if #lista == 0 then | ||
table.insert( | table.insert( | ||
lista, | lista, | ||
nowy | |||
) | ) | ||
| Linia 535: | Linia 508: | ||
lista[1].wartosc | lista[1].wartosc | ||
-- Nowy rekord | |||
if wartosc > obecna then | if wartosc > obecna then | ||
tabela[miejsce] = { | tabela[miejsce] = { | ||
nowy | |||
} | } | ||
-- Rekord ex aequo | |||
elseif wartosc == obecna then | elseif wartosc == obecna then | ||
table.insert( | table.insert( | ||
lista, | lista, | ||
nowy | |||
) | ) | ||
| Linia 841: | Linia 813: | ||
-- ============================================= | -- ============================================= | ||
-- DOM | -- DOM | ||
-- ============================================= | -- ============================================= | ||
| Linia 891: | Linia 859: | ||
-- ============================================= | -- ============================================= | ||
-- WYJAZD | -- WYJAZD | ||
-- ============================================= | -- ============================================= | ||
| Linia 1014: | Linia 979: | ||
if wartosc == "" then | if wartosc == "" then | ||
wartosc = | wartosc = | ||
tostring(item.minuty) | tostring(item.minuty) | ||
end | end | ||
| Linia 1096: | Linia 1063: | ||
) | ) | ||
table.insert( | table.insert(wynik, "") | ||
| Linia 1111: | Linia 1075: | ||
) | ) | ||
table.insert( | table.insert(wynik, "") | ||
table.insert( | table.insert( | ||
| Linia 1127: | Linia 1088: | ||
-- NAJWYŻSZE ZWYCIĘSTWO | -- NAJWYŻSZE ZWYCIĘSTWO | ||
table.insert( | table.insert(wynik, "|-") | ||
table.insert( | table.insert( | ||
| Linia 1158: | Linia 1114: | ||
-- NAJWYŻSZA PORAŻKA | -- NAJWYŻSZA PORAŻKA | ||
table.insert( | table.insert(wynik, "|-") | ||
table.insert( | table.insert( | ||
| Linia 1189: | Linia 1140: | ||
table.insert( | table.insert(wynik, "|}") | ||
table.insert(wynik, "") | |||
table.insert( | |||
| Linia 1210: | Linia 1153: | ||
) | ) | ||
table.insert( | table.insert(wynik, "") | ||
table.insert( | table.insert( | ||
| Linia 1269: | Linia 1209: | ||
for _, rekord in ipairs(rekordyLista) do | for _, rekord in ipairs(rekordyLista) do | ||
table.insert( | table.insert(wynik, "|-") | ||
table.insert( | table.insert( | ||
| Linia 1300: | Linia 1237: | ||
table.insert( | table.insert(wynik, "|}") | ||
table.insert(wynik, "") | |||
table.insert( | |||
| Linia 1321: | Linia 1250: | ||
) | ) | ||
table.insert( | table.insert(wynik, "") | ||
table.insert( | table.insert( | ||
| Linia 1337: | Linia 1263: | ||
-- SERIA WYGRANYCH | -- SERIA WYGRANYCH | ||
table.insert( | table.insert(wynik, "|-") | ||
table.insert( | table.insert( | ||
| Linia 1376: | Linia 1297: | ||
-- SERIA PORAŻEK | -- SERIA PORAŻEK | ||
table.insert( | table.insert(wynik, "|-") | ||
table.insert( | table.insert( | ||
| Linia 1415: | Linia 1331: | ||
table.insert( | table.insert(wynik, "|}") | ||
Wersja z 11:04, 17 sie 2026
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
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)
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
-- =====================================================
-- NAZWA MECZU
--
-- WAŻNE:
-- zawsze zachowujemy faktyczną kolejność gospodarze –
-- goście.
-- =====================================================
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
-- =====================================================
-- KOPIOWANIE TABELI
--
-- Dzięki temu każdy rekord indywidualny otrzymuje
-- własną tabelę i własne pole "wartosc".
-- =====================================================
local function kopiujItem(item)
local nowy = {}
for klucz, wartosc in pairs(item) do
nowy[klucz] = wartosc
end
return nowy
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
local stracone
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
--
-- KLUCZOWA POPRAWKA:
-- każdy rekord dostaje kopię itemu.
-- =====================================================
local function dodajRekord(
tabela,
miejsce,
wartosc,
item
)
local lista =
tabela[miejsce]
-- Tworzymy osobną kopię dla tej kategorii
local nowy =
kopiujItem(item)
nowy.wartosc =
wartosc
-- Pierwszy rekord
if #lista == 0 then
table.insert(
lista,
nowy
)
return
end
local obecna =
lista[1].wartosc
-- Nowy rekord
if wartosc > obecna then
tabela[miejsce] = {
nowy
}
-- Rekord ex aequo
elseif wartosc == obecna then
table.insert(
lista,
nowy
)
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
-- =============================================
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
-- =============================================
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 ==