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

Материал из ЧТМ
Перейти к навигации Перейти к поиску
Нет описания правки
Нет описания правки
 
(не показаны 4 промежуточные версии 2 участников)
Строка 1: Строка 1:
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly>
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}{{OnLuaCronJson}}''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>


== Общее описание ==
== Общее описание ==
[[Module:PlayerStats]] — это центральный контроллер (точка входа) для генерации полной личной страницы игрока [[ЧТМ]]. Модуль собирает абсолютно всю статистику по игроку за все годы, высчитывает достижения, [[Индивидуальные рекорды ЧТМ|рекорды]], [[мегарейтинг]], медали, строит навигационные шаблоны и хронологию матчей.
<markdown>**Module:PlayerStats** — это центральный фронтенд-контроллер для генерации полной личной страницы игрока ЧТМ. Модуль мгновенно выводит абсолютно всю статистику по игроку за все годы, достижения, рекорды, мегарейтинг, медали, навигационные шаблоны и хронологию матчей.


Главное достижение системы — скорость работы. Вместо того чтобы каждый блок (таблицы, медали, рекорды) заново перебирал базу данных, система делает один-единственный проход по [[Модуль:Data|базам данных]] всех лет через движок {{Модуль|StatEngine/Pure}} (Харвестер). Все данные кэшируются в гигантский словарь <code>GrandStats</code>, откуда интерфейсные модули мгновенно забирают нужные цифры.
**Главное достижение системы — архитектура глобального JSON-кэширования.** </markdown>
Модуль больше не занимается тяжелыми математическими вычислениями и не перебирает базы данных на лету. Вместо этого он за долю секунды читает предварительно сгенерированный и сжатый текстовый файл <code>[[Module:Data/GrandStats.json]]</code>.Это позволило снизить потребление оперативной памяти сервером в 6 раз, а скорость загрузки страниц увеличить в десятки раз.


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


