plaatsen-return-messages #8
@@ -4,7 +4,7 @@ import './styles/game1.css';
|
|||||||
let sequenceFinished = false;
|
let sequenceFinished = false;
|
||||||
let stillPlayingSound = true;
|
let stillPlayingSound = true;
|
||||||
|
|
||||||
function subscribeToMercure(mercurePublicUrl, topic) {
|
function subscribeToMercure(mercurePublicUrl, topic, myScreen) {
|
||||||
try {
|
try {
|
||||||
const url = mercurePublicUrl + '?topic=' + encodeURIComponent(topic);
|
const url = mercurePublicUrl + '?topic=' + encodeURIComponent(topic);
|
||||||
const es = new EventSource(url);
|
const es = new EventSource(url);
|
||||||
@@ -16,6 +16,13 @@ function subscribeToMercure(mercurePublicUrl, topic) {
|
|||||||
|
|
||||||
// data is [sendTo, message]
|
// data is [sendTo, message]
|
||||||
if (Array.isArray(data) && data.length >= 2) {
|
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');
|
const messageContainer = document.getElementById('message-container');
|
||||||
if (messageContainer) {
|
if (messageContainer) {
|
||||||
const msgEl = document.createElement('div');
|
const msgEl = document.createElement('div');
|
||||||
@@ -121,11 +128,12 @@ document.addEventListener('DOMContentLoaded', async () => {
|
|||||||
|
|
||||||
const mercurePublicUrl = cfgEl.dataset.mercurePublicUrl;
|
const mercurePublicUrl = cfgEl.dataset.mercurePublicUrl;
|
||||||
const topic = cfgEl.dataset.topic;
|
const topic = cfgEl.dataset.topic;
|
||||||
|
const screen = cfgEl.dataset.screen;
|
||||||
const apiPingUrl = cfgEl.dataset.apiPingUrl;
|
const apiPingUrl = cfgEl.dataset.apiPingUrl;
|
||||||
const apiEchoUrl = cfgEl.dataset.apiEchoUrl;
|
const apiEchoUrl = cfgEl.dataset.apiEchoUrl;
|
||||||
|
|
||||||
if (mercurePublicUrl && topic) {
|
if (mercurePublicUrl && topic) {
|
||||||
subscribeToMercure(mercurePublicUrl, topic);
|
subscribeToMercure(mercurePublicUrl, topic, screen);
|
||||||
} else {
|
} else {
|
||||||
console.warn('[Mercure][game1] Missing data attributes on #mercure-config');
|
console.warn('[Mercure][game1] Missing data attributes on #mercure-config');
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,8 +85,18 @@ final class GameController extends AbstractController
|
|||||||
#[IsGranted(new Expression("is_granted('ROLE_PLAYER') or is_granted('ROLE_ADMIN')"))]
|
#[IsGranted(new Expression("is_granted('ROLE_PLAYER') or is_granted('ROLE_ADMIN')"))]
|
||||||
#[IsGranted('SESSION_VIEW', subject: 'session')]
|
#[IsGranted('SESSION_VIEW', subject: 'session')]
|
||||||
public function index(
|
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,
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,4 +21,5 @@ enum SessionSettingType: string
|
|||||||
case VERIFICATION_PROGRESS_FOR_PLAYER1 = 'VerificationProgressForPlayer1';
|
case VERIFICATION_PROGRESS_FOR_PLAYER1 = 'VerificationProgressForPlayer1';
|
||||||
case VERIFICATION_PROGRESS_FOR_PLAYER2 = 'VerificationProgressForPlayer2';
|
case VERIFICATION_PROGRESS_FOR_PLAYER2 = 'VerificationProgressForPlayer2';
|
||||||
case VERIFICATION_PROGRESS_FOR_PLAYER3 = 'VerificationProgressForPlayer3';
|
case VERIFICATION_PROGRESS_FOR_PLAYER3 = 'VerificationProgressForPlayer3';
|
||||||
|
case EVERYONE_VERIFIED = 'EveryoneVerified';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -585,6 +585,52 @@ class GameResponseService
|
|||||||
$setting->setValue(json_encode($rights));
|
$setting->setValue(json_encode($rights));
|
||||||
$this->entityManager->persist($setting);
|
$this->entityManager->persist($setting);
|
||||||
$this->entityManager->flush();
|
$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])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
data-topic="{{ (mercure_topic_base ~ '/game/hub-' ~ session.id)|e('html_attr') }}"
|
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-ping-url="{{ path('game_api_ping')|e('html_attr') }}"
|
||||||
data-api-echo-url="{{ path('game_api_message')|e('html_attr') }}"
|
data-api-echo-url="{{ path('game_api_message')|e('html_attr') }}"
|
||||||
|
data-screen="{{ screen|e('html_attr') }}"
|
||||||
style="display:none">
|
style="display:none">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user