diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java new file mode 100644 index 0000000..89119a8 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/chat/ChatClientInterface.java @@ -0,0 +1,13 @@ +package ch.unibas.dmi.dbis.cs108.casono.client.chat; + +import java.util.List; + +/** Interface used to create test instances of the ChatClient */ +public interface ChatClientInterface { + + List getMessages(); + + void sendMessage(Message message); + + List getUsers(); +} 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 09d7838..58fb787 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 @@ -33,9 +33,9 @@ public class ChatController { private volatile String username; - private final ClientService clientService; + private ClientService clientService; - private final ChatClient chatClient; + private final ChatClientInterface chatClient; public ChatBoxController getChatBoxController() { return chatBoxController; @@ -112,6 +112,39 @@ public class ChatController { REFRESH_TIME); } + /** + * Another constructor to give the ChatClient directly instead of the Client Service used only + * for test purposes + * + * @param username + */ + public ChatController(String username, ChatClientInterface chatClient) { + this.username = username; + this.chatClient = chatClient; + chatModelMap = new LinkedHashMap<>(); + localUserList = new ArrayList<>(); + this.chatBoxController = new ChatBoxController(username, this); + this.logger = LogManager.getLogger(ChatController.class); + this.serverEventListener = this::handleServerEvent; + this.activeChatControllers = new HashMap<>(); + + this.timer = new Timer(true); + timer.schedule( + new TimerTask() { + @Override + public void run() { + try { + receiveMessage(); + checkWhisperUsers(); + } catch (RuntimeException e) { + logger.warn("Chat refresh failed: {}", e.getMessage()); + } + } + }, + 0, + REFRESH_TIME); + } + private void registerAsActiveController(ClientService clientService) { synchronized (ACTIVE_CONTROLLERS) { ChatController oldController = ACTIVE_CONTROLLERS.get(clientService); 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 6cbca3c..e8949fe 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 @@ -2,8 +2,6 @@ package ch.unibas.dmi.dbis.cs108.casono.client.chat; import java.util.ArrayList; import java.util.function.Consumer; -import javafx.beans.property.IntegerProperty; -import javafx.beans.property.SimpleIntegerProperty; /** * ChatModel, stores the data for a specific chat @@ -12,7 +10,7 @@ import javafx.beans.property.SimpleIntegerProperty; */ public class ChatModel { - private ArrayList> listeners = new ArrayList<>(); + private final ArrayList> listeners = new ArrayList<>(); public ArrayList messages; @@ -24,8 +22,6 @@ public class ChatModel { /** The person to send the message to If the chat is a whisper chat */ private String target; - private final IntegerProperty count; - public int lobbyId; /** @@ -37,10 +33,9 @@ public class ChatModel { * @param target The username of the whisper recipient, or null for other chat types. */ public ChatModel(ChatType chattype, String username, int lobbyId, String target) { - this.messages = new ArrayList(); + this.messages = new ArrayList<>(); this.chattype = chattype; this.username = username; - this.count = new SimpleIntegerProperty(0); this.lobbyId = lobbyId; this.target = target; } @@ -62,7 +57,7 @@ public class ChatModel { */ public synchronized void addMessage(Message msg) { messages.add(msg); - listeners.stream().forEach((l) -> l.accept(messages.getLast())); + listeners.forEach((l) -> l.accept(messages.getLast())); } /** 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 abe2ec1..4decd18 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 @@ -15,8 +15,8 @@ public class Message { private final String message; public String sender; public String timestamp; - public int lobbyId = 0; - public String target = null; + public int lobbyId; + public String target; /** * Constructs a Message with a provided timestamp. Typically used when reconstructing messages @@ -100,7 +100,7 @@ public class Message { * @return A formatted string containing all message attributes for server transmission. */ public String toArgsString() { - String gameIdString = ""; + String gameIdString; if (lobbyId >= 0) { gameIdString = " GAME=" + lobbyId; } else { 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 298e557..d46ce22 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 @@ -1,5 +1,6 @@ package ch.unibas.dmi.dbis.cs108.casono.client.network; +import ch.unibas.dmi.dbis.cs108.casono.client.chat.ChatClientInterface; import ch.unibas.dmi.dbis.cs108.casono.client.chat.Message; import ch.unibas.dmi.dbis.cs108.casono.server.network.command.parsing.RequestParameter; import java.util.ArrayList; @@ -12,7 +13,7 @@ import org.apache.logging.log4j.Logger; * from the server. It uses the ClientService to send commands and receive responses from the * server. */ -public class ChatClient { +public class ChatClient implements ChatClientInterface { private final ClientService clientService; private final Logger logger; diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java index 46bfe4f..897bc04 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatBoxController.java @@ -195,8 +195,7 @@ public class ChatBoxController { () -> { try { ChatViewController chatViewController = - new ChatViewController( - this.chatController, chatModel, this); + new ChatViewController(this.chatController, chatModel, this); ChatKey chatKey; if (chatType.equals(ChatType.WHISPER)) { diff --git a/src/main/resources/ui-structure/gameuicomponents/chatui/chatbox.fxml b/src/main/resources/ui-structure/gameuicomponents/chatui/chatbox.fxml deleted file mode 100644 index 98db056..0000000 --- a/src/main/resources/ui-structure/gameuicomponents/chatui/chatbox.fxml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -