diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java index 4783499..34126b8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatController.java @@ -89,7 +89,9 @@ public class ChatController { public void setLobbyChat(int lobbyId) { this.lobbyId = lobbyId; ChatKey key = new ChatKey(ChatType.LOBBY); - if (chatModelMap.containsKey(key)) { + ChatModel existingModel = chatModelMap.get(key); + if (existingModel != null) { + existingModel.lobbyId = lobbyId; return; } ChatModel lobbyChatModel = new ChatModel(ChatType.LOBBY, username, lobbyId, null); @@ -115,7 +117,7 @@ public class ChatController { chatModelMap.get(new ChatKey(ChatType.GLOBAL)).addMessage(msg); break; case ChatType.LOBBY: - if (msg.lobbyId == lobbyId) { + if (msg.lobbyId == getActiveLobbyChatId()) { chatModelMap .computeIfAbsent( new ChatKey(ChatType.LOBBY), @@ -155,6 +157,14 @@ public class ChatController { } } + private int getActiveLobbyChatId() { + ChatModel lobbyModel = chatModelMap.get(new ChatKey(ChatType.LOBBY)); + if (lobbyModel != null) { + return lobbyModel.lobbyId; + } + return lobbyId; + } + /** * Method to process the usernames of other users connected to the server, after they got polled * by the {@link ChatClient}. diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java index 6a88ed9..298e557 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ChatClient.java @@ -79,21 +79,11 @@ public class ChatClient { public List getUsers() { logger.info("Asking server for list of users"); List users = clientService.processCommand("LIST_USERS"); - List parameters = new ArrayList(); - for (int i = 0; i < users.size(); i++) { - String line = users.get(i); - if (line.equals("USERS")) { - continue; - } else if (line.equals("END")) { - break; - } - line = line.replaceFirst("^\t", ""); - - if (line.equals("USER")) { - String username = users.get(i + 1); - username = username.replaceFirst("^\t", ""); - username = username.replaceFirst("^\t", ""); - parameters.add(username); + List parameters = new ArrayList<>(); + for (String line : users) { + String trimmed = line == null ? "" : line.trim(); + if (trimmed.startsWith("USERNAME=")) { + parameters.add(trimmed); } } return parameters; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ClientService.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ClientService.java index 0998fb3..1792e47 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ClientService.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/network/ClientService.java @@ -195,6 +195,8 @@ public class ClientService { || token.equals("LOBBY") || token.equals("PLAYERS") || token.equals("PLAYER") + || token.equals("USERS") + || token.equals("USER") || token.equals("CARDS") || token.equals("CARD"); } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java index ff3d672..fb9e9bd 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/ServerApp.java @@ -174,7 +174,8 @@ public class ServerApp { parserDispatcher.register("SEND_MESSAGE", new SendMessageParser()); commandRouter.register( - SendMessageRequest.class, new SendMessageHandler(responseDispatcher, userRegistry)); + SendMessageRequest.class, + new SendMessageHandler(responseDispatcher, userRegistry, context.lobbyManager())); parserDispatcher.register("GET_MESSAGE_COUNT", new GetMessageCountParser()); commandRouter.register( diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/send_message/SendMessageHandler.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/send_message/SendMessageHandler.java index 0bf5b95..94ee193 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/send_message/SendMessageHandler.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/server/app/commands/send_message/SendMessageHandler.java @@ -1,6 +1,9 @@ package ch.unibas.dmi.dbis.cs108.casono.server.app.commands.send_message; import ch.unibas.dmi.dbis.cs108.casono.client.chat.Message; +import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatType; +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.OkResponse; @@ -8,6 +11,7 @@ import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.dispatch public class SendMessageHandler extends CommandHandler { private final UserRegistry userRegistry; + private final LobbyManager lobbyManager; /** * Constructs a new SendMessageHandler with the required dispatcher and user registry. @@ -15,9 +19,13 @@ public class SendMessageHandler extends CommandHandler { * @param responseDispatcher The dispatcher used to send responses back to clients. * @param userRegistry The registry containing all currently connected users. */ - public SendMessageHandler(ResponseDispatcher responseDispatcher, UserRegistry userRegistry) { + public SendMessageHandler( + ResponseDispatcher responseDispatcher, + UserRegistry userRegistry, + LobbyManager lobbyManager) { super(responseDispatcher); this.userRegistry = userRegistry; + this.lobbyManager = lobbyManager; } /** @@ -42,6 +50,19 @@ public class SendMessageHandler extends CommandHandler { * @param message The {@link Message} object to be broadcast. */ public void broadcast(Message message) { + if (message != null + && message.getMessageType() == ChatType.LOBBY + && message.lobbyId >= 0 + && lobbyManager != null) { + lobbyManager.broadcast( + LobbyId.of(message.lobbyId), + username -> + userRegistry + .getByUsername(username) + .ifPresent(user -> user.enqueueMessage(message))); + return; + } + userRegistry.getAllUsers().forEach(user -> user.enqueueMessage(message)); } } diff --git a/src/main/resources/ui-structure/components/chatui/chattab.fxml b/src/main/resources/ui-structure/components/chatui/chattab.fxml index 5aa596f..ce3bf95 100644 --- a/src/main/resources/ui-structure/components/chatui/chattab.fxml +++ b/src/main/resources/ui-structure/components/chatui/chattab.fxml @@ -25,8 +25,8 @@ - -