Модуль:FetchData
Документацію для цього модуля можна створити у Модуль:FetchData/документація
local p = {}
-- Функція для читання таблиці
local function get_table_from_page(page_name)
local title = mw.title.new(page_name)
if not title or not title.exists then return nil end
local content = title:getContent()
if not content then return nil end
local table_start = mw.ustring.find(content, "{|")
local table_end = mw.ustring.find(content, "|}", table_start)
if not table_start or not table_end then return nil end
return mw.ustring.sub(content, table_start, table_end + 1)
end
-- Парсинг таблиці
local function parse_table_rows(table_content)
local rows = {}
for row in mw.ustring.gmatch(table_content, "|-\n(.-)\n|-") do
table.insert(rows, row)
end
local last_row = mw.ustring.match(table_content, "|-\n(.-)%s*|}")
if last_row then table.insert(rows, last_row) end
return rows
end
local function parse_row_cells(row)
local cells = {}
row = mw.ustring.gsub(row, "^%s*|%s*", "")
for cell in mw.ustring.gmatch(row, "([^|]+)") do
local trimmed = mw.text.trim(cell)
if trimmed ~= "" then table.insert(cells, trimmed) end
end
return cells
end
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 find_player_data(table_content, player_name)
if not table_content then return nil end
local escaped = mw.ustring.gsub(player_name, "([%^%$%(%)%%%.%[%]%*%+%-%?])", "%%%1")
local player_pattern = "%[%[" .. escaped .. "%]%]"
local rows = parse_table_rows(table_content)
for _, row in ipairs(rows) do
if mw.ustring.find(row, player_pattern) then
return parse_row_cells(row)
end
end
return nil
end
-- Отримати всіх гравців зі списку
local function get_all_players()
local table_content = get_table_from_page("Гравці")
if not table_content then return nil end
local rows = parse_table_rows(table_content)
local players = {}
for _, row in ipairs(rows) do
local cells = parse_row_cells(row)
if #cells >= 2 then
local player_name = clean_wikilinks(cells[2])
if player_name then
table.insert(players, player_name)
end
end
end
return players
end
-- Згенерувати код для одного гравця
function p.generate_single_player(frame)
local player_name = frame.args.player or frame.args[1]
if not player_name or player_name == "" then
return "Помилка: Не вказано ім'я гравця"
end
-- Збираємо дані з різних таблиць
local stats = find_player_data(get_table_from_page("Статистика"), player_name)
local player_info = find_player_data(get_table_from_page("Гравці"), player_name)
local foundation = find_player_data(get_table_from_page("Фундація"), player_name)
local prize_pool = find_player_data(get_table_from_page("Призовий_фонд"), player_name)
local finalist = find_player_data(get_table_from_page("Фіналіст"), player_name)
-- FOTY Rating з таблиці "Період"
local foty_rating = "—"
local period_content = get_table_from_page("Період")
if period_content then
local content = mw.title.new("Період"):getContent()
local foty_section = mw.ustring.match(content, "==+%s*Фінал Року%s*==+(.-)\n==")
if not foty_section then
foty_section = mw.ustring.match(content, "==+%s*Фінал Року%s*==+(.*)")
end
if foty_section then
local table_start = mw.ustring.find(foty_section, "{|")
local table_end = mw.ustring.find(foty_section, "|}", table_start)
if table_start and table_end then
local table_content = mw.ustring.sub(foty_section, table_start, table_end + 1)
local foty_cells = find_player_data(table_content, player_name)
if foty_cells and #foty_cells >= 3 then
local place = mw.text.trim(foty_cells[1])
local rating = mw.text.trim(foty_cells[3])
rating = mw.ustring.gsub(rating, "<span[^>]*>", "")
rating = mw.ustring.gsub(rating, "</span>", "")
rating = mw.ustring.gsub(rating, "[^%d%-]", "")
rating = mw.text.trim(rating)
if rating and rating ~= "" then
foty_rating = rating .. " (" .. place .. " місце)"
end
end
end
end
end
-- Форматуємо дату
local date_added = "Лише Бог знає"
if player_info and #player_info >= 3 then
local raw_date = player_info[3]
if raw_date and raw_date ~= "" and raw_date ~= "-" then
local day, month, year = mw.ustring.match(raw_date, "(%d+)%.(%d+)%.(%d+)")
if day and month and year then
local end_date = os.time({year=2024, month=12, day=1})
local start_date = os.time({year=tonumber(year), month=tonumber(month), day=tonumber(day)})
local days_diff = math.floor((end_date - start_date) / 86400)
date_added = string.format("%s (%d днів)", raw_date, days_diff)
end
end
end
-- Recruiter
local recruiter = "Не вказано"
if player_info and #player_info >= 2 then
local raw = mw.text.trim(player_info[2])
if raw ~= "Відсутній" and raw ~= "-" and raw ~= "" then
recruiter = raw
end
end
-- Генеруємо код
local output = {}
table.insert(output, "{{MCC Player New")
table.insert(output, "| nickname = " .. player_name)
if stats and #stats >= 5 then
table.insert(output, "| games = " .. (stats[2] or "0"))
table.insert(output, "| wins = " .. (stats[3] or "0"))
table.insert(output, "| losses = " .. (stats[4] or "0"))
table.insert(output, "| winrate = " .. (stats[5] or "0"))
else
table.insert(output, "| games = 0")
table.insert(output, "| wins = 0")
table.insert(output, "| losses = 0")
table.insert(output, "| winrate = 0")
end
table.insert(output, "| foty_rating = " .. foty_rating)
table.insert(output, "| recruiter = " .. recruiter)
table.insert(output, "| date_added = " .. date_added)
if foundation and #foundation >= 2 then
local found = mw.ustring.gsub(foundation[2] or "0", "[^%d]", "")
table.insert(output, "| foundation = " .. found)
else
table.insert(output, "| foundation = 0")
end
if prize_pool and #prize_pool >= 2 then
local prize = mw.ustring.gsub(prize_pool[2] or "0", "[^%d]", "")
table.insert(output, "| prize_pool = " .. prize)
else
table.insert(output, "| prize_pool = 0")
end
if finalist and #finalist >= 2 then
local fin = mw.ustring.gsub(finalist[2] or "0", "[^%d]", "")
table.insert(output, "| finalist = " .. fin)
else
table.insert(output, "| finalist = 0")
end
table.insert(output, "}}")
return "<pre>" .. table.concat(output, "\n") .. "</pre>"
end
-- Згенерувати код для всіх гравців
function p.generate_all_players(frame)
local players = get_all_players()
if not players then
return "Помилка: Не вдалося отримати список гравців"
end
local output = {}
table.insert(output, "== Згенеровані шаблони для всіх гравців ==\n")
for i, player_name in ipairs(players) do
table.insert(output, string.format("=== %d. %s ===", i, player_name))
-- Генеруємо код для цього гравця
local player_code = p.generate_single_player({args = {player = player_name}})
table.insert(output, player_code)
table.insert(output, "\n")
-- Обмеження: тільки перші 10 гравців (щоб не перевантажити)
if i >= 10 then
table.insert(output, "\n''... і ще " .. (#players - 10) .. " гравців''")
break
end
end
return table.concat(output, "\n")
end
return p