Документацію для цього модуля можна створити у Модуль:FetchData6/документація
local p = {}
--- Видаляє вікі-посилання [[link]]
local function clean_wikilinks(text)
if not text then return nil end
text = mw.ustring.gsub(text, "%[%[([^%]|]+)|([^%]]+)%]%]", "%2")
text = mw.ustring.gsub(text, "%[%[([^%]]+)%]%]", "%1")
return mw.text.trim(text)
end
--- Отримує дані гравця з конкретного сезону
local function get_season_data(season_number, player_name)
local season_names = {
[1] = "Перший сезон",
[2] = "Другий сезон",
[3] = "Третій сезон",
[4] = "Четвертий сезон",
[5] = "П'ятий сезон",
[6] = "Шостий сезон",
[7] = "Сьомий сезон",
[8] = "Восьмий сезон",
[9] = "Дев'ятий сезон"
}
local season_name = season_names[season_number]
if not season_name then
return nil
end
local title = mw.title.new(season_name)
if not title or not title.exists then
return nil
end
local content = title:getContent()
if not content then
return nil
end
-- Знаходимо секцію "Рейтинг"
local rating_section = mw.ustring.match(content, "==+%s*Рейтинг%s*==+(.-)\n==")
if not rating_section then
rating_section = mw.ustring.match(content, "==+%s*Рейтинг%s*==+(.*)")
end
if not rating_section then
return nil
end
-- Знаходимо таблицю
local table_start = mw.ustring.find(rating_section, "{|")
local table_end = mw.ustring.find(rating_section, "|}", table_start)
if not table_start or not table_end then
return nil
end
local table_content = mw.ustring.sub(rating_section, table_start, table_end + 1)
-- Розбиваємо таблицю на рядки (між |- )
local current_row = {}
local all_rows = {}
for line in mw.ustring.gmatch(table_content .. "\n", "([^\n]*)\n") do
line = mw.text.trim(line)
if line == "|-" then
if #current_row > 0 then
table.insert(all_rows, current_row)
end
current_row = {}
elseif mw.ustring.match(line, "^|[^-}]") then
-- Це комірка (починається з | але не |- або |})
local cell_content = mw.ustring.gsub(line, "^|%s*", "")
table.insert(current_row, cell_content)
end
end
-- Додаємо останній рядок якщо є
if #current_row > 0 then
table.insert(all_rows, current_row)
end
-- Шукаємо рядок з гравцем
for _, row in ipairs(all_rows) do
-- row[1] = №, row[2] = Пан/Пані, row[3] = Σ, row[4] = І, row[5] = %
if #row >= 5 then
local player_cell = clean_wikilinks(row[2])
if player_cell == player_name then
return {
place = mw.text.trim(row[1]),
points = mw.text.trim(row[3]),
games = mw.text.trim(row[4]),
winrate = mw.text.trim(row[5])
}
end
end
end
return nil
end
--- Головна функція для виведення таблиці досягнень
function p.season_achievements(frame)
local player_name = frame.args.player
if not player_name or player_name == "" then
return "<span style='color:red;'>Ім'я гравця не вказано</span>"
end
-- Створюємо HTML таблицю
local htmlTable = mw.html.create('table')
:addClass('wikitable sortable')
:css('width', '100%')
:css('font-size', '14.5px')
-- Додаємо заголовки
local headerRow = htmlTable:tag('tr')
headerRow:tag('th'):wikitext('Сезон')
headerRow:tag('th'):wikitext('Місце')
headerRow:tag('th'):wikitext('Бали')
headerRow:tag('th'):wikitext('% перемог')
headerRow:tag('th'):wikitext('Ігор')
-- Посилання на сезони
local season_links = {
[1] = "[[Перший сезон#Рейтинг|01 сезон]]",
[2] = "[[Другий сезон#Рейтинг|02 сезон]]",
[3] = "[[Третій сезон#Рейтинг|03 сезон]]",
[4] = "[[Четвертий сезон#Рейтинг|04 сезон]]",
[5] = "[[П'ятий сезон#Рейтинг|05 сезон]]",
[6] = "[[Шостий сезон#Рейтинг|06 сезон]]",
[7] = "[[Сьомий сезон#Рейтинг|07 сезон]]",
[8] = "[[Восьмий сезон#Рейтинг|08 сезон]]",
[9] = "[[Дев'ятий сезон#Рейтинг|09 сезон]]"
}
-- Проходимо по всіх 9 сезонах
for season = 1, 9 do
local data = get_season_data(season, player_name)
local row = htmlTable:tag('tr')
-- Сезон
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:wikitext(season_links[season])
if data then
-- Місце
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:wikitext(data.place)
-- Бали
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:wikitext(data.points)
-- % перемог
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:wikitext(data.winrate)
-- Ігор
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:wikitext(data.games)
else
-- Гравець не брав участі - показуємо "-"
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:css('color', '#666')
:wikitext('-')
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:css('color', '#666')
:wikitext('-')
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:css('color', '#666')
:wikitext('-')
row:tag('td')
:css('text-align', 'center')
:css('padding', '8px')
:css('color', '#666')
:wikitext('-')
end
end
return tostring(htmlTable)
end
return p