Модуль:PlayerStats/doc: различия между версиями
Нет описания правки |
Lord (обсуждение | вклад) Нет описания правки |
||
| (не показаны 4 промежуточные версии 2 участников) | |||
| Строка 1: | Строка 1: | ||
{{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}</includeonly> | {{Doc/begin|{{FULLPAGENAME}}}}{{Docpage}}<includeonly>{{Docpage/для модулей}}{{OnLuaCronJson}}''Пожалуйста, добавляйте категории на страницу [[/doc|документации]]''.</includeonly> | ||
== Общее описание == | == Общее описание == | ||
<markdown>**Module:PlayerStats** — это центральный фронтенд-контроллер для генерации полной личной страницы игрока ЧТМ. Модуль мгновенно выводит абсолютно всю статистику по игроку за все годы, достижения, рекорды, мегарейтинг, медали, навигационные шаблоны и хронологию матчей. | |||
Главное достижение системы — | **Главное достижение системы — архитектура глобального JSON-кэширования.** </markdown> | ||
Модуль больше не занимается тяжелыми математическими вычислениями и не перебирает базы данных на лету. Вместо этого он за долю секунды читает предварительно сгенерированный и сжатый текстовый файл <code>[[Module:Data/GrandStats.json]]</code>.Это позволило снизить потребление оперативной памяти сервером в 6 раз, а скорость загрузки страниц увеличить в десятки раз. | |||
== Использование == | == Использование == | ||
<markdown>На странице игрока (например, Диман) модуль вызывается через шаблон (или напрямую через `#invoke`):</markdown> | |||
<syntaxhighlight lang="mediawiki" line> | |||
<syntaxhighlight lang=" | |||
{{#invoke:PlayerStats|main|Диман}} | {{#invoke:PlayerStats|main|Диман}} | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Или с указанием параметров: | <markdown>Или с указанием всех тонких параметров:</markdown> | ||
<syntaxhighlight lang=" | <syntaxhighlight lang="mediawiki" line> | ||
{{#invoke:PlayerStats|main|Диман|achievements = yes|main_table = yes|matches_list = yes|navboxes = 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> | Для удобства навигации (и чтобы не перегружать страницу визуально) рекомендуется выносить рекорды, достижения и полный список матчей ветеранов турнира на отдельную подстраницу. | ||
Заполняйте шаблон **основной статьи** так:</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> | |||
<markdown>А на **подстранице** (например, `/Достижения, рекорды и список матчей`) заполните так:</markdown> | |||
<syntaxhighlight lang="mediawiki" line> | |||
{{#invoke:PlayerStats|main<!-- | |||
-->|ИМЯ<!-- | |||
-->|achievements = yes | |||
|main_table = no | |||
|matches_list = yes | |||
|navboxes = no | |||
}} | |||
</syntaxhighlight> | |||
== Архитектура системы (MVC + Cache) == | |||
<markdown>Система разделена на независимые слои для обеспечения максимальной производительности: | |||
### Слой 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:Автоматическая статистика`: Рисует таблицу по годам и сворачиваемый список матчей.</markdown> | |||
== Инструкция по поддержке и обслуживанию == | == Инструкция по поддержке и обслуживанию == | ||
Поскольку | <markdown>⚠️ **ГЛАВНОЕ ПРАВИЛО НОВОЙ АРХИТЕКТУРЫ:** | ||
Поскольку `PlayerStats` берет данные из закэшированного файла, **любое изменение в базах данных (добавили гол) или в конфигах (изменили эпоху) требует ручного перевыпуска кэша!** Без этого страницы игроков не увидят изменений. | |||
### 🔄 Как обновить кэш (Пересчитать всю вики) | |||
Если вы сыграли новый игровой день или исправили ошибку в старом матче: | |||
1. Перейдите на служебную страницу **Служебная:Развёртка_шаблонов** (`Special:ExpandTemplates`). | |||
2. В верхнее окно вставьте код: `{{#invoke:Cron/GenerateStats|main}}` | |||
3. Нажмите «ОК». | |||
4. В нижнем окне появится огромный текстовый массив (начинается с `{"Players":{...`). Скопируйте его целиком. | |||
5. Откройте на редактирование `Module:Data/GrandStats.json`. | |||
6. Удалите старый текст, вставьте новый и сохраните. Страницы всех игроков мгновенно обновятся! | |||
### ➕ Как добавить новый турнир (например, ЧТМ-2050) | |||
1. Создайте | 1. Создайте `Module:Data/2050` и залейте туда матчи. | ||
2. Откройте | 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. ** | 3. **Обновите кэш** (см. инструкцию выше). | ||
### Как скорректировать статистику ( | ### 🛠 Как скорректировать статистику (ручные добавки) | ||
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код: | Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код: | ||
1. Зайдите в | 1. Зайдите в `Module:Config`. | ||
2. В массиве `Config.metrics` найдите нужный показатель (например, `clearances | 2. В массиве `Config.metrics` найдите нужный показатель (например, `clearances`). | ||
3. Добавьте игрока в секцию `adjustments -> players`:</markdown> | 3. Добавьте игрока в секцию `adjustments -> players`:</markdown> | ||
| Строка 88: | Строка 129: | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<markdown> | <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`. | 4. В `Module:Автоматическая статистика` добавьте строчку в `p.row_defs`. | ||
5. **Обновите кэш**. Колонка автоматически появится во всех таблицах, а лучший по этому показателю получит медаль.</markdown> | |||
{{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 берет данные из закэшированного файла, любое изменение в базах данных (добавили гол) или в конфигах (изменили эпоху) требует ручного перевыпуска кэша! Без этого страницы игроков не увидят изменений.
🔄 Как обновить кэш (Пересчитать всю вики)
Если вы сыграли новый игровой день или исправили ошибку в старом матче:
- Перейдите на служебную страницу Служебная:Развёртка_шаблонов (
Special:ExpandTemplates). - В верхнее окно вставьте код:
{{#invoke:Cron/GenerateStats|main}} - Нажмите «ОК».
- В нижнем окне появится огромный текстовый массив (начинается с
{"Players":{...). Скопируйте его целиком. - Откройте на редактирование
Module:Data/GrandStats.json. - Удалите старый текст, вставьте новый и сохраните. Страницы всех игроков мгновенно обновятся!
➕ Как добавить новый турнир (например, ЧТМ-2050)
- Создайте
Module:Data/2050и залейте туда матчи. - Откройте
Module:Config:- Добавьте
2050вConfig.yearsиConfig.all_years. - Если турнир не закончен, поставьте
Config.is_latest_finished = false. Как только сыгран финал — меняйте наtrue. - Пропишите чемпионов в
Config.champions_teamsиConfig.champions_players(когда они станут известны).
- Добавьте
- Обновите кэш (см. инструкцию выше).
🛠 Как скорректировать статистику (ручные добавки)
Иногда история ЧТМ требует ручного вмешательства (матчи без протоколов, технические решения). Для этого не нужно ломать код:
- Зайдите в
Module:Config. - В массиве
Config.metricsнайдите нужный показатель (например,clearances). - Добавьте игрока в секцию
adjustments -> players:
["clearances"] = {
start = 2022,
get_val = function(stats) return stats.clearances end,
adjustments = {
players = {
["Имя_Игрока"] = { [2050] = 5 }, -- Добавит 5 выносов в 2050 году
}
}
}
- Обновите кэш (см. инструкцию выше). Система сама плюсанёт эти цифры в общую историю и в конкретный год.
📈 Что делать, если появляется совершенно новый показатель?
Если в 2050 году вы решите считать, например, «Голы с центра поля»:
- В
Module:StatEngine/Pureв функцииcreate_empty_statsдобавьте полеcenter_goals = 0. - Там же в
extract_goalsпропишите условие:if goal.goal_type == "с центра" then p.goals.center_goals = ... end. - В
Module:ConfigвConfig.metricsсоздайте словарь["center_goals"]. - В
Module:Автоматическая статистикадобавьте строчку вp.row_defs. - Обновите кэш. Колонка автоматически появится во всех таблицах, а лучший по этому показателю получит медаль.