Moduł:Trenerzy sezon
Wygląd
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Trenerzy sezon/opis
local p = {}
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 przygotowanie wartości do SQL
local sezonSQL = mw.ustring.gsub(sezon, "'", "''")
local druzynaSQL = mw.ustring.gsub(druzyna, "'", "''")
-- =====================================================
-- POBRANIE TRENERÓW I MECZÓW
-- =====================================================
local fields = table.concat({
"SztabMeczu.osoba=trener",
"SztabMeczu.druzyna=druzyna",
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.sezon=sezon",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik"
}, ",")
local args = {
join = "SztabMeczu.mecz=Mecze.id",
where =
"SztabMeczu.rola='Trener'" ..
" AND SztabMeczu.druzyna='" .. druzynaSQL .. "'" ..
" AND Mecze.sezon='" .. sezonSQL .. "'",
orderBy = "Mecze.data ASC",
limit = 5000
}
local rows = mw.ext.cargo.query(
"SztabMeczu,Mecze",
fields,
args
)
if not rows or #rows == 0 then
return "''Brak danych o trenerach dla tej drużyny w podanym sezonie.''"
end
-- =====================================================
-- PODSUMOWANIA TRENERÓW
-- =====================================================
local trenerzy = {}
local function nowePodsumowanie()
return {
mecze = 0,
zwyciestwa = 0,
porazki = 0,
remisy = 0,
rzucone = 0,
stracone = 0
}
end
-- =====================================================
-- PRZETWARZANIE MECZÓW
-- =====================================================
for _, row in ipairs(rows) do
local trener = row.trener or ""
if trener ~= "" then
if not trenerzy[trener] then
trenerzy[trener] = nowePodsumowanie()
end
local stat = trenerzy[trener]
local d1 = row.druzyna1 or ""
local d2 = row.druzyna2 or ""
local g1 = tonumber(row.gole1 or "")
local g2 = tonumber(row.gole2 or "")
-- Jeżeli pola gole1/gole2 nie są dostępne,
-- próbujemy odczytać wynik z pola wynik.
if not g1 or not g2 then
local wynik = row.wynik or ""
local a, b =
wynik:match("(%d+)%s*:%s*(%d+)")
if a and b then
g1 = tonumber(a)
g2 = tonumber(b)
end
end
-- Bez poprawnego wyniku nie liczymy meczu
-- do klasyfikacji.
if g1 and g2 then
stat.mecze =
stat.mecze + 1
-- -----------------------------------------
-- DRUŻYNA TRENERA JAKO GOSPODARZ
-- -----------------------------------------
if druzyna == d1 then
stat.rzucone =
stat.rzucone + g1
stat.stracone =
stat.stracone + g2
if g1 > g2 then
stat.zwyciestwa =
stat.zwyciestwa + 1
elseif g1 < g2 then
stat.porazki =
stat.porazki + 1
else
stat.remisy =
stat.remisy + 1
end
-- -----------------------------------------
-- DRUŻYNA TRENERA JAKO GOŚĆ
-- -----------------------------------------
elseif druzyna == d2 then
stat.rzucone =
stat.rzucone + g2
stat.stracone =
stat.stracone + g1
if g2 > g1 then
stat.zwyciestwa =
stat.zwyciestwa + 1
elseif g2 < g1 then
stat.porazki =
stat.porazki + 1
else
stat.remisy =
stat.remisy + 1
end
end
end
end
end
-- =====================================================
-- USUNIĘCIE TRENERÓW BEZ POLICZONYCH MECZÓW
-- =====================================================
for trener, stat in pairs(trenerzy) do
if stat.mecze == 0 then
trenerzy[trener] = nil
end
end
-- =====================================================
-- SPRAWDZENIE DANYCH
-- =====================================================
local lista = {}
for trener, stat in pairs(trenerzy) do
table.insert(
lista,
{
trener = trener,
stat = stat
}
)
end
if #lista == 0 then
return "''Brak kompletnych danych o meczach trenerów w tym sezonie.''"
end
-- =====================================================
-- SORTOWANIE
-- =====================================================
table.sort(
lista,
function(a, b)
-- najpierw liczba zwycięstw
if a.stat.zwyciestwa ~= b.stat.zwyciestwa then
return a.stat.zwyciestwa > b.stat.zwyciestwa
end
-- następnie liczba meczów
if a.stat.mecze ~= b.stat.mecze then
return a.stat.mecze > b.stat.mecze
end
-- następnie bilans
local bilansA =
a.stat.rzucone - a.stat.stracone
local bilansB =
b.stat.rzucone - b.stat.stracone
if bilansA ~= bilansB then
return bilansA > bilansB
end
return a.trener < b.trener
end
)
-- =====================================================
-- WYNIK
-- =====================================================
local wynik = {}
table.insert(
wynik,
'{| class="wikitable sortable" style="width:100%; text-align:center;"'
)
-- Nagłówki
table.insert(
wynik,
"! Trener"
)
table.insert(
wynik,
"! Mecze"
)
table.insert(
wynik,
"! W"
)
table.insert(
wynik,
"! P"
)
table.insert(
wynik,
"! R"
)
table.insert(
wynik,
"! % zwycięstw"
)
table.insert(
wynik,
"! Kosze rzucone"
)
table.insert(
wynik,
"! Kosze stracone"
)
table.insert(
wynik,
"! Bilans"
)
-- =====================================================
-- WIERSZE
-- =====================================================
for _, item in ipairs(lista) do
local trener = item.trener
local stat = item.stat
local bilans =
stat.rzucone - stat.stracone
local procent = 0
if stat.mecze > 0 then
procent =
(stat.zwyciestwa / stat.mecze) * 100
end
-- Zaokrąglenie do jednego miejsca
procent =
string.format(
"%.1f",
procent
)
-- Link do strony trenera
local trenerLink =
"[[" .. trener .. "]]"
table.insert(
wynik,
"|-"
)
table.insert(
wynik,
"| " .. trenerLink
)
table.insert(
wynik,
"| " .. stat.mecze
)
table.insert(
wynik,
"| " .. stat.zwyciestwa
)
table.insert(
wynik,
"| " .. stat.porazki
)
table.insert(
wynik,
"| " .. stat.remisy
)
table.insert(
wynik,
"| " .. procent .. "%"
)
table.insert(
wynik,
"| " .. stat.rzucone
)
table.insert(
wynik,
"| " .. stat.stracone
)
local bilansTekst
if bilans > 0 then
bilansTekst =
"+" .. bilans
else
bilansTekst =
tostring(bilans)
end
table.insert(
wynik,
"| " .. bilansTekst
)
end
table.insert(
wynik,
"|}"
)
return table.concat(
wynik,
"\n"
)
end
return p