Moduł:HistoriaSpotkanDruzyny
Wygląd
Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:HistoriaSpotkanDruzyny/opis
local p = {}
local function trim(v)
if v == nil then
return ""
end
return mw.text.trim(tostring(v))
end
local function esc(v)
return mw.ustring.gsub(
trim(v),
"'",
"''"
)
end
local function num(v)
if v == nil or trim(v) == "" then
return 0
end
local text = mw.ustring.gsub(
trim(v),
",",
"."
)
return tonumber(text) or 0
end
local function location(row, team)
if trim(row.druzyna1) == team then
return "dom"
end
if trim(row.druzyna2) == team then
return "wyjazd"
end
return nil
end
-- =========================================================
-- PRZECIWNIK
-- =========================================================
-- Jeżeli nasza drużyna jest drużyną 1,
-- przeciwnik znajduje się w nazwa_statystyki2.
--
-- Jeżeli nasza drużyna jest drużyną 2,
-- przeciwnik znajduje się w nazwa_statystyki1.
-- =========================================================
local function opponent(row, team)
local loc = location(
row,
team
)
if loc == "dom" then
return trim(row.nazwa_statystyki2)
end
if loc == "wyjazd" then
return trim(row.nazwa_statystyki1)
end
return ""
end
-- =========================================================
-- PAUZA
-- =========================================================
-- Pauza nie jest meczem i nie może być liczona
-- do żadnych statystyk.
-- =========================================================
local function isPause(row)
local values = {
row.wynik,
row.druzyna1,
row.druzyna2,
row.nazwa_statystyki1,
row.nazwa_statystyki2
}
for _, value in ipairs(values) do
local text =
mw.ustring.lower(
trim(value)
)
if text == "pauza" then
return true
end
if mw.ustring.find(
text,
"pauza",
1,
true
) ~= nil then
return true
end
end
return false
end
-- =========================================================
-- DOGRYWKI
-- =========================================================
-- Liczymy bezpośrednio pola dogrywka1/2/3.
--
-- Dzięki temu:
--
-- dogrywka1 = 1
-- dogrywka2 = 1
-- dogrywka3 = 1
--
-- daje 3 dogrywki.
--
-- Nie próbujemy już zgadywać liczby dogrywek
-- na podstawie kwart i wyniku końcowego.
-- =========================================================
local function overtime(row)
local count = 0
if trim(row.dogrywka1) ~= "" then
count = count + 1
end
if trim(row.dogrywka2) ~= "" then
count = count + 1
end
if trim(row.dogrywka3) ~= "" then
count = count + 1
end
return count
end
local function pct(
wins,
games
)
if games == 0 then
return "0,0%"
end
local value =
wins / games * 100
local text =
string.format(
"%.1f",
value
)
text =
mw.ustring.gsub(
text,
"%.",
","
)
return text .. "%"
end
local function matchLink(row)
local title =
trim(row.strona_meczu)
local date =
trim(row.data)
if title == "" then
return date
end
if date == "" then
return "[[" .. title .. "]]"
end
return (
"[["
.. title
.. "|"
.. date
.. "]]"
)
end
local function recordText(record)
if record == nil then
return "—"
end
local place
if record.location == "dom" then
place = "dom"
else
place = "wyjazd"
end
return (
matchLink(record.row)
.. " – "
.. record.opponent
.. " "
.. tostring(record.forScore)
.. ":"
.. tostring(record.againstScore)
.. " ("
.. place
.. ", +"
.. tostring(record.diff)
.. ")"
)
end
local function betterRecord(
oldRecord,
newRecord
)
if oldRecord == nil then
return true
end
if newRecord.diff > oldRecord.diff then
return true
end
if newRecord.diff < oldRecord.diff then
return false
end
return trim(newRecord.row.data)
< trim(oldRecord.row.data)
end
function p.main(frame)
local team =
trim(frame.args.druzyna)
if team == "" then
local title =
mw.title.getCurrentTitle()
if title ~= nil then
team =
trim(
title.prefixedText
)
end
end
if team == "" then
return "''Nie podano drużyny.''"
end
-- =====================================================
-- POLA CARGO
-- =====================================================
local fields = table.concat(
{
"Mecze.id=mecz",
"Mecze.data=data",
"Mecze.sezon=sezon",
"Mecze.druzyna1=druzyna1",
"Mecze.druzyna2=druzyna2",
"Mecze.nazwa_statystyki1=nazwa_statystyki1",
"Mecze.nazwa_statystyki2=nazwa_statystyki2",
"Mecze.gole1=gole1",
"Mecze.gole2=gole2",
"Mecze.wynik=wynik",
"Mecze.strona_meczu=strona_meczu",
"Mecze.kwarta1=kwarta1",
"Mecze.kwarta2=kwarta2",
"Mecze.kwarta3=kwarta3",
"Mecze.kwarta4=kwarta4",
"Mecze.dogrywka1=dogrywka1",
"Mecze.dogrywka2=dogrywka2",
"Mecze.dogrywka3=dogrywka3"
},
","
)
local teamSQL =
esc(team)
-- =====================================================
-- POBRANIE MECZÓW
-- =====================================================
local rows =
mw.ext.cargo.query(
"Mecze",
fields,
{
where =
"(Mecze.druzyna1='"
.. teamSQL
.. "' OR Mecze.druzyna2='"
.. teamSQL
.. "')",
orderBy =
"Mecze.data ASC",
limit = 10000
}
)
if not rows
or #rows == 0 then
return (
"''Brak wprowadzonych spotkań dla drużyny: "
.. team
.. ".''"
)
end
local groups = {}
local records = {
win = {
dom = nil,
wyjazd = nil
},
loss = {
dom = nil,
wyjazd = nil
}
}
-- =====================================================
-- PRZETWARZANIE MECZÓW
-- =====================================================
for _, row in ipairs(rows) do
-- =================================================
-- POMIJAMY PAUZĘ
-- =================================================
if not isPause(row) then
local g1 =
num(row.gole1)
local g2 =
num(row.gole2)
local loc =
location(
row,
team
)
local opp =
opponent(
row,
team
)
if loc and opp ~= "" then
-- =========================================
-- GRUPA PRZECIWNIKA
-- =========================================
local item =
groups[opp]
if not item then
item = {
nazwa = opp,
mecze = 0,
wygrane = 0,
porazki = 0,
dogrywki = 0,
forScore = 0,
againstScore = 0
}
groups[opp] =
item
end
-- =========================================
-- NASZE PUNKTY / PUNKTY PRZECIWNIKA
-- =========================================
local gf
local ga
if loc == "dom" then
gf = g1
ga = g2
else
gf = g2
ga = g1
end
-- =========================================
-- MECZ
-- =========================================
item.mecze =
item.mecze + 1
-- =========================================
-- KOSZE
-- =========================================
item.forScore =
item.forScore + gf
item.againstScore =
item.againstScore + ga
-- =========================================
-- DOGRYWKI
-- =========================================
item.dogrywki =
item.dogrywki
+ overtime(row)
-- =========================================
-- WYGRANA / PORAŻKA
-- =========================================
local kind = nil
if gf > ga then
item.wygrane =
item.wygrane + 1
kind = "win"
elseif gf < ga then
item.porazki =
item.porazki + 1
kind = "loss"
end
-- =========================================
-- NAJWIĘKSZA WYGRANA / PORAŻKA
-- =========================================
if kind ~= nil then
local old =
records[kind][loc]
local current = {
row = row,
opponent = opp,
location = loc,
forScore = gf,
againstScore = ga,
diff = math.abs(
gf - ga
)
}
if betterRecord(
old,
current
) then
records[kind][loc] =
current
end
end
end
end
end
-- =====================================================
-- LISTA PRZECIWNIKÓW
-- =====================================================
local list = {}
for _, item in pairs(groups) do
table.insert(
list,
item
)
end
table.sort(
list,
function(a, b)
if a.mecze ~= b.mecze then
return a.mecze >
b.mecze
end
return mw.ustring.lower(
a.nazwa
)
<
mw.ustring.lower(
b.nazwa
)
end
)
-- =====================================================
-- WYNIK
-- =====================================================
local out = {}
table.insert(
out,
"== Historia spotkań =="
)
table.insert(
out,
""
)
table.insert(
out,
"Historia spotkań drużyny "
.. team
.. " ze wszystkimi przeciwnikami wprowadzonymi do bazy."
)
table.insert(
out,
""
)
-- =====================================================
-- TABELA HISTORII
-- =====================================================
table.insert(
out,
'{| class="wikitable sortable" style="width:100%; text-align:center;"'
)
table.insert(
out,
"! Przeciwnik !! Mecze ogółem !! Wygrane !! Porażki !! Dogrywki !! % wygranych !! Kosze rzucone !! Kosze stracone"
)
for _, item in ipairs(list) do
table.insert(
out,
"|-"
)
table.insert(
out,
'| style="text-align:left;" | '
.. item.nazwa
)
table.insert(
out,
"| "
.. tostring(item.mecze)
.. " || "
.. tostring(item.wygrane)
.. " || "
.. tostring(item.porazki)
.. " || "
.. tostring(item.dogrywki)
.. " || "
.. pct(
item.wygrane,
item.mecze
)
.. " || "
.. tostring(item.forScore)
.. " || "
.. tostring(item.againstScore)
)
end
table.insert(
out,
"|}"
)
table.insert(
out,
""
)
-- =====================================================
-- REKORDY
-- =====================================================
table.insert(
out,
"== Największa wygrana i największa porażka =="
)
table.insert(
out,
""
)
table.insert(
out,
'{| class="wikitable" style="width:100%; text-align:center;"'
)
table.insert(
out,
"! Rekord !! 🏠 Dom !! ✈️ Wyjazd"
)
table.insert(
out,
"|-"
)
table.insert(
out,
"! 🏆 Największa wygrana"
)
table.insert(
out,
"| "
.. recordText(
records.win.dom
)
.. " || "
.. recordText(
records.win.wyjazd
)
)
table.insert(
out,
"|-"
)
table.insert(
out,
"! 📉 Największa porażka"
)
table.insert(
out,
"| "
.. recordText(
records.loss.dom
)
.. " || "
.. recordText(
records.loss.wyjazd
)
)
table.insert(
out,
"|}"
)
table.insert(
out,
""
)
table.insert(
out,
"''Dogrywki są liczone na podstawie pól dogrywka1, dogrywka2 i dogrywka3 zapisanych przy meczu.''"
)
return table.concat(
out,
"\n"
)
end
return p