Moduł:H2H: Różnice pomiędzy wersjami
Wygląd
Nie podano opisu zmian |
Nie podano opisu zmian |
||
| Linia 1122: | Linia 1122: | ||
-- ===================================================== | -- ===================================================== | ||
-- ===================================================== | |||
-- NAJLEPSI STRZELCY | |||
-- OBU DRUŻYN | |||
-- | |||
-- Drużyna jest ustalana na podstawie strony meczu: | |||
-- | |||
-- ns1 = team1: | |||
-- druzyna1 = team1 | |||
-- druzyna2 = team2 | |||
-- | |||
-- ns2 = team1: | |||
-- druzyna2 = team1 | |||
-- druzyna1 = team2 | |||
-- | |||
-- Dzięki temu działa również przy zmianach nazw sponsorskich. | |||
-- ===================================================== | |||
local strzelcy = { | |||
[team1] = {}, | |||
[team2] = {} | |||
} | |||
local function dodajStrzelca( | |||
tabela, | |||
zawodnik, | |||
punkty | |||
) | |||
if not zawodnik or zawodnik == "" then | |||
return | |||
end | |||
tabela[zawodnik] = | |||
tabela | (tabela[zawodnik] or 0) | ||
+ | |||
punkty | punkty | ||
end | |||
-- ===================================================== | |||
-- JEDNO ZAPYTANIE DLA OBU DRUŻYN | |||
-- ===================================================== | |||
local zawodnicyStrzelcy = | |||
mw.ext.cargo.query( | |||
"UdzialZawodnika=U,Mecze=M", | |||
table.concat({ | |||
"U.zawodnik=zawodnik", | |||
"U.druzyna=druzyna", | |||
"U.gol=gol", | |||
"U.minuty=minuty", | |||
"M.id=mecz", | |||
"M.druzyna1=druzyna1", | |||
"M.druzyna2=druzyna2", | |||
"M.nazwa_statystyki1=ns1", | |||
"M.nazwa_statystyki2=ns2" | |||
}, ","), | |||
{ | |||
join = | |||
"U.mecz=M.id", | |||
where = | |||
" | "(" .. | ||
"M. | "(" .. | ||
"M. | "M.nazwa_statystyki1='" .. | ||
" | team1SQL .. | ||
"' AND " .. | |||
"M.nazwa_statystyki2='" .. | |||
team2SQL .. | |||
"' AND " .. | |||
"M. | "(" .. | ||
"M. | "U.druzyna=M.druzyna1" .. | ||
" OR " .. | |||
"U.druzyna=M.druzyna2" .. | |||
")" .. | |||
")" .. | |||
" OR " .. | |||
"(" .. | |||
"M.nazwa_statystyki1='" .. | |||
team2SQL .. | |||
"' AND " .. | |||
"M.nazwa_statystyki2='" .. | |||
team1SQL .. | |||
"' AND " .. | |||
"(" .. | |||
"U.druzyna=M.druzyna1" .. | |||
" OR " .. | |||
"U.druzyna=M.druzyna2" .. | |||
")" .. | |||
")" .. | |||
")" .. | |||
" AND U.minuty > 0", | |||
limit = 20000 | |||
} | |||
) | |||
-- ===================================================== | |||
-- PRZYPISANIE ZAWODNIKA DO TEAM1 / TEAM2 | |||
-- NA PODSTAWIE STRONY MECZU | |||
-- ===================================================== | |||
if zawodnicyStrzelcy then | |||
for _, row in ipairs(zawodnicyStrzelcy) do | |||
local druzynaH2H = nil | |||
-- ------------------------------------------------- | |||
-- Wariant 1: | |||
-- team1 jest drużyną 1 | |||
-- ------------------------------------------------- | |||
if row.ns1 == team1 and | |||
row.ns2 == team2 then | |||
if row.druzyna == row.druzyna1 then | |||
druzynaH2H = team1 | |||
elseif | elseif row.druzyna == row.druzyna2 then | ||
druzynaH2H = team2 | |||
end | |||
-- ------------------------------------------------- | |||
-- Wariant 2: | |||
-- team2 jest drużyną 1 | |||
-- ------------------------------------------------- | |||
elseif row.ns1 == team2 and | |||
row.ns2 == team1 then | |||
if druzyna == | if row.druzyna == row.druzyna1 then | ||
druzynaH2H = team2 | |||
elseif row.druzyna == row.druzyna2 then | |||
druzynaH2H = team1 | |||
end | end | ||
| Linia 1272: | Linia 1288: | ||
end | end | ||
-- ------------------------------------------------- | |||
-- Dodanie punktów | |||
-- ------------------------------------------------- | |||
if druzynaH2H == team1 then | |||
dodajStrzelca( | |||
strzelcy[team1], | |||
row.zawodnik, | |||
liczba(row.gol) | |||
) | |||
elseif druzynaH2H == team2 then | |||
dodajStrzelca( | |||
strzelcy[team2], | |||
row.zawodnik, | |||
liczba(row.gol) | |||
) | ) | ||
end | end | ||
end | |||
table. | end | ||
-- ===================================================== | |||
-- SORTOWANIE STRZELCÓW | |||
-- ===================================================== | |||
local function uporzadkujStrzelcow( | |||
tablica | |||
) | |||
local wynik = {} | |||
for zawodnik, punkty | |||
in pairs(tablica) do | |||
table.insert( | |||
wynik, | wynik, | ||
{ | |||
zawodnik = zawodnik, | |||
punkty = punkty | |||
} | |||
) | |||
end | |||
table.sort( | |||
wynik, | |||
function(a, b) | |||
if a.punkty == b.punkty then | |||
return a. | return a.zawodnik < | ||
b. | b.zawodnik | ||
end | end | ||
return a.punkty > | |||
b.punkty | |||
end | |||
) | |||
return wynik | |||
end | |||
local strzelcy1 = | |||
uporzadkujStrzelcow( | |||
strzelcy[team1] | |||
) | |||
local strzelcy2 = | |||
uporzadkujStrzelcow( | |||
strzelcy[team2] | |||
) | |||
-- ===================================================== | -- ===================================================== | ||
Aktualna wersja na dzień 11:14, 18 sie 2026
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
--
-- nazwa_statystyki1 / nazwa_statystyki2 służą do identyfikacji
-- drużyn niezależnie od historycznych nazw sponsorskich.
--
-- 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. Dogrywki 1, 2 i 3
-- =========================================================
function p.main(frame)
-- =====================================================
-- PARAMETRY
-- =====================================================
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(
tostring(value or ""),
"'",
"''"
)
end
local team1SQL = sql(team1)
local team2SQL = sql(team2)
-- =====================================================
-- FUNKCJE POMOCNICZE
-- =====================================================
local function liczba(value)
if value == nil or value == "" then
return 0
end
local tekst =
mw.ustring.gsub(
tostring(value),
"%s+",
""
)
return tonumber(tekst) or 0
end
local function procent(wygrane, mecze)
if mecze == 0 then
return "0,0%"
end
local wartosc =
(wygrane / mecze) * 100
return string.format(
"%.1f%%",
wartosc
):gsub("%.", ",")
end
-- =====================================================
-- IDENTYFIKACJA STRONY TEAM1
-- =====================================================
local function miejsce(row)
if row.ns1 == team1 then
return "dom"
end
if row.ns2 == team1 then
return "wyjazd"
end
return nil
end
-- =====================================================
-- WYNIK TEAM1
-- =====================================================
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
-- =====================================================
-- NAZWA MECZU
-- =====================================================
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
-- =====================================================
-- PARSOWANIE CZĘŚCI WYNIKU
-- =====================================================
local function parseWynikCzesciowy(value)
if value == nil or value == "" then
return nil, nil
end
local tekst =
tostring(value)
local a, b =
tekst:match(
"(%d+)%s*:%s*(%d+)"
)
if not a or not b then
return nil, nil
end
return
tonumber(a),
tonumber(b)
end
-- =====================================================
-- WARUNEK H2H
-- =====================================================
local whereH2H =
"(" ..
"(Mecze.nazwa_statystyki1='" ..
team1SQL ..
"' AND " ..
"Mecze.nazwa_statystyki2='" ..
team2SQL ..
"')" ..
" OR " ..
"(Mecze.nazwa_statystyki1='" ..
team2SQL ..
"' AND " ..
"Mecze.nazwa_statystyki2='" ..
team1SQL ..
"')" ..
")"
-- =====================================================
-- POBRANIE MECZÓW
--
-- UWAGA:
-- pola nazywają się KWARTA1, KWARTA2 itd.
-- a nie KWART1.
-- =====================================================
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.kwarta1=kwarta1",
"Mecze.kwarta2=kwarta2",
"Mecze.kwarta3=kwarta3",
"Mecze.kwarta4=kwarta4",
"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 = whereH2H,
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,
wartosc,
item
)
if #lista == 0 then
item.wartosc =
wartosc
table.insert(
lista,
item
)
return
end
local obecna =
lista[1].wartosc
if wartosc > obecna then
lista = {
item
}
item.wartosc =
wartosc
return lista
elseif wartosc == obecna then
item.wartosc =
wartosc
table.insert(
lista,
item
)
end
return lista
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
-- =============================================
-- OGÓŁEM
-- =============================================
local b =
bilans.wszystkie
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
-- =============================================
-- DOM / WYJAZD
-- =============================================
local bd =
bilans[miejsceMeczu]
bd.mecze =
bd.mecze + 1
bd.punktyZdobyte =
bd.punktyZdobyte +
zdobyte
bd.punktyStracone =
bd.punktyStracone +
stracone
if wynikMeczu == "W" then
bd.wygrane =
bd.wygrane + 1
elseif wynikMeczu == "P" then
bd.przegrane =
bd.przegrane + 1
end
-- =============================================
-- REKORD MECZOWY
-- =============================================
local itemMeczu = {
tekst =
nazwaMeczu(row),
wynik =
tostring(
liczba(row.gole1)
) ..
":" ..
tostring(
liczba(row.gole2)
),
data =
row.data or "",
miejsce =
miejsceMeczu
}
local roznica =
zdobyte - stracone
if roznica > 0 then
local lista =
rekordyMeczowe
.zwyciestwo
[miejsceMeczu]
if #lista == 0 then
itemMeczu.wartosc =
roznica
table.insert(
lista,
itemMeczu
)
elseif roznica >
lista[1].wartosc then
itemMeczu.wartosc =
roznica
rekordyMeczowe
.zwyciestwo
[miejsceMeczu] = {
itemMeczu
}
elseif roznica ==
lista[1].wartosc then
itemMeczu.wartosc =
roznica
table.insert(
lista,
itemMeczu
)
end
elseif roznica < 0 then
local wartosc =
math.abs(roznica)
local lista =
rekordyMeczowe
.porazka
[miejsceMeczu]
if #lista == 0 then
itemMeczu.wartosc =
wartosc
table.insert(
lista,
itemMeczu
)
elseif wartosc >
lista[1].wartosc then
itemMeczu.wartosc =
wartosc
rekordyMeczowe
.porazka
[miejsceMeczu] = {
itemMeczu
}
elseif wartosc ==
lista[1].wartosc then
itemMeczu.wartosc =
wartosc
table.insert(
lista,
itemMeczu
)
end
end
-- =============================================
-- SERIA OGÓŁEM
-- =============================================
local so =
aktualnaSeria.wszystkie
if wynikMeczu == "W" then
so.W =
so.W + 1
so.P = 0
if so.W >
serie.wszystkie.W then
serie.wszystkie.W =
so.W
end
elseif wynikMeczu == "P" then
so.P =
so.P + 1
so.W = 0
if so.P >
serie.wszystkie.P then
serie.wszystkie.P =
so.P
end
end
-- =============================================
-- SERIA DOM / WYJAZD
-- =============================================
local ss =
aktualnaSeria[miejsceMeczu]
local sr =
serie[miejsceMeczu]
if wynikMecz