summaryrefslogtreecommitdiff
path: root/core/src/kz/ilotterytea/maxon/session/SessionClient.java
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/kz/ilotterytea/maxon/session/SessionClient.java')
-rw-r--r--core/src/kz/ilotterytea/maxon/session/SessionClient.java95
1 files changed, 95 insertions, 0 deletions
diff --git a/core/src/kz/ilotterytea/maxon/session/SessionClient.java b/core/src/kz/ilotterytea/maxon/session/SessionClient.java
new file mode 100644
index 0000000..78a6c0e
--- /dev/null
+++ b/core/src/kz/ilotterytea/maxon/session/SessionClient.java
@@ -0,0 +1,95 @@
+package kz.ilotterytea.maxon.session;
+
+import kz.ilotterytea.maxon.MaxonConstants;
+import kz.ilotterytea.maxon.MaxonGame;
+import kz.ilotterytea.maxon.screens.MenuScreen;
+import kz.ilotterytea.maxon.shared.Acknowledge;
+import kz.ilotterytea.maxon.shared.Identity;
+import kz.ilotterytea.maxon.shared.exceptions.PlayerKickException;
+import org.java_websocket.client.WebSocketClient;
+import org.java_websocket.handshake.ServerHandshake;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.net.URI;
+import java.nio.ByteBuffer;
+
+public class SessionClient extends WebSocketClient {
+ private final Logger log;
+ private final MaxonGame game;
+
+ public SessionClient() {
+ super(URI.create(MaxonConstants.SESSION_WSS_URL));
+ this.log = LoggerFactory.getLogger(SessionClient.class);
+ this.game = MaxonGame.getInstance();
+ }
+
+ @Override
+ public void onOpen(ServerHandshake handshakedata) {
+ log.info("Connected!");
+ updateIdentity();
+ }
+
+ @Override
+ public void onMessage(String message) {
+ }
+
+ @Override
+ public void onMessage(ByteBuffer bytes) {
+ try {
+ // Deserialize the object
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes.array());
+ ObjectInputStream ois = new ObjectInputStream(bais);
+ Object obj = ois.readObject();
+
+ if (obj instanceof Acknowledge acknowledge) SessionHandlers.handleAcknowledge(acknowledge);
+ else if (obj instanceof PlayerKickException exception) throw exception;
+ } catch (PlayerKickException e) {
+ log.info("Kicked out!", e);
+ } catch (Exception e) {
+ log.error("An exception was thrown while processing message", e);
+ }
+ }
+
+ @Override
+ public void onClose(int code, String reason, boolean remote) {
+ log.info("Connection closed! Reason: {} {}", code, reason);
+ game.getIdentityClient().invalidateToken();
+ if (!game.getScreen().getClass().equals(MenuScreen.class)) {
+ game.setScreen(new MenuScreen());
+ }
+ }
+
+ @Override
+ public void onError(Exception ex) {
+ log.error("Failed to connect", ex);
+ }
+
+ @Override
+ public void connect() {
+ super.connect();
+ }
+
+ public void updateIdentity() {
+ IdentityClient identityClient = game.getIdentityClient();
+
+ Identity identity = new Identity(identityClient.getClientToken(), identityClient.getAccessToken());
+
+ send(identity);
+ }
+
+ public void send(Object object) {
+ try {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(object);
+ send(baos.toByteArray());
+ } catch (Exception e) {
+ log.error("Failed to serialize and send an object", e);
+ }
+ }
+}