Модуль:StatEngine/RatingBuilder/Debug
Перейти к навигации
Перейти к поиску
Для документации этого модуля может быть создана страница Модуль:StatEngine/RatingBuilder/Debug/doc
-- =========================================================================
-- Модуль:StatEngine/Debug
-- Вызов в вики-тексте: {{#invoke:StatEngine/Debug|run|2024}}
-- =========================================================================
local p = {}
-- Копия таблицы рангов для правильной сортировки от лучших к худшим
local ranks = {
["оп"] = 1,
["о"] = 2, ["о1"] = 3, ["о2"] = 4, ["о3"] = 5,
["о1-3г-no"] = 10, ["о-8г-no"] = 11, ["о-7г-no"] = 12, ["о-6г-no"] = 13,
["о-5г-no"] = 14, ["о-4г-no"] = 15, ["о-3г-no"] = 16,
["о1-6г"] = 20, ["о1-5г"] = 21, ["о1-4г"] = 22, ["о1-3г"] = 23, ["о1-2г"] = 24, ["о1-1г"] = 25,
["о2-6г"] = 30, ["о2-5г"] = 31, ["о2-4г"] = 32, ["о2-3г"] = 33, ["о2-2г"] = 34, ["о2-1г"] = 35,
["о3-6г"] = 40, ["о3-5г"] = 41, ["о3-4г"] = 42, ["о3-3г"] = 43, ["о3-2г"] = 44, ["о3-1г"] = 45,
["о-8г"] = 50, ["о-7г"] = 51, ["о-6г"] = 52, ["о-5г"] = 53, ["о-4г"] = 54, ["о-3г"] = 55, ["о-2г"] = 56, ["о-1г"] = 57,
["ос"] = 60, ["ос-5г"] = 61, ["ос-4г"] = 62, ["ос-3г"] = 63, ["ос-2г"] = 64, ["ос-1г"] = 65,
-- === ЛИГА НАЦИЙ ===
["4гD"]=101, ["3гD-no"]=102, ["3гD"]=103, ["2гD"]=104, ["1гD"]=105, ["чфD"]=106, ["пD"]=107, ["фD"]=108, ["побD"]=109,
["4гC"]=111, ["3гC-no"]=112, ["3гC"]=113, ["2гC"]=114, ["1гC"]=115, ["чфC"]=116, ["пC"]=117, ["фC"]=118, ["побC"]=119,
["4гB"]=121, ["3гB-no"]=122, ["3гB"]=123, ["2гB"]=124, ["1гB"]=125, ["чфB"]=126, ["пB"]=127, ["фB"]=128, ["побB"]=129,
["4гA"]=131, ["3гA-no"]=132, ["3гA"]=133, ["2гA"]=134, ["1гA"]=135, ["чфA"]=136, ["пA"]=137, ["фA"]=138,
-- === ФИНАЛЬНЫЕ ТУРНИРЫ ===
["8"] = 270, ["7"] = 271, ["6"] = 272, ["5"] = 273,
["6г"] = 280, ["5г"] = 281, ["4г"] = 282, ["3г"] = 283, ["2г"] = 284, ["1г"] = 285,
["в"] = 290, ["чф"] = 291, ["д"] = 292, ["б"] = 293, ["ф"] = 294, ["ч"] = 295
}
function p.run(frame)
-- Получаем аргументы (сначала проверяем напрямую, затем у родителя)
local args = frame.args[1] and frame.args or frame:getParent().args
local year = tonumber(args[1] or args["год"] or args.year)
if not year then
return "<strong class='error'>Ошибка: Укажите год первым параметром (например, {{#invoke:StatEngine/RatingBuilder/Debug|run|2024}}).</strong>"
end
-- Загружаем БД турниров за указанный год
local db_module_name = 'Модуль:Data/Tournaments/' .. year
local success_db, db_tournaments = pcall(require, db_module_name)
if not success_db then
return "<strong class='error'>Ошибка: Не удалось загрузить данные турниров (" .. db_module_name .. ").</strong>"
end
-- Загружаем основной модуль рейтинга
local success_builder, Builder = pcall(require, 'Модуль:StatEngine/RatingBuilder')
if not success_builder then
return "<strong class='error'>Ошибка: Не удалось загрузить Модуль:StatEngine/RatingBuilder.</strong>"
end
-- Собираем данные
local data = Builder.build_year(year, db_tournaments)
if not data or next(data) == nil then
return "''Нет данных для вывода за " .. year .. " год.''"
end
local output_lines = {}
-- Собираем названия турниров и сортируем их по алфавиту для красоты
local tournaments = {}
for tourney_name in pairs(data) do
table.insert(tournaments, tourney_name)
end
table.sort(tournaments)
-- Обрабатываем каждый турнир
for _, tourney in ipairs(tournaments) do
local teams_data = data[tourney]
local teams_list = {}
-- Переводим команды из ассоциативного массива в индексированный для сортировки
for team_name, result in pairs(teams_data) do
table.insert(teams_list, {
name = team_name,
result = result,
-- Если ключа нет в базе рангов или пришел nil, ставим -1 (чтобы улетел в самый низ)
rank = ranks[result] or -1
})
end
-- Сортировка команд
table.sort(teams_list, function(a, b)
if a.rank ~= b.rank then
return a.rank > b.rank -- От большего (лучшего) к меньшему
else
return a.name < b.name -- При равных рангах сортируем по алфавиту
end
end)
-- Формируем текст для текущего турнира
table.insert(output_lines, string.format("== %s (%d) ==", tourney, #teams_list))
for i, t in ipairs(teams_list) do
local display_result = t.result
if display_result == nil then
display_result = "<span style='color:red;'>'''nil''' (неизвестная ошибка)</span>"
elseif t.rank == -1 then
display_result = string.format("<span style='color:orange;'>%s (неизвестный код ранга)</span>", tostring(t.result))
end
table.insert(output_lines, string.format("%d. %s — %s", i, t.name, display_result))
end
table.insert(output_lines, "") -- Пустая строка между турнирами
end
return table.concat(output_lines, "\n\n")
end
return p