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
--
-- Jeden moduł dla wielu dyscyplin.
--
-- Wywołanie:
--
-- {{#invoke:Rekordy_sezon|main
-- |sezon=2026/2027
-- |druzyna=Lech Poznań
-- |dyscyplina=piłka nożna
-- }}
--
-- lub:
--
-- {{#invoke:Rekordy_sezon|main
-- |sezon=2026/2027
-- |druzyna=Enea Basket Poznań
-- |dyscyplina=koszykówka
-- }}
--
-- Opcjonalnie:
--
-- |rozgrywki=Ekstraklasa
--
-- =========================================================
function p.main(frame)
-- =====================================================
-- PARAMETRY
-- =====================================================
local sezon =
mw.text.trim(frame.args.sezon or "")
local druzyna =
mw.text.trim(frame.args.druzyna or "")
local dyscyplina =
mw.text.trim(frame.args.dyscyplina or "koszykówka")
local rozgrywki =
mw.text.trim(frame.args.rozgrywki or "")
if sezon == "" then
return "'''Błąd:''' nie podano sezonu."
end
if druzyna == "" then
return "'''Błąd:''' nie podano drużyny."
end
-- =====================================================
-- ESCAPOWANIE SQL
-- =====================================================
local sezonSQL =
mw.ustring.gsub(sezon, "'", "''")
local druzynaSQL =
mw.ustring.gsub(druzyna, "'", "''")
local rozgrywkiSQL =
mw.ustring.gsub(rozgrywki, "'", "''")
-- =====================================================
-- 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 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 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 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 kopiuj(item)
local nowy = {}
for k, v in pairs(item) do
nowy[k] = v
end
return nowy
end
local function dodajRekord(
tabela,
miejsce,
wartosc,
item
)
local lista =
tabela[miejsce]
local nowy =
kopiuj(item)
nowy.wartosc =
wartosc
if #lista == 0 then
table.insert(
lista,
nowy
)
return
end
local obecna =
lista[1].wartosc
if wartosc > obecna then
tabela[miejsce] = {
nowy
}
elseif wartosc == obecna then
table.insert(
lista,
nowy
)
end
end
-- =====================================================
-- WYBÓR DYSCYPLINY
-- =====================================================
if mw.ustring.lower(dyscyplina)
== "piłka nożna"
or
mw.ustring.lower(dyscyplina)
== "pilka nozna"
then
return p.pilka(
sezon,
druzyna,
sezonSQL,
druzynaSQL,
rozgrywki,
rozgrywkiSQL
)
end
-- Domyślnie koszykówka
return p.koszykowka(
sezon,
druzyna,
sezonSQL,
druzynaSQL,
rozgrywki,
rozgrywkiSQL
)
end
-- =========================================================
-- =========================================================
-- KOSZYKÓWKA
-- =========================================================
-- =========================================================
function p.koszykowka(
sezon,
druzyna,
sezonSQL,
druzynaSQL,
rozgrywki,
rozgrywkiSQL
)
-- =====================================================
-- POBRANIE MECZÓW
-- =====================================================
local fieldsMecze =
table.concat({
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.sezon=sezon",
"Mecze.rozgrywki=rozgrywki",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik",
"Mecze.strona_meczu=strona_meczu"
}, ",")
local whereMecze =
"(Mecze.druzyna1='" ..
druzynaSQL ..
"' OR Mecze.druzyna2='" ..
druzynaSQL ..
"')" ..
" AND Mecze.sezon='" ..
sezonSQL ..
"'"
if rozgrywki ~= "" then
whereMecze =
whereMecze ..
" AND Mecze.rozgrywki='" ..
rozgrywkiSQL ..
"'"
end
local mecze =
mw.ext.cargo.query(
"Mecze",
fieldsMecze,
{
where = whereMecze,
orderBy = "Mecze.data ASC",
limit = 5000
}
)
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 = {}
}
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)
}
if roznica > 0 then
local lista =
najwyzszeZwyciestwo[miejsce]
if #lista == 0 then
table.insert(
lista,
item
)
elseif roznica >
lista[1].roznica then
najwyzszeZwyciestwo[miejsce] = {
item
}
elseif roznica ==
lista[1].roznica then
table.insert(
lista,
item
)
end
end
if roznica < 0 then
local przegrana =
math.abs(roznica)
item.przegrana =
przegrana
local lista =
najwyzszaPorazka[miejsce]
if #lista == 0 then
table.insert(
lista,
item
)
elseif przegrana >
lista[1].przegrana then
najwyzszaPorazka