From d81ee26371334998ba85ddce99a6d16563a29060 Mon Sep 17 00:00:00 2001 From: Finn Date: Wed, 24 Jul 2024 16:58:38 +0200 Subject: [PATCH] NetworkSystem rework --- .idea/copyright/profiles_settings.xml | 3 + .../network/system/client/NetworkClient.java | 483 ++++++++---------- .../received/C_PacketFailedReceivedEvent.java | 10 +- .../received/C_PacketReceivedEvent.java | 8 +- .../C_UnknownObjectReceivedEvent.java | 13 +- .../send/C_PacketFailedSendEvent.java | 10 +- .../{packets => }/send/C_PacketSendEvent.java | 8 +- .../client/events/state/C_ConnectedEvent.java | 6 +- .../events/state/C_DisconnectedEvent.java | 6 +- ...t.java => C_ReceiveThreadFailedEvent.java} | 10 +- .../network/system/packets/Packet.java | 12 +- .../network/system/packets/PacketHandler.java | 37 +- .../network/system/packets/SystemPacket.java | 15 + .../packets/impl/ClientDisconnectPacket.java | 48 ++ .../system/packets/impl/ClientIDPacket.java | 42 ++ .../network/system/server/ClientHandler.java | 181 ------- .../system/server/ConnectionHandler.java | 148 ++++++ .../network/system/server/NetworkServer.java | 412 ++++++++------- .../received/S_PacketFailedReceivedEvent.java | 44 -- .../received/S_PacketReceivedEvent.java | 44 -- .../S_UnknownObjectReceivedEvent.java | 43 -- .../packets/send/S_PacketFailedSendEvent.java | 44 -- .../packets/send/S_PacketSendEvent.java | 44 -- .../client/state/S_ClientConnectedEvent.java | 40 -- .../state/S_ClientDisconnectedEvent.java | 40 -- .../client/state/S_ClientStoppedEvent.java | 40 -- .../connection/S_IncomingConnectionEvent.java | 33 ++ ...S_IncomingConnectionThreadFailedEvent.java | 31 ++ .../received/S_PacketFailedReceivedEvent.java | 26 + .../received/S_PacketReceivedEvent.java | 24 + .../received/S_ReceiveThreadFailedEvent.java | 22 + .../S_UnknownObjectReceivedEvent.java | 22 + .../packets/send/S_PacketFailedSendEvent.java | 34 ++ .../packets/send/S_PacketSendEvent.java | 32 ++ .../server/events/server/S_StartedEvent.java | 41 -- .../server/events/server/S_StoppedEvent.java | 41 -- .../S_ConnectionHandlerConnectedEvent.java | 21 + .../S_ConnectionHandlerDisconnectedEvent.java | 21 + .../events/state/server/S_StartedEvent.java | 37 ++ .../events/state/server/S_StoppedEvent.java | 37 ++ .../me/finn/unlegitlibrary/utils/Logger.java | 175 +++++++ 41 files changed, 1294 insertions(+), 1094 deletions(-) create mode 100644 .idea/copyright/profiles_settings.xml rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/{packets => }/received/C_PacketFailedReceivedEvent.java (75%) rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/{packets => }/received/C_PacketReceivedEvent.java (79%) rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/{packets => }/received/C_UnknownObjectReceivedEvent.java (72%) rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/{packets => }/send/C_PacketFailedSendEvent.java (76%) rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/{packets => }/send/C_PacketSendEvent.java (80%) rename src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/{C_StoppedEvent.java => C_ReceiveThreadFailedEvent.java} (75%) create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/packets/SystemPacket.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientDisconnectPacket.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientIDPacket.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/ClientHandler.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/ConnectionHandler.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketFailedReceivedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketReceivedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_UnknownObjectReceivedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketFailedSendEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketSendEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientConnectedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientDisconnectedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientStoppedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionThreadFailedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketFailedReceivedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketReceivedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_ReceiveThreadFailedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_UnknownObjectReceivedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketFailedSendEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketSendEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StartedEvent.java delete mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StoppedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerConnectedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerDisconnectedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StartedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StoppedEvent.java create mode 100644 src/main/java/me/finn/unlegitlibrary/utils/Logger.java diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..4e1b17d --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java index dd72e7c..545d2ed 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/NetworkClient.java @@ -9,56 +9,121 @@ package me.finn.unlegitlibrary.network.system.client; import me.finn.unlegitlibrary.event.EventManager; -import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_PacketFailedReceivedEvent; -import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_PacketReceivedEvent; -import me.finn.unlegitlibrary.network.system.client.events.packets.received.C_UnknownObjectReceivedEvent; -import me.finn.unlegitlibrary.network.system.client.events.packets.send.C_PacketFailedSendEvent; -import me.finn.unlegitlibrary.network.system.client.events.packets.send.C_PacketSendEvent; +import me.finn.unlegitlibrary.network.system.client.events.received.C_PacketFailedReceivedEvent; +import me.finn.unlegitlibrary.network.system.client.events.received.C_PacketReceivedEvent; +import me.finn.unlegitlibrary.network.system.client.events.received.C_UnknownObjectReceivedEvent; +import me.finn.unlegitlibrary.network.system.client.events.send.C_PacketFailedSendEvent; +import me.finn.unlegitlibrary.network.system.client.events.send.C_PacketSendEvent; import me.finn.unlegitlibrary.network.system.client.events.state.C_ConnectedEvent; import me.finn.unlegitlibrary.network.system.client.events.state.C_DisconnectedEvent; -import me.finn.unlegitlibrary.network.system.client.events.state.C_StoppedEvent; +import me.finn.unlegitlibrary.network.system.client.events.state.C_ReceiveThreadFailedEvent; import me.finn.unlegitlibrary.network.system.packets.Packet; import me.finn.unlegitlibrary.network.system.packets.PacketHandler; +import me.finn.unlegitlibrary.network.system.packets.impl.ClientDisconnectPacket; +import me.finn.unlegitlibrary.network.system.packets.impl.ClientIDPacket; import me.finn.unlegitlibrary.utils.DefaultMethodsOverrider; +import me.finn.unlegitlibrary.utils.Logger; -import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.Socket; -import java.net.SocketException; public class NetworkClient extends DefaultMethodsOverrider { + public static class ClientBuilder extends DefaultMethodsOverrider { + private String host; + private int port; + + private PacketHandler packetHandler; + private EventManager eventManager; + private Logger logger; + + private int maxReconnectAttempts = 0; + private int reconnectDelay = 3000; + private int timeout = 3000; + + public final NetworkClient build() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + return new NetworkClient(host, port ,packetHandler, eventManager, logger, maxReconnectAttempts, reconnectDelay, timeout); + } + + public final ClientBuilder setEventManager(EventManager eventManager) { + this.eventManager = eventManager; + return this; + } + + public final ClientBuilder setHost(String host) { + this.host = host; + return this; + } + + public final ClientBuilder setLogger(Logger logger) { + this.logger = logger; + return this; + } + + public final ClientBuilder setMaxReconnectAttempts(int maxReconnectAttempts) { + this.maxReconnectAttempts = maxReconnectAttempts; + return this; + } + + public final ClientBuilder setPacketHandler(PacketHandler packetHandler) { + this.packetHandler = packetHandler; + return this; + } + + public final ClientBuilder setPort(int port) { + this.port = port; + return this; + } + + public final ClientBuilder setReconnectDelay(int reconnectDelay) { + this.reconnectDelay = reconnectDelay; + return this; + } + + public final ClientBuilder setTimeout(int timeout) { + this.timeout = timeout; + return this; + } + } + private final String host; private final int port; private final PacketHandler packetHandler; private final EventManager eventManager; + private final Logger logger; - private final boolean debugLog; - private final int maxAttempts; - private final int attemptDelayInSec; + private int currentAttempts; + private final int maxReconnectAttempts; + private final int reconnectDelay; private Socket socket; - private ObjectOutputStream objectOutputStream; - private ObjectInputStream objectInputStream; + private int timeout; + private ObjectOutputStream outputStream; + private ObjectInputStream inputStream; private int clientID = -1; - private int attempt = 1; - private boolean needClientID = false; - private final Thread receiveThread = new Thread(this::receive); + public final Thread receiveThread = new Thread(this::receive); - private NetworkClient(String host, int port, PacketHandler packetHandler, EventManager eventManager, boolean debugLog, int maxAttempts, int attemptDelayInSec) { + private NetworkClient(String host, int port, PacketHandler packetHandler, EventManager eventManager, Logger logger, int reconnectAttempts, int reconnectDelay, int timeout) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { this.host = host; this.port = port; + this.clientID = -1; + this.timeout = timeout; this.packetHandler = packetHandler; this.eventManager = eventManager; - this.debugLog = debugLog; + this.logger = logger; - this.maxAttempts = maxAttempts; - this.attemptDelayInSec = attemptDelayInSec; - this.attempt = 1; + this.maxReconnectAttempts = reconnectAttempts; + this.reconnectDelay = reconnectDelay; + this.currentAttempts = 0; + + this.packetHandler.setClientInstance(this); + this.packetHandler.registerPacket(ClientDisconnectPacket.class); + this.packetHandler.registerPacket(ClientIDPacket.class); } public final int getClientID() { @@ -69,40 +134,36 @@ public class NetworkClient extends DefaultMethodsOverrider { return socket; } - public final ObjectOutputStream getObjectOutputStream() { - return objectOutputStream; - } - - public final ObjectInputStream getObjectInputStream() { - return objectInputStream; - } - - public final boolean isDebugLogEnabled() { - return debugLog; - } - - public final boolean isAutoReconnectEnabled() { - return maxAttempts != 0; - } - - public final PacketHandler getPacketHandler() { - return packetHandler; - } - - public final boolean isNeedClientID() { - return needClientID; - } - - public final int getPort() { - return port; + public final EventManager getEventManager() { + return eventManager; } public final String getHost() { return host; } - public final Thread getReceiveThread() { - return receiveThread; + public final int getPort() { + return port; + } + + public final ObjectInputStream getInputStream() { + return inputStream; + } + + public final ObjectOutputStream getOutputStream() { + return outputStream; + } + + public final PacketHandler getPacketHandler() { + return packetHandler; + } + + public final boolean isAutoReconnectEnabled() { + return maxReconnectAttempts != 0; + } + + public final Logger getLogger() { + return logger; } public final boolean isConnected() { @@ -110,236 +171,144 @@ public class NetworkClient extends DefaultMethodsOverrider { && receiveThread.isAlive() && !receiveThread.isInterrupted(); } - public synchronized final void connect() throws IOException, InterruptedException { - try { - if (isConnected()) return; - if (debugLog) System.out.println("Connecting to server..."); + public final Thread getReceiveThread() { + return receiveThread; + } - socket = new Socket(host, port); - socket.setTcpNoDelay(false); - - objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); - objectInputStream = new ObjectInputStream(socket.getInputStream()); - - needClientID = true; - receiveThread.start(); - - objectOutputStream.writeObject("c2s_connect"); - objectOutputStream.writeObject(clientID); - objectOutputStream.flush(); - - attempt = 1; - if (debugLog) System.out.println("Connected to Server. Attempts: " + attempt); - } catch (SocketException exception) { - if (isAutoReconnectEnabled()) reconnect(); - else if (!receiveThread.isInterrupted()) throw exception; + public final void setClientID(int clientID) { + if (this.clientID == -1) { + this.clientID = clientID; + eventManager.executeEvent(new C_ConnectedEvent(this)); } } - public final EventManager getEventManager() { - return eventManager; - } + public synchronized boolean disconnect(boolean sendDisconnectPacket) { + if (logger == null) System.out.println("Disconnecting from server..."); + else logger.info("Disconnecting from server..."); - public synchronized final void disconnect() throws IOException { - if (debugLog) System.out.println("Disconnecting from server..."); - - if (isConnected()) { - objectOutputStream.writeObject("c2s_disconnect"); - objectOutputStream.writeObject(clientID); - objectOutputStream.flush(); - } - - eventManager.executeEvent(new C_DisconnectedEvent(this)); - if (debugLog) System.out.println("Disconnected from server."); - stop(); - } - - private synchronized final void stop() throws IOException { - if (debugLog) System.out.println("Stopping client..."); - - if (isConnected()) { - objectOutputStream.close(); - objectInputStream.close(); - socket.close(); - } - - objectOutputStream = null; - objectInputStream = null; - socket = null; - - needClientID = false; - clientID = -1; - attempt = 1; receiveThread.interrupt(); - eventManager.executeEvent(new C_StoppedEvent(this)); - if (debugLog) System.out.println("Client stopped."); - } + if (isConnected()) { + if (sendDisconnectPacket) sendPacket(new ClientDisconnectPacket(clientID, true)); - public final boolean sendPacket(Packet packet) throws IOException, ClassNotFoundException { - if (!isConnected()) return false; - - if (packetHandler.sendPacket(packet, objectOutputStream)) { - eventManager.executeEvent(new C_PacketSendEvent(this, packet)); - return true; - } else { - eventManager.executeEvent(new C_PacketFailedSendEvent(this, packet)); - return false; + try { + outputStream.close(); + inputStream.close(); + socket.close(); + } catch (IOException exception) { + if (logger == null) System.err.println("Failed to close socket: " + exception.getMessage()); + else logger.exception("Failed to close socket", exception); + } } + + outputStream = null; + inputStream = null; + socket = null; + + clientID = -1; + currentAttempts = 0; + + eventManager.executeEvent(new C_DisconnectedEvent(this)); + if (logger == null) System.out.println("Disconnected from server"); + else logger.info("Disconnected from server..."); + + if (maxReconnectAttempts != 0) { + try { + Thread.sleep(reconnectDelay); + } catch (InterruptedException sleepThreadException) { + if (logger == null) System.err.println("Reconnect exception: " + sleepThreadException.getMessage()); + else logger.exception("Reconnect exception", sleepThreadException); + } + + currentAttempts++; + if (currentAttempts <= maxReconnectAttempts || maxReconnectAttempts < 0) return connect(); + } + + return true; } - private final void receive() { + public synchronized final boolean connect() { + if (isConnected()) return false; + + if (logger == null) System.out.println("Trying to connect to " + host + ":" + port); + else logger.info("Trying to connect to " + host + ":" + port); try { - if (!isConnected()) return; - String command = ""; + socket = new Socket(host, port); + socket.setTcpNoDelay(true); + socket.setSoTimeout(timeout); - while (isConnected()) { - Object received = objectInputStream.readObject(); + outputStream = new ObjectOutputStream(socket.getOutputStream()); + inputStream = new ObjectInputStream(socket.getInputStream()); - if (received instanceof String) { - command = (String) received; - continue; + receiveThread.start(); + + if (currentAttempts == 0) currentAttempts++; + if (logger == null) System.out.println("Connected to " + host + ":" + port + " (Attempts: " + currentAttempts + ")"); + else logger.info("Connected to " + host + ":" + port + " (Attempts: " + currentAttempts + ")"); + + currentAttempts = 0; + return true; + } catch (IOException exception) { + if (maxReconnectAttempts != 0) { + try { + Thread.sleep(reconnectDelay); + } catch (InterruptedException sleepThreadException) { + if (logger == null) System.err.println("Reconnect exception: " + sleepThreadException.getMessage()); + else logger.exception("Reconnect exception", sleepThreadException); } + currentAttempts++; + if (currentAttempts <= maxReconnectAttempts || maxReconnectAttempts < 0) return connect(); + } + + if (logger == null) System.err.println("Failed to connect to " + host + ":" + port + ": " + exception.getMessage()); + else logger.exception("Failed to connect to " + host + ":" + port, exception); + } + + return false; + } + + public final boolean sendPacket(Packet packet) { + if (!isConnected()) return false; + + try { + if (packetHandler.sendPacket(packet, outputStream)) { + eventManager.executeEvent(new C_PacketSendEvent(this, packet)); + return true; + } else eventManager.executeEvent(new C_PacketFailedSendEvent(this, packet, null)); + } catch (IOException | ClassNotFoundException exception) { + if (logger == null) System.err.println("Failed to send packet: " + exception.getMessage()); + else logger.exception("Failed to connect to send packet", exception); + + eventManager.executeEvent(new C_PacketFailedSendEvent(this, packet, exception)); + } + + return false; + } + + private void receive() { + if (!isConnected()) return; + + while (isConnected()) { + try { + Object received = inputStream.readObject(); + if (received instanceof Integer) { int id = (Integer) received; - if (command.equalsIgnoreCase("s2c_connect")) { - clientID = id; - command = ""; + Packet packet = packetHandler.getPacketByID(id); + if (packetHandler.handlePacket(id, packet, inputStream)) + eventManager.executeEvent(new C_PacketReceivedEvent(this, packet)); + else eventManager.executeEvent(new C_PacketFailedReceivedEvent(this, packet, null)); + } else eventManager.executeEvent(new C_UnknownObjectReceivedEvent(this, received)); + } catch (IOException | ClassNotFoundException exception) { + if (logger == null) System.err.println("Receive thread failed: " + exception.getMessage()); + else logger.exception("Receive thread failed", exception); - eventManager.executeEvent(new C_ConnectedEvent(this)); - continue; - } else if (command.equalsIgnoreCase("s2c_disconnect")) { - if (clientID != id) continue; - eventManager.executeEvent(new C_DisconnectedEvent(this)); - command = ""; - - stop(); - break; - } else if (packetHandler.getPacketByID(id) != null) { - command = ""; - Packet packet = packetHandler.getPacketByID(id); - - if (packetHandler.handlePacket(id, packet, objectInputStream)) - eventManager.executeEvent(new C_PacketReceivedEvent(this, packet)); - else eventManager.executeEvent(new C_PacketFailedReceivedEvent(this, packet)); - - continue; - } - } - - eventManager.executeEvent(new C_UnknownObjectReceivedEvent(this, received)); - } - } catch (EOFException exception) { - attempt = 1; - if (isAutoReconnectEnabled()) reconnect(); - else if (!receiveThread.isInterrupted()) { - try { - stop(); - } catch (IOException exception1) { - exception.printStackTrace(); - exception1.printStackTrace(); - } - } - } catch (ClassNotFoundException exception) { - exception.printStackTrace(); - } catch (IOException exception) { - eventManager.executeEvent(new C_StoppedEvent(this)); - if (!receiveThread.isInterrupted()) { - try { - stop(); - } catch (IOException exception1) { - exception.printStackTrace(); - exception1.printStackTrace(); - } + eventManager.executeEvent(new C_ReceiveThreadFailedEvent(this, exception)); } } - } - private final void reconnect() { - if (isAutoReconnectEnabled()) { - if (isConnected()) { - try { - disconnect(); - } catch (IOException exception) { - if (maxAttempts > 0 && attempt > maxAttempts) { - eventManager.executeEvent(new C_StoppedEvent(this)); - if (!receiveThread.isInterrupted()) exception.printStackTrace(); - return; - } - } - } - - if (debugLog) System.out.println("Trying to reconnect... (Attempt: " + attempt++ + ")"); - - try { - Thread.sleep(attemptDelayInSec * 1000L); - connect(); - } catch (InterruptedException | IOException exception) { - if (maxAttempts == -1) reconnect(); - else if (attempt <= maxAttempts) reconnect(); - else { - eventManager.executeEvent(new C_StoppedEvent(this)); - if (!receiveThread.isInterrupted()) exception.printStackTrace(); - } - } - } else { - try { - stop(); - } catch (IOException exception) { - eventManager.executeEvent(new C_StoppedEvent(this)); - if (!receiveThread.isInterrupted()) exception.printStackTrace(); - } - } - } - - public static class ClientBuilder { - private int port; - private String host; - private PacketHandler packetHandler = new PacketHandler(); - private EventManager eventManager = new EventManager(); - private boolean debugLog = false; - private int maxAttempts = 0; - private int attemptDelayInSec = 1; - - public final ClientBuilder enableDebugLog() { - this.debugLog = true; - return this; - } - - public final ClientBuilder setEventManager(EventManager eventManager) { - this.eventManager = eventManager; - return this; - } - - public final ClientBuilder setPort(int port) { - this.port = port; - return this; - } - - public final ClientBuilder setHost(String host) { - this.host = host; - return this; - } - - public final ClientBuilder setPacketHandler(PacketHandler packetHandler) { - this.packetHandler = packetHandler; - return this; - } - - public final ClientBuilder setAttemptDelayInSeconds(int attemptDelayInSec) { - this.attemptDelayInSec = attemptDelayInSec; - return this; - } - - public final ClientBuilder setMaxAttempts(int maxAttempts) { - this.maxAttempts = maxAttempts; - return this; - } - - public final NetworkClient build() { - return new NetworkClient(host, port, packetHandler, eventManager, debugLog, maxAttempts, attemptDelayInSec); - } + disconnect(false); } } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketFailedReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketFailedReceivedEvent.java similarity index 75% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketFailedReceivedEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketFailedReceivedEvent.java index 7c8977d..b184bbe 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketFailedReceivedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketFailedReceivedEvent.java @@ -6,7 +6,7 @@ * See LICENSE-File if exists */ -package me.finn.unlegitlibrary.network.system.client.events.packets.received; +package me.finn.unlegitlibrary.network.system.client.events.received; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; @@ -14,12 +14,14 @@ import me.finn.unlegitlibrary.network.system.packets.Packet; public class C_PacketFailedReceivedEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; public final Packet packet; + public final Exception exception; - public C_PacketFailedReceivedEvent(NetworkClient networkClient, Packet packet) { - this.networkClient = networkClient; + public C_PacketFailedReceivedEvent(NetworkClient client, Packet packet, Exception exception) { + this.client = client; this.packet = packet; + this.exception = exception; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketReceivedEvent.java similarity index 79% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketReceivedEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketReceivedEvent.java index 20a64e3..a4aa5e4 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_PacketReceivedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_PacketReceivedEvent.java @@ -6,7 +6,7 @@ * See LICENSE-File if exists */ -package me.finn.unlegitlibrary.network.system.client.events.packets.received; +package me.finn.unlegitlibrary.network.system.client.events.received; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; @@ -14,11 +14,11 @@ import me.finn.unlegitlibrary.network.system.packets.Packet; public class C_PacketReceivedEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; public final Packet packet; - public C_PacketReceivedEvent(NetworkClient networkClient, Packet packet) { - this.networkClient = networkClient; + public C_PacketReceivedEvent(NetworkClient client, Packet packet) { + this.client = client; this.packet = packet; } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_UnknownObjectReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_UnknownObjectReceivedEvent.java similarity index 72% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_UnknownObjectReceivedEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_UnknownObjectReceivedEvent.java index cb867de..6511725 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/received/C_UnknownObjectReceivedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/received/C_UnknownObjectReceivedEvent.java @@ -6,18 +6,19 @@ * See LICENSE-File if exists */ -package me.finn.unlegitlibrary.network.system.client.events.packets.received; +package me.finn.unlegitlibrary.network.system.client.events.received; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; public class C_UnknownObjectReceivedEvent extends Event { - public final NetworkClient networkClient; - public final Object object; - public C_UnknownObjectReceivedEvent(NetworkClient networkClient, Object object) { - this.networkClient = networkClient; - this.object = object; + public final NetworkClient client; + public final Object received; + + public C_UnknownObjectReceivedEvent(NetworkClient client, Object received) { + this.client = client; + this.received = received; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketFailedSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketFailedSendEvent.java similarity index 76% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketFailedSendEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketFailedSendEvent.java index d9fc0df..3eac412 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketFailedSendEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketFailedSendEvent.java @@ -6,7 +6,7 @@ * See LICENSE-File if exists */ -package me.finn.unlegitlibrary.network.system.client.events.packets.send; +package me.finn.unlegitlibrary.network.system.client.events.send; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; @@ -14,12 +14,14 @@ import me.finn.unlegitlibrary.network.system.packets.Packet; public class C_PacketFailedSendEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; public final Packet packet; + public final Exception exception; - public C_PacketFailedSendEvent(NetworkClient networkClient, Packet packet) { - this.networkClient = networkClient; + public C_PacketFailedSendEvent(NetworkClient client, Packet packet, Exception exception) { + this.client = client; this.packet = packet; + this.exception = exception; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketSendEvent.java similarity index 80% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketSendEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketSendEvent.java index 882846d..9ce8a39 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/packets/send/C_PacketSendEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/send/C_PacketSendEvent.java @@ -6,7 +6,7 @@ * See LICENSE-File if exists */ -package me.finn.unlegitlibrary.network.system.client.events.packets.send; +package me.finn.unlegitlibrary.network.system.client.events.send; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; @@ -14,11 +14,11 @@ import me.finn.unlegitlibrary.network.system.packets.Packet; public class C_PacketSendEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; public final Packet packet; - public C_PacketSendEvent(NetworkClient networkClient, Packet packet) { - this.networkClient = networkClient; + public C_PacketSendEvent(NetworkClient client, Packet packet) { + this.client = client; this.packet = packet; } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ConnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ConnectedEvent.java index fa4c093..3841e6b 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ConnectedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ConnectedEvent.java @@ -13,10 +13,10 @@ import me.finn.unlegitlibrary.network.system.client.NetworkClient; public class C_ConnectedEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; - public C_ConnectedEvent(NetworkClient networkClient) { - this.networkClient = networkClient; + public C_ConnectedEvent(NetworkClient client) { + this.client = client; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_DisconnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_DisconnectedEvent.java index 0c68206..6da6726 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_DisconnectedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_DisconnectedEvent.java @@ -13,10 +13,10 @@ import me.finn.unlegitlibrary.network.system.client.NetworkClient; public class C_DisconnectedEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; - public C_DisconnectedEvent(NetworkClient networkClient) { - this.networkClient = networkClient; + public C_DisconnectedEvent(NetworkClient client) { + this.client = client; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_StoppedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ReceiveThreadFailedEvent.java similarity index 75% rename from src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_StoppedEvent.java rename to src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ReceiveThreadFailedEvent.java index 24308ac..69e07f9 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_StoppedEvent.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/client/events/state/C_ReceiveThreadFailedEvent.java @@ -11,12 +11,14 @@ package me.finn.unlegitlibrary.network.system.client.events.state; import me.finn.unlegitlibrary.event.impl.Event; import me.finn.unlegitlibrary.network.system.client.NetworkClient; -public class C_StoppedEvent extends Event { +public class C_ReceiveThreadFailedEvent extends Event { - public final NetworkClient networkClient; + public final NetworkClient client; + public final Exception exception; - public C_StoppedEvent(NetworkClient networkClient) { - this.networkClient = networkClient; + public C_ReceiveThreadFailedEvent(NetworkClient client, Exception exception) { + this.client = client; + this.exception = exception; } @Override diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/packets/Packet.java b/src/main/java/me/finn/unlegitlibrary/network/system/packets/Packet.java index 4ae4c9f..8e1291a 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/packets/Packet.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/packets/Packet.java @@ -6,6 +6,14 @@ * See LICENSE-File if exists */ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + package me.finn.unlegitlibrary.network.system.packets; import java.io.IOException; @@ -24,8 +32,8 @@ public abstract class Packet { return id; } - public abstract void write(ObjectOutputStream outputStream) throws IOException, ClassNotFoundException; + public abstract void write(PacketHandler packetHandler, ObjectOutputStream outputStream) throws IOException, ClassNotFoundException; - public abstract void read(ObjectInputStream outputStream) throws IOException, ClassNotFoundException; + public abstract void read(PacketHandler packetHandler, ObjectInputStream outputStream) throws IOException, ClassNotFoundException; } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/packets/PacketHandler.java b/src/main/java/me/finn/unlegitlibrary/network/system/packets/PacketHandler.java index 5203ba8..ea19536 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/packets/PacketHandler.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/packets/PacketHandler.java @@ -6,8 +6,18 @@ * See LICENSE-File if exists */ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + package me.finn.unlegitlibrary.network.system.packets; +import me.finn.unlegitlibrary.network.system.client.NetworkClient; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; import me.finn.unlegitlibrary.utils.DefaultMethodsOverrider; import java.io.IOException; @@ -21,6 +31,25 @@ public class PacketHandler extends DefaultMethodsOverrider { private final Map> packets = new HashMap<>(); + private NetworkClient clientInstance; + private NetworkServer serverInstance; + + public final NetworkClient getClientInstance() { + return clientInstance; + } + + public final NetworkServer getServerInstance() { + return serverInstance; + } + + public void setClientInstance(NetworkClient clientInstance) { + if (this.clientInstance == null) this.clientInstance = clientInstance; + } + + public void setServerInstance(NetworkServer serverInstance) { + if (this.serverInstance == null) this.serverInstance = serverInstance; + } + public final boolean isPacketIDRegistered(int id) { return packets.containsKey(id); } @@ -40,7 +69,9 @@ public class PacketHandler extends DefaultMethodsOverrider { Packet packet = packetClass.getDeclaredConstructor().newInstance(); int id = packet.getPacketID(); - if (isPacketIDRegistered(id)) return false; + if (!(packet instanceof SystemPacket) && isPacketIDRegistered(id)) return false; + else if (isPacketIDRegistered(id)) packets.remove(id); + packets.put(id, packetClass); return true; } @@ -49,7 +80,7 @@ public class PacketHandler extends DefaultMethodsOverrider { if (!isPacketIDRegistered(id) || (packet != null && id != packet.getPacketID()) || (packet != null && !isPacketIDRegistered(packet.getPacketID()))) return false; - packet.read(inputStream); + packet.read(this, inputStream); return true; } @@ -58,7 +89,7 @@ public class PacketHandler extends DefaultMethodsOverrider { if (!isPacketIDRegistered(id)) return false; outputStream.writeObject(id); - packet.write(outputStream); + packet.write(this, outputStream); outputStream.flush(); return true; diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/packets/SystemPacket.java b/src/main/java/me/finn/unlegitlibrary/network/system/packets/SystemPacket.java new file mode 100644 index 0000000..db40b33 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/packets/SystemPacket.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.packets; + +public abstract class SystemPacket extends Packet { + protected SystemPacket(int id) { + super(id); + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientDisconnectPacket.java b/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientDisconnectPacket.java new file mode 100644 index 0000000..5fed1b3 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientDisconnectPacket.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.packets.impl; + +import me.finn.unlegitlibrary.network.system.client.NetworkClient; +import me.finn.unlegitlibrary.network.system.packets.PacketHandler; +import me.finn.unlegitlibrary.network.system.packets.SystemPacket; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +public class ClientDisconnectPacket extends SystemPacket { + public ClientDisconnectPacket() { + super(-2); + } + + private int clientID; + private boolean fromClient; + + public ClientDisconnectPacket(int clientID, boolean fromClient) { + this(); + this.clientID = clientID; + this.fromClient = fromClient; + } + + @Override + public void write(PacketHandler packetHandler, ObjectOutputStream outputStream) throws IOException, ClassNotFoundException { + outputStream.writeBoolean(fromClient); + outputStream.writeInt(clientID); + } + + @Override + public void read(PacketHandler packetHandler, ObjectInputStream outputStream) throws IOException, ClassNotFoundException { + fromClient = outputStream.readBoolean(); + clientID = outputStream.readInt(); + + if (fromClient) packetHandler.getServerInstance().getConnectionHandlerByID(clientID).disconnect(false); + else packetHandler.getClientInstance().disconnect(false); + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientIDPacket.java b/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientIDPacket.java new file mode 100644 index 0000000..848acbe --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/packets/impl/ClientIDPacket.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.packets.impl; + +import me.finn.unlegitlibrary.network.system.client.NetworkClient; +import me.finn.unlegitlibrary.network.system.packets.PacketHandler; +import me.finn.unlegitlibrary.network.system.packets.SystemPacket; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +public class ClientIDPacket extends SystemPacket { + + public ClientIDPacket() { + super(-1); + } + + private int clientID; + + public ClientIDPacket(int clientID) { + this(); + this.clientID = clientID; + } + + @Override + public void write(PacketHandler packetHandler, ObjectOutputStream outputStream) throws IOException, ClassNotFoundException { + outputStream.writeInt(clientID); + } + + @Override + public void read(PacketHandler packetHandler, ObjectInputStream outputStream) throws IOException, ClassNotFoundException { + clientID = outputStream.readInt(); + packetHandler.getClientInstance().setClientID(clientID); + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/ClientHandler.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/ClientHandler.java deleted file mode 100644 index 0c7187b..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/ClientHandler.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server; - -import me.finn.unlegitlibrary.network.system.packets.Packet; -import me.finn.unlegitlibrary.network.system.server.events.client.packets.received.S_PacketFailedReceivedEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.packets.received.S_PacketReceivedEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.packets.received.S_UnknownObjectReceivedEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.packets.send.S_PacketFailedSendEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.packets.send.S_PacketSendEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.state.S_ClientConnectedEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.state.S_ClientDisconnectedEvent; -import me.finn.unlegitlibrary.network.system.server.events.client.state.S_ClientStoppedEvent; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; -import java.net.SocketException; - -public class ClientHandler { - - private final NetworkServer networkServer; - private Socket socket; - private ObjectOutputStream objectOutputStream; - private ObjectInputStream objectInputStream; - private int clientID; private final Thread receiveThread = new Thread(this::receive); - - public ClientHandler(NetworkServer networkServer, Socket socket, int clientID) throws IOException { - this.networkServer = networkServer; - this.socket = socket; - this.clientID = clientID; - - objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); - objectInputStream = new ObjectInputStream(socket.getInputStream()); - - receiveThread.start(); - } - - public final int getClientID() { - return clientID; - } - - public final Socket getSocket() { - return socket; - } - - public final NetworkServer getNetworkServer() { - return networkServer; - } - - public final ObjectOutputStream getObjectOutputStream() { - return objectOutputStream; - } - - public final ObjectInputStream getObjectInputStream() { - return objectInputStream; - } - - public final Thread getReceiveThread() { - return receiveThread; - } - - public final boolean isConnected() { - return networkServer.isRunning() && socket != null && socket.isConnected() && !socket.isClosed() && socket.isBound() - && receiveThread.isAlive() && !receiveThread.isInterrupted(); - } - - public synchronized final void disconnect() throws IOException { - if (isConnected()) { - objectOutputStream.writeUTF("s2c_disconnect"); - objectOutputStream.writeInt(clientID); - objectOutputStream.flush(); - } - - networkServer.getEventManager().executeEvent(new S_ClientDisconnectedEvent(this)); - stop(); - } - - private synchronized final void stop() throws IOException { - if (isConnected()) { - objectOutputStream.close(); - objectInputStream.close(); - socket.close(); - } - - objectOutputStream = null; - objectInputStream = null; - socket = null; - - clientID = -1; - receiveThread.interrupt(); - - synchronized (networkServer.getClientHandlers()) { networkServer.getClientHandlers().remove(this); } - networkServer.getEventManager().executeEvent(new S_ClientStoppedEvent(this)); - } - - public final boolean sendPacket(Packet packet) throws IOException, ClassNotFoundException { - if (!isConnected()) return false; - - if (networkServer.getPacketHandler().sendPacket(packet, objectOutputStream)) { - networkServer.getEventManager().executeEvent(new S_PacketSendEvent(this, packet)); - return true; - } else { - networkServer.getEventManager().executeEvent(new S_PacketFailedSendEvent(this, packet)); - return false; - } - } - - private final void receive() { - if (!isConnected()) return; - - try { - String command = ""; - - while (isConnected()) { - Object received = objectInputStream.readObject(); - - if (received instanceof String) { - command = (String) received; - continue; - } - - if (received instanceof Integer) { - int id = (Integer) received; - if (command.equalsIgnoreCase("c2s_connect")) { - if (clientID == id) continue; - command = ""; - - objectOutputStream.writeObject("s2c_connect"); - objectOutputStream.writeObject(clientID); - objectOutputStream.flush(); - - networkServer.getEventManager().executeEvent(new S_ClientConnectedEvent(this)); - continue; - } else if (command.equalsIgnoreCase("c2s_disconnect")) { - if (clientID != id) continue; - networkServer.getEventManager().executeEvent(new S_ClientDisconnectedEvent(this)); - command = ""; - - stop(); - break; - } else if (networkServer.getPacketHandler().getPacketByID(id) != null) { - command = ""; - Packet packet = networkServer.getPacketHandler().getPacketByID(id); - - if (networkServer.getPacketHandler().handlePacket(id, packet, objectInputStream)) - networkServer.getEventManager().executeEvent(new S_PacketReceivedEvent(this, packet)); - else - networkServer.getEventManager().executeEvent(new S_PacketFailedReceivedEvent(this, packet)); - - continue; - } - } - - networkServer.getEventManager().executeEvent(new S_UnknownObjectReceivedEvent(this, received)); - } - } catch (SocketException exception) { - networkServer.getEventManager().executeEvent(new S_ClientDisconnectedEvent(this)); - try { - stop(); - } catch (IOException ioException) { - networkServer.getClientHandlers().remove(this); - networkServer.getEventManager().executeEvent(new S_ClientStoppedEvent(this)); - - exception.printStackTrace(); - ioException.printStackTrace(); - } - } catch (IOException | ClassNotFoundException exception) { - exception.printStackTrace(); - } - } - - -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/ConnectionHandler.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/ConnectionHandler.java new file mode 100644 index 0000000..99417e6 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/ConnectionHandler.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server; + +import me.finn.unlegitlibrary.network.system.packets.impl.ClientIDPacket; +import me.finn.unlegitlibrary.network.system.packets.impl.ClientDisconnectPacket; +import me.finn.unlegitlibrary.network.system.server.events.packets.received.S_PacketFailedReceivedEvent; +import me.finn.unlegitlibrary.network.system.server.events.packets.received.S_PacketReceivedEvent; +import me.finn.unlegitlibrary.network.system.server.events.packets.received.S_ReceiveThreadFailedEvent; +import me.finn.unlegitlibrary.network.system.server.events.packets.received.S_UnknownObjectReceivedEvent; +import me.finn.unlegitlibrary.network.system.server.events.packets.send.S_PacketFailedSendEvent; +import me.finn.unlegitlibrary.network.system.server.events.packets.send.S_PacketSendEvent; +import me.finn.unlegitlibrary.network.system.server.events.state.connection.S_ConnectionHandlerConnectedEvent; +import me.finn.unlegitlibrary.network.system.server.events.state.connection.S_ConnectionHandlerDisconnectedEvent; +import me.finn.unlegitlibrary.network.system.packets.Packet; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.net.Socket; + +public class ConnectionHandler { + + private NetworkServer server; + private Socket socket; + private int clientID; + + private ObjectOutputStream outputStream; + private ObjectInputStream inputStream; + public final Thread receiveThread = new Thread(this::receive); + + public ConnectionHandler(NetworkServer server, Socket socket, int clientID) throws IOException { + this.server = server; + this.socket = socket; + this.clientID = clientID; + + outputStream = new ObjectOutputStream(socket.getOutputStream()); + inputStream = new ObjectInputStream(socket.getInputStream()); + + receiveThread.start(); + + sendPacket(new ClientIDPacket(clientID)); + server.getEventManager().executeEvent(new S_ConnectionHandlerConnectedEvent(this)); + } + + public final int getClientID() { + return clientID; + } + + public final NetworkServer getServer() { + return server; + } + + public final Socket getSocket() { + return socket; + } + + public final Thread getReceiveThread() { + return receiveThread; + } + + public final boolean isConnected() { + return server.isRunning() && socket != null && socket.isConnected() && !socket.isClosed() && socket.isBound() + && receiveThread.isAlive() && !receiveThread.isInterrupted(); + } + + public final boolean sendPacket(Packet packet) { + if (!isConnected()) return false; + + try { + if (server.getPacketHandler().sendPacket(packet, outputStream)) { + server.getEventManager().executeEvent(new S_PacketSendEvent(this, packet)); + return true; + } else server.getEventManager().executeEvent(new S_PacketFailedSendEvent(this, packet, null)); + } catch (IOException | ClassNotFoundException exception) { + if (server.getLogger() == null) System.err.println("Failed to send packet: " + exception.getMessage()); + else server.getLogger().exception("Failed to connect to send packet", exception); + + server.getEventManager().executeEvent(new S_PacketFailedSendEvent(this, packet, exception)); + } + + return false; + } + + public synchronized boolean disconnect(boolean sendDisconnectPacket) { + if (server.getLogger() == null) System.out.println("Disconnecting from server..."); + else server.getLogger().info("Disconnecting from server..."); + + receiveThread.interrupt(); + + if (isConnected()) { + if (sendDisconnectPacket) sendPacket(new ClientDisconnectPacket(clientID, false)); + + try { + outputStream.close(); + inputStream.close(); + socket.close(); + } catch (IOException exception) { + if (server.getLogger() == null) System.err.println("Failed to close socket: " + exception.getMessage()); + else server.getLogger().exception("Failed to close socket", exception); + } + } + + outputStream = null; + inputStream = null; + socket = null; + + server.getConnectionHandlers().remove(this); + clientID = -1; + + server.getEventManager().executeEvent(new S_ConnectionHandlerDisconnectedEvent(this)); + if (server.getLogger() == null) System.out.println("Disconnected from server"); + else server.getLogger().info("Disconnected from server..."); + + return true; + } + + private void receive() { + if (!isConnected()) return; + + while (isConnected()) { + try { + Object received = inputStream.readObject(); + + if (received instanceof Integer) { + int id = (Integer) received; + Packet packet = server.getPacketHandler().getPacketByID(id); + if (server.getPacketHandler().handlePacket(id, packet, inputStream)) + server.getEventManager().executeEvent(new S_PacketReceivedEvent(this, packet)); + else server.getEventManager().executeEvent(new S_PacketFailedReceivedEvent(this, packet, null)); + } else server.getEventManager().executeEvent(new S_UnknownObjectReceivedEvent(this, received)); + } catch (IOException | ClassNotFoundException exception) { + if (server.getLogger() == null) System.err.println("Receive thread failed: " + exception.getMessage()); + else server.getLogger().exception("Receive thread failed", exception); + + server.getEventManager().executeEvent(new S_ReceiveThreadFailedEvent(this, exception)); + } + } + + disconnect(false); + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java index c20ded8..ae719d2 100644 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/NetworkServer.java @@ -9,209 +9,41 @@ package me.finn.unlegitlibrary.network.system.server; import me.finn.unlegitlibrary.event.EventManager; +import me.finn.unlegitlibrary.network.system.client.NetworkClient; +import me.finn.unlegitlibrary.network.system.packets.impl.ClientDisconnectPacket; +import me.finn.unlegitlibrary.network.system.packets.impl.ClientIDPacket; +import me.finn.unlegitlibrary.network.system.server.events.connection.S_IncomingConnectionEvent; +import me.finn.unlegitlibrary.network.system.server.events.connection.S_IncomingConnectionThreadFailedEvent; +import me.finn.unlegitlibrary.network.system.server.events.state.server.S_StartedEvent; +import me.finn.unlegitlibrary.network.system.server.events.state.server.S_StoppedEvent; import me.finn.unlegitlibrary.network.system.packets.Packet; import me.finn.unlegitlibrary.network.system.packets.PacketHandler; -import me.finn.unlegitlibrary.network.system.server.events.server.S_StartedEvent; -import me.finn.unlegitlibrary.network.system.server.events.server.S_StoppedEvent; +import me.finn.unlegitlibrary.utils.DefaultMethodsOverrider; +import me.finn.unlegitlibrary.utils.Logger; import java.io.IOException; -import java.net.*; +import java.lang.reflect.InvocationTargetException; +import java.net.ServerSocket; +import java.net.Socket; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; -public class NetworkServer { - private final int port; - private final boolean debugLog; +public class NetworkServer extends DefaultMethodsOverrider { - private final PacketHandler packetHandler; - private final EventManager eventManager; - - private final int maxAttempts; - private final int attemptDelayInSec; - - private final List clientHandlers = new ArrayList<>(); - private final Thread incomingConnectionThread = new Thread(this::incomingConnection); - - private ServerSocket serverSocket; - private int attempt; - - private NetworkServer(int port, boolean debugLog, PacketHandler packetHandler, EventManager eventManager, int maxAttempts, int attemptDelayInSec) { - this.port = port; - this.debugLog = debugLog; - - this.packetHandler = packetHandler; - this.eventManager = eventManager; - - this.maxAttempts = maxAttempts; - this.attemptDelayInSec = attemptDelayInSec; - this.attempt = 1; - } - - public final int getPort() { - return port; - } - - public final PacketHandler getPacketHandler() { - return packetHandler; - } - - public final boolean isAutoRestartEnabled() { - return maxAttempts != 0 && !incomingConnectionThread.isInterrupted(); - } - - public final boolean isDebugLogEnabled() { - return debugLog; - } - - public final ServerSocket getServerSocket() { - return serverSocket; - } - - public final List getClientHandlers() { - return clientHandlers; - } - - public final Thread getIncomingConnectionThread() { - return incomingConnectionThread; - } - - public final boolean isRunning() { - return serverSocket != null && !serverSocket.isClosed() && serverSocket.isBound() && - incomingConnectionThread.isAlive() && !incomingConnectionThread.isInterrupted(); - } - - public synchronized final void start() throws IOException, InterruptedException { - try { - if (isRunning()) return; - if (debugLog) System.out.println("Starting server..."); - - clientHandlers.clear(); - - serverSocket = new ServerSocket(port); - incomingConnectionThread.start(); - - attempt = 1; - eventManager.executeEvent(new S_StartedEvent(this)); - - if (debugLog) System.out.println("Server started on port " + port + ". Attempts: " + attempt); - } catch (BindException exception) { - if (isAutoRestartEnabled()) restart(); - else if (!incomingConnectionThread.isInterrupted()) throw exception; - } - } - - public synchronized final void stop() throws IOException { - if (!isRunning()) return; - if (debugLog) System.out.println("Stopping server..."); - - List handlersToDisconnect = new ArrayList<>(clientHandlers); - - handlersToDisconnect.forEach(clientHandler -> { - try { - clientHandler.disconnect(); - } catch (IOException exception) { - exception.printStackTrace(); - } - }); - - handlersToDisconnect.clear(); - clientHandlers.clear(); - - serverSocket.close(); - incomingConnectionThread.interrupt(); - - serverSocket = null; - - eventManager.executeEvent(new S_StoppedEvent(this)); - if (debugLog) System.out.println("Server stopped."); - } - - public final boolean sendPacket(ClientHandler clientHandler, Packet packet) throws IOException, ClassNotFoundException { - return clientHandler.sendPacket(packet); - } - - private final void incomingConnection() { - try { - if (!isRunning()) return; - - while (isRunning()) { - Socket socket = serverSocket.accept(); - if (socket == null) continue; - - socket.setTcpNoDelay(false); - if (debugLog) System.out.println("New incoming connection..."); - clientHandlers.add(new ClientHandler(this, socket, clientHandlers.size() + 1)); - } - } catch (SocketException exception) { - if (isAutoRestartEnabled()) restart(); - else if (!incomingConnectionThread.isInterrupted()) exception.printStackTrace(); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - private final void restart() { - if (isAutoRestartEnabled()) { - if (isRunning()) { - try { - stop(); - } catch (IOException exception) { - if (maxAttempts > 0 && attempt > maxAttempts) { - eventManager.executeEvent(new S_StoppedEvent(this)); - exception.printStackTrace(); - return; - } - } - } - - if (debugLog) System.out.println("Trying to restart... (Attempt: " + attempt++ + ")"); - - try { - Thread.sleep(attemptDelayInSec * 1000L); - start(); - } catch (InterruptedException | IOException exception) { - if (maxAttempts == -1) restart(); - else if (attempt <= maxAttempts) restart(); - else { - eventManager.executeEvent(new S_StoppedEvent(this)); - exception.printStackTrace(); - } - } - } else { - try { - stop(); - } catch (IOException exception) { - eventManager.executeEvent(new S_StoppedEvent(this)); - exception.printStackTrace(); - } - } - } - - public final ClientHandler getClientHandlerByID(int id) { - for (ClientHandler clientHandler : clientHandlers) if (clientHandler.getClientID() == id) return clientHandler; - return null; - } - - public final EventManager getEventManager() { - return eventManager; - } - - public static class ServerBuilder { + public static class ServerBuilder extends DefaultMethodsOverrider { private int port; - private boolean debugLog = false; - private PacketHandler packetHandler = new PacketHandler(); - private EventManager eventManager = new EventManager(); - private int maxAttempts = 0; - private int attemptDelayInSec = 1; - public final ServerBuilder enableDebugLog() { - this.debugLog = true; - return this; - } + private PacketHandler packetHandler; + private EventManager eventManager; + private Logger logger; - public final ServerBuilder setPort(int port) { - this.port = port; - return this; + private int maxRestartAttempts = 0; + private int restartDelay = 3000; + private int timeout = 3000; + + public final NetworkServer build() throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + return new NetworkServer(port, packetHandler, eventManager, logger, maxRestartAttempts, restartDelay, timeout); } public final ServerBuilder setEventManager(EventManager eventManager) { @@ -219,23 +51,207 @@ public class NetworkServer { return this; } + public final ServerBuilder setLogger(Logger logger) { + this.logger = logger; + return this; + } + + public final ServerBuilder setMaxReconnectAttempts(int maxRestartAttempts) { + this.maxRestartAttempts = maxRestartAttempts; + return this; + } + public final ServerBuilder setPacketHandler(PacketHandler packetHandler) { this.packetHandler = packetHandler; return this; } - public final ServerBuilder setAttemptDelayInSeconds(int attemptDelayInSec) { - this.attemptDelayInSec = attemptDelayInSec; + public final ServerBuilder setPort(int port) { + this.port = port; return this; } - public final ServerBuilder setMaxAttempts(int maxAttempts) { - this.maxAttempts = maxAttempts; + public final ServerBuilder setReconnectDelay(int reconnectDelay) { + this.restartDelay = reconnectDelay; return this; } - public final NetworkServer build() { - return new NetworkServer(port, debugLog, packetHandler, eventManager, maxAttempts, attemptDelayInSec); + public final ServerBuilder setTimeout(int timeout) { + this.timeout = timeout; + return this; } } + + private final int port; + + private final PacketHandler packetHandler; + private final EventManager eventManager; + private final Logger logger; + + private int currentAttempts; + private final int timeout; + private final int maxRestartAttempts; + private final int restartDelay; + + private final List connectionHandlers = new ArrayList<>(); + public final Thread incomingConnectionThread = new Thread(this::incomingConnection); + + private ServerSocket serverSocket; + + public NetworkServer(int port, PacketHandler packetHandler, EventManager eventManager, Logger logger, int maxRestartAttempts, int restartDelay, int timeout) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException { + this.port = port; + this.timeout = timeout; + + this.packetHandler = packetHandler; + this.eventManager = eventManager; + this.logger = logger; + + this.maxRestartAttempts = maxRestartAttempts; + this.restartDelay = restartDelay; + this.currentAttempts = 0; + + this.packetHandler.setServerInstance(this); + this.packetHandler.registerPacket(ClientDisconnectPacket.class); + this.packetHandler.registerPacket(ClientIDPacket.class); + } + + public final Logger getLogger() { + return logger; + } + + public final EventManager getEventManager() { + return eventManager; + } + + public final int getPort() { + return port; + } + + public final ServerSocket getServerSocket() { + return serverSocket; + } + + public final PacketHandler getPacketHandler() { + return packetHandler; + } + + public final List getConnectionHandlers() { + return connectionHandlers; + } + + public final boolean isAutoRestartEnabled() { + return maxRestartAttempts != 0; + } + + public final boolean isRunning() { + return serverSocket != null && !serverSocket.isClosed() && serverSocket.isBound() && + incomingConnectionThread.isAlive() && !incomingConnectionThread.isInterrupted(); + } + + public final ConnectionHandler getConnectionHandlerByID(int clientID) { + return connectionHandlers.get(clientID); + } + + public synchronized final boolean stop() { + if (!isRunning()) return false; + + if (logger == null) System.out.println("Trying to stop server"); + else logger.info("Trying to stop server"); + + new ArrayList<>(connectionHandlers).forEach(connectionHandler -> connectionHandler.disconnect(true)); + connectionHandlers.clear(); + + incomingConnectionThread.interrupt(); + serverSocket = null; + currentAttempts = 0; + + if (logger == null) System.out.println("Server stopped"); + else logger.info("Server stopped"); + + eventManager.executeEvent(new S_StoppedEvent(this)); + return true; + } + + public synchronized final boolean start() { + if (isRunning()) return false; + + if (logger == null) System.out.println("Trying to start on port " + port); + else logger.info("Trying to start on port " + port); + + try { + serverSocket = new ServerSocket(port); + serverSocket.setSoTimeout(timeout); + + incomingConnectionThread.start(); + + if (currentAttempts == 0) currentAttempts++; + if (logger == null) System.out.println("Started ad port" + port + " (Attempts: " + currentAttempts + ")"); + else logger.info("Started at port " + port + " (Attempts: " + currentAttempts + ")"); + + currentAttempts = 0; + + eventManager.executeEvent(new S_StartedEvent(this)); + return true; + } catch (IOException exception) { + if (maxRestartAttempts != 0) { + try { + Thread.sleep(restartDelay); + } catch (InterruptedException sleepThreadException) { + if (logger == null) System.err.println("Restart exception: " + sleepThreadException.getMessage()); + else logger.exception("Restart exception", sleepThreadException); + } + + currentAttempts++; + if (currentAttempts <= maxRestartAttempts || maxRestartAttempts < 0) return start(); + } + + if (logger == null) System.err.println("Failed to start on port " + port + ": " + exception.getMessage()); + else logger.exception("Failed to start on port " + port, exception); + } + + return false; + } + + public final boolean sendPacket(int clientID, Packet packet) { + return getConnectionHandlerByID(clientID).sendPacket(packet); + } + + public final boolean sendPacket(Packet packet, int clientID) { + return sendPacket(clientID, packet); + } + + public final Thread getIncomingConnectionThread() { + return incomingConnectionThread; + } + + public final boolean broadcastPacket(Packet packet) { + AtomicBoolean toReturn = new AtomicBoolean(false); + connectionHandlers.forEach(connectionHandler -> toReturn.set(connectionHandler.sendPacket(packet))); + return toReturn.get(); + } + + private void incomingConnection() { + if (!isRunning()) return; + + try { + while (isRunning()) { + Socket socket = serverSocket.accept(); + socket.setTcpNoDelay(true); + socket.setSoTimeout(timeout); + + if (logger == null) System.out.println("Accepted connection from " + socket.getRemoteSocketAddress()); + else logger.info("Accepted connection from " + socket.getRemoteSocketAddress()); + + eventManager.executeEvent(new S_IncomingConnectionEvent(this, socket)); + connectionHandlers.add(new ConnectionHandler(this, socket, connectionHandlers.size() + 1)); + } + } catch (IOException exception) { + if (logger == null) System.err.println("Accept exception: " + exception.getMessage()); + else logger.exception("Accept exception", exception); + + eventManager.executeEvent(new S_IncomingConnectionThreadFailedEvent(this, exception)); + } + + stop(); + } } diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketFailedReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketFailedReceivedEvent.java deleted file mode 100644 index 8be767a..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketFailedReceivedEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.packets.received; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.packets.Packet; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_PacketFailedReceivedEvent extends Event { - - public final ClientHandler clientHandler; - public final Packet packet; - - public S_PacketFailedReceivedEvent(ClientHandler clientHandler, Packet packet) { - this.clientHandler = clientHandler; - this.packet = packet; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketReceivedEvent.java deleted file mode 100644 index 9d76882..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_PacketReceivedEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.packets.received; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.packets.Packet; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_PacketReceivedEvent extends Event { - - public final ClientHandler clientHandler; - public final Packet packet; - - public S_PacketReceivedEvent(ClientHandler clientHandler, Packet packet) { - this.clientHandler = clientHandler; - this.packet = packet; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_UnknownObjectReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_UnknownObjectReceivedEvent.java deleted file mode 100644 index 8a489ff..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/received/S_UnknownObjectReceivedEvent.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.packets.received; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_UnknownObjectReceivedEvent extends Event { - - public final ClientHandler clientHandler; - public final Object object; - - public S_UnknownObjectReceivedEvent(ClientHandler clientHandler, Object object) { - this.clientHandler = clientHandler; - this.object = object; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketFailedSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketFailedSendEvent.java deleted file mode 100644 index 93ad5d0..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketFailedSendEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.packets.send; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.packets.Packet; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_PacketFailedSendEvent extends Event { - - public final ClientHandler clientHandler; - public final Packet packet; - - public S_PacketFailedSendEvent(ClientHandler clientHandler, Packet packet) { - this.clientHandler = clientHandler; - this.packet = packet; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketSendEvent.java deleted file mode 100644 index dc03569..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/packets/send/S_PacketSendEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.packets.send; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.packets.Packet; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_PacketSendEvent extends Event { - - public final ClientHandler clientHandler; - public final Packet packet; - - public S_PacketSendEvent(ClientHandler clientHandler, Packet packet) { - this.clientHandler = clientHandler; - this.packet = packet; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientConnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientConnectedEvent.java deleted file mode 100644 index 5b2b2e3..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientConnectedEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.state; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_ClientConnectedEvent extends Event { - public final ClientHandler clientHandler; - - public S_ClientConnectedEvent(ClientHandler clientHandler) { - this.clientHandler = clientHandler; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientDisconnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientDisconnectedEvent.java deleted file mode 100644 index 217409b..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientDisconnectedEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.state; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_ClientDisconnectedEvent extends Event { - public final ClientHandler clientHandler; - - public S_ClientDisconnectedEvent(ClientHandler clientHandler) { - this.clientHandler = clientHandler; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientStoppedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientStoppedEvent.java deleted file mode 100644 index f49a2b4..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/client/state/S_ClientStoppedEvent.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.client.state; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.ClientHandler; - -public class S_ClientStoppedEvent extends Event { - public final ClientHandler clientHandler; - - public S_ClientStoppedEvent(ClientHandler clientHandler) { - this.clientHandler = clientHandler; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionEvent.java new file mode 100644 index 0000000..8198260 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionEvent.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.connection; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; + +import java.net.Socket; + +public class S_IncomingConnectionEvent extends Event { + + public final NetworkServer server; + public final Socket socket; + + public S_IncomingConnectionEvent(NetworkServer server, Socket socket) { + this.server = server; + this.socket = socket; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionThreadFailedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionThreadFailedEvent.java new file mode 100644 index 0000000..a352c18 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/connection/S_IncomingConnectionThreadFailedEvent.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.connection; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; + +public class S_IncomingConnectionThreadFailedEvent extends Event { + + public final NetworkServer server; + public final Exception exception; + + public S_IncomingConnectionThreadFailedEvent(NetworkServer server, Exception exception) { + this.server = server; + this.exception = exception; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketFailedReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketFailedReceivedEvent.java new file mode 100644 index 0000000..20abdb5 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketFailedReceivedEvent.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.received; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; +import me.finn.unlegitlibrary.network.system.packets.Packet; + +public class S_PacketFailedReceivedEvent extends Event { + + public final ConnectionHandler connectionHandler; + public final Packet packet; + public final Exception exception; + + public S_PacketFailedReceivedEvent(ConnectionHandler connectionHandler, Packet packet, Exception exception) { + this.connectionHandler = connectionHandler; + this.packet = packet; + this.exception = exception; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketReceivedEvent.java new file mode 100644 index 0000000..3288569 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_PacketReceivedEvent.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.received; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; +import me.finn.unlegitlibrary.network.system.packets.Packet; + +public class S_PacketReceivedEvent extends Event { + + public final ConnectionHandler connectionHandler; + public final Packet packet; + + public S_PacketReceivedEvent(ConnectionHandler connectionHandler, Packet packet) { + this.connectionHandler = connectionHandler; + this.packet = packet; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_ReceiveThreadFailedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_ReceiveThreadFailedEvent.java new file mode 100644 index 0000000..ee1f678 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_ReceiveThreadFailedEvent.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.received; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; + +public class S_ReceiveThreadFailedEvent extends Event { + public final ConnectionHandler connectionHandler; + public final Exception exception; + + public S_ReceiveThreadFailedEvent(ConnectionHandler connectionHandler, Exception exception) { + this.connectionHandler = connectionHandler; + this.exception = exception; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_UnknownObjectReceivedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_UnknownObjectReceivedEvent.java new file mode 100644 index 0000000..8fefaf9 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/received/S_UnknownObjectReceivedEvent.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.received; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; + +public class S_UnknownObjectReceivedEvent extends Event { + public final ConnectionHandler connectionHandler; + public final Object received; + + public S_UnknownObjectReceivedEvent(ConnectionHandler connectionHandler, Object received) { + this.connectionHandler = connectionHandler; + this.received = received; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketFailedSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketFailedSendEvent.java new file mode 100644 index 0000000..936c113 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketFailedSendEvent.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.send; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; +import me.finn.unlegitlibrary.network.system.packets.Packet; + +public class S_PacketFailedSendEvent extends Event { + + public final ConnectionHandler connectionHandler; + public final Packet packet; + public final Exception exception; + + public S_PacketFailedSendEvent(ConnectionHandler connectionHandler, Packet packet, Exception exception) { + this.connectionHandler = connectionHandler; + this.packet = packet; + this.exception = exception; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketSendEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketSendEvent.java new file mode 100644 index 0000000..1932d13 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/packets/send/S_PacketSendEvent.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.packets.send; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; +import me.finn.unlegitlibrary.network.system.packets.Packet; + +public class S_PacketSendEvent extends Event { + + public final ConnectionHandler connectionHandler; + public final Packet packet; + + public S_PacketSendEvent(ConnectionHandler connectionHandler, Packet packet) { + this.connectionHandler = connectionHandler; + this.packet = packet; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StartedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StartedEvent.java deleted file mode 100644 index 1888b3f..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StartedEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.server; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.NetworkServer; - -public class S_StartedEvent extends Event { - - public final NetworkServer networkServer; - - public S_StartedEvent(NetworkServer networkServer) { - this.networkServer = networkServer; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StoppedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StoppedEvent.java deleted file mode 100644 index fa94007..0000000 --- a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/server/S_StoppedEvent.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved - * - * You are unauthorized to remove this copyright. - * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk - * See LICENSE-File if exists - */ - -package me.finn.unlegitlibrary.network.system.server.events.server; - -import me.finn.unlegitlibrary.event.impl.Event; -import me.finn.unlegitlibrary.network.system.server.NetworkServer; - -public class S_StoppedEvent extends Event { - - public final NetworkServer networkServer; - - public S_StoppedEvent(NetworkServer networkServer) { - this.networkServer = networkServer; - } - - @Override - protected final Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - @Override - public final boolean equals(Object obj) { - return super.equals(obj); - } - - @Override - public final String toString() { - return super.toString(); - } - - @Override - public final int hashCode() { - return super.hashCode(); - } -} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerConnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerConnectedEvent.java new file mode 100644 index 0000000..8f10754 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerConnectedEvent.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.state.connection; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; + +public class S_ConnectionHandlerConnectedEvent extends Event { + + public final ConnectionHandler connectionHandler; + + public S_ConnectionHandlerConnectedEvent(ConnectionHandler connectionHandler) { + this.connectionHandler = connectionHandler; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerDisconnectedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerDisconnectedEvent.java new file mode 100644 index 0000000..91ce0d3 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/connection/S_ConnectionHandlerDisconnectedEvent.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.state.connection; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.ConnectionHandler; + +public class S_ConnectionHandlerDisconnectedEvent extends Event { + + public final ConnectionHandler connectionHandler; + + public S_ConnectionHandlerDisconnectedEvent(ConnectionHandler connectionHandler) { + this.connectionHandler = connectionHandler; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StartedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StartedEvent.java new file mode 100644 index 0000000..b6b2b26 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StartedEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.state.server; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; + +public class S_StartedEvent extends Event { + + public final NetworkServer server; + + public S_StartedEvent(NetworkServer server) { + this.server = server; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StoppedEvent.java b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StoppedEvent.java new file mode 100644 index 0000000..ec17bd7 --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/network/system/server/events/state/server/S_StoppedEvent.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +/* + * Copyright (C) 2024 UnlegitDqrk - All Rights Reserved + * + * You are unauthorized to remove this copyright. + * You have to give Credits to the Author in your project and link this GitHub site: https://github.com/UnlegitDqrk + * See LICENSE-File if exists + */ + +package me.finn.unlegitlibrary.network.system.server.events.state.server; + +import me.finn.unlegitlibrary.event.impl.Event; +import me.finn.unlegitlibrary.network.system.server.NetworkServer; + +public class S_StoppedEvent extends Event { + + public final NetworkServer server; + + public S_StoppedEvent(NetworkServer server) { + this.server = server; + } +} diff --git a/src/main/java/me/finn/unlegitlibrary/utils/Logger.java b/src/main/java/me/finn/unlegitlibrary/utils/Logger.java new file mode 100644 index 0000000..aa3c4bb --- /dev/null +++ b/src/main/java/me/finn/unlegitlibrary/utils/Logger.java @@ -0,0 +1,175 @@ +package me.finn.unlegitlibrary.utils; + +import me.finn.unlegitlibrary.file.FileUtils; +import me.finn.unlegitlibrary.string.color.ConsoleColor; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Logger by shock9 Interactive + */ +public final class Logger { + private File logFolder; + private File latestLogFile; + + private static boolean isInitialized = false; + + public Logger(File logFolder) throws IOException { + // Basic setup for log folder and latest log file + this.logFolder = logFolder; + latestLogFile = new File(logFolder, "log-latest.txt"); + + logFolder.mkdir(); + + if (latestLogFile.exists()) latestLogFile.delete(); + latestLogFile.createNewFile(); + + isInitialized = true; + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + shutdown(); + } catch (IOException exception) { + exception("Failed to shutdown logger", exception); + } + })); + } + + // Renaming latest log to current date and yeah + public final void shutdown() throws IOException { + if (!isInitialized) return; + + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy_HH.mm.ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Backup latest log file to current date and time + File backupLogFile = new File(logFolder, "log-" + timeStamp + ".txt"); + backupLogFile.createNewFile(); + FileUtils.copyFile(latestLogFile, backupLogFile, true); + FileUtils.writeFile(backupLogFile, FileUtils.readFile(latestLogFile)); + + isInitialized = false; + } + + private final void writeToLog(String log) throws IOException { + if (isInitialized) + FileUtils.writeFile(latestLogFile, FileUtils.readFile(latestLogFile) + System.lineSeparator() + log); + } + + public final void log(String string) { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [LOG] " + string; + + try { + writeToLog(log); + } catch (IOException ignored) { + } + } + + public final void info(String info) { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [INFO] " + info; + + System.out.println(ConsoleColor.WHITE + log + ConsoleColor.RESET); + + try { + writeToLog(log); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + + public final void warn(String warn) { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [WARN] " + warn; + + System.out.println(ConsoleColor.YELLOW + log + ConsoleColor.RESET); + + try { + writeToLog(log); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + + public final void error(String error) { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [ERROR] " + error; + + System.out.println(ConsoleColor.RED + log + ConsoleColor.RESET); + + try { + writeToLog(log); + } catch (IOException exception) { + exception.printStackTrace(); + } + } + + public final void exception(String infoLine, Exception exception) { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [EXCEPTION-INFO] " + infoLine + System.lineSeparator() + timeStamp + " [EXCEPTION-MESSAGE] " + exception.getMessage(); + + System.out.println(ConsoleColor.RED + log + ConsoleColor.RESET); + + try { + writeToLog(log); + } catch (IOException exception1) { + exception1.printStackTrace(); + } + } + + public final void debug(String debug) throws IOException { + // Get current date and time + SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); + Date date = new Date(); + + String timeStamp = formatter.format(date); + + // Writing log + String log = timeStamp + " [DEBUG] " + debug; + + System.out.println(ConsoleColor.BLUE + log + ConsoleColor.RESET); + + try { + writeToLog(log); + } catch (IOException exception) { + exception.printStackTrace(); + } + } +}