From d8b0156bdfe668e298d7c18807bb174a0d10fad8 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 2 Jan 2022 19:55:45 +0100 Subject: [PATCH] message handling on receiving --- .../java/earth/krakatao/KraSocketClient.java | 10 +++-- .../java/earth/krakatao/SocketClient.java | 38 +++++++++++++++++-- .../protocol/KraSocketClientProtocol.java | 33 ++++++++++------ 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/src/main/java/earth/krakatao/KraSocketClient.java b/src/main/java/earth/krakatao/KraSocketClient.java index b526606..e0a406b 100644 --- a/src/main/java/earth/krakatao/KraSocketClient.java +++ b/src/main/java/earth/krakatao/KraSocketClient.java @@ -17,18 +17,20 @@ public class KraSocketClient { @Getter private final SocketClient socketClient; private KraSocketClientEventInitiater kraSocketClientEventInitiater; - - public KraSocketClient(KraSocketClientConfig kraSocketClientConfig, KraSocketClientEventInterface kraSocketClientEventInterface, KraSocketClientProtocol kraSocketClientProtocol) throws URISyntaxException { + + public KraSocketClient(KraSocketClientConfig kraSocketClientConfig, + KraSocketClientEventInterface kraSocketClientEventInterface, + KraSocketClientProtocol kraSocketClientProtocol) throws URISyntaxException { this.kraSocketClientConfig = kraSocketClientConfig; this.kraSocketClientEventInitiater = new KraSocketClientEventInitiater(); this.kraSocketClientEventInitiater.addListener(kraSocketClientEventInterface); this.socketClient = new SocketClient(new URI(this.kraSocketClientConfig.getWebSocketProtocol() - +"://" + this.kraSocketClientConfig.getWebSocketHost() + ":" + + "://" + this.kraSocketClientConfig.getWebSocketHost() + ":" + this.kraSocketClientConfig.getWebSocketPort() + "/ws?ak=" + this.kraSocketClientConfig.getWebSocketAccessKey() - + "&s="+ this.kraSocketClientConfig.getWebSocketServerName()), + + "&s=" + this.kraSocketClientConfig.getWebSocketServerName()), this.kraSocketClientEventInitiater, kraSocketClientProtocol); } } diff --git a/src/main/java/earth/krakatao/SocketClient.java b/src/main/java/earth/krakatao/SocketClient.java index 7b48a98..280294e 100644 --- a/src/main/java/earth/krakatao/SocketClient.java +++ b/src/main/java/earth/krakatao/SocketClient.java @@ -1,8 +1,9 @@ package earth.krakatao; +import earth.krakatao.events.KraSocketClientEventInitiater; import earth.krakatao.protocol.KraSocketClientProtocol; import earth.krakatao.protocol.KraSocketClientProtocolMessage; -import earth.krakatao.events.KraSocketClientEventInitiater; +import earth.krakatao.protocol.KraSocketClientProtocolStatus; import java.net.URI; import java.nio.ByteBuffer; import org.java_websocket.client.WebSocketClient; @@ -13,7 +14,8 @@ public class SocketClient extends WebSocketClient { private final KraSocketClientProtocol kraProtocol; private final KraSocketClientEventInitiater kraSocketClientEventInitiater; - public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater, KraSocketClientProtocol kraProtocol) { + public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater, + KraSocketClientProtocol kraProtocol) { super(serverUri); this.kraSocketClientEventInitiater = kraSocketClientEventInitiater; @@ -44,7 +46,34 @@ public class SocketClient extends WebSocketClient { @Override public void onMessage(ByteBuffer byteBuffer) { - KraSocketClientProtocolMessage kraProtocolMessage = new KraSocketClientProtocol().DecodeMessage(byteBuffer.array()); + KraSocketClientProtocolMessage kraProtocolMessage = new KraSocketClientProtocol().DecodeMessage( + byteBuffer.array()); + + if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.ERROR_NO_PERMS.getStatus() + || kraProtocolMessage.getStatus() + == KraSocketClientProtocolStatus.ERROR_TRY_AGAIN.getStatus() + || kraProtocolMessage.getStatus() + == KraSocketClientProtocolStatus.ERROR_ARG_LEN_TOO_BIG.getStatus()) { + + KraSocketClient.getLogger().warning("error! status: " + kraProtocolMessage.getStatus()); + return; + } + + if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.REPLY.getStatus() + && this.kraProtocol.getCmdIDs().contains(kraProtocolMessage.getCmdID())) { + // TODO: uuid + kraProtocolMessage = new KraSocketClientProtocolMessage( + KraSocketClientProtocolStatus.MESSAGE_ALREADY_IN_QUEUE.getStatus(), 1, 0, + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", (short) kraProtocolMessage.getCmdNumber(), ""); + + this.SendMessage(kraProtocolMessage); + return; + } + + if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.GET.getStatus() + && this.kraProtocol.getCmdIDs().contains(kraProtocolMessage.getCmdID())) { + this.kraProtocol.getCmdIDs().remove(kraProtocolMessage.getCmdID()); + } this.kraSocketClientEventInitiater.callOnMessage(kraProtocolMessage); } @@ -52,7 +81,8 @@ public class SocketClient extends WebSocketClient { @Override public void onClose(int code, String reason, boolean remote) { this.kraSocketClientEventInitiater.callOnClose(code, reason, remote); - KraSocketClient.logger.warning("connection closed. Code: " + code + " reason: " + reason + " remote: " + remote); + KraSocketClient.logger.warning( + "connection closed. Code: " + code + " reason: " + reason + " remote: " + remote); } @Override diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java index 83a07ee..a7d8198 100644 --- a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java @@ -2,7 +2,6 @@ package earth.krakatao.protocol; import earth.krakatao.Formatter; import earth.krakatao.KraSocketClient; -import earth.krakatao.SocketClient; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; @@ -11,14 +10,21 @@ import lombok.Getter; public class KraSocketClientProtocol { - @Getter - //ArrayList cmdIDs = Lists.newArrayList(); - ArrayList cmdIDs = new ArrayList<>(); + //@Getter + //ArrayList cmdIDs = new ArrayList<>(); @Getter - HashMap> consumerHashMap = new HashMap<>(); + private final ArrayList cmdIDs; + @Getter + private int currentCmdIDIndex; - private int currentCmdIDIndex = 10; + //@Getter + //HashMap> consumerHashMap = new HashMap<>(); + + public KraSocketClientProtocol() { + this.cmdIDs = new ArrayList<>(); + this.currentCmdIDIndex = 10; + } public int generateCmdID() { // TODO: check max int value 2^32 @@ -39,10 +45,11 @@ public class KraSocketClientProtocol { kraProtocolMessage.getDest(), kraProtocolMessage.getUuid(), kraProtocolMessage.getCmdNumber(), kraProtocolMessage.getArgs()); } - + public byte[] EncodeMessage(int status, int cmdID, int dest, String uuid, int cmdNumber, String args) { - KraSocketClient.getLogger().info("sendMessage: " + status + " " + cmdID + " " + dest + " " + cmdNumber); + KraSocketClient.getLogger() + .info("sendMessage: " + status + " " + cmdID + " " + dest + " " + cmdNumber); int argLen = args.length(); @@ -74,6 +81,8 @@ public class KraSocketClientProtocol { } } + this.cmdIDs.add(cmdID); + return raw; //ProxySystem.getInstance().getSocketClient().SendMessage(raw); } @@ -114,9 +123,11 @@ public class KraSocketClientProtocol { String args = new String(argsBytes, StandardCharsets.UTF_8); - KraSocketClient.getLogger().info( "decoded message " + status + " " + cmdID + " " + dest + " " + playerUuid + " " - + cmdNumber + " " + args + " "); + KraSocketClient.getLogger() + .info("decoded message " + status + " " + cmdID + " " + dest + " " + playerUuid + " " + + cmdNumber + " " + args + " "); - return new KraSocketClientProtocolMessage(status, cmdID, dest, Formatter.stringToUuid(playerUuid).toString(), cmdNumber, args); + return new KraSocketClientProtocolMessage(status, cmdID, dest, + Formatter.stringToUuid(playerUuid).toString(), cmdNumber, args); } }