From 9a6ac251426df95cd3fcc73972c4e5505902a126 Mon Sep 17 00:00:00 2001 From: ThePixelbrain <19214217+ThePixelbrain@users.noreply.github.com> Date: Fri, 28 Feb 2025 22:14:05 +0100 Subject: [PATCH 1/3] Allow more versatile implementations of Polychat clients --- .../client/clientbase/PolychatClient.java | 37 ++++++++++----- .../handlers/CommandMessageHandler.java | 1 - .../clientbase/logging/DefaultLogger.java | 45 +++++++++++++++++++ .../client/clientbase/logging/LogManager.java | 7 +++ .../client/clientbase/logging/Logger.java | 12 +++++ .../client/clientbase/util/MuteStorage.java | 8 ++-- 6 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/DefaultLogger.java create mode 100644 client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/LogManager.java create mode 100644 client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/Logger.java diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java index 948f6c4..0146cbd 100644 --- a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java @@ -4,6 +4,7 @@ import club.moddedminecraft.polychat.client.clientbase.handlers.CommandMessageHandler; import club.moddedminecraft.polychat.client.clientbase.handlers.PlayerStatusChangedMessageHandler; import club.moddedminecraft.polychat.client.clientbase.handlers.ServerStatusMessageHandler; +import club.moddedminecraft.polychat.client.clientbase.logging.LogManager; import club.moddedminecraft.polychat.client.clientbase.util.MuteStorage; import club.moddedminecraft.polychat.core.common.YamlConfig; import club.moddedminecraft.polychat.core.messagelibrary.PolychatProtobufMessageDispatcher; @@ -21,12 +22,12 @@ public class PolychatClient { private final ClientApiBase clientApi; - private final Client client; - private final PolychatProtobufMessageDispatcher polychatProtobufMessageDispatcher; - private final YamlConfig config; - private final String serverId; - private final ClientCallbacks clientCallbacks; - private final MuteStorage muteStorage; + private Client client; + private PolychatProtobufMessageDispatcher polychatProtobufMessageDispatcher; + private YamlConfig config; + private String serverId; + private ClientCallbacks clientCallbacks; + private MuteStorage muteStorage; private long lastUpdate = 0; private static final HashMap colorHashMap = new HashMap() {{ put(0, 0x000000); @@ -53,8 +54,18 @@ public class PolychatClient { * @param clientImpl the implementation of the client protocol */ public PolychatClient(ClientApiBase clientImpl) { - clientCallbacks = new ClientCallbacks(this); clientApi = clientImpl; + initialize(); + } + + public PolychatClient(ClientApiBase clientImpl, YamlConfig customConfig) { + clientApi = clientImpl; + config = customConfig; + initialize(); + } + + private void initialize() { + clientCallbacks = new ClientCallbacks(this); config = getConfig(); client = new Client(config.getOrDefault("server.address", "localhost"), config.getOrDefault("server.port", 5005), config.getOrDefault("server.buffersize", 32768)); @@ -79,6 +90,10 @@ public PolychatClient(ClientApiBase clientImpl) { * @return client config */ public YamlConfig getConfig() { + if (config != null) { + return config; + } + try { Path directory = clientApi.getConfigDirectory(); Path configPath = directory.resolve("polychat.yml"); @@ -90,8 +105,7 @@ public YamlConfig getConfig() { return YamlConfig.fromFilesystem(configPath); } catch (IOException e) { - System.err.println("Failed to load config!"); - e.printStackTrace(); + LogManager.LOGGER.error("Failed to load config!", e); } return YamlConfig.fromInMemoryString(""); } @@ -141,7 +155,7 @@ public void update() { try { messages = client.poll(); } catch (IOException e) { - System.err.println("Failed to reconnect to Polychat server"); + LogManager.LOGGER.warn("Failed to reconnect to Polychat server", e); } for (Message message : messages) { @@ -162,8 +176,7 @@ public void sendMessage(com.google.protobuf.Message message) { try { client.sendMessage(messageBytes); } catch (IOException e) { - System.err.println("Failed to send message!"); - e.printStackTrace(); + LogManager.LOGGER.warn("Failed to send message!", e); } } diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/handlers/CommandMessageHandler.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/handlers/CommandMessageHandler.java index 1ffc5fb..b41f4fd 100644 --- a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/handlers/CommandMessageHandler.java +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/handlers/CommandMessageHandler.java @@ -23,7 +23,6 @@ public class CommandMessageHandler { public CommandMessageHandler(ClientApiBase clientApiBase, PolychatClient client) { this.clientApiBase = clientApiBase; this.client = client; - System.out.println("command message handler"); } public int calculateParameters(String command) { diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/DefaultLogger.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/DefaultLogger.java new file mode 100644 index 0000000..74e09ba --- /dev/null +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/DefaultLogger.java @@ -0,0 +1,45 @@ +package club.moddedminecraft.polychat.client.clientbase.logging; + +public class DefaultLogger implements Logger { + @Override + public void error(String message) { + System.err.println(message); + } + + @Override + public void error(String message, Throwable t) { + System.err.println(message); + t.printStackTrace(); + } + + @Override + public void warn(String message) { + error(message); + } + + @Override + public void warn(String message, Throwable t) { + error(message, t); + } + + @Override + public void info(String message) { + System.out.println(message); + } + + @Override + public void info(String message, Throwable t) { + System.out.println(message); + t.printStackTrace(System.out); + } + + @Override + public void debug(String message) { + info(message); + } + + @Override + public void debug(String message, Throwable t) { + info(message, t); + } +} diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/LogManager.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/LogManager.java new file mode 100644 index 0000000..a51f461 --- /dev/null +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/LogManager.java @@ -0,0 +1,7 @@ +package club.moddedminecraft.polychat.client.clientbase.logging; + +public class LogManager { + public static Logger LOGGER = new DefaultLogger(); + + private LogManager() {} +} diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/Logger.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/Logger.java new file mode 100644 index 0000000..5674af9 --- /dev/null +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/logging/Logger.java @@ -0,0 +1,12 @@ +package club.moddedminecraft.polychat.client.clientbase.logging; + +public interface Logger { + void error(String message); + void error(String message, Throwable t); + void warn(String message); + void warn(String message, Throwable t); + void info(String message); + void info(String message, Throwable t); + void debug(String message); + void debug(String message, Throwable t); +} diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/util/MuteStorage.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/util/MuteStorage.java index a30b7fd..c2f0479 100644 --- a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/util/MuteStorage.java +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/util/MuteStorage.java @@ -1,5 +1,7 @@ package club.moddedminecraft.polychat.client.clientbase.util; +import club.moddedminecraft.polychat.client.clientbase.logging.LogManager; + import java.io.*; import java.nio.file.Path; import java.util.*; @@ -19,14 +21,14 @@ private void loadMutelist() { try { Object unparsed = new ObjectInputStream(new FileInputStream(path.resolve(FILENAME).toFile())).readObject(); if (!(unparsed instanceof UUID[])) { - System.err.println("Failed to parse mutelist!"); + LogManager.LOGGER.warn("Failed to parse mutelist!"); return; } UUID[] uuids = (UUID[]) unparsed; List tempList = Arrays.asList(uuids); Collections.addAll(muteList, uuids); } catch (IOException | ClassNotFoundException e) { - System.err.println("Failed to access mutelist!"); + LogManager.LOGGER.warn("Failed to access mutelist!"); } } @@ -54,7 +56,7 @@ private void writeList(ArrayList uuids) { UUID[] uuidArray = uuids.toArray(new UUID[0]); outputStream.writeObject(uuidArray); } catch (IOException e) { - System.err.println("Failed to access mutelist"); + LogManager.LOGGER.warn("Failed to access mutelist"); } } From 9e1f06b4ced88917fd2bfdc52a1b6746df9ecb06 Mon Sep 17 00:00:00 2001 From: ThePixelbrain <19214217+ThePixelbrain@users.noreply.github.com> Date: Sat, 1 Mar 2025 00:07:19 +0100 Subject: [PATCH 2/3] Bring back finals on fields in PolychatClient --- .../client/clientbase/PolychatClient.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java index 0146cbd..b8e1ff7 100644 --- a/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java +++ b/client/client-base/src/main/java/club/moddedminecraft/polychat/client/clientbase/PolychatClient.java @@ -22,12 +22,12 @@ public class PolychatClient { private final ClientApiBase clientApi; - private Client client; - private PolychatProtobufMessageDispatcher polychatProtobufMessageDispatcher; - private YamlConfig config; - private String serverId; - private ClientCallbacks clientCallbacks; - private MuteStorage muteStorage; + private final Client client; + private final PolychatProtobufMessageDispatcher polychatProtobufMessageDispatcher; + private final YamlConfig config; + private final String serverId; + private final ClientCallbacks clientCallbacks; + private final MuteStorage muteStorage; private long lastUpdate = 0; private static final HashMap colorHashMap = new HashMap() {{ put(0, 0x000000); @@ -54,19 +54,13 @@ public class PolychatClient { * @param clientImpl the implementation of the client protocol */ public PolychatClient(ClientApiBase clientImpl) { - clientApi = clientImpl; - initialize(); + this(clientImpl, null); } public PolychatClient(ClientApiBase clientImpl, YamlConfig customConfig) { clientApi = clientImpl; - config = customConfig; - initialize(); - } - - private void initialize() { + config = customConfig != null ? customConfig : getConfig(); clientCallbacks = new ClientCallbacks(this); - config = getConfig(); client = new Client(config.getOrDefault("server.address", "localhost"), config.getOrDefault("server.port", 5005), config.getOrDefault("server.buffersize", 32768)); polychatProtobufMessageDispatcher = new PolychatProtobufMessageDispatcher(); From ea07e8deee97ca31d94750cb34d83d71f93dd720 Mon Sep 17 00:00:00 2001 From: ThePixelbrain <19214217+ThePixelbrain@users.noreply.github.com> Date: Thu, 29 May 2025 21:06:59 +0200 Subject: [PATCH 3/3] Thread-safe message sending queue --- .../polychat/core/networklibrary/ConnectedClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/network-library/src/main/java/club/moddedminecraft/polychat/core/networklibrary/ConnectedClient.java b/core/network-library/src/main/java/club/moddedminecraft/polychat/core/networklibrary/ConnectedClient.java index 769a8cb..1ca3e72 100644 --- a/core/network-library/src/main/java/club/moddedminecraft/polychat/core/networklibrary/ConnectedClient.java +++ b/core/network-library/src/main/java/club/moddedminecraft/polychat/core/networklibrary/ConnectedClient.java @@ -3,8 +3,8 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; -import java.util.ArrayDeque; import java.util.List; +import java.util.concurrent.ConcurrentLinkedDeque; /** * This class represents a currently connected client to the server. This class is not to be used (except as an @@ -16,14 +16,14 @@ public final class ConnectedClient{ private ClientStatus currentStatus = ClientStatus.CONNECTING; private ByteBuffer readBuffer; private ByteBuffer sendBuffer; - private ArrayDeque sendQueue; + private ConcurrentLinkedDeque sendQueue; ConnectedClient(SocketChannel socketChannel, int bufferSize) throws IOException{ this.socketChannel = socketChannel; socketChannel.configureBlocking(false); readBuffer = ByteBuffer.allocateDirect(bufferSize); sendBuffer = ByteBuffer.allocateDirect(bufferSize); - sendQueue = new ArrayDeque<>(); + sendQueue = new ConcurrentLinkedDeque<>(); //setup initial state for poll() function readBuffer.clear();