Модуль:PlayerStats/doc

Материал из ЧТМ
Перейти к навигации Перейти к поиску

Это страница документации Модуль:PlayerStats.

Документация Документация

Общее описание

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 = 
   |ach_list     = 
   |records_list = 
   |main_table   = 
   |sortable     = 
   |medals       = 
   |matches_list = 
   |matches_link = 
   |navboxes     = 
   |СГ           = 
   |Год          = 
   |Качество     = 
}}

Архитектура системы

Система разделена на независимые слои, как в классическом MVC (Model-View-Controller).

Слой 1
Базы Данных (Data)
  • Module:Data/2006 ... Module:Data/2046: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти).
  • Module:Data/Teams: Справочник команд (коды, полные названия, падежи).
Слой 2
Настройки и Правила (Config)
  • Module:Config: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча).
Слой 3
Вычислительные движки (Engines)
Слой 4
Контроллер (PlayerStats)

Сам Module:PlayerStats. Его задачи по порядку:

  1. Подгрузить все БД.
  2. Прогнать всё через Харвестер и получить GrandStats.
  3. Применить ручные добавки из Config.award_adjustments.
  4. Сделать линейный проход по плоскому списку матчей flat_matches для расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощью StreaksCore.
  5. Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей).
  6. Отдать готовые данные на отрисовку.
Слой 5
Интерфейс (UI View)

Инструкция по поддержке и обслуживанию

Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях.

Как добавить новый турнир (например, ЧТМ-2050):

  1. Создайте модуль Module:Data/2050 и заливайте туда матчи.
  2. Откройте Module:Config:
    • Добавьте 2050 в Config.years и Config.all_years.
    • Если турнир не закончен, поставьте Config.is_latest_finished = false. Как только сыгран финал — меняйте на true.
    • Пропишите чемпионов в Config.champions_teams и Config.champions_players (когда они станут известны).
  3. ВСЁ. Система автоматически начнет считать статистику 2050 года, добавит новые колонки в таблицы и обновит все медали и мегарейтинг.

Как скорректировать статистику (например, забытые голы или полезность):

Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:

  1. Зайдите в Module:Config.
  2. В массиве Config.metrics найдите нужный показатель (например, clearances или head_goals).
  3. Добавьте игрока в секцию adjustments -> players:

   ["clearances"] = {
       start = 2022,
       get_val = function(stats) return stats.clearances end,
       adjustments = {
           players = {
               ["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году
           }
       }
   }

Модуль PlayerStats сам подхватит эти цифры, плюсанет их в общую историю и в конкретный год.

Что делать, если появляется новый показатель?

Если в 2050 году вы решите считать, например, «Голы с центра поля»:

  1. В StatEngine/Pure в create_empty_stats добавьте поле center_goals = 0.
  2. Там же в extract_goals пропишите if goal.goal_type == "с центра" then p.goals.center_goals = ... end.
  3. В Config в Config.metrics создайте словарь ["center_goals"].
  4. В Module:Автоматическая статистика добавьте строчку в p.row_defs.