commit 7ca3afd60e16c492bdcb6bc3cd3a59b13ce02d82 Author: Alex Date: Fri Dec 24 22:25:06 2021 +0100 init diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..ea4878d --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + earth.krakatoa + KraSocketClient + 1.0-SNAPSHOT + + + 14 + 14 + + + + clean install + + + maven-assembly-plugin + + + jar-with-dependencies + + + + + + single + + make-assembly + package + + + + + maven-compiler-plugin + + 9 + 9 + + org.apache.maven.plugins + + + + + + + lombok + org.projectlombok + provided + 1.18.22 + + + Java-WebSocket + org.java-websocket + 1.5.2 + + + + + + + sonatype-nexus-snapshots + + false + + + true + + https://oss.sonatype.org/content/repositories/snapshots + + + + \ No newline at end of file diff --git a/src/main/java/earth/krakatao/KraSocketClient.java b/src/main/java/earth/krakatao/KraSocketClient.java new file mode 100644 index 0000000..e9c66dc --- /dev/null +++ b/src/main/java/earth/krakatao/KraSocketClient.java @@ -0,0 +1,29 @@ +package earth.krakatao; + +import earth.krakatao.events.KraSocketClientEventInitiater; +import earth.krakatao.events.KraSocketClientEventInterface; +import earth.krakatao.protocol.KraSocketClientProtocol; +import earth.krakatao.protocol.KraSocketClientProtocolMessage; +import java.net.URI; +import java.net.URISyntaxException; + +public class KraSocketClient { + + private KraSocketClientConfig kraSocketClientConfig; + private final SocketClient socketClient; + private KraSocketClientEventInitiater kraSocketClientEventInitiater; + + 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.getWebSocketPort() + "/ws?t=" + this.kraSocketClientConfig.getWebSocketToken() + "&s="+ this.kraSocketClientConfig.getWebSocketServerName()), kraSocketClientEventInitiater, kraSocketClientProtocol); + } + + public void sendMsg(KraSocketClientProtocolMessage kraProtocolMessage) { + this.socketClient.send(""); + } + +} diff --git a/src/main/java/earth/krakatao/KraSocketClientConfig.java b/src/main/java/earth/krakatao/KraSocketClientConfig.java new file mode 100644 index 0000000..253f511 --- /dev/null +++ b/src/main/java/earth/krakatao/KraSocketClientConfig.java @@ -0,0 +1,15 @@ +package earth.krakatao; + +import lombok.Data; + +@Data +public class KraSocketClientConfig { + + private final String WebSocketProtocol; + private final String WebSocketHost; + private final int WebSocketPort; + private final String WebSocketToken; + private final String WebSocketAccessKey; + private final String WebSocketServerName; + +} diff --git a/src/main/java/earth/krakatao/SocketClient.java b/src/main/java/earth/krakatao/SocketClient.java new file mode 100644 index 0000000..8b31f9e --- /dev/null +++ b/src/main/java/earth/krakatao/SocketClient.java @@ -0,0 +1,55 @@ +package earth.krakatao; + +import earth.krakatao.protocol.KraSocketClientProtocol; +import earth.krakatao.protocol.KraSocketClientProtocolMessage; +import earth.krakatao.events.KraSocketClientEventInitiater; +import java.net.URI; +import java.nio.ByteBuffer; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +public class SocketClient extends WebSocketClient { + + private final KraSocketClientProtocol kraProtocol; + private final KraSocketClientEventInitiater kraSocketClientEventInitiater; + + public SocketClient(URI serverUri, KraSocketClientEventInitiater kraSocketClientEventInitiater, KraSocketClientProtocol kraProtocol) { + super(serverUri); + + this.kraSocketClientEventInitiater = kraSocketClientEventInitiater; + this.kraProtocol = kraProtocol; + } + + public void SendMessage(KraSocketClientProtocolMessage kraProtocolMessage) { + if (isOpen()) { + send(this.kraProtocol.EncodeMessage(kraProtocolMessage)); + } + } + + @Override + public void onOpen(ServerHandshake serverHandshake) { + this.kraSocketClientEventInitiater.callOnOpen(serverHandshake); + } + + @Override + public void onMessage(String s) { + + } + + @Override + public void onMessage(ByteBuffer byteBuffer) { + KraSocketClientProtocolMessage kraProtocolMessage = new KraSocketClientProtocol().DecodeMessage(byteBuffer.array()); + + this.kraSocketClientEventInitiater.callOnMessage(kraProtocolMessage); + } + + @Override + public void onClose(int code, String reason, boolean remote) { + this.kraSocketClientEventInitiater.callOnClose(code, reason, remote); + } + + @Override + public void onError(Exception e) { + System.out.println("Error: " + e); + } +} diff --git a/src/main/java/earth/krakatao/events/KraSocketClientEventInitiater.java b/src/main/java/earth/krakatao/events/KraSocketClientEventInitiater.java new file mode 100644 index 0000000..8fc5819 --- /dev/null +++ b/src/main/java/earth/krakatao/events/KraSocketClientEventInitiater.java @@ -0,0 +1,33 @@ +package earth.krakatao.events; + +import earth.krakatao.protocol.KraSocketClientProtocolMessage; +import java.util.ArrayList; +import java.util.List; +import org.java_websocket.handshake.ServerHandshake; + +public class KraSocketClientEventInitiater { + + private final List listenerList = new ArrayList<>(); + + public void addListener(KraSocketClientEventInterface testListener) { + listenerList.add(testListener); + } + + public void callOnOpen(ServerHandshake serverHandshake) { + for (KraSocketClientEventInterface testListener : listenerList) { + testListener.kraSocketClientOnOpen(serverHandshake); + } + } + + public void callOnMessage(KraSocketClientProtocolMessage kraProtocolMessage) { + for (KraSocketClientEventInterface testListener : listenerList) { + testListener.kraSocketClientOnMessage(kraProtocolMessage); + } + } + + public void callOnClose(int code, String reason, boolean remote) { + for (KraSocketClientEventInterface testListener : listenerList) { + testListener.kraSocketClientOnClose(code, reason, remote); + } + } +} diff --git a/src/main/java/earth/krakatao/events/KraSocketClientEventInterface.java b/src/main/java/earth/krakatao/events/KraSocketClientEventInterface.java new file mode 100644 index 0000000..c8f25ba --- /dev/null +++ b/src/main/java/earth/krakatao/events/KraSocketClientEventInterface.java @@ -0,0 +1,13 @@ +package earth.krakatao.events; + +import earth.krakatao.protocol.KraSocketClientProtocolMessage; +import org.java_websocket.handshake.ServerHandshake; + +public interface KraSocketClientEventInterface { + + void kraSocketClientOnMessage(KraSocketClientProtocolMessage kraProtocolMessage); + + void kraSocketClientOnOpen(ServerHandshake serverHandshake); + + void kraSocketClientOnClose(int code, String reason, boolean remote); +} diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java new file mode 100644 index 0000000..f1e4d90 --- /dev/null +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java @@ -0,0 +1,120 @@ +package earth.krakatao.protocol; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.function.Consumer; +import lombok.Getter; + +public class KraSocketClientProtocol { + + @Getter + //ArrayList cmdIDs = Lists.newArrayList(); + ArrayList cmdIDs = new ArrayList<>(); + + @Getter + HashMap> consumerHashMap = new HashMap<>(); + + public int getCmdID() { + if (cmdIDs.isEmpty()) { + cmdIDs.add(10); + return 10; + } + + int cmdID = cmdIDs.get(cmdIDs.size() - 1) + 1; + + cmdIDs.add(cmdID); + + // TODO: check max int value 2^32 + + return cmdID; + } + + public byte[] EncodeMessage(KraSocketClientProtocolMessage kraProtocolMessage) { + return EncodeMessage(kraProtocolMessage.getStatus(), kraProtocolMessage.getCmdID(), + kraProtocolMessage.getDest(), kraProtocolMessage.getUuid(), + kraProtocolMessage.getCmdNumber(), kraProtocolMessage.getArgs()); + } + + public byte[] EncodeMessage(int status, int cmdID, int dest, String uuid, int cmdNumber, + String args) { + System.out.println("sendMessage: " + status + " " + cmdID + " " + dest + " " + cmdNumber); + + int argLen = args.length(); + + byte[] raw = new byte[40 + argLen]; + + raw[0] = (byte) status; + + raw[1] = (byte) cmdID; + raw[2] = (byte) (cmdID >> 8); + raw[3] = (byte) (cmdID >> 16); + raw[4] = (byte) (cmdID >> 24); + + raw[5] = (byte) dest; + + byte[] uuidBytes = uuid.getBytes(); + + /* for (int i = 0; i < 32; i++) { + raw[6 + i] = uuidBytes[i]; + }*/ + + System.arraycopy(uuidBytes, 0, raw, 6, 32); + + raw[38] = (byte) cmdNumber; + raw[39] = (byte) (cmdNumber >> 8); + + if (argLen > 0) { + for (int i = 0; i < argLen; i++) { + raw[40 + i] = (byte) args.charAt(i); + } + } + + return raw; + //ProxySystem.getInstance().getSocketClient().SendMessage(raw); + } + + public KraSocketClientProtocolMessage DecodeMessage(byte[] data) { + System.out.println("start decode"); + + byte status = data[0]; + + int cmdID = Byte.toUnsignedInt(data[1]); + + cmdID += Byte.toUnsignedInt(data[2]) * 256; + cmdID += Byte.toUnsignedInt(data[3]) * 256 * 256; + cmdID += Byte.toUnsignedInt(data[4]) * 256 * 256 * 256; + + int dest = Byte.toUnsignedInt(data[5]); + + byte[] playerUuidBytes = new byte[32]; + + System.arraycopy(data, 6, playerUuidBytes, 0, 32); + + /* for (int i = 0; i < 32; i++) { + playerUuidBytes[i] = data[6 + i]; + } */ + + String playerUuid = new String(playerUuidBytes, StandardCharsets.UTF_8); + + short cmdNumber = (short) (Byte.toUnsignedInt(data[38]) + (Byte.toUnsignedInt(data[39]) * 256)); + + int argLen = data.length - 40; + byte[] argsBytes = new byte[argLen]; + + /* for (int i = 0; i < argLen; i++) { + argsBytes[i] = data[40 + i]; + } */ + + System.arraycopy(data, 40, argsBytes, 0, argLen); + + String args = new String(argsBytes, StandardCharsets.UTF_8); + + System.out.println( + "decoded message " + status + " " + cmdID + " " + dest + " " + playerUuid + " " + + cmdNumber + " " + args + " "); + + return new KraSocketClientProtocolMessage(status, cmdID, dest, playerUuid, cmdNumber, args); + } + +} diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java new file mode 100644 index 0000000..9d2fffe --- /dev/null +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java @@ -0,0 +1,24 @@ +package earth.krakatao.protocol; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class KraSocketClientProtocolMessage { + + private final byte status; + private final int cmdID; // long + private final int dest; + private final String uuid; + private final short cmdNumber; + private final String args; + + public int getStatus() { + return Byte.toUnsignedInt(status); + } + + public int getCmdNumber() { + return Short.toUnsignedInt(cmdNumber); + } +} diff --git a/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolStatus.java b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolStatus.java new file mode 100644 index 0000000..05eb398 --- /dev/null +++ b/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolStatus.java @@ -0,0 +1,21 @@ +package earth.krakatao.protocol; + +import lombok.Getter; + +public enum KraSocketClientProtocolStatus { + + SEND(10), + GET(11), + MESSAGE_ALREADY_IN_QUEUE(12), + ERROR_NO_PERMS(13), + ERROR_TRY_AGAIN(14), + ERROR_ARG_LEN_TOO_BIG(15), + REPLY(16); + + @Getter + private final int status; + + KraSocketClientProtocolStatus(int status) { + this.status = status; + } +} diff --git a/target/classes/earth/krakatao/KraSocketClient.class b/target/classes/earth/krakatao/KraSocketClient.class new file mode 100644 index 0000000..ca4b5ba Binary files /dev/null and b/target/classes/earth/krakatao/KraSocketClient.class differ diff --git a/target/classes/earth/krakatao/KraSocketClientConfig.class b/target/classes/earth/krakatao/KraSocketClientConfig.class new file mode 100644 index 0000000..ad9b573 Binary files /dev/null and b/target/classes/earth/krakatao/KraSocketClientConfig.class differ diff --git a/target/classes/earth/krakatao/SocketClient.class b/target/classes/earth/krakatao/SocketClient.class new file mode 100644 index 0000000..32316e7 Binary files /dev/null and b/target/classes/earth/krakatao/SocketClient.class differ diff --git a/target/classes/earth/krakatao/events/KraSocketClientEventInitiater.class b/target/classes/earth/krakatao/events/KraSocketClientEventInitiater.class new file mode 100644 index 0000000..ce32d1a Binary files /dev/null and b/target/classes/earth/krakatao/events/KraSocketClientEventInitiater.class differ diff --git a/target/classes/earth/krakatao/events/KraSocketClientEventInterface.class b/target/classes/earth/krakatao/events/KraSocketClientEventInterface.class new file mode 100644 index 0000000..1221506 Binary files /dev/null and b/target/classes/earth/krakatao/events/KraSocketClientEventInterface.class differ diff --git a/target/classes/earth/krakatao/protocol/KraProtocol.class b/target/classes/earth/krakatao/protocol/KraProtocol.class new file mode 100644 index 0000000..1700a7a Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraProtocol.class differ diff --git a/target/classes/earth/krakatao/protocol/KraProtocolMessage.class b/target/classes/earth/krakatao/protocol/KraProtocolMessage.class new file mode 100644 index 0000000..eab4ca4 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraProtocolMessage.class differ diff --git a/target/classes/earth/krakatao/protocol/KraProtocolMessageHandler.class b/target/classes/earth/krakatao/protocol/KraProtocolMessageHandler.class new file mode 100644 index 0000000..ebdeea1 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraProtocolMessageHandler.class differ diff --git a/target/classes/earth/krakatao/protocol/KraProtocolStatus.class b/target/classes/earth/krakatao/protocol/KraProtocolStatus.class new file mode 100644 index 0000000..bc6e9f1 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraProtocolStatus.class differ diff --git a/target/classes/earth/krakatao/protocol/KraSocketClientProtocol.class b/target/classes/earth/krakatao/protocol/KraSocketClientProtocol.class new file mode 100644 index 0000000..9c6d892 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraSocketClientProtocol.class differ diff --git a/target/classes/earth/krakatao/protocol/KraSocketClientProtocolMessage.class b/target/classes/earth/krakatao/protocol/KraSocketClientProtocolMessage.class new file mode 100644 index 0000000..b376672 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraSocketClientProtocolMessage.class differ diff --git a/target/classes/earth/krakatao/protocol/KraSocketClientProtocolStatus.class b/target/classes/earth/krakatao/protocol/KraSocketClientProtocolStatus.class new file mode 100644 index 0000000..9584181 Binary files /dev/null and b/target/classes/earth/krakatao/protocol/KraSocketClientProtocolStatus.class differ diff --git a/target/classes/earth/krakatao/test/TestInitiater.class b/target/classes/earth/krakatao/test/TestInitiater.class new file mode 100644 index 0000000..6f2a991 Binary files /dev/null and b/target/classes/earth/krakatao/test/TestInitiater.class differ diff --git a/target/classes/earth/krakatao/test/TestListener.class b/target/classes/earth/krakatao/test/TestListener.class new file mode 100644 index 0000000..505a091 Binary files /dev/null and b/target/classes/earth/krakatao/test/TestListener.class differ diff --git a/target/classes/earth/krakatao/test/TestResponder.class b/target/classes/earth/krakatao/test/TestResponder.class new file mode 100644 index 0000000..28781d7 Binary files /dev/null and b/target/classes/earth/krakatao/test/TestResponder.class differ diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..56e9bb7 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Fri Dec 17 19:53:24 CET 2021 +groupId=earth.krakatoa +artifactId=KraSocketClient +version=1.0-SNAPSHOT diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..1ff5c4d --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +earth/krakatao/KraSocketClientConfig.class +earth/krakatao/protocol/KraSocketClientProtocolStatus.class +earth/krakatao/protocol/KraSocketClientProtocolMessage.class +earth/krakatao/SocketClient.class +earth/krakatao/events/KraSocketClientEventInitiater.class +earth/krakatao/protocol/KraSocketClientProtocol.class +earth/krakatao/events/KraSocketClientEventInterface.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..b6d5275 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,8 @@ +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/KraSocketClient.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/SocketClient.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/events/KraSocketClientEventInterface.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/protocol/KraSocketClientProtocol.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolStatus.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/KraSocketClientConfig.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/protocol/KraSocketClientProtocolMessage.java +/home/alex/IdeaProjects/KraSocketClient/src/main/java/earth/krakatao/events/KraSocketClientEventInitiater.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..e69de29