commit 24828aec5b0f2dc99932c11f55c197f52c02d31d Author: Alex Date: Wed Dec 22 22:54:03 2021 +0100 init diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1b52ff8 --- /dev/null +++ b/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + net.krakatoa.proxy + KrakatoaProxySystem + 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 + + + + + + + net.md-5 + bungeecord-api + 1.17-R0.1-SNAPSHOT + jar + provided + + + lombok + org.projectlombok + provided + 1.18.22 + + + Java-WebSocket + org.java-websocket + 1.5.2 + + + mongodb-driver-async + org.mongodb + 3.12.10 + + + + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + + sonatype-nexus-snapshots + + false + + + true + + https://oss.sonatype.org/content/repositories/snapshots + + + \ No newline at end of file diff --git a/src/main/java/net/krakatoa/proxy/ProxySystem.java b/src/main/java/net/krakatoa/proxy/ProxySystem.java new file mode 100644 index 0000000..ec25a88 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/ProxySystem.java @@ -0,0 +1,99 @@ +package net.krakatoa.proxy; + +import com.mongodb.async.client.MongoCollection; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Arrays; +import lombok.Getter; +import lombok.SneakyThrows; +import net.krakatoa.proxy.command.CodeCommand; +import net.krakatoa.proxy.config.ConfigHandler; +import net.krakatoa.proxy.listener.PlayerDisconnectListener; +import net.krakatoa.proxy.listener.PostLoginListener; +import net.krakatoa.proxy.mongo.MongoManager; +import net.krakatoa.proxy.protocol.KraProtocol; +import net.krakatoa.proxy.socket.SocketClient; +import net.krakatoa.proxy.util.Formatter; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.api.plugin.PluginManager; +import org.bson.Document; + +@Getter +public class ProxySystem extends Plugin { + + @Getter + private static ProxySystem instance; + + private ConfigHandler configHandler; + private MongoManager mongoManager; + private SocketClient socketClient; + private KraProtocol kraProtocol; + private Formatter formatter; + + private MongoCollection players; + + @SneakyThrows + @Override + public void onEnable() { + instance = this; + + configHandler = new ConfigHandler(); + configHandler.load(); + + kraProtocol = new KraProtocol(); + formatter = new Formatter(); + + System.out.println( + "mongo cfg " + configHandler.getMongodbHost() + " " + configHandler.getMongodbUsername()); + + mongoManager = new MongoManager(configHandler.getMongodbHost(), + configHandler.getMongodbPort(), configHandler.getMongodbUsername(), + configHandler.getMongodbPassword()); + mongoManager.connect(configHandler.getMongodbDatabase()); + + try { + socketClient = new SocketClient( + new URI(configHandler.getWebSocketProtocol() + "://" + configHandler.getWebSocketHost() + + ":" + configHandler.getWebSocketPort() + "/ws?t=" + + configHandler.getWebSocketAccessKey() + "&s=proxy-1")); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + + socketClient.connect(); + + players = mongoManager.getMongoDatabase().getCollection("players"); + + loadListeners(); + loadCommands(); + } + + @Override + public void onDisable() { + socketClient.getConnection().close(); + socketClient.getConnection().closeConnection(1, ""); + + instance = null; + } + + public void loadListeners() { + PluginManager pluginManager = getProxy().getPluginManager(); + Arrays.asList(new PostLoginListener(), new PlayerDisconnectListener()) + .forEach(listener -> { + pluginManager.registerListener(this, listener); + }); + } + + public void loadCommands() { + PluginManager pluginManager = getProxy().getPluginManager(); + Arrays.asList(new CodeCommand("code")).forEach(listener -> { + pluginManager.registerCommand(this, listener); + }); + } + + /* + TODO: proxy ping & join only accessible for 1.17.1 clients + + */ + +} diff --git a/src/main/java/net/krakatoa/proxy/command/CodeCommand.java b/src/main/java/net/krakatoa/proxy/command/CodeCommand.java new file mode 100644 index 0000000..fba75c4 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/command/CodeCommand.java @@ -0,0 +1,60 @@ +package net.krakatoa.proxy.command; + +import java.security.SecureRandom; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; + +public class CodeCommand extends Command { + + public CodeCommand(String name) { + super(name); + } + + @Override + public void execute(CommandSender commandSender, String[] strings) { + if (commandSender instanceof ProxiedPlayer) { + ProxiedPlayer proxiedPlayer = (ProxiedPlayer) commandSender; + + /* + Document query = new Document().append("uuid", ProxySystem.getInstance().getFormatter() + .formatUuid(proxiedPlayer.getUniqueId().toString())); + + String voiceWebCode = generateVoiceWebCode(""); + + Bson updates = Updates.combine(Updates.set("voiceWebCode", voiceWebCode)); + + UpdateOptions options = new UpdateOptions().upsert(true); + + try { + ProxySystem.getInstance().getPlayerRegistrationProcess() + .updateOne(query, updates, (updateResult, throwable) -> { + System.out.println("Modified document count: " + updateResult.getModifiedCount()); + System.out.println("Upserted id: " + + updateResult.getUpsertedId()); // only contains a value when an upsert is performed + }); + } catch (MongoException exception) { + System.err.println("Unable to update due to an error: " + exception); + } */ + + // TODO: add url and copy text + //proxiedPlayer.sendMessage(new TextComponent("§eNeuer Code §c§l" + voiceWebCode)); + + } + } + + // TODO: use static method from other file + public String generateVoiceWebCode(String uuid) { + SecureRandom secureRandom = new SecureRandom(); + + String chrs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + String customTag = secureRandom.ints(8, 0, chrs.length()).mapToObj(chrs::charAt) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString(); + + System.out.println(customTag); + + return customTag; + } + +} diff --git a/src/main/java/net/krakatoa/proxy/config/ConfigHandler.java b/src/main/java/net/krakatoa/proxy/config/ConfigHandler.java new file mode 100644 index 0000000..1b889c0 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/config/ConfigHandler.java @@ -0,0 +1,44 @@ +package net.krakatoa.proxy.config; + +import java.io.File; +import java.io.IOException; +import lombok.Getter; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +@Getter +public class ConfigHandler { + + private String webSocketAccessKey; + private String webSocketProtocol; + private String webSocketHost; + private int webSocketPort; + + private String webVoiceAddress; + + private String mongodbHost; + private int mongodbPort; + private String mongodbDatabase; + private String mongodbUsername; + private String mongodbPassword; + + public void load() throws IOException { + // TODO change file to yaml + Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class) + .load(new File("/home/CloudNet/kraConfigs", "kraSettings.yaml")); + + webSocketAccessKey = configuration.getString("web_socket.access_key"); + webSocketProtocol = configuration.getString("web_socket.protocol"); + webSocketHost = configuration.getString("web_socket.host"); + webSocketPort = configuration.getInt("web_socket.port"); + + webVoiceAddress = configuration.getString("web.voice_address"); + + mongodbHost = configuration.getString("mongodb.host"); + mongodbPort = configuration.getInt("mongodb.port"); + mongodbDatabase = configuration.getString("mongodb.database"); + mongodbUsername = configuration.getString("mongodb.username"); + mongodbPassword = configuration.getString("mongodb.password"); + } +} diff --git a/src/main/java/net/krakatoa/proxy/listener/PlayerDisconnectListener.java b/src/main/java/net/krakatoa/proxy/listener/PlayerDisconnectListener.java new file mode 100644 index 0000000..05a8952 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/listener/PlayerDisconnectListener.java @@ -0,0 +1,26 @@ +package net.krakatoa.proxy.listener; + +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; + +public class PlayerDisconnectListener implements Listener { + + @EventHandler + public void onDisconnect(PlayerDisconnectEvent event) { + ProxiedPlayer proxiedPlayer = event.getPlayer(); + + //String uuid = ProxySystem.getInstance().getFormatter() + // .formatUuid(proxiedPlayer.getUniqueId().toString()); + + /* + ProxySystem.getInstance().getPlayerRegistrationProcess() + .deleteOne(Filters.eq("uuid", uuid), + (deleteResult, throwable) -> { + + System.out.println("delete " + deleteResult.getDeletedCount()); + }); */ + } + +} diff --git a/src/main/java/net/krakatoa/proxy/listener/PostLoginListener.java b/src/main/java/net/krakatoa/proxy/listener/PostLoginListener.java new file mode 100644 index 0000000..2f9b7bf --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/listener/PostLoginListener.java @@ -0,0 +1,184 @@ +package net.krakatoa.proxy.listener; + +import com.mongodb.client.model.Filters; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.model.Updates; +import java.security.SecureRandom; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import net.krakatoa.proxy.ProxySystem; +import net.krakatoa.proxy.protocol.KraProtocolMessage; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.HoverEvent.Action; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.hover.content.Text; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.event.ServerSwitchEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import org.bson.Document; +import org.bson.conversions.Bson; + +public class PostLoginListener implements Listener { + + @EventHandler + public void onPostLogin(PostLoginEvent event) { + ProxiedPlayer proxiedPlayer = event.getPlayer(); + + String uuid = ProxySystem.getInstance().getFormatter() + .formatUuid(proxiedPlayer.getUniqueId().toString()); + + ProxySystem.getInstance().getPlayers() + .find(Filters.eq("uuid", uuid)) + .first((document, throwable) -> { + if (document == null) { + // create player in db and send voice url + System.out.println("create player in db"); + String voiceWebCode = generateVoiceWebCode(uuid); + + document = new Document("uuid", uuid).append("voiceWebCode", voiceWebCode); + + ProxySystem.getInstance().getPlayers().insertOne(document, (unused, throwable1) -> { + System.out.println("insertOne"); + }); + + sendVoiceWebCodeUrl(proxiedPlayer, voiceWebCode); + } else { + // check if both sockets connected + int cmdID = ProxySystem.getInstance().getKraProtocol().getCmdID(); + + ProxySystem.getInstance().getKraProtocol().SendMessage(11, cmdID, 1, uuid, 10, ""); + + Document finalDocument = document; + Consumer consumer = value -> { + if (value.getArgs().equals("1")) { + // connected! Send player to game server + System.out.println( + proxiedPlayer.getName() + " sockets connected! Send player to game server"); + proxiedPlayer.sendMessage( + new TextComponent("§bWillkommen zurück §6" + proxiedPlayer.getDisplayName())); + + ProxyServer.getInstance().getScheduler().schedule(ProxySystem.getInstance(), () -> { + ServerInfo serverInfos = ProxyServer.getInstance().getServerInfo("NewYork-1"); + proxiedPlayer.connect(serverInfos); + }, 2L, TimeUnit.SECONDS); + } else { + // not connected! Send voice url + System.out.println( + proxiedPlayer.getName() + " sockets not connected! Send voice url"); + + String voiceWebCode = generateVoiceWebCode(uuid); + + Bson updates = Updates.combine(Updates.set("voiceWebCode", voiceWebCode)); + + UpdateOptions options = new UpdateOptions().upsert(true); + + ProxySystem.getInstance().getPlayers() + .updateOne(finalDocument, updates, options, (updateResult, throwable1) -> { + }); + + System.out.println("voiceWebCode " + voiceWebCode); + + sendVoiceWebCodeUrl(proxiedPlayer, voiceWebCode); + } + + System.out.println( + "consumer response value " + value.getUuid() + " " + value.getCmdID()); + }; + ProxySystem.getInstance().getKraProtocol().getConsumerHashMap().put(cmdID, consumer); + } + }); + + + } + + public void sendVoiceWebCodeUrl(ProxiedPlayer proxiedPlayer, String voiceWebCode) { + String url = ProxySystem.getInstance().getConfigHandler() + .getWebVoiceAddress() + voiceWebCode; + + TextComponent textComponent = new TextComponent( + "Klicke auf den Link, um dich mit dem Voice Server zu verbinden"); + + TextComponent linkComponent = new TextComponent(url); + linkComponent.setHoverEvent(new HoverEvent(Action.SHOW_TEXT, + new Text(url))); + linkComponent.setClickEvent( + new ClickEvent(ClickEvent.Action.OPEN_URL, + url)); + + textComponent.addExtra("\n"); + textComponent.addExtra(linkComponent); + + proxiedPlayer.sendMessage(textComponent); + } + + public String generateVoiceWebCode(String uuid) { + SecureRandom secureRandom = new SecureRandom(); + + String chrs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + String customTag = secureRandom.ints(8, 0, chrs.length()).mapToObj(chrs::charAt) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString(); + + System.out.println(customTag); + + + /* String chrs = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + SecureRandom secureRandom = SecureRandom.getInstanceStrong(); + + String customTag = secureRandom.ints(9, 0, chrs.length()).mapToObj(chrs::charAt) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString(); + System.out.println(customTag); + + /*AtomicBoolean avail = new AtomicBoolean(false); + + while (!avail.get()) { + System.out.println("while"); + secureRandom.ints(8, 0, chrs.length()).mapToObj(chrs::charAt) + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append).toString(); + System.out.println(customTag); + + ProxySystem.getInstance().getPlayerRegistrationProcess().find(Filters.eq("webCode", chrs)) + .first((document, throwable) -> { + if (document == null) { + avail.set(true); + } + }); + }*/ + + return customTag; + } + + @EventHandler + public void onServerSwitch(ServerSwitchEvent event) { + ProxiedPlayer player = event.getPlayer(); + + player.sendMessage( + new TextComponent("Switched server " + player.getServer().getInfo().getName())); + } + + /* + + @EventHandler + public void onServerConnect(ServerConnectEvent event) { + System.out.println( + "REASON " + event.getReason() + " " + event.getPlayer().getUniqueId().toString()); + + if (!event.getReason().equals(Reason.JOIN_PROXY)) { + System.out.println("return join proxy"); + return; + } + + // event.setTarget(ProxyServer.getInstance().getServerInfo("NewYork-1")); +/* + ProxySystem.getInstance().getKraProtocol() + .SendMessage(11, 10, 0, event.getPlayer().getUniqueId().toString().replaceAll("-", ""), 10, + ""); + + //event.setTarget(ProxyServer.getInstance().getServerInfo("NewYork-1")); + } */ +} diff --git a/src/main/java/net/krakatoa/proxy/mongo/MongoManager.java b/src/main/java/net/krakatoa/proxy/mongo/MongoManager.java new file mode 100644 index 0000000..b21425b --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/mongo/MongoManager.java @@ -0,0 +1,39 @@ +package net.krakatoa.proxy.mongo; + +import com.mongodb.async.client.MongoClient; +import com.mongodb.async.client.MongoClients; +import com.mongodb.async.client.MongoCollection; +import com.mongodb.async.client.MongoDatabase; +import lombok.Getter; +import org.bson.Document; + +public class MongoManager { + + private final String hostname; + private final int port; + private final String username; + private final String password; + + @Getter + private MongoDatabase mongoDatabase; + @Getter + private MongoClient mongoClient; + @Getter + private MongoCollection players; + + public MongoManager(String hostname, int port, String username, String password) { + this.hostname = hostname; + this.port = port; + this.username = username; + this.password = password; + } + + public void connect(String database) { + mongoClient = MongoClients.create( + "mongodb://" + username + ":" + password + "@" + hostname + ":" + port + "/?authSource=" + + database); + + mongoDatabase = mongoClient.getDatabase(database); + players = mongoDatabase.getCollection("players"); + } +} diff --git a/src/main/java/net/krakatoa/proxy/protocol/KraProtocol.java b/src/main/java/net/krakatoa/proxy/protocol/KraProtocol.java new file mode 100644 index 0000000..b54844d --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/protocol/KraProtocol.java @@ -0,0 +1,119 @@ +package net.krakatoa.proxy.protocol; + +import com.google.common.collect.Lists; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.function.Consumer; +import lombok.Getter; +import net.krakatoa.proxy.ProxySystem; + +public class KraProtocol { + + @Getter + ArrayList cmdIDs = Lists.newArrayList(); + + @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 void SendMessage(KraProtocolMessage kraProtocolMessage) { + SendMessage(kraProtocolMessage.getStatus(), kraProtocolMessage.getCmdID(), + kraProtocolMessage.getDest(), kraProtocolMessage.getUuid(), + kraProtocolMessage.getCmdNumber(), kraProtocolMessage.getArgs()); + } + + public void SendMessage(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); + } + } + + ProxySystem.getInstance().getSocketClient().SendMessage(raw); + } + + public KraProtocolMessage 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 KraProtocolMessage(status, cmdID, dest, playerUuid, cmdNumber, args); + } +} diff --git a/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessage.java b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessage.java new file mode 100644 index 0000000..7a46101 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessage.java @@ -0,0 +1,24 @@ +package net.krakatoa.proxy.protocol; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class KraProtocolMessage { + + 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/net/krakatoa/proxy/protocol/KraProtocolMessageHandler.java b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessageHandler.java new file mode 100644 index 0000000..ad1a724 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessageHandler.java @@ -0,0 +1,5 @@ +package net.krakatoa.proxy.protocol; + +public class KraProtocolMessageHandler { + +} diff --git a/src/main/java/net/krakatoa/proxy/protocol/KraProtocolStatus.java b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolStatus.java new file mode 100644 index 0000000..b7c928d --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/protocol/KraProtocolStatus.java @@ -0,0 +1,21 @@ +package net.krakatoa.proxy.protocol; + +import lombok.Getter; + +public enum KraProtocolStatus { + + 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; + + KraProtocolStatus(int status) { + this.status = status; + } +} diff --git a/src/main/java/net/krakatoa/proxy/socket/SocketClient.java b/src/main/java/net/krakatoa/proxy/socket/SocketClient.java new file mode 100644 index 0000000..26c9625 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/socket/SocketClient.java @@ -0,0 +1,121 @@ +package net.krakatoa.proxy.socket; + +import java.net.URI; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.concurrent.TimeUnit; +import net.krakatoa.proxy.ProxySystem; +import net.krakatoa.proxy.protocol.KraProtocolMessage; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +public class SocketClient extends WebSocketClient { + + public SocketClient(URI uri) { + super(uri); + } + + public void SendMessage(byte[] message) { + if (isOpen()) { + send(message); + } + } + + @Override + public void onOpen(ServerHandshake serverHandshake) { + System.out.println("Socket connection opened!"); + + //ProxySystem.getInstance().getKraProtocol() + // .SendMessage(1, 126375, 248, "myuui123asdrsdasadsdasdadsadsdsa", 65017, "player joined"); + + for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) { + proxiedPlayer.sendMessage(new TextComponent("§cSocket §8» §aConnected")); + } + } + + @Override + public void onMessage(String s) { + System.out.println("recv s: " + s); + } + + @Override + public void onMessage(ByteBuffer byteBuffer) { + System.out.println("recv b: " + Arrays.toString(byteBuffer.array())); + + KraProtocolMessage kraProtocolMessage = ProxySystem.getInstance().getKraProtocol() + .DecodeMessage(byteBuffer.array()); + + System.out.println( + "kraProtocolMessage " + kraProtocolMessage.getCmdID() + " " + kraProtocolMessage.getArgs()); + + // remove cmdID from cmdID list + ProxySystem.getInstance().getKraProtocol().getCmdIDs() + .removeIf(cmdID -> cmdID == kraProtocolMessage.getCmdID()); + + System.out.println( + "consumer ids " + ProxySystem.getInstance().getKraProtocol().getConsumerHashMap().keySet()); + + // test - mobile or voice socket connected + if (kraProtocolMessage.getCmdNumber() == 15) { + ProxyServer.getInstance().getScheduler().runAsync(ProxySystem.getInstance(), () -> { + System.out.println(ProxySystem.getInstance().getFormatter() + .stringToUuid(kraProtocolMessage.getUuid())); + + ProxiedPlayer proxiedPlayer = ProxySystem.getInstance().getProxy() + .getPlayer(ProxySystem.getInstance().getFormatter() + .stringToUuid(kraProtocolMessage.getUuid())); + + if (proxiedPlayer != null) { + if (kraProtocolMessage.getArgs().equals("1")) { + proxiedPlayer.sendMessage(new TextComponent("§5Mobile §8» §cConnection lost!")); + } else { + proxiedPlayer.sendMessage( + new TextComponent("§bVoice §8» §cConnection lost!")); + } + } + }); + } + + ProxySystem.getInstance().getKraProtocol().getConsumerHashMap() + .forEach((cmdID, consumer) -> { + if (cmdID == kraProtocolMessage.getCmdID()) { + System.out.println("accept " + cmdID + " " + kraProtocolMessage.getCmdID()); + consumer.accept(kraProtocolMessage); + } + }); + } + + @Override + public void onClose(int code, String reason, boolean remote) { + System.out.println( + "Connection! closed by " + (remote ? "remote peer" : "us") + " Code: " + code + " Reason: " + + reason); + + for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) { + proxiedPlayer.sendMessage( + new TextComponent( + "§cSocket §8» §c" + (remote ? "Connection! Closed by remote peer" : reason))); + } + + /* 1 called on plugin disable */ + if (code != 1) { + ProxyServer.getInstance().getScheduler().schedule(ProxySystem.getInstance(), () -> { + for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) { + proxiedPlayer.sendMessage(new TextComponent("§cSocket §8» §7Reconnecting...")); + } + + System.out.println("try reconnect"); + reconnect(); + }, 3L, TimeUnit.SECONDS); + } + } + + @Override + public void onError(Exception e) { + System.out.println("Error: " + e); + //e.printStackTrace(); + } +} diff --git a/src/main/java/net/krakatoa/proxy/util/Formatter.java b/src/main/java/net/krakatoa/proxy/util/Formatter.java new file mode 100644 index 0000000..bfbb671 --- /dev/null +++ b/src/main/java/net/krakatoa/proxy/util/Formatter.java @@ -0,0 +1,18 @@ +package net.krakatoa.proxy.util; + +import java.math.BigInteger; +import java.util.UUID; + +public class Formatter { + + public String formatUuid(String uuid) { + return uuid.replaceAll("-", ""); + } + + public UUID stringToUuid(String s) { + BigInteger bigInteger = new BigInteger(s.substring(0, 16), 16); + BigInteger bigInteger1 = new BigInteger(s.substring(16, 32), 16); + + return new UUID(bigInteger.longValue(), bigInteger1.longValue()); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..6de8bf6 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: KrakatoaProxySystem +author: AlexanderRoese +version: 1.0 +main: net.krakatoa.proxy.ProxySystem +commands: + code: \ No newline at end of file diff --git a/target/classes/net/krakatoa/proxy/ProxySystem.class b/target/classes/net/krakatoa/proxy/ProxySystem.class new file mode 100644 index 0000000..9e4cabf Binary files /dev/null and b/target/classes/net/krakatoa/proxy/ProxySystem.class differ diff --git a/target/classes/net/krakatoa/proxy/command/CodeCommand.class b/target/classes/net/krakatoa/proxy/command/CodeCommand.class new file mode 100644 index 0000000..be8218f Binary files /dev/null and b/target/classes/net/krakatoa/proxy/command/CodeCommand.class differ diff --git a/target/classes/net/krakatoa/proxy/config/ConfigHandler.class b/target/classes/net/krakatoa/proxy/config/ConfigHandler.class new file mode 100644 index 0000000..7b73012 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/config/ConfigHandler.class differ diff --git a/target/classes/net/krakatoa/proxy/listener/PlayerDisconnectListener.class b/target/classes/net/krakatoa/proxy/listener/PlayerDisconnectListener.class new file mode 100644 index 0000000..f822cc1 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/listener/PlayerDisconnectListener.class differ diff --git a/target/classes/net/krakatoa/proxy/listener/PostLoginListener.class b/target/classes/net/krakatoa/proxy/listener/PostLoginListener.class new file mode 100644 index 0000000..279dc16 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/listener/PostLoginListener.class differ diff --git a/target/classes/net/krakatoa/proxy/mongo/MongoManager.class b/target/classes/net/krakatoa/proxy/mongo/MongoManager.class new file mode 100644 index 0000000..bee298d Binary files /dev/null and b/target/classes/net/krakatoa/proxy/mongo/MongoManager.class differ diff --git a/target/classes/net/krakatoa/proxy/protocol/KraProtocol.class b/target/classes/net/krakatoa/proxy/protocol/KraProtocol.class new file mode 100644 index 0000000..010c4c4 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/protocol/KraProtocol.class differ diff --git a/target/classes/net/krakatoa/proxy/protocol/KraProtocolMessage.class b/target/classes/net/krakatoa/proxy/protocol/KraProtocolMessage.class new file mode 100644 index 0000000..8dc3de2 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/protocol/KraProtocolMessage.class differ diff --git a/target/classes/net/krakatoa/proxy/socket/SocketClient.class b/target/classes/net/krakatoa/proxy/socket/SocketClient.class new file mode 100644 index 0000000..13c9bf5 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/socket/SocketClient.class differ diff --git a/target/classes/net/krakatoa/proxy/util/Formatter.class b/target/classes/net/krakatoa/proxy/util/Formatter.class new file mode 100644 index 0000000..6a02038 Binary files /dev/null and b/target/classes/net/krakatoa/proxy/util/Formatter.class differ diff --git a/target/classes/plugin.yml b/target/classes/plugin.yml new file mode 100644 index 0000000..6de8bf6 --- /dev/null +++ b/target/classes/plugin.yml @@ -0,0 +1,6 @@ +name: KrakatoaProxySystem +author: AlexanderRoese +version: 1.0 +main: net.krakatoa.proxy.ProxySystem +commands: + code: \ No newline at end of file diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..2349549 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Oct 20 21:02:03 CEST 2021 +groupId=net.krakatoa.proxy +artifactId=KrakatoaProxySystem +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..4eecb6d --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,10 @@ +net/krakatoa/proxy/command/CodeCommand.class +net/krakatoa/proxy/mongo/MongoManager.class +net/krakatoa/proxy/socket/SocketClient.class +net/krakatoa/proxy/listener/PostLoginListener.class +net/krakatoa/proxy/ProxySystem.class +net/krakatoa/proxy/protocol/KraProtocol.class +net/krakatoa/proxy/util/Formatter.class +net/krakatoa/proxy/config/ConfigHandler.class +net/krakatoa/proxy/listener/PlayerDisconnectListener.class +net/krakatoa/proxy/protocol/KraProtocolMessage.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..4e204b6 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,10 @@ +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/config/ConfigHandler.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/protocol/KraProtocolMessage.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/command/CodeCommand.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/mongo/MongoManager.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/listener/PlayerDisconnectListener.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/listener/PostLoginListener.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/util/Formatter.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/ProxySystem.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/protocol/KraProtocol.java +/home/alex/IdeaProjects/KrakatoaProxySystem/src/main/java/net/krakatoa/proxy/socket/SocketClient.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