From b55314fd1a9bbce7bd2464bc8ec853df57653011 Mon Sep 17 00:00:00 2001 From: eric <3024947@stud.hs-mannheim.de> Date: Wed, 13 Aug 2025 05:12:23 +0200 Subject: [PATCH] =?UTF-8?q?verhindern=20dass=20mehrere=20gleichzeitig=20ru?= =?UTF-8?q?nde=20starten=20dr=C3=BCcken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Roullette/controller/GameController.java | 9 +++- .../websocket/GameWebSocketHandler.java | 4 +- src/main/resources/public/js/start-round.js | 46 ++++++++++--------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/main/java/eric/Roullette/controller/GameController.java b/src/main/java/eric/Roullette/controller/GameController.java index ca15429..7d9a2ab 100644 --- a/src/main/java/eric/Roullette/controller/GameController.java +++ b/src/main/java/eric/Roullette/controller/GameController.java @@ -132,7 +132,8 @@ public class GameController { return; } boolean correct = guess.equals(owner); - if (correct) game.scores().merge(user, 1, Integer::sum); + game.scores().merge(user, correct ? 3 : -1, Integer::sum); // an WS-Logik angeglichen + //if (correct) game.scores().merge(user, 3, Integer::sum); ctx.json(Map.of( "correct", correct, "owner", owner, @@ -152,7 +153,11 @@ public class GameController { try { //String accessToken = authService.getAccessTokenForUser(username); - String accessToken = userAccessTokens.get(username); + String accessToken = userAccessTokens.computeIfAbsent(username, authService::getAccessTokenForUser); + if (accessToken == null || accessToken.isBlank()) { + ctx.status(401).result("Kein Zugriffstoken für " + username); return; + } + //String accessToken = userAccessTokens.get(username); OkHttpClient client = httpClient; String trackId = trackUri.split(":")[2]; Request getTrack = new Request.Builder() diff --git a/src/main/java/eric/Roullette/websocket/GameWebSocketHandler.java b/src/main/java/eric/Roullette/websocket/GameWebSocketHandler.java index f8bcf1e..e61040c 100644 --- a/src/main/java/eric/Roullette/websocket/GameWebSocketHandler.java +++ b/src/main/java/eric/Roullette/websocket/GameWebSocketHandler.java @@ -145,10 +145,10 @@ public class GameWebSocketHandler { allTracks.addAll(game.playerTracks().getOrDefault(player, List.of())); } if (allTracks.isEmpty()) { - // TODO: Fehler an Client senden, dass keine Songs da sind + broadcastToAll(gameId, JsonUtil.toJson(Map.of("type","error","message","Keine Tracks geladen"))); return; } - // TODO funktionalität bei neu joinenden Spielern überprüfen + // Runde im Service starten, um Song und Owner zu setzen service.startRound(gameId, allTracks); // Jetzt Broadcast mit den aktuellen Daten diff --git a/src/main/resources/public/js/start-round.js b/src/main/resources/public/js/start-round.js index 78d5a34..d567b9d 100644 --- a/src/main/resources/public/js/start-round.js +++ b/src/main/resources/public/js/start-round.js @@ -1,25 +1,29 @@ -// public/js/start-round.js +// javascript + import { getParam } from "./utils.js"; -import { getParam } from "./utils.js"; + export function setupStartRound(socket) { + const gameId = getParam("gameId"); + const startBtn = document.getElementById("startRound"); + if (!startBtn || !gameId) return; -/** - * Bindet den Klick-Handler an den "Runde starten"-Button, - * der per WebSocket an den Server das Start-Event feuert. - * @param {WebSocket} socket – die geöffnete WS-Verbindung - */ -export function setupStartRound(socket) { - const gameId = getParam("gameId"); - if (!gameId || socket.readyState !== WebSocket.OPEN) return; + // Mehrfaches Registrieren verhindern + if (startBtn.dataset.handlerAttached === "1") return; + startBtn.dataset.handlerAttached = "1"; - const startBtn = document.getElementById("startRound"); - startBtn.addEventListener("click", () => { - // Button direkt deaktivieren, bis neue Runde kommt - startBtn.disabled = true; + startBtn.onclick = async () => { + if (startBtn.disabled) return; + startBtn.disabled = true; // Doppelklick verhindern - // Sende das Start-Runden-Event an den Server - socket.send(JSON.stringify({ - type: "start-round", - gameId: gameId - })); - }); -} + try { + if (socket && socket.readyState === WebSocket.OPEN) { + socket.send(JSON.stringify({ type: "start-round" })); + } else { + await fetch(`/api/game/${encodeURIComponent(gameId)}/start-round`, { method: "POST" }); + } + // UI-Änderungen (hidden usw.) macht bereits handleRoundStart in game.js + } catch (_) { + // Bei Fehler kurz reaktivieren, damit der Nutzer erneut versuchen kann + setTimeout(() => { startBtn.disabled = false; }, 1200); + } + }; + } \ No newline at end of file