diff options
Diffstat (limited to 'core/src/kz/ilotterytea/maxon/session/SessionClient.java')
| -rw-r--r-- | core/src/kz/ilotterytea/maxon/session/SessionClient.java | 95 |
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); + } + } +} |
