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;
}
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()

View File

@ -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

View File

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