SSE: не рассылать ratings на правки без влияния на рейтинг; событие group при смене настроек группы
- notify.match_changed получил флаг ratings: фото (игрок и админ) его не шлют, правка
партии — только если изменились входы рейтинга (match_service.rating_inputs до/после).
- PATCH /api/groups/{id} публикует group — переименование и правило 9 раундов видны
остальным участникам сразу.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -479,6 +479,27 @@ def assert_can_modify(session: Session, match: Match, user: User) -> None:
|
||||
raise ForbiddenError("Недостаточно прав для изменения партии.")
|
||||
|
||||
|
||||
def rating_inputs(session: Session, match: Match) -> tuple:
|
||||
"""Снимок всего, что из партии читает рейтинг (stats_service.load_history): порядок
|
||||
в истории, итоги и места. Сравнение снимков до и после правки показывает, сдвинула ли
|
||||
она рейтинг, — комментарий или фото его не трогают."""
|
||||
seats = session.exec(
|
||||
select(MatchParticipant).where(MatchParticipant.match_id == match.id)
|
||||
).all()
|
||||
return (
|
||||
match.status,
|
||||
match.played_at,
|
||||
match.finished_at,
|
||||
match.win_reason,
|
||||
match.end_round,
|
||||
match.nine_rounds_rule,
|
||||
sorted(
|
||||
(p.user_id, p.faction_id, p.place, p.eliminated, p.objectives, p.worlds)
|
||||
for p in seats
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def update_match(
|
||||
session: Session,
|
||||
match: Match,
|
||||
|
||||
@@ -32,12 +32,15 @@ def _ratings_changed(session: Session, notified: list[int]) -> None:
|
||||
hub.publish(ids, {"type": "ratings"})
|
||||
|
||||
|
||||
def match_changed(session: Session, match: Match) -> None:
|
||||
def match_changed(session: Session, match: Match, *, ratings: bool = True) -> None:
|
||||
"""Партия изменилась — уведомить всех участников её группы, а если она завершена —
|
||||
и остальных игроков (_ratings_changed)."""
|
||||
и остальных игроков (_ratings_changed).
|
||||
|
||||
ratings=False — правка, которая рейтинг не двигает (фото, комментарий): тогда
|
||||
остальным игрокам незачем перезапрашивать все рейтинговые витрины."""
|
||||
members = _group_member_ids(session, match.group_id)
|
||||
hub.publish(members, {"type": "match", "match_id": match.id, "group_id": match.group_id})
|
||||
if match.status == "finished":
|
||||
if ratings and match.status == "finished":
|
||||
_ratings_changed(session, members)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user