From 7f20cb3bf971b2dce64ffeee2e5ce490cc815221 Mon Sep 17 00:00:00 2001 From: DEV-bot Date: Tue, 17 Mar 2026 10:13:41 +0000 Subject: [PATCH] refactor(gameplay): move scoreboard phase events into cartridge payloads --- fupogfakta/payloads.py | 25 ++++++++++++++++++++++--- lobby/tests.py | 2 ++ lobby/views.py | 15 ++++++++------- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/fupogfakta/payloads.py b/fupogfakta/payloads.py index ee13fe8..be5f386 100644 --- a/fupogfakta/payloads.py +++ b/fupogfakta/payloads.py @@ -102,15 +102,34 @@ def build_start_next_round_response( } -def build_finish_game_response(session: GameSession) -> dict: +def build_start_next_round_phase_event( + session: GameSession, + round_config: RoundConfig, + round_question: RoundQuestion, +) -> dict: + return { + "name": "phase.lie_started", + "payload": build_lie_started_payload(session, round_config, round_question), + } + + +def build_finish_game_phase_event(session: GameSession) -> dict: leaderboard = build_leaderboard(session) winner = leaderboard[0] if leaderboard else None + return { + "name": "phase.game_over", + "payload": {"winner": winner, "leaderboard": leaderboard}, + } + + +def build_finish_game_response(session: GameSession) -> dict: + finish_event = build_finish_game_phase_event(session) return { "session": { "code": session.code, "status": GameSession.Status.FINISHED, "current_round": session.current_round, }, - "winner": winner, - "leaderboard": leaderboard, + "winner": finish_event["payload"]["winner"], + "leaderboard": finish_event["payload"]["leaderboard"], } diff --git a/lobby/tests.py b/lobby/tests.py index 4df512f..2d0c22c 100644 --- a/lobby/tests.py +++ b/lobby/tests.py @@ -36,7 +36,9 @@ class LobbyGameplayExtractionTests(TestCase): self.assertIs(lobby_views._resolve_scores, gameplay_services.resolve_scores) self.assertIs(lobby_views._start_next_round, gameplay_services.start_next_round) self.assertIs(lobby_views._finish_game, gameplay_services.finish_game) + self.assertIs(lobby_views._build_start_next_round_phase_event, gameplay_payloads.build_start_next_round_phase_event) self.assertIs(lobby_views._build_start_next_round_response, gameplay_payloads.build_start_next_round_response) + self.assertIs(lobby_views._build_finish_game_phase_event, gameplay_payloads.build_finish_game_phase_event) self.assertIs(lobby_views._build_finish_game_response, gameplay_payloads.build_finish_game_response) diff --git a/lobby/views.py b/lobby/views.py index 2b87b62..b20afd5 100644 --- a/lobby/views.py +++ b/lobby/views.py @@ -10,10 +10,12 @@ from django.views.decorators.http import require_GET, require_POST from fupogfakta.models import Category, GameSession, Guess, LieAnswer, Player, Question, RoundConfig, RoundQuestion, ScoreEvent from fupogfakta.payloads import ( + build_finish_game_phase_event as _build_finish_game_phase_event, build_finish_game_response as _build_finish_game_response, build_leaderboard as _build_leaderboard, build_lie_started_payload as _build_lie_started_payload, build_reveal_payload as _build_reveal_payload, + build_start_next_round_phase_event as _build_start_next_round_phase_event, build_start_next_round_response as _build_start_next_round_response, ) from fupogfakta.services import ( @@ -928,15 +930,15 @@ def start_next_round(request: HttpRequest, code: str) -> JsonResponse: return api_error(request, code=str(exc), status=400) if transition.should_broadcast: - lie_started_payload = _build_lie_started_payload( + phase_event = _build_start_next_round_phase_event( transition.session, transition.round_config, transition.round_question, ) sync_broadcast_phase_event( transition.session.code, - "phase.lie_started", - lie_started_payload, + phase_event["name"], + phase_event["payload"], ) return JsonResponse( @@ -966,12 +968,11 @@ def finish_game(request: HttpRequest, code: str) -> JsonResponse: return api_error(request, code=str(exc), status=400) if transition.should_broadcast: - leaderboard = _build_leaderboard(transition.session) - winner = leaderboard[0] if leaderboard else None + phase_event = _build_finish_game_phase_event(transition.session) sync_broadcast_phase_event( transition.session.code, - "phase.game_over", - {"winner": winner, "leaderboard": list(leaderboard)}, + phase_event["name"], + phase_event["payload"], ) return JsonResponse(_build_finish_game_response(transition.session))