На странице игрока (например, [[Диман]]) модуль вызывается через шаблон (или напрямую через <code>#invoke</code>):
<syntaxhighlight lang="mediawiki" line>
 
<syntaxhighlight lang="wikitext" line>
{{#invoke:PlayerStats|main|Диман}}
{{#invoke:PlayerStats|main|Диман}}
</syntaxhighlight>
</syntaxhighlight>


Или с указанием параметров:
<markdown>Или с указанием всех тонких параметров:</markdown>


<syntaxhighlight lang="wikitext" line>
<syntaxhighlight lang="mediawiki" line>
{{#invoke:PlayerStats|main|Диман|achievements = yes|main_table = yes|matches_list = yes|navboxes = yes|medals = yes}}
{{#invoke:PlayerStats|main<!-- Запуск модуля
-->|Диман<!-- Имя игрока, обязательный параметр, НЕ ПЕРЕНОСИТЕ СТРОКУ ПОСЛЕ ИМЕНИ, если нужен визуальный перенос, то используйте комментарии, как в этом примере<!--
-->|achievements=yes<!-- Вычислять и показывать ли блок «Достижения и Рекорды» (по умолчанию-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=yes<!-- Отключает расчёт и вывод таблицы статистики (по умолчанию — yes)
-->|sortable=no<!-- Отключает сортировку таблицы статистики, делая её более компактной (по умолчанию — no)
-->|medals=yes<!-- Показывать ли медали в таблице статистики (по умолчанию — no)
-->|matches_list=no<!-- Отключает расчёт и вывод полного списка матчей (по умолчанию — yes)
-->|matches_link=<!-- В случае отключения списка матчей необходимо задать ссылку на подстраницу.
-->|navboxes=yes<!-- Отключает расчёт и вывод навигационных шаблонов (по умолчанию — yes)
-->|СГ=1<!-- Если статья заняла какое-то место в голосовании за статью года, то оно указывается
-->|Год=2020<!-- Год, когда происходило голосование
-->|Качество=ИС<!-- Избранная (ИС) или хорошая (ХС) статья
-->}}
</syntaxhighlight>
</syntaxhighlight>


=== Параметры вызова ===
<markdown>## Оптимизация (Разделение контента)
<markdown>*  `1` **(Обязательный)**: Точное имя игрока так, как оно записано в базах данных (например, `Диман`, `Диман Е.`, `Макс`).
Для удобства навигации чтобы не перегружать страницу визуально) рекомендуется выносить рекорды, достижения и полный список матчей ветеранов турнира на отдельную подстраницу.
*  `achievements`: Вычислять и показывать ли блок «Достижения и Рекорды»? (`yes` / `no`, по умолчанию `yes`).
 
*  `ach_list`: Если `achievements=no`, то показать только блок достижений: `ach_list=yes`. Если `achievements=yes`, то не показывать блок достижений: `ach_list=no`.
Заполняйте шаблон **основной статьи** так:</markdown>
*  `records_list`: Если `achievements=no`, то показать только блок рекордов: `records_list=yes`. Если `achievements=yes`, то не показывать блок рекордов: `records_list=no`.
*  `main_table`: Показывать ли главную сводную таблицу статистики? (`yes` / `no`, по умолчанию `yes`).
*  `matches_list`: Показывать ли хронологический список всех матчей игрока начиная с ЧТМ-2022? (`yes` / `no`, по умолчанию `yes`).
*  `matches_link`: Если `matches_list=no`, то необходимо дать ссылку на страницу, где будет размещаться полный список матчей.
*   `navboxes`: Генерировать ли навигационные шаблоны (Чемпионские списки, Клуб 100, призы)? (`yes` / `no`, по умолчанию `yes`).
*   `medals`: Раскрашивать ли ячейки в таблице статистики (золото, серебро, бронза, дерево) за лидерство в конкретном году и историческом зачёте? (`yes` / `no`, по умолчанию `no`).</markdown>


== Архитектура системы ==
<syntaxhighlight lang="mediawiki" line>
== Достижения и рекорды ==
{{ОС|Достижения, рекорды и список матчей}}.
{{#invoke:PlayerStats|main<!--
-->|ИМЯ<!--
-->|achievements = no
  |main_table  = yes
  |sortable    = no
  |medals      = yes
  |matches_list = no
  |matches_link = Достижения, рекорды и список матчей
  |navboxes    = yes
}}
</syntaxhighlight>


Система разделена на независимые слои, как в классическом MVC (Model-View-Controller).
<markdown>А на **подстранице** (например, `/Достижения, рекорды и список матчей`) заполните так:</markdown>


; Слой 1: Базы Данных (Data)
<syntaxhighlight lang="mediawiki" line>
*   [[Module:Data/2006]] ... [[Module:Data/2046]]: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти).
{{#invoke:PlayerStats|main<!--
*  [[Module:Data/Teams]]: Справочник команд (коды, полные названия, падежи).
-->|ИМЯ<!--
-->|achievements = yes
  |main_table   = no
  |matches_list = yes
  |navboxes    = no
}}
</syntaxhighlight>


; Слой 2: Настройки и Правила (Config)
== Архитектура системы (MVC + Cache) ==
*  [[Module:Config]]: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча).
<markdown>Система разделена на независимые слои для обеспечения максимальной производительности:


; Слой 3: Вычислительные движки (Engines)
### Слой 1: Базы Данных (Data)
*   [[Module:StatEngine/Pure]] (Харвестер): Математик. Берет сырые базы и перемалывает их в готовую статистику (голы, мега-трики, матчи на ноль). Ничего не знает про интерфейс.
* `Module:Data/2006` ... `Module:Data/2046`: Сырые массивы матчей. Никакой логики, только факты (кто играл, кто забил, минуты, пенальти).
*  [[Module:StatEngine/TournamentAwards]]: Логика судейства (кто получил [[Башмак]], кто [[MVP игрового дня]], как разрешать равенство очков).
* `Module:Data/Teams`: Справочник команд (коды, полные названия, падежи).
*   [[Module:Megarating]]: Сложный калькулятор [[мегарейтинг]]а по формулам ЧТМ (награждение очками, тайбрейкеры).


; Слой 4: Контроллер (PlayerStats)
### Слой 2: Настройки и Правила (Config)
Сам [[Module:PlayerStats]]. Его задачи по порядку:
* `Module:Config`: Мозг проекта. Здесь лежат списки годов, массивы чемпионов, цвета для таблиц, параметры эпох (с какого года считается статистика), а также «Костыли» (ручные корректировки вроде +11 к полезности для отдельного матча).
# Подгрузить все БД.
# Прогнать всё через Харвестер и получить <code>GrandStats</code>.
# Применить ручные добавки из <code>Config.award_adjustments</code>.
# Сделать линейный проход по плоскому списку матчей <code>flat_matches</code> для расчёта последовательностей (серии побед, паузы между матчами, сухие серии) с помощью <code>StreaksCore</code>.
# Посчитать медали по годам (учитывая лимиты: минимум 20 матчей в поле или 5 в воротах для средних показателей).
# Отдать готовые данные на отрисовку.


; Слой 5: Интерфейс (UI View)
### Слой 3: Вычислительные движки (Engines)
*   [[Module:PlayerAchievements]]: Строит маркированные списки текстовых достижений и рекордов.
* `Module:StatEngine/Pure` (Харвестер): Математик. Берет сырые базы и перемалывает их в готовую статистику.
*   [[Module:Автоматическая статистика]]: Рисует таблицу по годам и сворачиваемый список матчей.
* `Module:StatEngine/TournamentAwards`: Логика судейства (кто получил Башмак, кто MVP игрового дня, как разрешать равенство очков).
* `Module:Megarating`: Сложный калькулятор мегарейтинга по формулам ЧТМ.
* `Module:StatEngine/StreaksCore`: Анализатор серий (сухие серии, победные серии, матчи подряд).
 
### Слой 4: Генератор и Кэш (Backend)
* `Module:Cron/GenerateStats`: **Тяжеловоз.** Вызывается только вручную администратором. Загружает БД, прогоняет через все движки и собирает `GrandStats` и глобальные рекорды. Сжимает результат в текст формата JSON.
* `Module:Data/GrandStats.json`: **Тетрадка бухгалтера.** Обычная текстовая страница, хранящая итог работы генератора. Именно её читают страницы игроков.
 
### Слой 5: Интерфейс (Frontend)
* `Module:PlayerStats`: Роутер. Быстро считывает нужный кусок из `GrandStats.json` и раздает данные отрисовщикам.
* `Module:PlayerAchievements`: Строит маркированные списки текстовых достижений и рекордов.
* `Module:Автоматическая статистика`: Рисует таблицу по годам и сворачиваемый список матчей.</markdown>


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


Поскольку система написана модульно, вам почти никогда не придется лезть в математику (`StatEngine`) или в контроллер (`PlayerStats`). Все изменения делаются в конфигурациях.
<markdown>⚠️ **ГЛАВНОЕ ПРАВИЛО НОВОЙ АРХИТЕКТУРЫ:**
Поскольку `PlayerStats` берет данные из закэшированного файла, **любое изменение в базах данных (добавили гол) или в конфигах (изменили эпоху) требует ручного перевыпуска кэша!** Без этого страницы игроков не увидят изменений.
 
### 🔄 Как обновить кэш (Пересчитать всю вики)
Если вы сыграли новый игровой день или исправили ошибку в старом матче:
1. Перейдите на служебную страницу **Служебная:Развёртка_шаблонов** (`Special:ExpandTemplates`).
2. В верхнее окно вставьте код: `{{#invoke:Cron/GenerateStats|main}}`
3. Нажмите «ОК».
4. В нижнем окне появится огромный текстовый массив (начинается с `{"Players":{...`). Скопируйте его целиком.
5. Откройте на редактирование `Module:Data/GrandStats.json`.
6. Удалите старый текст, вставьте новый и сохраните. Страницы всех игроков мгновенно обновятся!


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


### Как скорректировать статистику (например, забытые голы или полезность):
### 🛠 Как скорректировать статистику (ручные добавки)
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:
1. Зайдите в **`Module:Config`**.
1. Зайдите в `Module:Config`.
2. В массиве `Config.metrics` найдите нужный показатель (например, `clearances` или `head_goals`).
2. В массиве `Config.metrics` найдите нужный показатель (например, `clearances`).
3. Добавьте игрока в секцию `adjustments -> players`:</markdown>
3. Добавьте игрока в секцию `adjustments -> players`:</markdown>


Строка 88: Строка 129:
       }
       }
   }
   }
 
</syntaxhighlight>
</syntaxhighlight>


<markdown>Модуль `PlayerStats` сам подхватит эти цифры, плюсанет их в общую историю и в конкретный год.
<markdown>4. **Обновите кэш** (см. инструкцию выше). Система сама плюсанёт эти цифры в общую историю и в конкретный год.


### Что делать, если появляется новый показатель?
### 📈 Что делать, если появляется совершенно новый показатель?
Если в 2050 году вы решите считать, например, «Голы с центра поля»:
Если в 2050 году вы решите считать, например, «Голы с центра поля»:
1. В `StatEngine/Pure` в `create_empty_stats` добавьте поле `center_goals = 0`.
1. В `Module:StatEngine/Pure` в функции `create_empty_stats` добавьте поле `center_goals = 0`.
2. Там же в `extract_goals` пропишите `if goal.goal_type == "с центра" then p.goals.center_goals = ... end`.
2. Там же в `extract_goals` пропишите условие: `if goal.goal_type == "с центра" then p.goals.center_goals = ... end`.
3. В `Config` в `Config.metrics` создайте словарь `["center_goals"]`.
3. В `Module:Config` в `Config.metrics` создайте словарь `["center_goals"]`.
4. В `Module:Автоматическая статистика` добавьте строчку в `p.row_defs`.</markdown>
4. В `Module:Автоматическая статистика` добавьте строчку в `p.row_defs`.
----
5. **Обновите кэш**. Колонка автоматически появится во всех таблицах, а лучший по этому показателю получит медаль.</markdown>
<includeonly>''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly>{{Doc/end}}
{{Doc/end}}

Текущая версия от 00:50, 5 июня 2026

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

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

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

Главное достижение системы — архитектура глобального JSON-кэширования.

Модуль больше не занимается тяжелыми математическими вычислениями и не перебирает базы данных на лету. Вместо этого он за долю секунды читает предварительно сгенерированный и сжатый текстовый файл Module:Data/GrandStats.json.Это позволило снизить потребление оперативной памяти сервером в 6 раз, а скорость загрузки страниц увеличить в десятки раз.

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

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

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

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

{{#invoke:PlayerStats|main<!-- Запуск модуля
-->|Диман<!-- Имя игрока, обязательный параметр, НЕ ПЕРЕНОСИТЕ СТРОКУ ПОСЛЕ ИМЕНИ, если нужен визуальный перенос, то используйте комментарии, как в этом примере<!-- 
-->|achievements=yes<!-- Вычислять и показывать ли блок «Достижения и Рекорды» (по умолчанию-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=yes<!-- Отключает расчёт и вывод таблицы статистики (по умолчанию — yes)
-->|sortable=no<!-- Отключает сортировку таблицы статистики, делая её более компактной (по умолчанию — no)
-->|medals=yes<!-- Показывать ли медали в таблице статистики (по умолчанию — no)
-->|matches_list=no<!-- Отключает расчёт и вывод полного списка матчей (по умолчанию — yes)
-->|matches_link=<!-- В случае отключения списка матчей необходимо задать ссылку на подстраницу.
-->|navboxes=yes<!-- Отключает расчёт и вывод навигационных шаблонов (по умолчанию — 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 + Cache)

Система разделена на независимые слои для обеспечения максимальной производительности:

Слой 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: Сложный калькулятор мегарейтинга по формулам ЧТМ.
  • Module:StatEngine/StreaksCore: Анализатор серий (сухие серии, победные серии, матчи подряд).

Слой 4: Генератор и Кэш (Backend)

  • Module:Cron/GenerateStats: Тяжеловоз. Вызывается только вручную администратором. Загружает БД, прогоняет через все движки и собирает GrandStats и глобальные рекорды. Сжимает результат в текст формата JSON.
  • Module:Data/GrandStats.json: Тетрадка бухгалтера. Обычная текстовая страница, хранящая итог работы генератора. Именно её читают страницы игроков.

Слой 5: Интерфейс (Frontend)

  • Module:PlayerStats: Роутер. Быстро считывает нужный кусок из GrandStats.json и раздает данные отрисовщикам.
  • Module:PlayerAchievements: Строит маркированные списки текстовых достижений и рекордов.
  • Module:Автоматическая статистика: Рисует таблицу по годам и сворачиваемый список матчей.

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

⚠️ ГЛАВНОЕ ПРАВИЛО НОВОЙ АРХИТЕКТУРЫ: Поскольку PlayerStats берет данные из закэшированного файла, любое изменение в базах данных (добавили гол) или в конфигах (изменили эпоху) требует ручного перевыпуска кэша! Без этого страницы игроков не увидят изменений.

🔄 Как обновить кэш (Пересчитать всю вики)

Если вы сыграли новый игровой день или исправили ошибку в старом матче:

  1. Перейдите на служебную страницу Служебная:Развёртка_шаблонов (Special:ExpandTemplates).
  2. В верхнее окно вставьте код: {{#invoke:Cron/GenerateStats|main}}
  3. Нажмите «ОК».
  4. В нижнем окне появится огромный текстовый массив (начинается с {"Players":{...). Скопируйте его целиком.
  5. Откройте на редактирование Module:Data/GrandStats.json.
  6. Удалите старый текст, вставьте новый и сохраните. Страницы всех игроков мгновенно обновятся!

➕ Как добавить новый турнир (например, ЧТМ-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. Обновите кэш (см. инструкцию выше).

🛠 Как скорректировать статистику (ручные добавки)

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

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

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

  1. Обновите кэш (см. инструкцию выше). Система сама плюсанёт эти цифры в общую историю и в конкретный год.

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

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

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