summaryrefslogtreecommitdiff
path: root/server/src/kz/ilotterytea/maxon/MaxonServer.java
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/kz/ilotterytea/maxon/MaxonServer.java')
-rw-r--r--server/src/kz/ilotterytea/maxon/MaxonServer.java64
1 files changed, 61 insertions, 3 deletions
diff --git a/server/src/kz/ilotterytea/maxon/MaxonServer.java b/server/src/kz/ilotterytea/maxon/MaxonServer.java
index 7a38a7f..91ba049 100644
--- a/server/src/kz/ilotterytea/maxon/MaxonServer.java
+++ b/server/src/kz/ilotterytea/maxon/MaxonServer.java
@@ -1,36 +1,83 @@
package kz.ilotterytea.maxon;
+import kz.ilotterytea.maxon.shared.Identity;
+import kz.ilotterytea.maxon.shared.exceptions.PlayerKickException;
import org.java_websocket.WebSocket;
+import org.java_websocket.framing.CloseFrame;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Optional;
public class MaxonServer extends WebSocketServer {
private static MaxonServer instance;
private final Logger log;
+ private final ArrayList<PlayerConnection> connections;
private MaxonServer() {
super(new InetSocketAddress(31084));
this.log = LoggerFactory.getLogger(MaxonServer.class);
+ this.connections = new ArrayList<>();
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
- log.info("{} connected!", conn.getRemoteSocketAddress().getAddress().getHostAddress());
+ PlayerConnection connection = new PlayerConnection(conn);
+ log.info("{} ({}) connected!", connection, conn.getRemoteSocketAddress().getAddress().getHostAddress());
+ this.connections.add(connection);
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
- log.info("Connection {} has been closed! ({} {} {})", conn, code, reason, remote);
+ Optional<PlayerConnection> connection = this.connections.stream().filter((x) -> x.getConnection().equals(conn)).findFirst();
+ if (connection.isPresent()) {
+ log.info("{} has left! Reason: {} {}", connection.get(), code, reason);
+ this.connections.remove(connection.get());
+ } else {
+ log.info("Unknown connection was closed! Reason: {} {}", code, reason);
+ }
}
@Override
public void onMessage(WebSocket conn, String message) {
- log.info("{} says {}", conn, message);
+ this.connections.removeIf((x) -> x.getConnection().equals(conn));
+ conn.send("Invalid input.");
+ conn.close(CloseFrame.UNEXPECTED_CONDITION);
+ }
+
+ @Override
+ public void onMessage(WebSocket conn, ByteBuffer message) {
+ Optional<PlayerConnection> playerConnection = this.connections.stream().filter((x) -> x.getConnection().equals(conn)).findFirst();
+
+ if (playerConnection.isEmpty()) {
+ conn.close(5001, "Your PlayerConnection was not found!");
+ return;
+ }
+
+ PlayerConnection c = playerConnection.get();
+
+ try {
+ // Deserialize the object
+ ByteArrayInputStream bais = new ByteArrayInputStream(message.array());
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ Object obj = ois.readObject();
+
+ if (obj instanceof Identity identity) ServerHandlers.handleIdentity(c, identity);
+ else kickConnection(c, PlayerKickException.internalServerError());
+ } catch (PlayerKickException e) {
+ kickConnection(c, e);
+ } catch (Exception e) {
+ log.error("An exception was thrown while processing message", e);
+ kickConnection(c, PlayerKickException.internalServerError());
+ }
}
@Override
@@ -45,8 +92,19 @@ public class MaxonServer extends WebSocketServer {
setConnectionLostTimeout(100);
}
+ public void kickConnection(PlayerConnection connection, PlayerKickException e) {
+ connection.send(e);
+ connection.getConnection().close();
+ this.connections.remove(connection);
+ log.debug("Kicked out {}! Reason: {}", connection, e.getMessage());
+ }
+
public static MaxonServer getInstance() {
if (instance == null) instance = new MaxonServer();
return instance;
}
+
+ public ArrayList<PlayerConnection> getPlayerConnections() {
+ return connections;
+ }
}