commit
86cecfee9e
|
|
@ -62,13 +62,11 @@ public class GameController {
|
||||||
userAccessTokens.put(username, playerAccessToken);
|
userAccessTokens.put(username, playerAccessToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!userAccessTokens.containsKey(username)) {
|
||||||
if (accessToken == null) {
|
ctx.status(401).result("Zugriffstoken für Benutzer " + username + " nicht gefunden.");
|
||||||
ctx.status(401).result("Zugriffstoken fehlt oder ist ungültig");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
var devices = authService.getDevices(userAccessTokens.get(username));
|
||||||
var devices = authService.getDevices(accessToken);
|
|
||||||
ctx.json(devices);
|
ctx.json(devices);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,11 @@ package eric.Roullette.service;
|
||||||
Game g = getOrCreateGame(gameId);
|
Game g = getOrCreateGame(gameId);
|
||||||
if (g.players().isEmpty()) throw new IllegalStateException("No players");
|
if (g.players().isEmpty()) throw new IllegalStateException("No players");
|
||||||
String owner = g.players().get(ThreadLocalRandom.current().nextInt(g.players().size()));
|
String owner = g.players().get(ThreadLocalRandom.current().nextInt(g.players().size()));
|
||||||
String song = uris.get(ThreadLocalRandom.current().nextInt(uris.size()));
|
List<String> ownerTracks = g.playerTracks().getOrDefault(owner, List.of());
|
||||||
|
if (ownerTracks.isEmpty()) throw new IllegalStateException("Owner hat keine Tracks");
|
||||||
|
String song = ownerTracks.get(ThreadLocalRandom.current().nextInt(ownerTracks.size()));
|
||||||
|
|
||||||
|
//String song = uris.get(ThreadLocalRandom.current().nextInt(uris.size()));
|
||||||
Game updated = new Game(gameId, g.players(), g.scores(), owner, song, uris, g.playerTracks());
|
Game updated = new Game(gameId, g.players(), g.scores(), owner, song, uris, g.playerTracks());
|
||||||
games.put(gameId, updated);
|
games.put(gameId, updated);
|
||||||
return updated;
|
return updated;
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ public class SpotifyAuthService {
|
||||||
return tempApi.authorizationCodeUri()
|
return tempApi.authorizationCodeUri()
|
||||||
.scope(scope)
|
.scope(scope)
|
||||||
.state(user) // Der Benutzername wird im State mitgegeben
|
.state(user) // Der Benutzername wird im State mitgegeben
|
||||||
.show_dialog(true)
|
//.show_dialog(true)
|
||||||
.build()
|
.build()
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
@ -85,47 +85,47 @@ public class SpotifyAuthService {
|
||||||
SpotifyApi userApi = userApis.get(user);
|
SpotifyApi userApi = userApis.get(user);
|
||||||
|
|
||||||
if (userApi == null) {
|
if (userApi == null) {
|
||||||
System.out.println("Kein SpotifyApi-Client für Benutzer gefunden: " + user);
|
System.err.println("Kein SpotifyApi-Client für Benutzer gefunden: " + user);
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
System.out.println("SpotifyApi-Client für Benutzer gefunden: " + user);
|
// System.out.println("SpotifyApi-Client für Benutzer gefunden: " + user);
|
||||||
System.out.println("AccessToken: " + userApi.getAccessToken());
|
// System.out.println("AccessToken: " + userApi.getAccessToken());
|
||||||
System.out.println("RefreshToken: " + userApi.getRefreshToken());
|
// System.out.println("RefreshToken: " + userApi.getRefreshToken());
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
System.out.println("Hole Profil für Benutzer: " + user);
|
//System.out.println("Hole Profil für Benutzer: " + user);
|
||||||
// Hole das Profil des Benutzers, um den Account-Typ zu überprüfen
|
// Hole das Profil des Benutzers, um den Account-Typ zu überprüfen
|
||||||
var profile = userApi.getCurrentUsersProfile().build().execute();
|
//var profile = userApi.getCurrentUsersProfile().build().execute();
|
||||||
System.out.println("Account-Typ: " + profile.getProduct());
|
//System.out.println("Account-Typ: " + profile.getProduct());
|
||||||
|
|
||||||
System.out.println("Erstelle Anfrage für kürzlich gespielte Tracks...");
|
//System.out.println("Erstelle Anfrage für kürzlich gespielte Tracks...");
|
||||||
if (userApi.getRefreshToken() == null) {
|
// if (userApi.getRefreshToken() == null) {
|
||||||
System.out.println("Refresh Token für Benutzer " + user + " ist nicht gesetzt.");
|
// System.err.println("Refresh Token für Benutzer " + user + " ist nicht gesetzt.");
|
||||||
}
|
// }
|
||||||
|
|
||||||
System.out.println("Refresh Token für Benutzer " + user + " ist gesetzt.");
|
// System.out.println("Refresh Token für Benutzer " + user + " ist gesetzt.");
|
||||||
if( userApi.getAccessToken() == null) {
|
// if( userApi.getAccessToken() == null) {
|
||||||
System.out.println("Access Token für Benutzer " + user + " ist nicht gesetzt.");
|
// System.out.println("Access Token für Benutzer " + user + " ist nicht gesetzt.");
|
||||||
return Collections.emptyList();
|
// return Collections.emptyList();
|
||||||
}
|
// }
|
||||||
|
|
||||||
System.out.println("Access Token für Benutzer " + user + " ist gesetzt.");
|
// System.out.println("Access Token für Benutzer " + user + " ist gesetzt.");
|
||||||
|
|
||||||
|
|
||||||
GetCurrentUsersRecentlyPlayedTracksRequest request = userApi.getCurrentUsersRecentlyPlayedTracks()
|
GetCurrentUsersRecentlyPlayedTracksRequest request = userApi.getCurrentUsersRecentlyPlayedTracks()
|
||||||
.limit(limit)
|
.limit(limit)
|
||||||
.build();
|
.build();
|
||||||
// Führe die Anfrage aus und erhalte die Ergebnisse
|
// Führe die Anfrage aus und erhalte die Ergebnisse
|
||||||
System.out.println("Führe paging Anfrage aus...");
|
// System.out.println("Führe paging Anfrage aus...");
|
||||||
PagingCursorbased<PlayHistory> history = request.execute();
|
PagingCursorbased<PlayHistory> history = request.execute();
|
||||||
System.out.println("Paging Anfrage erfolgreich ausgeführt.");
|
// System.out.println("Paging Anfrage erfolgreich ausgeführt.");
|
||||||
// Überprüfe, ob die Ergebnisse leer sind
|
// Überprüfe, ob die Ergebnisse leer sind
|
||||||
System.out.println("Überprüfe, ob Ergebnisse vorhanden sind...");
|
// System.out.println("Überprüfe, ob Ergebnisse vorhanden sind...");
|
||||||
if (history == null || history.getItems() == null) {
|
if (history == null || history.getItems() == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
System.out.println("Verarbeite kürzlich gespielte Tracks...");
|
// System.out.println("Verarbeite kürzlich gespielte Tracks...");
|
||||||
// Extrahiere die URIs der kürzlich gespielten Tracks
|
// Extrahiere die URIs der kürzlich gespielten Tracks
|
||||||
List<String> recentTracks = Arrays.stream(history.getItems())
|
List<String> recentTracks = Arrays.stream(history.getItems())
|
||||||
.map(item -> item.getTrack().getUri())
|
.map(item -> item.getTrack().getUri())
|
||||||
|
|
@ -134,6 +134,7 @@ public class SpotifyAuthService {
|
||||||
System.out.println("Gefundene kürzlich gespielte Tracks: " + recentTracks.size());
|
System.out.println("Gefundene kürzlich gespielte Tracks: " + recentTracks.size());
|
||||||
|
|
||||||
if (recentTracks.size() < limit) {
|
if (recentTracks.size() < limit) {
|
||||||
|
int oldLimit = limit;
|
||||||
int newLimit = limit - recentTracks.size();
|
int newLimit = limit - recentTracks.size();
|
||||||
// restliche songs mit kürzlich gespeicherten Tracks auffüllen
|
// restliche songs mit kürzlich gespeicherten Tracks auffüllen
|
||||||
List<String> savedTracks = getSavedTracks(user, newLimit, 0);
|
List<String> savedTracks = getSavedTracks(user, newLimit, 0);
|
||||||
|
|
@ -142,8 +143,9 @@ public class SpotifyAuthService {
|
||||||
recentTracks = new java.util.ArrayList<>(recentTracks);
|
recentTracks = new java.util.ArrayList<>(recentTracks);
|
||||||
recentTracks.addAll(savedTracks.subList(0, Math.min(newLimit, savedTracks.size())));
|
recentTracks.addAll(savedTracks.subList(0, Math.min(newLimit, savedTracks.size())));
|
||||||
if(recentTracks.size() < limit){
|
if(recentTracks.size() < limit){
|
||||||
|
oldLimit = newLimit;
|
||||||
newLimit = limit - recentTracks.size();
|
newLimit = limit - recentTracks.size();
|
||||||
List<String> savedTracks2 = getSavedTracks(user, newLimit, 50);
|
List<String> savedTracks2 = getSavedTracks(user, newLimit, oldLimit);
|
||||||
savedTracks2.removeAll(recentTracks);
|
savedTracks2.removeAll(recentTracks);
|
||||||
recentTracks.addAll(savedTracks2.subList(0, Math.min(newLimit, savedTracks2.size())));
|
recentTracks.addAll(savedTracks2.subList(0, Math.min(newLimit, savedTracks2.size())));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -52,7 +52,19 @@ public class GameWebSocketHandler {
|
||||||
// Connection geschlossen
|
// Connection geschlossen
|
||||||
ws.onClose(ctx -> {
|
ws.onClose(ctx -> {
|
||||||
String gameId = ctx.pathParam("gameId");
|
String gameId = ctx.pathParam("gameId");
|
||||||
|
String username = ctx.queryParam("username");
|
||||||
service.removeSession(gameId, ctx);
|
service.removeSession(gameId, ctx);
|
||||||
|
|
||||||
|
// Spieler aus der Spielerliste entfernen
|
||||||
|
var game = service.getOrCreateGame(gameId);
|
||||||
|
if (username != null && game.players().contains(username)) {
|
||||||
|
game.players().remove(username);
|
||||||
|
game.scores().remove(username);
|
||||||
|
// Optional: auch die Tracks entfernen
|
||||||
|
game.playerTracks().remove(username);
|
||||||
|
}
|
||||||
|
service.broadcastPlayers(gameId);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Eingehende Nachrichten (Guesses & Player-Requests)
|
// Eingehende Nachrichten (Guesses & Player-Requests)
|
||||||
|
|
@ -88,14 +100,36 @@ public class GameWebSocketHandler {
|
||||||
.flatMap(List::stream)
|
.flatMap(List::stream)
|
||||||
.toList();
|
.toList();
|
||||||
System.out.println("AlltracksCache für Spiel " + gameId + " hat " + allTracks.size() + " Songs (rundenstart)");
|
System.out.println("AlltracksCache für Spiel " + gameId + " hat " + allTracks.size() + " Songs (rundenstart)");
|
||||||
|
//Trackinfos für alle Spieler sammeln
|
||||||
|
|
||||||
|
if(playerTrackInfoCache.containsKey(gameId)){
|
||||||
|
// Wenn der Cache schon existiert, dann nur die Trackinfos nutzen
|
||||||
|
System.out.println("TrackInfosCache für Spiel " + gameId + " existiert bereits (rundenstart)");
|
||||||
|
// prüfen ob ein neuer spieler dazugekommen ist
|
||||||
|
if( allPlayerTracks.size() > playerTrackInfoCache.get(gameId).size()) {
|
||||||
|
System.out.println("Neuer Spieler hinzugefügt, Trackinfos werden aktualisiert (rundenstart)");
|
||||||
|
Map<String, List<String>> allTrackInfos = service.getTrackInfos(allPlayerTracks);
|
||||||
|
// Cache für Trackinfos pro Spiel-ID aktualisieren
|
||||||
|
playerTrackInfoCache.put(gameId, allTrackInfos);
|
||||||
|
} else {
|
||||||
|
System.out.println("Keine neuen Spieler, Trackinfos bleiben unverändert (rundenstart)");
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Wenn der Cache nicht existiert, dann Trackinfos sammeln
|
||||||
|
System.out.println("TrackInfosCache für Spiel " + gameId + " wird erstellt (rundenstart)");
|
||||||
|
Map<String, List<String>> allTrackInfos = service.getTrackInfos(allPlayerTracks);
|
||||||
|
// Cache für Trackinfos pro Spiel-ID
|
||||||
|
playerTrackInfoCache.put(gameId, allTrackInfos);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("TrackInfosCache für Spiel " + gameId + " hat " + playerTrackInfoCache.get(gameId).size() + " Spieler (rundenstart)");
|
||||||
|
|
||||||
|
|
||||||
if (!allTracks.isEmpty()) {
|
if (!allTracks.isEmpty()) {
|
||||||
service.startRound(gameId, allTracks);
|
service.startRound(gameId, allTracks);
|
||||||
}
|
}
|
||||||
// Trackinfos für alle Spieler sammeln
|
//
|
||||||
//Map<String, List<String>> allTrackInfos = service.getTrackInfos(allPlayerTracks);
|
|
||||||
// Cache für Trackinfos pro Spiel-ID
|
|
||||||
//playerTrackInfoCache.put(gameId, allTrackInfos);
|
|
||||||
//System.out.println("TrackInfosCache für Spiel " + gameId + " hat " + allTrackInfos.size() + " Spieler (rundenstart)");
|
|
||||||
broadcastRoundStart(gameId);
|
broadcastRoundStart(gameId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -149,12 +183,19 @@ private void broadcastRoundResult(String gameId) {
|
||||||
Map<String,String> guesses = currentGuesses.remove(gameId);
|
Map<String,String> guesses = currentGuesses.remove(gameId);
|
||||||
String owner = game.currentOwner();
|
String owner = game.currentOwner();
|
||||||
|
|
||||||
|
// System.out.println("Owner: " + owner);
|
||||||
|
// System.out.println("Guesses: " + guesses);
|
||||||
|
// System.out.println("Scores vor Auswertung: " + scores);
|
||||||
|
|
||||||
// Für jeden Tippenden Score anpassen
|
// Für jeden Tippenden Score anpassen
|
||||||
for (Map.Entry<String, String> entry : guesses.entrySet()) {
|
for (Map.Entry<String, String> entry : guesses.entrySet()) {
|
||||||
String guesser = entry.getKey();
|
String guesser = entry.getKey();
|
||||||
boolean correct = owner.equals(entry.getValue());
|
boolean correct = owner.equals(entry.getValue());
|
||||||
scores.merge(guesser, correct ? 3 : -1, Integer::sum);
|
scores.merge(guesser, correct ? 3 : -1, Integer::sum);
|
||||||
}
|
}
|
||||||
|
// System.out.println("Owner: " + owner);
|
||||||
|
// System.out.println("Guesses: " + guesses);
|
||||||
|
// System.out.println("Scores nach Auswertung: " + scores);
|
||||||
|
|
||||||
String msg = JsonUtil.toJson(Map.of(
|
String msg = JsonUtil.toJson(Map.of(
|
||||||
"type", "round-result",
|
"type", "round-result",
|
||||||
|
|
@ -165,21 +206,23 @@ private void broadcastRoundResult(String gameId) {
|
||||||
broadcastToAll(gameId, msg);
|
broadcastToAll(gameId, msg);
|
||||||
|
|
||||||
// Prüfe auf Gewinner
|
// Prüfe auf Gewinner
|
||||||
String winner = scores.entrySet().stream()
|
// Nur beenden, wenn EIN Spieler allein die höchste Punktzahl >= score hat
|
||||||
.filter(e -> e.getValue() >= 6)
|
int score = 6;
|
||||||
|
int max = scores.values().stream().max(Integer::compareTo).orElse(0);
|
||||||
|
List<String> topScorers = scores.entrySet().stream()
|
||||||
|
.filter(e -> e.getValue() == max && max >= score)
|
||||||
.map(Map.Entry::getKey)
|
.map(Map.Entry::getKey)
|
||||||
.findFirst()
|
.toList();
|
||||||
.orElse(null);
|
|
||||||
if (winner != null) {
|
if (topScorers.size() == 1) {
|
||||||
// Broadcast an alle, dass das Spiel vorbei ist
|
String winner = topScorers.get(0);
|
||||||
String winMsg = JsonUtil.toJson(Map.of(
|
String winMsg = JsonUtil.toJson(Map.of(
|
||||||
"type", "game-end",
|
"type", "game-end",
|
||||||
"winner", winner,
|
"winner", winner,
|
||||||
"scores", scores
|
"scores", scores
|
||||||
));
|
));
|
||||||
broadcastToAll(gameId, winMsg);
|
broadcastToAll(gameId, winMsg);
|
||||||
game.scores().replaceAll((user , pts) -> 0); // Reset Scores für alle Spieler
|
game.scores().replaceAll((user , pts) -> 0); // Reset Scores
|
||||||
|
|
||||||
}
|
}
|
||||||
// else{
|
// else{
|
||||||
// // nächste Runde starten
|
// // nächste Runde starten
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1 @@
|
||||||
spring.application.name=Roullette
|
spring.application.name=Roullette
|
||||||
|
|
||||||
spotify:
|
|
||||||
client-id: 70c36cd6e2d54ad0ba2e60ef6334bbc8
|
|
||||||
client-secret: 116188574dd140eab1973e75c7e5ecfe
|
|
||||||
redirect-uri: https://www.davidmagkuchen.de/spotify/callback
|
|
||||||
|
|
@ -18,6 +18,13 @@ area.appendChild(select);
|
||||||
|
|
||||||
async function loadDevices() {
|
async function loadDevices() {
|
||||||
select.innerHTML = "";
|
select.innerHTML = "";
|
||||||
|
|
||||||
|
// Standardoption "Kein Gerät"
|
||||||
|
const noneOpt = document.createElement("option");
|
||||||
|
noneOpt.value = "";
|
||||||
|
noneOpt.textContent = "Kein Gerät";
|
||||||
|
select.appendChild(noneOpt);
|
||||||
|
|
||||||
const devices = await fetchJson(`/api/spotify/devices?username=${encodeURIComponent(username)}`);
|
const devices = await fetchJson(`/api/spotify/devices?username=${encodeURIComponent(username)}`);
|
||||||
if (!devices.length) {
|
if (!devices.length) {
|
||||||
const opt = document.createElement("option");
|
const opt = document.createElement("option");
|
||||||
|
|
@ -34,6 +41,8 @@ async function loadDevices() {
|
||||||
select.appendChild(opt);
|
select.appendChild(opt);
|
||||||
});
|
});
|
||||||
select.disabled = false;
|
select.disabled = false;
|
||||||
|
select.value = ""; // "Kein Gerät" als Standard
|
||||||
|
|
||||||
}
|
}
|
||||||
loadDevices();
|
loadDevices();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -316,8 +316,9 @@ function handleGameEnd({ winner }) {
|
||||||
// Spotify-Playback Funktion (unverändert)
|
// Spotify-Playback Funktion (unverändert)
|
||||||
async function playOnSpotify(trackUri, username) {
|
async function playOnSpotify(trackUri, username) {
|
||||||
const deviceId = document.getElementById("deviceSelect")?.value;
|
const deviceId = document.getElementById("deviceSelect")?.value;
|
||||||
if (!deviceId) {
|
if (deviceId === "") {
|
||||||
alert("Bitte ein Wiedergabegerät auswählen!");
|
//alert("Bitte ein Wiedergabegerät auswählen!");
|
||||||
|
//keine warnung i guess
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue