verhindern dass mehrere gleichzeitig runde starten drücken

GUI
eric 2025-08-13 05:12:23 +02:00
parent b2627984af
commit b55314fd1a
3 changed files with 34 additions and 25 deletions

View File

@ -132,7 +132,8 @@ public class GameController {
return; return;
} }
boolean correct = guess.equals(owner); 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( ctx.json(Map.of(
"correct", correct, "correct", correct,
"owner", owner, "owner", owner,
@ -152,7 +153,11 @@ public class GameController {
try { try {
//String accessToken = authService.getAccessTokenForUser(username); //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; OkHttpClient client = httpClient;
String trackId = trackUri.split(":")[2]; String trackId = trackUri.split(":")[2];
Request getTrack = new Request.Builder() Request getTrack = new Request.Builder()

View File

@ -145,10 +145,10 @@ public class GameWebSocketHandler {
allTracks.addAll(game.playerTracks().getOrDefault(player, List.of())); allTracks.addAll(game.playerTracks().getOrDefault(player, List.of()));
} }
if (allTracks.isEmpty()) { 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; return;
} }
// TODO funktionalität bei neu joinenden Spielern überprüfen
// Runde im Service starten, um Song und Owner zu setzen // Runde im Service starten, um Song und Owner zu setzen
service.startRound(gameId, allTracks); service.startRound(gameId, allTracks);
// Jetzt Broadcast mit den aktuellen Daten // Jetzt Broadcast mit den aktuellen Daten

View File

@ -1,25 +1,29 @@
// public/js/start-round.js // javascript
import { getParam } from "./utils.js";
import { getParam } from "./utils.js"; export function setupStartRound(socket) {
/**
* 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"); const gameId = getParam("gameId");
if (!gameId || socket.readyState !== WebSocket.OPEN) return;
const startBtn = document.getElementById("startRound"); const startBtn = document.getElementById("startRound");
startBtn.addEventListener("click", () => { if (!startBtn || !gameId) return;
// Button direkt deaktivieren, bis neue Runde kommt
startBtn.disabled = true;
// Sende das Start-Runden-Event an den Server // Mehrfaches Registrieren verhindern
socket.send(JSON.stringify({ if (startBtn.dataset.handlerAttached === "1") return;
type: "start-round", startBtn.dataset.handlerAttached = "1";
gameId: gameId
})); startBtn.onclick = async () => {
}); if (startBtn.disabled) return;
} startBtn.disabled = true; // Doppelklick verhindern
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);
}
};
}