From f91642bade6bcb2bd7f97868cdf8801bb3e1dc30 Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Sun, 12 Apr 2026 15:13:33 +0200 Subject: [PATCH] Fix: fetch lobbies on client startup --- .../casono/client/network/LobbyClient.java | 77 +++++++++++++++++++ .../ui/lobbyui/CasinomainuiController.java | 18 +++++ 2 files changed, 95 insertions(+) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/LobbyClient.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/LobbyClient.java index 2f48eef..0e9ae35 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/LobbyClient.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/LobbyClient.java @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.casono.client.network; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter; +import java.util.ArrayList; import java.util.List; /** @@ -129,4 +130,80 @@ public class LobbyClient { } return new LoginResult(assigned, id); } + + /** + * Request the server for the list of available lobbies. + * + * @return list of LobbyInfo objects representing current lobbies + */ + public List getLobbyList() { + List lines = client.processCommand("GET_LOBBY_LIST"); + + List params = ClientService.convertToRequestParameters(lines); + + List result = new ArrayList<>(); + + Integer currentId = null; + String currentName = null; + Integer currentPlayerCount = null; + + for (RequestParameter p : params) { + String key = p.key().toUpperCase(); + String val = p.value(); + switch (key) { + case "ID": + // If we were collecting a lobby, flush it + if (currentId != null) { + result.add( + new LobbyInfo( + currentId, + currentName, + currentPlayerCount == null ? 0 : currentPlayerCount)); + currentName = null; + currentPlayerCount = null; + } + try { + currentId = Integer.parseInt(val); + } catch (NumberFormatException e) { + currentId = null; + } + break; + case "NAME": + currentName = val; + break; + case "PLAYER_COUNT": + try { + currentPlayerCount = Integer.parseInt(val); + } catch (NumberFormatException e) { + currentPlayerCount = 0; + } + break; + default: + break; + } + } + + if (currentId != null) { + result.add( + new LobbyInfo( + currentId, + currentName, + currentPlayerCount == null ? 0 : currentPlayerCount)); + } + + return result; + } + + /** Simple data holder for lobby metadata returned by the server. */ + public static final class LobbyInfo { + public final int id; + public final String name; + public final int playerCount; + + public LobbyInfo(int id, String name, int playerCount) { + this.id = id; + this.name = name; + this.playerCount = playerCount; + } + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java index 701f092..c06315f 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java @@ -75,6 +75,24 @@ public class CasinomainuiController { // LobbyClient will use the provided ClientService; in offline mode calls will // fail with RuntimeException lobbyClient = new LobbyClient(clientService); + // Fetch existing lobbies from server on startup so newly-created lobbies + // by other clients are immediately visible. + try { + if (!lobbyClient.getClientService().isOffline()) { + var lobbies = lobbyClient.getLobbyList(); + int bid = nextButtonId; + for (var li : lobbies) { + try { + translationManager.addLobbyButton(bid++, li.id); + } catch (Exception e) { + LOGGER.warn("Could not add lobby button: {}", e.getMessage()); + } + } + nextButtonId = bid; + } + } catch (RuntimeException e) { + LOGGER.warn("Failed to fetch lobby list at startup: {}", e.getMessage()); + } casinoTable.getChildren().clear(); casinoTable.getChildren().add(gridManager.getGridPane()); gridManager.renderLobbyButtons();