From a930bd94b5a6a1d96350f67f5a6d10188b679a9f Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Sat, 11 Apr 2026 20:31:25 +0200 Subject: [PATCH 1/2] Feat: Add getlobbbystatus command --- .../GetLobbyStatusHandler.java | 62 +++++++++++++++++++ .../GetLobbyStatusParser.java | 21 +++++++ .../GetLobbyStatusRequest.java | 23 +++++++ .../GetLobbyStatusResponse.java | 34 ++++++++++ 4 files changed, 140 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusHandler.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusParser.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusRequest.java create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusResponse.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusHandler.java new file mode 100644 index 0000000..5e04fcd --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusHandler.java @@ -0,0 +1,62 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.lobby.get_lobby_status; + +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyId; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.LobbyManager; +import ch.unibas.dmi.dbis.cs108.casono.server.domain.user.UserRegistry; +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.execution.CommandHandler; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.ErrorResponse; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatcher.ResponseDispatcher; +import java.util.Optional; + +/** Handler for GET_LOBBY_STATUS: returns lobby details and player list. */ +public class GetLobbyStatusHandler extends CommandHandler { + private final LobbyManager lobbyManager; + private final UserRegistry userRegistry; + + public GetLobbyStatusHandler( + ResponseDispatcher responseDispatcher, + LobbyManager lobbyManager, + UserRegistry userRegistry) { + super(responseDispatcher); + this.lobbyManager = lobbyManager; + this.userRegistry = userRegistry; + + // Only require logged-in session if the request does not provide an explicit ID + // or USERNAME + addCheck( + request -> { + if (!(request instanceof GetLobbyStatusRequest)) { + return Optional.empty(); + } + GetLobbyStatusRequest r = (GetLobbyStatusRequest) request; + if (r.getId() != null || r.getUsername() != null) { + return Optional.empty(); + } + var maybeUser = userRegistry.getBySessionId(r.getSessionId()); + if (maybeUser.isPresent()) { + return Optional.empty(); + } + return Optional.of( + new ErrorResponse( + r.getContext(), + "USER_NOT_LOGGED_IN", + "Request requires an associated logged-in user")); + }); + } + + @Override + public void execute(GetLobbyStatusRequest request) { + var lobby = + (request.getId() != null) + ? lobbyManager.getLobby(LobbyId.of(request.getId())) + : lobbyManager.getLobbyByUsername(request.getUsername()); + + if (lobby == null) { + responseDispatcher.dispatch( + new ErrorResponse(request.getContext(), "LOBBY_NOT_FOUND", "Lobby not found")); + return; + } + + responseDispatcher.dispatch(new GetLobbyStatusResponse(request.getContext(), lobby)); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusParser.java new file mode 100644 index 0000000..e6aec4c --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusParser.java @@ -0,0 +1,21 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.lobby.get_lobby_status; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.CommandParser; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.PrimitiveRequest; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.accessor.RequestParameterAccessor; + +public class GetLobbyStatusParser implements CommandParser { + @Override + public GetLobbyStatusRequest parse(PrimitiveRequest primitiveRequest) { + RequestParameterAccessor accessor = + new RequestParameterAccessor(primitiveRequest.parameters()); + Integer id = null; + try { + id = accessor.optional("ID", null, Integer::parseInt); + } catch (Exception e) { + // parse error handled elsewhere + } + String username = accessor.optional("USERNAME", null); + return new GetLobbyStatusRequest(primitiveRequest.context(), id, username); + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusRequest.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusRequest.java new file mode 100644 index 0000000..5d73882 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusRequest.java @@ -0,0 +1,23 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.lobby.get_lobby_status; + +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.Request; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; + +public class GetLobbyStatusRequest extends Request { + private final Integer id; + private final String username; + + public GetLobbyStatusRequest(RequestContext context, Integer id, String username) { + super(context); + this.id = id; + this.username = username; + } + + public Integer getId() { + return id; + } + + public String getUsername() { + return username; + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusResponse.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusResponse.java new file mode 100644 index 0000000..94bc690 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/lobby/get_lobby_status/GetLobbyStatusResponse.java @@ -0,0 +1,34 @@ +package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.lobby.get_lobby_status; + +import ch.unibas.dmi.dbis.cs108.casono.server.domain.lobby.Lobby; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.request.RequestContext; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.SuccessResponse; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; + +/** Response with lobby player listing and simple READY placeholders. */ +public class GetLobbyStatusResponse extends SuccessResponse { + public GetLobbyStatusResponse(RequestContext context, Lobby lobby) { + super( + context, + ResponseBody.builder() + .block( + "LOBBY", + lb -> { + lb.param("ID", lobby.getId().value()); + lb.param("NAME", lobby.getName()); + lb.block( + "PLAYERS", + players -> { + for (String p : lobby.getPlayerNames()) { + players.block( + "PLAYER", + pb -> { + pb.param("USERNAME", p); + pb.param("READY", "false"); + }); + } + }); + }) + .build()); + } +} From 050d87ce578ea31a7eec57b33fa14e966b454ebc Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Sat, 11 Apr 2026 20:32:38 +0200 Subject: [PATCH 2/2] Docs: Add command documentation for get_lobby_status --- .../networking/commands/protocol-document.md | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/documents/docs/networking/commands/protocol-document.md b/documents/docs/networking/commands/protocol-document.md index 329e669..266bb29 100644 --- a/documents/docs/networking/commands/protocol-document.md +++ b/documents/docs/networking/commands/protocol-document.md @@ -508,6 +508,67 @@ END ### Example Response (error) +``` +-ERR + CODE=LOBBY_NOT_FOUND + MESSAGE=Lobby not found +END +``` + +## GET_LOBBY_STATUS command + +The `GET_LOBBY_STATUS` command requests the server to return the current state of a lobby, including the list of players and their ready state. + +### Required pre-execution checks +None. + +### Request Parameters +| Parameter Name | Type | Optional | Description | +| :------------- | :--- | :------: | :---------- | +| `ID` | `int` | no | Numeric id of the target lobby | + +### Implementation notes + +- Parser: `GetLobbyStatusParser` — reads the `ID` parameter and builds `GetLobbyStatusRequest`. +- Handler: `GetLobbyStatusHandler` — queries `LobbyManager` for the lobby and builds a `GetLobbyStatusResponse` containing player entries. + +### Success Response + +The response contains a `LOBBY` collection with nested `PLAYERS` and one or more `PLAYER` entries. Each `PLAYER` entry contains `USERNAME` and `READY` fields. + +Example response structure: + +``` ++OK + LOBBY + ID=1 + PLAYERS + PLAYER + USERNAME=Lars_001 + READY=false + END + PLAYER + USERNAME=Anna + READY=true + END + END + END +END +``` + +### Error Response +| Code | Description | +| :--- | :---------- | +| `LOBBY_NOT_FOUND` | The specified lobby id does not exist | + +### Example Request + +``` +GET_LOBBY_STATUS ID=1 +``` + +### Example Response (error) + ``` -ERR CODE=LOBBY_NOT_FOUND