From e42966e61852e1d016c9e32ec1a03af60e91a7bd Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 8 Jan 2026 15:34:43 +0100 Subject: [PATCH] Message when everyone is verified --- assets/game1.js | 12 +++++-- src/Game/Controller/GameController.php | 14 ++++++-- src/Game/Enum/SessionSettingType.php | 1 + src/Game/Service/GameResponseService.php | 46 ++++++++++++++++++++++++ templates/game/index.html.twig | 1 + 5 files changed, 70 insertions(+), 4 deletions(-) diff --git a/assets/game1.js b/assets/game1.js index 6ec1a34..a69635a 100644 --- a/assets/game1.js +++ b/assets/game1.js @@ -4,7 +4,7 @@ import './styles/game1.css'; let sequenceFinished = false; let stillPlayingSound = true; -function subscribeToMercure(mercurePublicUrl, topic) { +function subscribeToMercure(mercurePublicUrl, topic, myScreen) { try { const url = mercurePublicUrl + '?topic=' + encodeURIComponent(topic); const es = new EventSource(url); @@ -16,6 +16,13 @@ function subscribeToMercure(mercurePublicUrl, topic) { // data is [sendTo, message] if (Array.isArray(data) && data.length >= 2) { + const sendTo = parseInt(data[0]); + // Filter: 0 means everyone, otherwise must match myScreen + if (sendTo !== 0 && sendTo !== parseInt(myScreen)) { + console.log('[Mercure][game1] Message not for this player, skipping.'); + return; + } + const messageContainer = document.getElementById('message-container'); if (messageContainer) { const msgEl = document.createElement('div'); @@ -121,11 +128,12 @@ document.addEventListener('DOMContentLoaded', async () => { const mercurePublicUrl = cfgEl.dataset.mercurePublicUrl; const topic = cfgEl.dataset.topic; + const screen = cfgEl.dataset.screen; const apiPingUrl = cfgEl.dataset.apiPingUrl; const apiEchoUrl = cfgEl.dataset.apiEchoUrl; if (mercurePublicUrl && topic) { - subscribeToMercure(mercurePublicUrl, topic); + subscribeToMercure(mercurePublicUrl, topic, screen); } else { console.warn('[Mercure][game1] Missing data attributes on #mercure-config'); } diff --git a/src/Game/Controller/GameController.php b/src/Game/Controller/GameController.php index 6c46080..6060be0 100644 --- a/src/Game/Controller/GameController.php +++ b/src/Game/Controller/GameController.php @@ -85,8 +85,18 @@ final class GameController extends AbstractController #[IsGranted(new Expression("is_granted('ROLE_PLAYER') or is_granted('ROLE_ADMIN')"))] #[IsGranted('SESSION_VIEW', subject: 'session')] public function index( - Session $session): Response + Session $session, + Security $security, + \App\Game\Repository\PlayerRepository $playerRepository + ): Response { - return $this->render('game/index.html.twig', ['session' => $session]); + $user = $security->getUser(); + $player = $playerRepository->findOneBy(['session' => $session, 'user' => $user]); + $screen = $player ? $player->getScreen() : 0; + + return $this->render('game/index.html.twig', [ + 'session' => $session, + 'screen' => $screen, + ]); } } diff --git a/src/Game/Enum/SessionSettingType.php b/src/Game/Enum/SessionSettingType.php index 66123c0..17abbdf 100644 --- a/src/Game/Enum/SessionSettingType.php +++ b/src/Game/Enum/SessionSettingType.php @@ -21,4 +21,5 @@ enum SessionSettingType: string case VERIFICATION_PROGRESS_FOR_PLAYER1 = 'VerificationProgressForPlayer1'; case VERIFICATION_PROGRESS_FOR_PLAYER2 = 'VerificationProgressForPlayer2'; case VERIFICATION_PROGRESS_FOR_PLAYER3 = 'VerificationProgressForPlayer3'; + case EVERYONE_VERIFIED = 'EveryoneVerified'; } diff --git a/src/Game/Service/GameResponseService.php b/src/Game/Service/GameResponseService.php index 2d546ff..bf33f8d 100644 --- a/src/Game/Service/GameResponseService.php +++ b/src/Game/Service/GameResponseService.php @@ -585,6 +585,52 @@ class GameResponseService $setting->setValue(json_encode($rights)); $this->entityManager->persist($setting); $this->entityManager->flush(); + + $this->checkIfAllPlayersVerified($player); + } + } + + private function checkIfAllPlayersVerified(Player $player): void + { + $session = $player->getSession(); + $everyoneVerifiedSetting = $this->sessionSettingRepository->getSetting($session, SessionSettingType::EVERYONE_VERIFIED, $player); + + if ($everyoneVerifiedSetting && $everyoneVerifiedSetting->getValue() === 'true') { + return; + } + + $allVerified = true; + foreach ([1, 2, 3] as $screen) { + $progressSettingName = match ($screen) { + 1 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER1, + 2 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER2, + 3 => SessionSettingType::VERIFICATION_PROGRESS_FOR_PLAYER3, + default => null, + }; + + $progressSetting = $this->sessionSettingRepository->getSetting($session, $progressSettingName, $player); + $progress = json_decode($progressSetting?->getValue() ?? '[]', true) ?? []; + + if (count($progress) < 2) { + $allVerified = false; + break; + } + } + + if ($allVerified) { + if (!$everyoneVerifiedSetting) { + $everyoneVerifiedSetting = new SessionSetting(); + $everyoneVerifiedSetting->setSession($session); + $everyoneVerifiedSetting->setPlayer($player); + $everyoneVerifiedSetting->setName(SessionSettingType::EVERYONE_VERIFIED); + } + $everyoneVerifiedSetting->setValue('true'); + $this->entityManager->persist($everyoneVerifiedSetting); + $this->entityManager->flush(); + + $topic = $_ENV['MERCURE_TOPIC_BASE'] . '/game/hub-' . $session->getId(); + $message = "Mainframe Help Modus: Agents Doyle, Vega and Lennox rapports have been updated with coded messages."; + $this->hub->publish(new Update($topic, json_encode([0, $message]))); } } diff --git a/templates/game/index.html.twig b/templates/game/index.html.twig index b3c67f4..6c098cb 100644 --- a/templates/game/index.html.twig +++ b/templates/game/index.html.twig @@ -18,6 +18,7 @@ data-topic="{{ (mercure_topic_base ~ '/game/hub-' ~ session.id)|e('html_attr') }}" data-api-ping-url="{{ path('game_api_ping')|e('html_attr') }}" data-api-echo-url="{{ path('game_api_message')|e('html_attr') }}" + data-screen="{{ screen|e('html_attr') }}" style="display:none">