Moduł:StatystykiHistoryczne
Wygląd
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:StatystykiHistoryczne/opis
local p = {}
-- =========================================================
-- MODUŁ: STATYSTYKISTORYCZNE
--
-- Łączne statystyki zawodników drużyny koszykarskiej
-- ze wszystkich wprowadzonych sezonów.
--
-- Tabele:
-- 1. Mecze
-- 2. Punkty
-- 3. Asysty
-- 4. Zbiórki
-- 5. Bloki
-- 6. Minuty
--
-- Użycie:
--
-- {{#invoke:StatystykiHistoryczne|main
-- |druzyna=Enea Basket Poznań
-- }}
--
-- Moduł jest uniwersalny dla drużyn koszykarskich.
-- =========================================================
-- =========================================================
-- GŁÓWNA FUNKCJA
-- =========================================================
function p.main(frame)
-- -----------------------------------------------------
-- DRUŻYNA
-- -----------------------------------------------------
local druzyna =
mw.text.trim(
frame.args.druzyna or ""
)
if druzyna == "" then
return
"''Nie podano drużyny.''"
end
-- -----------------------------------------------------
-- BEZPIECZNE PRZYGOTOWANIE NAZWY DRUŻYNY
-- -----------------------------------------------------
local druzynaSQL =
mw.ustring.gsub(
druzyna,
"'",
"''"
)
-- =====================================================
-- POLA CARGO
-- =====================================================
local fields = table.concat({
"UdzialZawodnika.zawodnik=zawodnik",
"UdzialZawodnika.druzyna=druzyna",
"UdzialZawodnika.mecz=mecz",
"UdzialZawodnika.minuty=minuty",
"UdzialZawodnika.minuty_format=minuty_format",
"UdzialZawodnika.gol=gol",
"UdzialZawodnika.asysta=asysta",
"UdzialZawodnika.zbiorka=zbiorka",
"UdzialZawodnika.blok=blok"
}, ",")
-- =====================================================
-- ZAPYTANIE CARGO
-- =====================================================
local args = {
where =
"UdzialZawodnika.druzyna='"
.. druzynaSQL
.. "'",
limit = 5000
}
local rows =
mw.ext.cargo.query(
"UdzialZawodnika",
fields,
args
)
-- =====================================================
-- BRAK DANYCH
-- =====================================================
if not rows or #rows == 0 then
return
"''Brak statystyk dla drużyny "
.. druzyna
.. " w bazie.''"
end
-- =====================================================
-- STRUKTURA ZAWODNIKA
-- =====================================================
local zawodnicy = {}
-- =====================================================
-- FUNKCJA NOWEGO REKORDU
-- =====================================================
local function nowyZawodnik()
return {
mecze = 0,
punkty = 0,
asysty = 0,
zbiorki = 0,
bloki = 0,
minuty = 0
}
end
-- =====================================================
-- POMOCNICZA FUNKCJA LICZBOWA
-- =====================================================
local function liczba(wartosc)
return
tonumber(wartosc or 0)
or 0
end
-- =====================================================
-- ZLICZANIE STATYSTYK
-- =====================================================
for _, row in ipairs(rows) do
local zawodnik =
mw.text.trim(
row.zawodnik or ""
)
if zawodnik ~= "" then
if not zawodnicy[zawodnik] then
zawodnicy[zawodnik] =
nowyZawodnik()
end
local stat =
zawodnicy[zawodnik]
-- ---------------------------------------------
-- MECZ
-- ---------------------------------------------
stat.mecze =
stat.mecze + 1
-- ---------------------------------------------
-- PUNKTY
-- ---------------------------------------------
stat.punkty =
stat.punkty
+ liczba(row.gol)
-- ---------------------------------------------
-- ASYSTY
-- ---------------------------------------------
stat.asysty =
stat.asysty
+ liczba(row.asysta)
-- ---------------------------------------------
-- ZBIÓRKI
-- ---------------------------------------------
stat.zbiorki =
stat.zbiorki
+ liczba(row.zbiorka)
-- ---------------------------------------------
-- BLOKI
-- ---------------------------------------------
stat.bloki =
stat.bloki
+ liczba(row.blok)
-- ---------------------------------------------
-- MINUTY
--
-- Cargo przechowuje minuty jako Integer.
-- Przyjmujemy, że jest to liczba minut.
-- ---------------------------------------------
stat.minuty =
stat.minuty
+ liczba(row.minuty)
end
end
-- =====================================================
-- LISTA ZAWODNIKÓW
-- =====================================================
local lista = {}
for zawodnik, stat in pairs(zawodnicy) do
table.insert(
lista,
{
zawodnik = zawodnik,
stat = stat
}
)
end
-- =====================================================
-- FORMATOWANIE MINUT
-- =====================================================
local function formatujMinuty(minuty)
minuty =
tonumber(minuty)
or 0
local godziny =
math.floor(
minuty / 60
)
local min =
minuty % 60
return string.format(
"%d:%02d",
godziny,
min
)
end
-- =====================================================
-- LINK DO ZAWODNIKA
--
-- Zakładamy, że strona zawodnika ma nazwę identyczną
-- z polem "zawodnik" w Cargo.
-- =====================================================
local function linkZawodnika(nazwa)
return
"[["
.. nazwa
.. "|"
.. nazwa
.. "]]"
end
-- =====================================================
-- GENEROWANIE JEDNEJ TABELI
-- =====================================================
local function generujTabele(
tytul,
pole,
formatWartosci,
ikona
)
-- ---------------------------------------------
-- SORTOWANIE
-- ---------------------------------------------
table.sort(
lista,
function(a, b)
local wartoscA =
a.stat[pole]
or 0
local wartoscB =
b.stat[pole]
or 0
if wartoscA ~= wartoscB then
return wartoscA > wartoscB
end
-- Przy remisie alfabetycznie
return
a.zawodnik
< b.zawodnik
end
)
-- ---------------------------------------------
-- TABELA
-- ---------------------------------------------
local wynik = {}
table.insert(
wynik,
"==== "
.. ikona
.. " "
.. tytul
.. " ===="
)
table.insert(
wynik,
""
)
table.insert(
wynik,
'{| class="wikitable sortable" style="width:100%; text-align:center;"'
)
table.insert(
wynik,
"! Miejsce"
)
table.insert(
wynik,
"! Zawodnik"
)
table.insert(
wynik,
"! "
.. tytul
)
-- ---------------------------------------------
-- WIERSZE
-- ---------------------------------------------
for i, rekord in ipairs(lista) do
local wartosc =
rekord.stat[pole]
or 0
if formatWartosci then
wartosc =
formatWartosci(
wartosc
)
end
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"| "
.. i
)
table.insert(
wynik,
"| "
.. linkZawodnika(
rekord.zawodnik
)
)
table.insert(
wynik,
"| '''"
.. wartosc
.. "'''"
)
end
table.insert(
wynik,
"|}"
)
return
table.concat(
wynik,
"\n"
)
end
-- =====================================================
-- WYNIK KOŃCOWY
-- =====================================================
local wynik = {}
table.insert(
wynik,
"=== Statystyki historyczne – "
.. druzyna
.. " ==="
)
table.insert(
wynik,
""
)
-- =====================================================
-- UKŁAD 2 KOLUMNY
--
-- Każda tabela znajduje się w osobnym bloku.
-- MediaWiki może je układać obok siebie dzięki CSS.
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne">'
)
-- =====================================================
-- 1. MECZE
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Mecze",
"mecze",
nil,
"🏀"
)
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- 2. PUNKTY
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Punkty",
"punkty",
nil,
"🏀"
)
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- 3. ASYSTY
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Asysty",
"asysty",
nil,
"🎯"
)
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- 4. ZBIÓRKI
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Zbiórki",
"zbiorki",
nil,
"🏀"
)
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- 5. BLOKI
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Bloki",
"bloki",
nil,
"🛡️"
)
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- 6. MINUTY
-- =====================================================
table.insert(
wynik,
'<div class="statystyki-historyczne-tabela">'
)
table.insert(
wynik,
generujTabele(
"Minuty",
"minuty",
formatujMinuty,
"⏱️"
)
)
table.insert(
wynik,
"</div>"
)
table.insert(
wynik,
"</div>"
)
-- =====================================================
-- ZWRÓCENIE WYNIKU
-- =====================================================
return
table.concat(
wynik,
"\n"
)
end
return p