verhindern dass mehrere gleichzeitig runde starten drücken
parent
b2627984af
commit
b55314fd1a
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
Loading…
Reference in New Issue