Модуль:PlayerStats/doc: различия между версиями

Материал из ЧТМ
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
Строка 1: Строка 1:
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly>
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly>
Здесь создаётся модуль-монстр для включения в страницы игроков.


== «Модули для модуля» ==
== Общее описание ==
* {{Модуль|PlayerAchievements}} ({{С*|global=Модуль:PlayerAchievements|Engine|Records}} [[ЧТМ:PlayerAchievements/debug|debug]])
[[Module:PlayerStats]] — это центральный контроллер (точка входа) для генерации полной личной страницы игрока [[ЧТМ]]. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, [[Индивидуальные рекорды ЧТМ|рекорды]], [[мегарейтинг]], медали, строит навигационные шаблоны и хронологию матчей.
* {{Модуль|Автоматическая статистика}} ({{С*|[[Модуль:Автоматическая статистика/тест|тест]]|[[ЧТМ:Автоматическая статистика/рефакторинг|рефакторинг]]}})
 
* [[ЧТМ:PlayerStats/Финальная сборка|Финальная сборка]]
Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по [[Модуль:Data|базам данных]] всех лет через движок {{Модуль|StatEngine/Pure}} (Харвестер). Все данные кэшируются в гигантский словарь <code>GrandStats</code>, откуда интерфейсные модули мгновенно забирают нужные цифры.
 
== Использование ==
 
На странице игрока (например, [[Диман]]) модуль вызывается через шаблон (или напрямую через <code>#invoke</code>):
 
<syntaxhighlight lang="wikitext" line>
{{#invoke:PlayerStats|main|Диман}}
</syntaxhighlight>
 
Или с указанием параметров:
 
<syntaxhighlight lang="wikitext" line>
{{#invoke:PlayerStats|main|Диман
|main_table  = yes
|achievements = yes
|matches_list = yes
|navboxes    = yes
|medals      = yes
}}
</syntaxhighlight>
 
=== Параметры вызова ===
<markdown>*  `1` или `player` или `игрок` **(Обязательный)**: Точное имя игрока так, как оно записано в базах данных (например, `Диман`, `Диман Е.`, `Макс`).
*  `main_table`: Показывать ли главную сводную таблицу статистики? (`yes` / `no`, по умолчанию `yes`).
*  `achievements`: Вычислять и показывать ли блок «Достижения и Рекорды»? (`yes` / `no`, по умолчанию `yes`).
*  `matches_list`: Показывать ли хронологический список всех матчей игрока начиная с [[ЧТМ-2022]]? (`yes` / `no`, по умолчанию `yes`).
*  `navboxes`: Генерировать ли навигационные шаблоны (Чемпионские списки, Клуб 100, призы)? (`yes` / `no`, по умолчанию `yes`).
*  `medals`: Раскрашивать ли ячейки в таблице статистики (золото, серебро, бронза, дерево) за лидерство в конкретном году и историческом зачёте? (`yes` / `no`, по умолчанию `no`).</markdown>
 
== Архитектура системы ==
 
Система разделена на независимые слои, как в классическом 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]]. Его задачи по порядку:
# Подгрузить все БД.
# Прогнать всё через Харвестер и получить <code>GrandStats</code>.
# Применить ручные добавки из <code>Config.award_adjustments</code>.
# Сделать линейный проход по плоскому списку матчей <code>flat_matches</code> для расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощью <code>StreaksCore</code>.
# Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей).
# Отдать готовые данные на отрисовку.
 
; Слой 5: Интерфейс (UI View)
*  [[Module:PlayerAchievements]]: Строит маркированные списки текстовых достижений и рекордов.
*  [[Module:Автоматическая статистика]]: Рисует таблицу по годам и сворачиваемый список матчей.
 
== Инструкция по поддержке и обслуживанию ==
 
Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях.
 
<markdown>### Как добавить новый турнир (например, ЧТМ-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`:</markdown>
 
<syntaxhighlight lang="lua" line>
  ["clearances"] = {
      start = 2022,
      get_val = function(stats) return stats.clearances end,
      adjustments = {
          players = {
              ["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году
          }
      }
  }
 
</syntaxhighlight>
 
<markdown>Модуль `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`.</markdown>
----
----
<includeonly>''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>{{Doc/end}}
<includeonly>''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>{{Doc/end}}

Версия от 05:53, 4 июня 2026

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

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

Module:PlayerStats — это центральный контроллер (точка входа) для генерации полной личной страницы игрока ЧТМ. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, рекорды, мегарейтинг, медали, строит навигационные шаблоны и хронологию матчей.

Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по базам данных всех лет через движок StatEngine/Pure (Харвестер). Все данные кэшируются в гигантский словарь GrandStats, откуда интерфейсные модули мгновенно забирают нужные цифры.

Использование

На странице игрока (например, Диман) модуль вызывается через шаблон (или напрямую через #invoke):

{{#invoke:PlayerStats|main|Диман}}

Или с указанием параметров:

{{#invoke:PlayerStats|main|Диман
|main_table   = yes
|achievements = yes
|matches_list = yes
|navboxes     = yes
|medals       = yes
}}

Параметры вызова

  • 1 или player или игрок (Обязательный): Точное имя игрока так, как оно записано в базах данных (например, Диман, Диман Е., Макс).
  • main_table: Показывать ли главную сводную таблицу статистики? (yes / no, по умолчанию yes).
  • achievements: Вычислять и показывать ли блок «Достижения и Рекорды»? (yes / no, по умолчанию yes).
  • matches_list: Показывать ли хронологический список всех матчей игрока начиная с [[ЧТМ-2022]]? (yes / no, по умолчанию yes).
  • navboxes: Генерировать ли навигационные шаблоны (Чемпионские списки, Клуб 100, призы)? (yes / no, по умолчанию yes).
  • medals: Раскрашивать ли ячейки в таблице статистики (золото, серебро, бронза, дерево) за лидерство в конкретном году и историческом зачёте? (yes / no, по умолчанию no).

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

Система разделена на независимые слои, как в классическом 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.