From c0c9225d423cf355721526b6aef55ef14a52a5fb Mon Sep 17 00:00:00 2001 From: Mathis Ginkel Date: Wed, 8 Apr 2026 23:06:25 +0200 Subject: [PATCH] Fix: Parsing of Server Responses for Client Chat --- .../dbis/cs108/casono/client/ClientApp.java | 1 + .../casono/client/chat/ChatController.java | 4 +- .../cs108/casono/client/chat/ChatModel.java | 16 ++--- .../cs108/casono/client/chat/Message.java | 72 +++++++++++++++---- .../casono/client/network/ChatClient.java | 34 ++++----- .../casono/client/network/ClientService.java | 66 ++++++++++++----- .../casono/client/network/GameClient.java | 9 +-- .../casono/client/network/LobbyClient.java | 6 +- .../client/ui/chatui/ChatBoxController.java | 2 +- .../client/ui/chatui/ChatViewController.java | 16 ++--- .../GetNextMessageHandler.java | 2 +- .../GetNextMessageResponse.java | 5 +- .../send_message/SendMessageParser.java | 2 +- .../components/chatui/chatbox.fxml | 4 +- .../components/chatui/chattab.fxml | 12 ++-- .../casono/client/chat/ChatApplication.java | 6 +- .../cs108/casono/client/chat/ChatTest.java | 32 +++++++++ 17 files changed, 196 insertions(+), 93 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java index fa680ba..c839930 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ClientApp.java @@ -3,6 +3,7 @@ package ch.unibas.dmi.dbis.cs108.casono.client; /** * Entry point for the Casono client application. Handles client startup and connection parameters. */ + import ch.unibas.dmi.dbis.cs108.casono.client.ui.Launcher; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; 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 a3861a5..dfccf24 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 @@ -77,13 +77,14 @@ public class ChatController { switch (msg.getMessageType()) { case ChatType.GLOBAL: chatModelMap.get(new ChatKey(ChatType.GLOBAL)).addMessage(msg); + break; case ChatType.LOBBY: if (msg.lobbyId == lobbyId) { chatModelMap.computeIfAbsent(new ChatKey(ChatType.LOBBY), (_key) -> new ChatModel(ChatType.LOBBY, username, msg.lobbyId, null)).addMessage(msg); } + break; case ChatType.WHISPER: - // TODO: Check, if target person is user and if yes, iterate through all if (msg.target.equals(username)) { if (chatModelMap.containsKey(new ChatKey(ChatType.WHISPER, msg.sender))) { chatModelMap.get(new ChatKey(ChatType.WHISPER, msg.sender)).addMessage(msg); @@ -93,6 +94,7 @@ public class ChatController { chatBoxController.addWhisperChat(msg.sender, value); } } + break; } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatModel.java index 894d957..39958f8 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatModel.java @@ -1,10 +1,10 @@ package ch.unibas.dmi.dbis.cs108.casono.client.chat; -import ch.unibas.dmi.dbis.cs108.casono.client.ui.chatui.ChatViewController; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import java.util.ArrayList; +import java.util.function.Consumer; /** * ChatModel, stores the data for a specific chat @@ -13,6 +13,8 @@ import java.util.ArrayList; */ public class ChatModel { + private ArrayList> listeners = new ArrayList<>(); + public ArrayList messages; private final ChatType chattype; @@ -62,18 +64,12 @@ public class ChatModel { */ public synchronized void addMessage(Message msg) { messages.add(msg); - count.add(1); + listeners.stream().forEach((l)-> l.accept(messages.getLast())); } - public void addListener(ChatViewController chatViewController) { - count.addListener( - (_count, _p, n) -> - { - if(n.intValue() > 0) { - chatViewController.showMessage(); - } - }); + public void addListener(Consumer listener) { + this.listeners.add(listener); } public String getTarget() { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/Message.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/Message.java index 7869271..4e3147b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/Message.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/Message.java @@ -1,12 +1,14 @@ package ch.unibas.dmi.dbis.cs108.casono.client.chat; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBody; +import ch.unibas.dmi.dbis.cs108.casono.server.network.protocol.response.builder.ResponseBodyBuilder; import org.jspecify.annotations.NonNull; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.List; -import java.util.regex.Matcher; +import java.util.Optional; import java.util.regex.Pattern; /** @@ -80,10 +82,16 @@ public class Message { * @return - request as specified in the network protocol, as String */ public String toArgsString() { + String gameIdString=""; + if(lobbyId >= 0) { + gameIdString=" GAME="+lobbyId; + } else { + gameIdString=" GAME='-1'"; + } return String.format( - "TYPE=%s GAME=%d USER=%s TARGET=%s TIME=%s TEXT='%s'", + "TYPE=%s%s USER='%s' TARGET='%s' TIME='%s' TEXT='%s'", this.type.toString(), - this.lobbyId, + gameIdString, this.sender, this.target, this.timestamp, @@ -93,16 +101,18 @@ public class Message { /** Pattern, to analyze the response String with the given parameters */ public static Pattern msgRex = Pattern.compile( - "TYPE=(?\\w+) " + "GAME=(?\\w+) " + - "USER=(?\\w+) " + "TARGET=(?\\w+) " + + "TYPE=(?\\w+) " + "(GAME=(?\\w+) )?" + + "USER=(?\\w+) " + "(TARGET=(?\\w+) )?" + "TIME=(?