Moduł:StatystykiHistoryczne: Różnice pomiędzy wersjami
Wygląd
Nie podano opisu zmian |
Nie podano opisu zmian |
||
| (Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
| Linia 24: | Linia 24: | ||
-- }} | -- }} | ||
-- | -- | ||
-- Zawodnicy występujący w | -- Zawodnicy występujący w wybranym sezonie | ||
-- | -- są wyróżniani pogrubieniem. | ||
-- ========================================================= | -- ========================================================= | ||
| Linia 102: | Linia 98: | ||
-- ===================================================== | -- ===================================================== | ||
-- USTALENIE SEZONU | -- USTALENIE SEZONU WYRÓŻNIENIA | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 120: | Linia 105: | ||
-- | -- ----------------------------------------------------- | ||
-- | -- Najpierw sprawdzamy sezon podany przez użytkownika | ||
-- | -- ----------------------------------------------------- | ||
if sezonSQL ~= "" then | if sezonSQL ~= "" then | ||
| Linia 142: | Linia 127: | ||
.. " AND Mecze.sezon='" | .. " AND Mecze.sezon='" | ||
.. sezonSQL | .. sezonSQL | ||
.. "'", | .. "'" | ||
.. " AND UdzialZawodnika.minuty > 0", | |||
groupBy = | groupBy = | ||
| Linia 164: | Linia 150: | ||
-- ===================================================== | -- ===================================================== | ||
-- JEŻELI | -- JEŻELI NIE MA DANYCH DLA PODANEGO SEZONU | ||
-- SZUKAMY OSTATNIEGO | -- SZUKAMY OSTATNIEGO SEZONU | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 183: | Linia 169: | ||
"UdzialZawodnika.druzyna='" | "UdzialZawodnika.druzyna='" | ||
.. druzynaSQL | .. druzynaSQL | ||
.. "'", | .. "'" | ||
.. " AND UdzialZawodnika.minuty > 0", | |||
groupBy = | groupBy = | ||
| Linia 235: | Linia 222: | ||
-- ===================================================== | -- ===================================================== | ||
local where = | |||
"UdzialZawodnika.druzyna='" | |||
.. druzynaSQL | |||
.. "'" | |||
.. " AND UdzialZawodnika.minuty > 0" | |||
| Linia 275: | Linia 263: | ||
-- ===================================================== | -- ===================================================== | ||
-- AKTUALNI | -- AKTUALNI ZAWODNICY | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 312: | Linia 295: | ||
.. " AND Mecze.sezon='" | .. " AND Mecze.sezon='" | ||
.. sezonAktualnySQL | .. sezonAktualnySQL | ||
.. "'", | .. "'" | ||
.. " AND UdzialZawodnika.minuty > 0", | |||
groupBy = | groupBy = | ||
| Linia 374: | Linia 358: | ||
liczba(row.punkty), | liczba(row.punkty), | ||
-- Cargo przechowuje minuty jako SEKUNDY | |||
minuty = | minuty = | ||
liczba(row.minuty), | liczba(row.minuty), | ||
| Linia 400: | Linia 385: | ||
-- FORMATOWANIE MINUT | -- FORMATOWANIE MINUT | ||
-- | -- | ||
-- | -- WAŻNE: | ||
-- Pole UdzialZawodnika.minuty jest zapisane w SEKUNDACH. | |||
-- | -- | ||
-- Przykład: | -- Przykład: | ||
-- 103775 sekund = 1729 minut 35 sekund | |||
-- | -- | ||
-- | -- Wynik: | ||
-- 1729:35 | |||
-- | |||
-- ===================================================== | -- ===================================================== | ||
| Linia 465: | Linia 446: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- ZAWODNIK | -- AKTUALNY ZAWODNIK = POGRUBIENIE | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 680: | Linia 661: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- | -- TABELA | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 690: | Linia 671: | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
-- | -- NAGŁÓWEK | ||
-- ------------------------------------------------- | -- ------------------------------------------------- | ||
| Linia 701: | Linia 682: | ||
table.insert( | |||
wynik, | |||
"! Miejsce" | |||
) | |||
table.insert( | |||
wynik, | |||
"! Zawodnik" | |||
) | |||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
" | "! " | ||
.. definicja.nazwa | .. definicja.nazwa | ||
) | ) | ||
| Linia 723: | Linia 712: | ||
) | ) | ||
-- miejsce | |||
table.insert( | table.insert( | ||
| Linia 728: | Linia 719: | ||
"| " | "| " | ||
.. i | .. i | ||
) | |||
.. linkZawodnika(zawodnik) | |||
-- zawodnik | |||
table.insert( | |||
wynik, | |||
"| " | |||
.. linkZawodnika( | |||
zawodnik | |||
) | |||
) | |||
-- wartość | |||
table.insert( | |||
wynik, | |||
"| '''" | |||
.. definicja.format( | .. definicja.format( | ||
zawodnik[ | zawodnik[ | ||
| Linia 741: | Linia 748: | ||
end | end | ||
table.insert( | table.insert( | ||
| Linia 782: | Linia 785: | ||
-- ===================================================== | -- ===================================================== | ||
-- INFORMACJA O | -- INFORMACJA O AKTUALNYCH ZAWODNIKACH | ||
-- ===================================================== | -- ===================================================== | ||
| Linia 789: | Linia 792: | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"''Pogrubieniem wyróżniono zawodników " | "'''''Pogrubieniem wyróżniono zawodników " | ||
.. "występujących w sezonie " | .. "występujących w sezonie " | ||
.. sezonWyroznienia | .. sezonWyroznienia | ||
.. "''' | .. ".'''''" | ||
) | ) | ||
| Linia 800: | Linia 802: | ||
wynik, | wynik, | ||
"" | "" | ||
) | ) | ||
end | end | ||
-- ===================================================== | |||
-- UKŁAD 3 KOLUMNY | |||
-- | |||
-- WAŻNE: | |||
-- Każda tabela zaczyna się od początku linii. | |||
-- Dzięki temu MediaWiki poprawnie rozpoznaje | |||
-- składnię {| ... |}. | |||
-- ===================================================== | |||
table.insert( | |||
wynik, | |||
'<div style="display:flex; flex-wrap:wrap; gap:12px; align-items:flex-start;">' | |||
) | |||
| Linia 808: | Linia 826: | ||
-- TABELA 1 – MECZE | -- TABELA 1 – MECZE | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 815: | Linia 838: | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | "</div>" | ||
) | ) | ||
| Linia 826: | Linia 848: | ||
-- TABELA 2 – PUNKTY | -- TABELA 2 – PUNKTY | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 833: | Linia 860: | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | "</div>" | ||
) | ) | ||
| Linia 844: | Linia 870: | ||
-- TABELA 3 – MINUTY | -- TABELA 3 – MINUTY | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 851: | Linia 882: | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | "</div>" | ||
) | ) | ||
| Linia 862: | Linia 892: | ||
-- TABELA 4 – ASYSTY | -- TABELA 4 – ASYSTY | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 869: | Linia 904: | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | "</div>" | ||
) | ) | ||
| Linia 880: | Linia 914: | ||
-- TABELA 5 – ZBIÓRKI | -- TABELA 5 – ZBIÓRKI | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 887: | Linia 926: | ||
) | ) | ||
) | ) | ||
table.insert( | table.insert( | ||
wynik, | wynik, | ||
"" | "</div>" | ||
) | ) | ||
| Linia 898: | Linia 936: | ||
-- TABELA 6 – BLOKI | -- TABELA 6 – BLOKI | ||
-- ===================================================== | -- ===================================================== | ||
table.insert( | |||
wynik, | |||
'<div style="flex:1 1 calc(33.333% - 12px); min-width:280px;">' | |||
) | |||
table.insert( | table.insert( | ||
| Linia 904: | Linia 947: | ||
tabele[6] | tabele[6] | ||
) | ) | ||
) | |||
table.insert( | |||
wynik, | |||
"</div>" | |||
) | |||
-- ===================================================== | |||
-- KONIEC UKŁADU | |||
-- ===================================================== | |||
table.insert( | |||
wynik, | |||
"</div>" | |||
) | ) | ||
Aktualna wersja na dzień 00:56, 1 wrz 2026
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:StatystykiHistoryczne/opis
local p = {}
-- =========================================================
-- MODUŁ: STATYSTYKIHISTORYCZNE
--
-- Łączne statystyki zawodników ze wszystkich
-- wprowadzonych sezonów.
--
-- KOSZYKÓWKA
--
-- Tabele:
-- 1. Mecze
-- 2. Punkty
-- 3. Minuty
-- 4. Asysty
-- 5. Zbiórki
-- 6. Bloki
--
-- Użycie:
--
-- {{#invoke:StatystykiHistoryczne|main
-- |druzyna=Enea Basket Poznań
-- |sezon_biezacy=2025/2026
-- }}
--
-- Zawodnicy występujący w wybranym sezonie
-- są wyróżniani pogrubieniem.
-- =========================================================
function p.main(frame)
-- =====================================================
-- PARAMETRY
-- =====================================================
local druzyna =
mw.text.trim(
frame.args.druzyna or ""
)
local sezonBiezacy =
mw.text.trim(
frame.args.sezon_biezacy or ""
)
-- =====================================================
-- SPRAWDZENIE DRUŻYNY
-- =====================================================
if druzyna == "" then
return
"'''Błąd:''' nie podano parametru <code>druzyna</code>."
end
-- =====================================================
-- BEZPIECZNE PRZYGOTOWANIE NAZW
-- =====================================================
local druzynaSQL =
mw.ustring.gsub(
druzyna,
"'",
"''"
)
local sezonSQL = ""
if sezonBiezacy ~= "" then
sezonSQL =
mw.ustring.gsub(
sezonBiezacy,
"'",
"''"
)
end
-- =====================================================
-- FUNKCJA LICZBOWA
-- =====================================================
local function liczba(value)
return
tonumber(value or 0)
or 0
end
-- =====================================================
-- USTALENIE SEZONU WYRÓŻNIENIA
-- =====================================================
local sezonWyroznienia = ""
local znalezionoBiezacy = false
-- -----------------------------------------------------
-- Najpierw sprawdzamy sezon podany przez użytkownika
-- -----------------------------------------------------
if sezonSQL ~= "" then
local sprawdzenieSezonu =
mw.ext.cargo.query(
"UdzialZawodnika,Mecze",
"UdzialZawodnika.zawodnik=zawodnik",
{
join =
"UdzialZawodnika.mecz=Mecze.id",
where =
"UdzialZawodnika.druzyna='"
.. druzynaSQL
.. "'"
.. " AND Mecze.sezon='"
.. sezonSQL
.. "'"
.. " AND UdzialZawodnika.minuty > 0",
groupBy =
"UdzialZawodnika.zawodnik",
limit = 5000
}
)
if sprawdzenieSezonu
and #sprawdzenieSezonu > 0 then
sezonWyroznienia = sezonBiezacy
znalezionoBiezacy = true
end
end
-- =====================================================
-- JEŻELI NIE MA DANYCH DLA PODANEGO SEZONU
-- SZUKAMY OSTATNIEGO SEZONU
-- =====================================================
if not znalezionoBiezacy then
local sezony =
mw.ext.cargo.query(
"UdzialZawodnika,Mecze",
"Mecze.sezon=sezon",
{
join =
"UdzialZawodnika.mecz=Mecze.id",
where =
"UdzialZawodnika.druzyna='"
.. druzynaSQL
.. "'"
.. " AND UdzialZawodnika.minuty > 0",
groupBy =
"Mecze.sezon",
orderBy =
"Mecze.sezon DESC",
limit = 100
}
)
if sezony and #sezony > 0 then
sezonWyroznienia =
mw.text.trim(
sezony[1].sezon or ""
)
end
end
-- =====================================================
-- POBRANIE ŁĄCZNYCH DANYCH STATYSTYCZNYCH
-- =====================================================
local fields = table.concat({
"UdzialZawodnika.zawodnik=zawodnik",
"COUNT(UdzialZawodnika.mecz)=mecze",
"SUM(UdzialZawodnika.gol)=punkty",
"SUM(UdzialZawodnika.minuty)=minuty",
"SUM(UdzialZawodnika.asysta)=asysty",
"SUM(UdzialZawodnika.zbiorka)=zbiorki",
"SUM(UdzialZawodnika.blok)=bloki"
}, ",")
-- =====================================================
-- WARUNEK
-- =====================================================
local where =
"UdzialZawodnika.druzyna='"
.. druzynaSQL
.. "'"
.. " AND UdzialZawodnika.minuty > 0"
-- =====================================================
-- ZAPYTANIE
-- =====================================================
local rows =
mw.ext.cargo.query(
"UdzialZawodnika",
fields,
{
where = where,
groupBy =
"UdzialZawodnika.zawodnik",
limit = 5000
}
)
-- =====================================================
-- BRAK DANYCH
-- =====================================================
if not rows or #rows == 0 then
return
"''Brak danych statystycznych dla drużyny "
.. druzyna
.. ".''"
end
-- =====================================================
-- AKTUALNI ZAWODNICY
-- =====================================================
local aktualni = {}
if sezonWyroznienia ~= "" then
local sezonAktualnySQL =
mw.ustring.gsub(
sezonWyroznienia,
"'",
"''"
)
local currentRows =
mw.ext.cargo.query(
"UdzialZawodnika,Mecze",
"UdzialZawodnika.zawodnik=zawodnik",
{
join =
"UdzialZawodnika.mecz=Mecze.id",
where =
"UdzialZawodnika.druzyna='"
.. druzynaSQL
.. "'"
.. " AND Mecze.sezon='"
.. sezonAktualnySQL
.. "'"
.. " AND UdzialZawodnika.minuty > 0",
groupBy =
"UdzialZawodnika.zawodnik",
limit = 5000
}
)
if currentRows then
for _, row in ipairs(currentRows) do
local zawodnik =
mw.text.trim(
row.zawodnik or ""
)
if zawodnik ~= "" then
aktualni[zawodnik] = true
end
end
end
end
-- =====================================================
-- PRZYGOTOWANIE DANYCH
-- =====================================================
local zawodnicy = {}
for _, row in ipairs(rows) do
local zawodnik =
mw.text.trim(
row.zawodnik or ""
)
if zawodnik ~= "" then
table.insert(
zawodnicy,
{
zawodnik = zawodnik,
mecze =
liczba(row.mecze),
punkty =
liczba(row.punkty),
-- Cargo przechowuje minuty jako SEKUNDY
minuty =
liczba(row.minuty),
asysty =
liczba(row.asysty),
zbiorki =
liczba(row.zbiorki),
bloki =
liczba(row.bloki),
aktualny =
aktualni[zawodnik] or false
}
)
end
end
-- =====================================================
-- FORMATOWANIE MINUT
--
-- WAŻNE:
-- Pole UdzialZawodnika.minuty jest zapisane w SEKUNDACH.
--
-- Przykład:
-- 103775 sekund = 1729 minut 35 sekund
--
-- Wynik:
-- 1729:35
-- =====================================================
local function formatujMinuty(sekundy)
local wartosc =
tonumber(sekundy or 0)
or 0
wartosc =
math.floor(
wartosc + 0.5
)
local caleMinuty =
math.floor(
wartosc / 60
)
local pozostaleSekundy =
wartosc % 60
return string.format(
"%d:%02d",
caleMinuty,
pozostaleSekundy
)
end
-- =====================================================
-- LINK DO ZAWODNIKA
-- =====================================================
local function linkZawodnika(row)
local nazwa =
row.zawodnik
local tekst =
"[["
.. nazwa
.. "|"
.. nazwa
.. "]]"
-- -------------------------------------------------
-- AKTUALNY ZAWODNIK = POGRUBIENIE
-- -------------------------------------------------
if row.aktualny then
tekst =
"'''"
.. tekst
.. "'''"
end
return tekst
end
-- =====================================================
-- SORTOWANIE
-- =====================================================
local funkcjeSortowania = {
mecze = function(a, b)
if a.mecze ~= b.mecze then
return a.mecze > b.mecze
end
return a.zawodnik < b.zawodnik
end,
punkty = function(a, b)
if a.punkty ~= b.punkty then
return a.punkty > b.punkty
end
return a.zawodnik < b.zawodnik
end,
minuty = function(a, b)
if a.minuty ~= b.minuty then
return a.minuty > b.minuty
end
return a.zawodnik < b.zawodnik
end,
asysty = function(a, b)
if a.asysty ~= b.asysty then
return a.asysty > b.asysty
end
return a.zawodnik < b.zawodnik
end,
zbiorki = function(a, b)
if a.zbiorki ~= b.zbiorki then
return a.zbiorki > b.zbiorki
end
return a.zawodnik < b.zawodnik
end,
bloki = function(a, b)
if a.bloki ~= b.bloki then
return a.bloki > b.bloki
end
return a.zawodnik < b.zawodnik
end
}
-- =====================================================
-- DEFINICJA TABEL
-- =====================================================
local tabele = {
{
nazwa = "MECZE",
pole = "mecze",
format = function(v)
return tostring(v)
end
},
{
nazwa = "PUNKTY",
pole = "punkty",
format = function(v)
return tostring(v)
end
},
{
nazwa = "MINUTY",
pole = "minuty",
format = function(v)
return formatujMinuty(v)
end
},
{
nazwa = "ASYSTY",
pole = "asysty",
format = function(v)
return tostring(v)
end
},
{
nazwa = "ZBIÓRKI",
pole = "zbiorki",
format = function(v)
return tostring(v)
end
},
{
nazwa = "BLOKI",
pole = "bloki",
format = function(v)
return tostring(v)
end
}
}
-- =====================================================
-- BUDOWANIE POJEDYNCZEJ TABELI
-- =====================================================
local function zbudujTabele(definicja)
local lista = {}
for _, zawodnik in ipairs(zawodnicy) do
table.insert(
lista,
zawodnik
)
end
table.sort(
lista,
funkcjeSortowania[
definicja.pole
]
)
local wynik = {}
-- -------------------------------------------------
-- TABELA
-- -------------------------------------------------
table.insert(
wynik,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
-- -------------------------------------------------
-- NAGŁÓWEK
-- -------------------------------------------------
table.insert(
wynik,
"|+ '''"
.. definicja.nazwa
.. "'''"
)
table.insert(
wynik,
"! Miejsce"
)
table.insert(
wynik,
"! Zawodnik"
)
table.insert(
wynik,
"! "
.. definicja.nazwa
)
-- -------------------------------------------------
-- WIERSZE
-- -------------------------------------------------
for i, zawodnik in ipairs(lista) do
table.insert(
wynik,
"|-"
)
-- miejsce
table.insert(
wynik,
"| "
.. i
)
-- zawodnik
table.insert(
wynik,
"| "
.. linkZawodnika(
zawodnik
)
)
-- wartość
table.insert(
wynik,
"| '''"
.. definicja.format(
zawodnik[
definicja.pole
]
)
.. "'''"
)
end
table.insert(
wynik,
"|}"
)
return table.concat(
wynik,
"\n"
)
end
-- =====================================================
-- WYNIK
-- =====================================================
local wynik = {}
table.insert(
wynik,
"== Statystyki historyczne – "
.. druzyna
.. " =="
)
table.insert(
wynik