Moduł:H2H
Wygląd
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:H2H/opis
local p = {}
-- =========================================================
-- MODUŁ:H2H
--
-- Historia bezpośrednich spotkań dwóch drużyn.
--
-- team1 = drużyna analizowana
-- team2 = przeciwnik
--
-- Wykorzystuje nazwa_statystyki1 / nazwa_statystyki2,
-- dzięki czemu zmiana nazwy sponsorskiej nie rozbija H2H.
--
-- Zawiera:
-- 1. Bilans ogółem / dom / wyjazd
-- 2. Trenerów team1 w rywalizacji
-- 3. Najlepszych strzelców obu drużyn
-- 4. Rekordy indywidualne team1
-- 5. Serie zwycięstw / porażek
-- 6. Analizę kwart
-- 7. Wszystkie mecze
-- 8. Dogrywkę 1, 2 i 3
-- =========================================================
function p.main(frame)
local team1 = mw.text.trim(frame.args.team1 or "")
local team2 = mw.text.trim(frame.args.team2 or "")
if team1 == "" then
return "'''Błąd:''' nie podano team1."
end
if team2 == "" then
return "'''Błąd:''' nie podano team2."
end
-- =====================================================
-- BEZPIECZEŃSTWO SQL
-- =====================================================
local function sql(value)
return mw.ustring.gsub(value, "'", "''")
end
local team1SQL = sql(team1)
local team2SQL = sql(team2)
-- =====================================================
-- FUNKCJE POMOCNICZE
-- =====================================================
local function liczba(value)
if value == nil or value == "" then
return 0
end
return tonumber(
mw.ustring.gsub(
tostring(value),
"%s+",
""
)
) or 0
end
local function procent(wygrane, mecze)
if mecze == 0 then
return "0,0%"
end
return string.format(
"%.1f%%",
(wygrane / mecze) * 100
):gsub("%.", ",")
end
local function wynikDruzyny(row)
local g1 = liczba(row.gole1)
local g2 = liczba(row.gole2)
if row.ns1 == team1 then
return g1, g2
elseif row.ns2 == team1 then
return g2, g1
end
return nil, nil
end
local function miejsce(row)
if row.ns1 == team1 then
return "dom"
end
if row.ns2 == team1 then
return "wyjazd"
end
return 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 parseWynikCzesciowy(value)
if not value or value == "" then
return nil, nil
end
local a, b =
tostring(value):match(
"(%d+)%s*:%s*(%d+)"
)
if not a or not b then
return nil, nil
end
return tonumber(a), tonumber(b)
end
-- =====================================================
-- POBRANIE MECZÓW
-- =====================================================
local fieldsMecze = table.concat({
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.sezon=sezon",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.nazwa_statystyki1=ns1",
"Mecze.nazwa_statystyki2=ns2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik",
"Mecze.wynik_do_przerwy=wynik_do_przerwy",
"Mecze.kwart1=kwart1",
"Mecze.kwart2=kwart2",
"Mecze.kwart3=kwart3",
"Mecze.kwart4=kwart4",
"Mecze.dogrywka1=dogrywka1",
"Mecze.dogrywka2=dogrywka2",
"Mecze.dogrywka3=dogrywka3",
"Mecze.hala=hala",
"Mecze.widzowie=widzowie",
"Mecze.sedziowie=sedziowie",
"Mecze.strona_meczu=strona_meczu"
}, ",")
local mecze =
mw.ext.cargo.query(
"Mecze",
fieldsMecze,
{
where =
"(" ..
"Mecze.nazwa_statystyki1='" ..
team1SQL ..
"' AND " ..
"Mecze.nazwa_statystyki2='" ..
team2SQL ..
"')" ..
" OR (" ..
"Mecze.nazwa_statystyki1='" ..
team2SQL ..
"' AND " ..
"Mecze.nazwa_statystyki2='" ..
team1SQL ..
"')",
orderBy =
"Mecze.data ASC",
limit = 5000
}
)
if not mecze or #mecze == 0 then
return
"'''Brak meczów pomiędzy ''" ..
team1 ..
"'' a ''" ..
team2 ..
"''.'''"
end
-- =====================================================
-- BILANS
-- =====================================================
local bilans = {
wszystkie = {
mecze = 0,
wygrane = 0,
przegrane = 0,
punktyZdobyte = 0,
punktyStracone = 0
},
dom = {
mecze = 0,
wygrane = 0,
przegrane = 0,
punktyZdobyte = 0,
punktyStracone = 0
},
wyjazd = {
mecze = 0,
wygrane = 0,
przegrane = 0,
punktyZdobyte = 0,
punktyStracone = 0
}
}
-- =====================================================
-- SERIE
-- =====================================================
local serie = {
wszystkie = {
W = 0,
P = 0
},
dom = {
W = 0,
P = 0
},
wyjazd = {
W = 0,
P = 0
}
}
local aktualnaSeria = {
wszystkie = {
W = 0,
P = 0
},
dom = {
W = 0,
P = 0
},
wyjazd = {
W = 0,
P = 0
}
}
-- =====================================================
-- REKORDY MECZOWE
-- =====================================================
local rekordyMeczowe = {
zwyciestwo = {
dom = {},
wyjazd = {}
},
porazka = {
dom = {},
wyjazd = {}
}
}
local function dodajRekordMeczowy(
lista,
roznica,
item,
typ
)
if #lista == 0 then
item.wartosc = roznica
table.insert(
lista,
item
)
return
end
local obecna =
lista[1].wartosc
if roznica > obecna then
item.wartosc = roznica
lista[1] = item
elseif roznica == obecna then
item.wartosc = roznica
table.insert(
lista,
item
)
end
end
-- =====================================================
-- PRZETWARZANIE MECZÓW
-- =====================================================
for _, row in ipairs(mecze) do
local zdobyte, stracone =
wynikDruzyny(row)
local miejsceMeczu =
miejsce(row)
if zdobyte and stracone and miejsceMeczu then
local wynikMeczu
if zdobyte > stracone then
wynikMeczu = "W"
elseif zdobyte < stracone then
wynikMeczu = "P"
else
wynikMeczu = "R"
end
-- =============================================
-- BILANS OGÓŁEM
-- =============================================
bilans.wszystkie.mecze =
bilans.wszystkie.mecze + 1
bilans.wszystkie.punktyZdobyte =
bilans.wszystkie.punktyZdobyte +
zdobyte
bilans.wszystkie.punktyStracone =
bilans.wszystkie.punktyStracone +
stracone
if wynikMeczu == "W" then
bilans.wszystkie.wygrane =
bilans.wszystkie.wygrane + 1
elseif wynikMeczu == "P" then
bilans.wszystkie.przegrane =
bilans.wszystkie.przegrane + 1
end
-- =============================================
-- BILANS DOM / WYJAZD
-- =============================================
local b =
bilans[miejsceMeczu]
b.mecze =
b.mecze + 1
b.punktyZdobyte =
b.punktyZdobyte +
zdobyte
b.punktyStracone =
b.punktyStracone +
stracone
if wynikMeczu == "W" then
b.wygrane =
b.wygrane + 1
elseif wynikMeczu == "P" then
b.przegrane =
b.przegrane + 1
end
-- =============================================
-- REKORDY MECZOWE
-- =============================================
local item = {
tek