Общий рейтинг (#80): живое обновление не доходит до тех, кого партия затронула #88

Closed
opened 2026-09-18 23:21:03 +03:00 by Agent · 0 comments
Collaborator

Проблема

С #80 рейтинг у игрока один на всё приложение, и он — функция упорядоченной истории. Любое завершение, правка или удаление партии меняет:

  • общий топ и главную — у всех;
  • рейтинг, а в истории rating_delta — у всех, кто играл после этой партии (правка прошлой партии пересчитывает всё после неё);
  • рейтинг игроков на страницах других групп, где они состоят.

SSE-инвалидация спроектирована под старый групповой рейтинг:

  • notify.match_changed / match_removed (backend/app/services/notify.py:30-69) шлют событие только участникам группы партии;
  • useServerEvents.ts:58-67 инвалидирует историю и профиль только участников этой партии; страницы групп — только группы партии.

Комментарий там же «Общее меняется от любой партии: рейтинг глобальный» верен, но до игроков вне группы событие не доходит вовсе.

Сценарий

  1. Игрок X состоит в группах A и B. У зрителя Z (только в B) открыта страница группы B или общий топ.
  2. В группе A завершают партию с X.
  3. У Z рейтинг X не обновляется, пока вкладка не получит фокус или не будет открыта заново. Так же не обновляется история и профиль Y, сыгравшего после правленой партии.

Данные не портятся — отстаёт только живое обновление.

Что сделать

  • Событие о партии отправлять всем активным игрокам (как announcements_changed), а не только группе.
  • На фронте по событию match инвалидировать рейтинговые витрины целиком: топ, главную, свою статистику, все истории, профили и статистику групп. TanStack Query перезапрашивает только смонтированные запросы, остальные лишь помечает устаревшими, так что широкая инвалидация дешёвая.
  • Тест на адресатов события.

Обнаружено при работе над #82.

## Проблема С #80 рейтинг у игрока один на всё приложение, и он — функция упорядоченной истории. Любое завершение, правка или удаление партии меняет: - общий топ и главную — у всех; - рейтинг, а в истории `rating_delta` — у всех, кто играл **после** этой партии (правка прошлой партии пересчитывает всё после неё); - рейтинг игроков на страницах **других** групп, где они состоят. SSE-инвалидация спроектирована под старый групповой рейтинг: - `notify.match_changed` / `match_removed` (`backend/app/services/notify.py:30-69`) шлют событие только участникам группы партии; - `useServerEvents.ts:58-67` инвалидирует историю и профиль только участников этой партии; страницы групп — только группы партии. Комментарий там же «Общее меняется от любой партии: рейтинг глобальный» верен, но до игроков вне группы событие не доходит вовсе. ## Сценарий 1. Игрок X состоит в группах A и B. У зрителя Z (только в B) открыта страница группы B или общий топ. 2. В группе A завершают партию с X. 3. У Z рейтинг X не обновляется, пока вкладка не получит фокус или не будет открыта заново. Так же не обновляется история и профиль Y, сыгравшего после правленой партии. Данные не портятся — отстаёт только живое обновление. ## Что сделать - [ ] Событие о партии отправлять всем активным игрокам (как `announcements_changed`), а не только группе. - [ ] На фронте по событию `match` инвалидировать рейтинговые витрины целиком: топ, главную, свою статистику, все истории, профили и статистику групп. TanStack Query перезапрашивает только **смонтированные** запросы, остальные лишь помечает устаревшими, так что широкая инвалидация дешёвая. - [ ] Тест на адресатов события. Обнаружено при работе над #82.
Agent added this to the v1.5 — изменение системы подсчёта рейтинга milestone 2026-09-18 23:21:03 +03:00
Agent added the Kind/Bug
Reviewed
Confirmed
1
labels 2026-09-18 23:21:13 +03:00
Agent added the
Status
In Review
label 2026-09-18 23:30:11 +03:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: NotBigGhost/ForbiddenStarsApp#88