Модуль:PlayerStats/doc: различия между версиями
Нет описания правки |
Нет описания правки |
||
| Строка 32: | Строка 32: | ||
-->|Качество=ИС<!-- Избранная (ИС) или хорошая (ХС) статья | -->|Качество=ИС<!-- Избранная (ИС) или хорошая (ХС) статья | ||
-->}} | -->}} | ||
</syntaxhighlight> | |||
== Оптимизация == | |||
Для ещё лучшей производительности рекомендуется выносить рекорды, достижения и полный список матчей игроков на отдельную страницу, заполняя шаблон основной статьи так: | |||
<syntaxhighlight lang="wikitext"> | |||
{{#invoke:PlayerStats|main<!-- | {{#invoke:PlayerStats|main<!-- | ||
-->|ИМЯ<!-- | -->|ИМЯ<!-- | ||
-->|achievements = | -->|achievements = no | ||
|main_table = yes | |||
|sortable = no | |||
|main_table = | |medals = yes | ||
|sortable = | |matches_list = no | ||
|medals = | |matches_link = Достижения, рекорды и список матчей | ||
|matches_list = | |navboxes = yes | ||
|matches_link = | |||
|navboxes = | |||
|СГ = | |СГ = | ||
|Год = | |Год = | ||
|Качество = | |Качество = | ||
}} | }}</syntaxhighlight> | ||
</syntaxhighlight> | А на подстранице заполнить так: | ||
<syntaxhighlight lang="wikitext"> | |||
{{#invoke:PlayerStats|main<!-- | |||
-->|ИМЯ<!-- | |||
-->|achievements = yes | |||
|main_table = no | |||
|matches_list = yes | |||
|navboxes = no | |||
}}</syntaxhighlight> | |||
== Архитектура системы == | == Архитектура системы == | ||
Версия от 06:56, 4 июня 2026
Общее описание
Module:PlayerStats — это центральный контроллер (точка входа) для генерации полной личной страницы игрока ЧТМ. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, рекорды, мегарейтинг, медали, строит навигационные шаблоны и хронологию матчей.
Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по базам данных всех лет через движок StatEngine/Pure (Харвестер). Все данные кэшируются в гигантский словарь GrandStats, откуда интерфейсные модули мгновенно забирают нужные цифры.
Использование
На странице игрока (например, Диман) модуль вызывается через шаблон (или напрямую через #invoke):
{{#invoke:PlayerStats|main|Диман}}
Или с указанием параметров:
{{#invoke:PlayerStats|main<!-- Запуск модуля
-->|Диман<!-- Имя игрока, обязательный параметр, НЕ ПЕРЕНОСИТЕ СТРОКУ ПОСЛЕ ИМЕНИ, если нужен визуальный перенос, то используйте комментарии, как в этом примере<!--
-->|achievements=no<!-- Вычислять и показывать ли блок «Достижения и Рекорды» (по умолчанию-yes)<!--
-->|ach_list=yes<!-- Если achievements=no, то показать только блок достижений: ach_list=yes. Если achievements=yes, то не показывать блок достижений: ach_list=no.
-->|records_list=yes<!-- Если achievements=no, то показать только блок рекордов: records_list=yes. Если achievements=yes, то не показывать блок рекордов: records_list=no.<!--
-->|main_table=no<!-- Отключает расчёт и вывод таблицы статистики (по умолчанию — yes)
-->|sortable=no<!-- Отключает сортировку таблицы статистики, делая её более компактной (по умолчанию — no)
-->|medals=yes<!-- Показывать ли медали в таблице статистики (по умолчанию — no)
-->|matches_list=no<!-- Отключает расчёт и вывод полного списка матчей (по умолчанию — yes)
-->|matches_link=<!-- В случае отключения списка матчей необходимо задать ссылку на подстраницу.
-->|navboxes=no<!-- Отключает расчёт и вывод навигационных шаблонов (по умолчанию — yes)
-->|СГ=1<!-- Если статья заняла какое-то место в голосовании за статью года, то оно указывается
-->|Год=2020<!-- Год, когда происходило голосование
-->|Качество=ИС<!-- Избранная (ИС) или хорошая (ХС) статья
-->}}
Оптимизация
Для ещё лучшей производительности рекомендуется выносить рекорды, достижения и полный список матчей игроков на отдельную страницу, заполняя шаблон основной статьи так:
{{#invoke:PlayerStats|main<!--
-->|ИМЯ<!--
-->|achievements = no
|main_table = yes
|sortable = no
|medals = yes
|matches_list = no
|matches_link = Достижения, рекорды и список матчей
|navboxes = yes
|СГ =
|Год =
|Качество =
}}
А на подстранице заполнить так:
{{#invoke:PlayerStats|main<!--
-->|ИМЯ<!--
-->|achievements = yes
|main_table = no
|matches_list = yes
|navboxes = no
}}
Архитектура системы
Система разделена на независимые слои, как в классическом MVC (Model-View-Controller).
- Слой 1
- Базы Данных (Data)
- Module:Data/2006 ... Module:Data/2046: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти).
- Module:Data/Teams: Справочник команд (коды, полные названия, падежи).
- Слой 2
- Настройки и Правила (Config)
- Module:Config: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча).
- Слой 3
- Вычислительные движки (Engines)
- Module:StatEngine/Pure (Харвестер): Математик. Берет сырые базы и перемалывает их в готовую статистику (голы, мега-трики, матчи на ноль). Ничего не знает про интерфейс.
- Module:StatEngine/TournamentAwards: Логика судейства (кто получил Башмак, кто MVP игрового дня, как разрешать равенство очков).
- Module:Megarating: Сложный калькулятор мегарейтинга по формулам ЧТМ (награждение очками, тайбрейкеры).
- Слой 4
- Контроллер (PlayerStats)
Сам Module:PlayerStats. Его задачи по порядку:
- Подгрузить все БД.
- Прогнать всё через Харвестер и получить
GrandStats. - Применить ручные добавки из
Config.award_adjustments. - Сделать линейный проход по плоскому списку матчей
flat_matchesдля расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощьюStreaksCore. - Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей).
- Отдать готовые данные на отрисовку.
- Слой 5
- Интерфейс (UI View)
- Module:PlayerAchievements: Строит маркированные списки текстовых достижений и рекордов.
- Module:Автоматическая статистика: Рисует таблицу по годам и сворачиваемый список матчей.
Инструкция по поддержке и обслуживанию
Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях.
Как добавить новый турнир (например, ЧТМ-2050):
- Создайте модуль
Module:Data/2050и заливайте туда матчи. - Откройте
Module:Config:- Добавьте
2050вConfig.yearsиConfig.all_years. - Если турнир не закончен, поставьте
Config.is_latest_finished = false. Как только сыгран финал — меняйте наtrue. - Пропишите чемпионов в
Config.champions_teamsиConfig.champions_players(когда они станут известны).
- Добавьте
- ВСЁ. Система автоматически начнет считать статистику 2050 года, добавит новые колонки в таблицы и обновит все медали и мегарейтинг.
Как скорректировать статистику (например, забытые голы или полезность):
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:
- Зайдите в
Module:Config. - В массиве
Config.metricsнайдите нужный показатель (например,clearancesилиhead_goals). - Добавьте игрока в секцию
adjustments -> players:
["clearances"] = {
start = 2022,
get_val = function(stats) return stats.clearances end,
adjustments = {
players = {
["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году
}
}
}
Модуль PlayerStats сам подхватит эти цифры, плюсанет их в общую историю и в конкретный год.
Что делать, если появляется новый показатель?
Если в 2050 году вы решите считать, например, «Голы с центра поля»:
- В
StatEngine/Pureвcreate_empty_statsдобавьте полеcenter_goals = 0. - Там же в
extract_goalsпропишитеif goal.goal_type == "с центра" then p.goals.center_goals = ... end. - В
ConfigвConfig.metricsсоздайте словарь["center_goals"]. - В
Module:Автоматическая статистикадобавьте строчку вp.row_defs.