Compare commits

..

156 Commits

Author SHA1 Message Date
Alex 71dbd42b5c debug: mongodb document subscriber 2022-04-14 14:34:22 +02:00
Alex a92703fb3a debug: mongodb document subscriber 2022-04-14 13:57:20 +02:00
Alex 12fb9cb453 debug: mongodb document subscriber 2022-04-14 13:55:42 +02:00
Alex 931c6a4ade debug: mongodb document subscriber 2022-04-14 13:35:55 +02:00
alex 6abd0a8c6e debug: mongodb document subscriber 2022-04-14 13:30:48 +02:00
alex b73c5f8e8a debug: mongodb document subscriber 2022-04-11 22:41:50 +02:00
alex 733e580c90 debug: mongodb document subscriber 2022-04-11 22:38:17 +02:00
alex f93e0bc684 mongodb document subscriber 2022-04-11 22:33:26 +02:00
alex d1644689a9 mongodb document subscriber 2022-04-11 22:25:18 +02:00
alex 854e713d52 test: mongodb document subscriber 2022-04-11 22:13:25 +02:00
alex 59699b80ad connect mongodb on proxy startup 2022-04-10 21:34:42 +02:00
alex b54518cf14 mongodb find document test 2022-04-10 21:30:15 +02:00
alex 144b0fc7fc unused dependencies removed 2022-04-10 21:07:09 +02:00
alex b5a830e4f5 removed debug msg 2022-04-10 20:50:39 +02:00
alex 54f6ba503d changed redis port to int 2022-04-10 20:44:31 +02:00
alex c7ca750fac debug msg 2022-04-10 20:38:19 +02:00
alex 1ca0a07b3a mongodb reactive stream driver 2022-04-10 20:17:31 +02:00
alex 84ade4ac37 is no longer needed, it is now imported from KraCore 2022-04-10 20:17:02 +02:00
alex c31641701d test 2022-04-09 22:09:41 +02:00
Alex 7d85f98384 redis added to the config handler 2022-04-06 21:28:06 +02:00
Alex 93f1179b38 save the player in the database again when the player leaves the server 2022-04-05 20:50:57 +02:00
Alex 93e2020621 save the player in the database again when the player leaves the server 2022-04-05 20:49:23 +02:00
Alex 1d7b2eea06 save the player in the database again when the player leaves the server 2022-04-05 20:46:06 +02:00
Alex 88c35ce447 save the player in the database again when the player leaves the server 2022-04-05 20:36:06 +02:00
Alex 10d6446688 save the player in the database again when the player leaves the server 2022-04-05 20:31:30 +02:00
Alex dfa48408d8 save the player in the database again when the player leaves the server 2022-04-05 20:21:43 +02:00
Alex a3dbe574d4 save the player in the database again when the player leaves the server 2022-04-05 20:20:30 +02:00
Alex eb2deaef14 unnecessary list deleted 2022-04-05 20:00:57 +02:00
Alex 43995d580f save the player in the database again when the player leaves the server 2022-04-05 20:00:37 +02:00
Alex 6cef1f2916 added debug for redis player data 2022-04-04 22:08:44 +02:00
Alex 5d2c9e249c added debug for redis player data 2022-04-04 21:54:41 +02:00
Alex 289ef5440e add player to redis when player enters server 2022-04-04 21:53:14 +02:00
Alex dfa7d25559 remove player from redis when player left server 2022-04-04 21:49:51 +02:00
Alex 56b939d385 add player to redis when player enters server 2022-04-04 19:42:57 +02:00
Alex 8297beb679 add player to redis when player enters server 2022-04-04 19:35:03 +02:00
Alex ec95ff73cb redis test 2022-03-27 23:13:01 +02:00
Alex 811ff26930 redis test 2022-03-27 23:04:19 +02:00
Alex b4724e399d redis test 2022-03-27 23:01:27 +02:00
Alex 0a50749a3a redis test 2022-03-27 22:45:16 +02:00
Alex 046ab438da redis test 2022-03-27 22:43:52 +02:00
Alex c0793baf8d redis test 2022-03-27 22:34:38 +02:00
Alex 8b2d7ba69e redis test 2022-03-27 22:33:06 +02:00
Alex e1758cbf4b redis test 2022-03-27 22:15:41 +02:00
Alex 6758e607fa redis test 2022-03-27 21:03:38 +02:00
Alex d5eb6ef5f3 redis test 2022-03-27 20:58:33 +02:00
Alex 80f220c062 redis test 2022-03-27 20:40:44 +02:00
Alex f910d951c8 redis test 2022-03-27 20:39:18 +02:00
Alex 6cd684f429 redis test 2022-03-27 20:33:53 +02:00
Alex c9eddca546 redis test 2022-03-27 20:31:28 +02:00
Alex ca756c6895 redis test 2022-03-27 20:23:50 +02:00
Alex 91a37e7dcd redis test 2022-03-27 20:10:54 +02:00
Alex 28efb35905 redis test 2022-03-27 20:03:01 +02:00
Alex 13fde2d52d redis test 2022-03-27 19:58:10 +02:00
Alex 9ca5712588 redis test 2022-03-27 19:54:05 +02:00
Alex c280a796f8 library changed to redisson 2022-03-27 19:43:22 +02:00
Alex 3763a3219e library changed to redisson 2022-03-27 19:35:18 +02:00
Alex f750945e6e library changed to redisson 2022-03-27 19:32:32 +02:00
Alex 7e44b6ab63 redis tests - hashes 2022-03-26 22:00:03 +01:00
Alex 511055e6e8 redis tests - hashes 2022-03-26 21:30:48 +01:00
Alex 5d68e4549a redis tests - hashes 2022-03-26 21:28:03 +01:00
Alex 7f3718d259 redis tests - hashes 2022-03-26 21:09:15 +01:00
Alex 3448f71b66 redis tests - hashes 2022-03-26 21:05:53 +01:00
Alex 26fd9540c1 redis tests - hashes 2022-03-26 21:04:49 +01:00
Alex 972d453d79 redis tests - hashes 2022-03-26 21:02:15 +01:00
Alex f0d595f0fb redis tests - hashes 2022-03-26 20:54:07 +01:00
Alex 2c9bbbf9a5 redis tests - hashes 2022-03-26 20:46:35 +01:00
Alex 4197762722 redis tests - hashes 2022-03-26 20:34:54 +01:00
Alex f3a3489551 redis tests - hashes 2022-03-26 20:17:33 +01:00
Alex 9da7c4cd82 redis tests - hashes 2022-03-26 19:30:43 +01:00
Alex e56d822bde redis tests - hashes 2022-03-26 19:26:39 +01:00
Alex 46e03ec877 tests with redis command interface 2022-03-21 21:15:20 +01:00
Alex 9d34b2e1fd tests with redis command interface 2022-03-21 21:08:11 +01:00
Alex 3fb37a34cb tests with redis command interface 2022-03-21 21:00:26 +01:00
Alex 3787a206ed implement redis command interface 2022-03-21 19:48:00 +01:00
Alex 6ea1aef3a7 implement redis command interface 2022-03-21 19:43:17 +01:00
Alex dc9232c420 implement Redis 2022-03-20 21:22:14 +01:00
Alex 6a6b0ceb32 implement Redis 2022-03-20 21:08:42 +01:00
Alex 6116e069a9 implement Redis 2022-03-20 21:04:51 +01:00
Alex 9a2f0ab15c close mongoManager and redisManager connections on proxy shutdown 2022-03-20 20:45:37 +01:00
Alex ebcd6d1a58 Implement Redis 2022-03-20 20:13:07 +01:00
Alex 8665d4b3f2 ToDo information added, as the method is deprecated 2022-03-20 20:12:37 +01:00
Alex 7cc71b2a3d added permission check to SendTestMessageCommand 2022-03-19 23:39:24 +01:00
Alex 5aa4730707 added KrakatoapCommand 2022-03-19 23:11:14 +01:00
Alex 64919d8e24 added KrakatoapCommand 2022-03-19 23:09:18 +01:00
Alex c7abef9630 reply to ack msg that we recevied the connection/closed information about the clients 2022-03-15 15:16:35 +01:00
Alex c91a062be3 removed unused dependency 2022-03-15 14:44:45 +01:00
Alex bcf60a7796 uuid kraSocketClient 2022-03-13 22:47:44 +01:00
Alex 2584ecc780 uuid kraSocketClient 2022-03-13 22:42:25 +01:00
Alex 29b3bef52e Message to the player when the voice/mobile connection is opened 2022-03-13 21:49:58 +01:00
Alex 8c41ad938d Message to the player when the voice/mobile connection is opened 2022-03-13 21:48:08 +01:00
Alex 4c282110ce Message to the player when the voice/mobile phone connection is terminated 2022-03-13 21:40:59 +01:00
Alex c102ed96d3 Message to the player when the mobile phone connection is terminated 2022-03-13 21:34:20 +01:00
Alex 5bcb9504b0 Message to the player when the mobile phone connection is terminated 2022-03-13 21:30:42 +01:00
Alex a0de144a3a Message to the player when the mobile phone connection is terminated 2022-03-13 21:19:17 +01:00
Alex 33c3fbc185 Message to the player when the mobile phone connection is terminated 2022-03-13 21:14:26 +01:00
Alex 292e46875b Message to the player when the mobile phone connection is terminated 2022-03-13 21:11:02 +01:00
Alex 6b21a94c5d Message to the player when the mobile phone connection is terminated 2022-03-13 21:10:54 +01:00
Alex 09f5717bea Added login listener to prevent players from joining with an unsupported version 2022-03-13 19:51:48 +01:00
Alex c8adb6268d Added login listener to prevent players from joining with an unsupported version 2022-03-13 19:42:05 +01:00
Alex d0fb219805 Added login listener to prevent players from joining with an unsupported version 2022-03-13 19:37:04 +01:00
Alex 7a18172b0a Added NumberFormatException check 2022-03-13 16:53:38 +01:00
Alex d054d84339 Added NumberFormatException check 2022-03-13 16:51:03 +01:00
Alex d1ce57dc2b Added NumberFormatException check 2022-03-13 16:49:06 +01:00
Alex 81682f477e Changed parseShort to parseInt 2022-03-13 16:24:39 +01:00
Alex 463a4806fc added consumer to send test messages command to receive and send a reply message to the player 2022-02-28 20:40:26 +01:00
Alex fcbc93ac77 method removeData changed to removeMessageFromSendQueue 2022-02-28 20:15:36 +01:00
Alex ff123f3ea7 code changed to current web socket client version 2022-02-28 20:11:55 +01:00
Alex 4d5baafb74 load web socket ack timeouts from config 2022-02-28 18:54:23 +01:00
Alex a7662eaaa6 load web socket ack timeouts from config 2022-02-28 18:53:22 +01:00
Alex 154dd2207a load web socket ack timeouts from config 2022-02-28 18:51:37 +01:00
Alex d6ce0d488f cmdNumber 53874: delete cmdID from cmdIDs list when we have replied 2022-02-12 20:02:15 +01:00
Alex d8ce99e7f8 added cmdNumber 53874 for ack handling between backend and proxy 2022-02-05 20:49:09 +01:00
Alex 36fa9f0d2b added cmdNumber 53874 for ack handling between backend and proxy 2022-02-05 20:46:23 +01:00
Alex 09e715a449 fix SendTestMessageCommand 2022-01-04 00:27:23 +01:00
Alex 70752bfb4f consumer message handling 2022-01-03 22:56:12 +01:00
Alex d3040f455e consumer handling on message receiving 2022-01-02 20:40:45 +01:00
Alex a56977bcac generateCmdID when status equal GET 2022-01-01 17:44:46 +01:00
Alex 6aa1446a20 removed mongodb debug output 2022-01-01 17:38:57 +01:00
Alex d81c59e1fe generateCmdID KraSocketClient 2022-01-01 17:19:38 +01:00
Alex 86673c36b3 Formatter imported again, as this is needed for the player uuids 2022-01-01 14:42:21 +01:00
Alex 8704026299 removed formatter because already implemented in KraSocketClient 2021-12-29 19:42:29 +01:00
Alex 2e178f09a6 removed formatter because already implemented in KraSocketClient 2021-12-29 19:41:16 +01:00
Alex 3c92d59843 removed formatter because already implemented in KraSocketClient 2021-12-29 18:57:59 +01:00
Alex 7b650b617d test message command 2021-12-29 15:16:17 +01:00
Alex 3b76fe2c05 test message command 2021-12-29 15:14:33 +01:00
Alex 8016d9d62f test message command 2021-12-29 13:14:29 +01:00
Alex e4b1ba7b0d auto restart system 2021-12-28 00:08:49 +01:00
Alex f3cc29d7f4 auto restart system 2021-12-28 00:06:40 +01:00
Alex 1365316d2a auto restart system 2021-12-28 00:02:12 +01:00
Alex 984537d155 auto restart system 2021-12-28 00:00:03 +01:00
Alex 3deca3a8bf auto restart system 2021-12-27 23:56:52 +01:00
Alex 4f7d8ad6a6 auto restart system 2021-12-27 23:54:39 +01:00
Alex 2f2f4fa44f auto restart system 2021-12-27 23:52:22 +01:00
Alex 589c84117e auto restart system 2021-12-27 23:36:48 +01:00
Alex 6090cadb23 auto restart system 2021-12-27 23:32:55 +01:00
Alex 6ca542642f auto restart system 2021-12-27 23:31:11 +01:00
Alex 7a75a4c205 auto restart system 2021-12-27 23:29:34 +01:00
Alex c6c55d512d auto restart system 2021-12-27 22:10:14 +01:00
Alex f8d21509ef auto restart system 2021-12-27 22:08:44 +01:00
Alex 14e5085726 auto restart system 2021-12-27 21:42:31 +01:00
Alex 9d0fd776c5 auto restart system 2021-12-27 21:33:59 +01:00
Alex b4dd93fa3d auto restart system 2021-12-27 21:31:53 +01:00
Alex b565237206 auto restart system 2021-12-27 20:03:50 +01:00
Alex 9743f674a4 auto restart system 2021-12-27 19:08:16 +01:00
Alex f63d64b6e0 auto restart system 2021-12-27 17:16:29 +01:00
Alex c26ea7aa24 auto restart system 2021-12-27 17:14:48 +01:00
Alex df39c12033 auto restart system 2021-12-27 17:14:33 +01:00
Alex f9814721f1 auto restart system 2021-12-27 16:57:19 +01:00
Alex 01be33fa8b implemented KraSocketClient 2021-12-27 15:19:20 +01:00
Alex f143804662 implemented KraSocketClient 2021-12-27 15:03:51 +01:00
Alex 44112e5e32 implemented KraSocketClient 2021-12-27 15:01:55 +01:00
Alex e9683bc9a7 implemented KraSocketClient 2021-12-27 14:57:02 +01:00
Alex 9b9c96b748 changed token to accessKey 2021-12-27 12:39:56 +01:00
Alex 553cce0f32 changed config path 2021-12-22 23:20:18 +01:00
Alex d38c520870 Changed name to KraProxySystem 2021-12-22 23:01:19 +01:00
Alex 8ed61dcb61 Changed name to KraProxySystem 2021-12-22 22:58:52 +01:00
33 changed files with 718 additions and 470 deletions

40
pom.xml Normal file → Executable file
View File

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.krakatoa.proxy</groupId>
<artifactId>KrakatoaProxySystem</artifactId>
<artifactId>KraProxySystem</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
@ -59,14 +59,26 @@
<version>1.18.22</version>
</dependency>
<dependency>
<artifactId>Java-WebSocket</artifactId>
<groupId>org.java-websocket</groupId>
<version>1.5.2</version> <!-- 1.5.1 -->
<groupId>de.dytanic.cloudnet</groupId>
<artifactId>cloudnet-bridge</artifactId>
<version>3.4.0-RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<artifactId>mongodb-driver-async</artifactId>
<groupId>org.mongodb</groupId>
<version>3.12.10</version> <!-- 3.0.4 -->
<groupId>de.dytanic.cloudnet</groupId>
<artifactId>cloudnet-driver</artifactId>
<version>3.4.0-RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>earth.krakatoa</groupId>
<artifactId>KraSocketClient</artifactId>
<version>1.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>earth.krakatoa</groupId>
<artifactId>KraCore</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
@ -86,5 +98,19 @@
</snapshots>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
<repository>
<id>krakatoa-earth</id>
<url>https://repo.krakatoa.umbach.dev/repository/krakatoa-earth/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>cloudnet-releases</id>
<url>https://repo.cloudnetservice.eu/repository/releases/</url>
</repository>
</repositories>
</project>

97
src/main/java/net/krakatoa/proxy/ProxySystem.java Normal file → Executable file
View File

@ -1,22 +1,28 @@
package net.krakatoa.proxy;
import com.mongodb.async.client.MongoCollection;
import java.net.URI;
import java.net.URISyntaxException;
import earth.krakatao.KraSocketClient;
import earth.krakatao.KraSocketClientConfig;
import earth.krakatao.events.KraSocketClientEventInitiater;
import earth.krakatao.events.KraSocketClientEventInterface;
import earth.krakatao.protocol.KraSocketClientProtocol;
import earth.krakatoa.core.config.MongoConfig;
import earth.krakatoa.core.config.RedisConfig;
import earth.krakatoa.core.mongo.MongoManager;
import earth.krakatoa.core.redis.RedisManager;
import earth.krakatoa.core.util.Formatter;
import java.util.Arrays;
import lombok.Getter;
import lombok.SneakyThrows;
import net.krakatoa.proxy.command.CodeCommand;
import net.krakatoa.proxy.command.KrakatoapCommand;
import net.krakatoa.proxy.command.SendTestMessageCommand;
import net.krakatoa.proxy.config.ConfigHandler;
import net.krakatoa.proxy.listener.LoginListener;
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.krakatoa.proxy.listener.SocketClientMessageListener;
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 {
@ -25,44 +31,48 @@ public class ProxySystem extends Plugin {
private static ProxySystem instance;
private ConfigHandler configHandler;
private MongoManager mongoManager;
private SocketClient socketClient;
private KraProtocol kraProtocol;
private Formatter formatter;
private MongoCollection<Document> players;
private KraSocketClientProtocol kraSocketClientProtocol;
private KraSocketClient kraSocketClient;
private KraSocketClientEventInitiater kraSocketClientEventInitiater;
private KraSocketClientEventInterface kraSocketClientEventInterface;
private MongoManager mongoManager;
private RedisManager redisManager;
@SneakyThrows
@Override
public void onEnable() {
instance = this;
configHandler = new ConfigHandler();
configHandler.load();
this.configHandler = new ConfigHandler();
this.configHandler.load();
kraProtocol = new KraProtocol();
formatter = new Formatter();
this.formatter = new Formatter();
System.out.println(
"mongo cfg " + configHandler.getMongodbHost() + " " + configHandler.getMongodbUsername());
this.kraSocketClientProtocol = new KraSocketClientProtocol();
mongoManager = new MongoManager(configHandler.getMongodbHost(),
configHandler.getMongodbPort(), configHandler.getMongodbUsername(),
configHandler.getMongodbPassword());
mongoManager.connect(configHandler.getMongodbDatabase());
KraSocketClientConfig kraSocketClientConfig = new KraSocketClientConfig(
this.configHandler.getWebSocketProtocol(), this.configHandler.getWebSocketHost(),
this.configHandler.getWebSocketPort(), this.configHandler.getWebSocketAccessKey(),
"proxy-1", this.configHandler.getWebSocketAckTimeouts());
try {
socketClient = new SocketClient(
new URI(configHandler.getWebSocketProtocol() + "://" + configHandler.getWebSocketHost()
+ ":" + configHandler.getWebSocketPort() + "/ws?t="
+ configHandler.getWebSocketAccessKey() + "&s=proxy-1"));
} catch (URISyntaxException e) {
e.printStackTrace();
}
this.kraSocketClientEventInitiater = new KraSocketClientEventInitiater();
this.kraSocketClientEventInterface = new SocketClientMessageListener();
socketClient.connect();
this.kraSocketClient = new KraSocketClient(kraSocketClientConfig,
this.kraSocketClientEventInterface, this.kraSocketClientProtocol);
players = mongoManager.getMongoDatabase().getCollection("players");
this.kraSocketClient.getSocketClient().connect();
this.mongoManager = new MongoManager(
new MongoConfig(this.configHandler.getMongodbHost(), this.configHandler.getMongodbPort(),
this.configHandler.getMongodbUsername(), this.configHandler.getMongodbPassword(),
this.configHandler.getMongodbDatabase()));
this.mongoManager.connect();
this.redisManager = new RedisManager(
new RedisConfig(this.configHandler.getRedisHost(), this.configHandler.getRedisPort()));
this.redisManager.connect();
loadListeners();
loadCommands();
@ -70,15 +80,18 @@ public class ProxySystem extends Plugin {
@Override
public void onDisable() {
socketClient.getConnection().close();
socketClient.getConnection().closeConnection(1, "");
this.kraSocketClient.getSocketClient().getConnection().close();
this.kraSocketClient.getSocketClient().getConnection().closeConnection(1, "");
this.mongoManager.shutdown();
this.redisManager.shutdown();
instance = null;
}
public void loadListeners() {
PluginManager pluginManager = getProxy().getPluginManager();
Arrays.asList(new PostLoginListener(), new PlayerDisconnectListener())
Arrays.asList(new PostLoginListener(), new PlayerDisconnectListener(), new LoginListener())
.forEach(listener -> {
pluginManager.registerListener(this, listener);
});
@ -86,16 +99,10 @@ public class ProxySystem extends Plugin {
public void loadCommands() {
PluginManager pluginManager = getProxy().getPluginManager();
Arrays.asList(new CodeCommand("code")).forEach(listener -> {
Arrays.asList(new CodeCommand("code"), new SendTestMessageCommand("sendTestMessage"),
new KrakatoapCommand("krakatoap"))
.forEach(listener -> {
pluginManager.registerCommand(this, listener);
});
}
/*
TODO: proxy ping & join only accessible for 1.17.1 clients
*/
}

View File

@ -39,7 +39,6 @@ public class CodeCommand extends Command {
// TODO: add url and copy text
//proxiedPlayer.sendMessage(new TextComponent("§eNeuer Code §c§l" + voiceWebCode));
}
}

View File

@ -0,0 +1,51 @@
package net.krakatoa.proxy.command;
import de.dytanic.cloudnet.driver.CloudNetDriver;
import de.dytanic.cloudnet.driver.permission.IPermissionUser;
import earth.krakatao.debug.DebugMessage;
import net.krakatoa.proxy.ProxySystem;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import org.redisson.api.RMap;
public class KrakatoapCommand extends Command {
public KrakatoapCommand(String name) {
super(name);
}
@Override
public void execute(CommandSender sender, String[] args) {
if (sender instanceof ProxiedPlayer) {
ProxiedPlayer player = (ProxiedPlayer) sender;
IPermissionUser permissionUser = CloudNetDriver.getInstance().getPermissionManagement()
.getUser(player.getUniqueId());
if (permissionUser != null && permissionUser.hasPermission("*").asBoolean()) {
player.sendMessage(new TextComponent(
DebugMessage.GetMessage(CloudNetDriver.getInstance().getComponentName(),
ProxySystem.getInstance().getKraSocketClient().getSocketClient()
.getDest(), ProxySystem.getInstance().getKraSocketClientProtocol()
.getSendQueueMessages().size(), ProxySystem.getInstance()
.getKraSocketClientProtocol()
.getReceivedQueueMessages().size())));
String uuid = ProxySystem.getInstance().getFormatter().formatUuid(player.getUniqueId());
RMap<String, String> map = ProxySystem.getInstance().getRedisManager()
.getRedissonClient()
.getMap("player:" + uuid);
if (!map.isEmpty()) {
player.sendMessage(new TextComponent("\n§cRedis player data:"));
map.forEach((key, value) -> {
player.sendMessage(new TextComponent("§7key: §e" + key + " §7value: §e" + value));
});
}
}
}
}
}

View File

@ -0,0 +1,76 @@
package net.krakatoa.proxy.command;
import de.dytanic.cloudnet.driver.CloudNetDriver;
import de.dytanic.cloudnet.driver.permission.IPermissionUser;
import earth.krakatao.protocol.KraSocketClientProtocolMessage;
import earth.krakatao.protocol.KraSocketClientProtocolStatus;
import java.util.function.Consumer;
import net.krakatoa.proxy.ProxySystem;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
public class SendTestMessageCommand extends Command {
// /sendTestMessage <status> <cmdID> <dest> <cmdNumber> <msg>
public SendTestMessageCommand(String name) {
super(name);
}
@Override
public void execute(CommandSender commandSender, String[] args) {
if (commandSender instanceof ProxiedPlayer) {
ProxiedPlayer proxiedPlayer = (ProxiedPlayer) commandSender;
IPermissionUser permissionUser = CloudNetDriver.getInstance().getPermissionManagement()
.getUser(proxiedPlayer.getUniqueId());
if (permissionUser != null && permissionUser.hasPermission("*").asBoolean()) {
if (args.length == 5) {
try {
int cmdID;
byte status = Byte.parseByte(args[0]);
if (status == KraSocketClientProtocolStatus.GET.getStatus()) {
cmdID = ProxySystem.getInstance().getKraSocketClientProtocol().generateCmdID();
} else {
cmdID = Byte.parseByte(args[1]);
}
Consumer<KraSocketClientProtocolMessage> consumer = null;
if (status == KraSocketClientProtocolStatus.GET.getStatus()) {
consumer = kraSocketClientProtocolMessage -> {
proxiedPlayer.sendMessage(new TextComponent(
"Received msg -> status:" + kraSocketClientProtocolMessage.getStatus()
+ " cmdID: "
+ kraSocketClientProtocolMessage.getCmdID() + " dest: "
+ kraSocketClientProtocolMessage.getDest() + " uuid: "
+ kraSocketClientProtocolMessage.getUuid() + " cmdNumber: "
+ kraSocketClientProtocolMessage.getCmdNumber() + " args: "
+ kraSocketClientProtocolMessage.getArgs()));
};
}
KraSocketClientProtocolMessage kraSocketClientProtocolMessage = null;
kraSocketClientProtocolMessage = new KraSocketClientProtocolMessage(
status, (byte) cmdID, Integer.parseInt(args[2]),
proxiedPlayer.getUniqueId(), Integer.parseInt(args[3]), args[4],
consumer);
ProxySystem.getInstance().getKraSocketClient().getSocketClient()
.SendMessage(kraSocketClientProtocolMessage);
} catch (NumberFormatException exception) {
proxiedPlayer.sendMessage(new TextComponent("§7Error: §cNumberFormatException"));
}
} else {
proxiedPlayer.sendMessage(new TextComponent(
"§cVerwendung: §7/sendTestMessage <status> <cmdID> <dest> <cmdNumber> <msg>"));
}
}
}
}
}

View File

@ -2,6 +2,7 @@ package net.krakatoa.proxy.config;
import java.io.File;
import java.io.IOException;
import java.util.List;
import lombok.Getter;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
@ -14,6 +15,7 @@ public class ConfigHandler {
private String webSocketProtocol;
private String webSocketHost;
private int webSocketPort;
private List<Long> webSocketAckTimeouts;
private String webVoiceAddress;
@ -23,15 +25,18 @@ public class ConfigHandler {
private String mongodbUsername;
private String mongodbPassword;
private String redisHost;
private int redisPort;
public void load() throws IOException {
// TODO change file to yaml
Configuration configuration = ConfigurationProvider.getProvider(YamlConfiguration.class)
.load(new File("/home/CloudNet/kraConfigs", "kraSettings.yaml"));
.load(new File("/home/kra-minecraft/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");
webSocketAckTimeouts = configuration.getLongList("web_socket.ack_timeouts");
webVoiceAddress = configuration.getString("web.voice_address");
@ -40,5 +45,8 @@ public class ConfigHandler {
mongodbDatabase = configuration.getString("mongodb.database");
mongodbUsername = configuration.getString("mongodb.username");
mongodbPassword = configuration.getString("mongodb.password");
redisHost = configuration.getString("redis.host");
redisPort = configuration.getInt("redis.port");
}
}

View File

@ -0,0 +1,26 @@
package net.krakatoa.proxy.listener;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class LoginListener implements Listener {
// https://wiki.vg/Protocol_version_numbers
private final BaseComponent[] component = new ComponentBuilder(
"You must use 1.18.X to play here").color(
ChatColor.RED).create();
@EventHandler
public void onLoginEvent(LoginEvent event) {
// prevent players from joing with an version under 1.18
if (event.getConnection().getVersion() < 757) {
event.setCancelled(true);
event.setCancelReason(component);
}
}
}

View File

@ -1,9 +1,22 @@
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.util.ArrayList;
import java.util.List;
import java.util.Objects;
import net.krakatoa.proxy.ProxySystem;
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;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
import org.redisson.api.RMap;
public class PlayerDisconnectListener implements Listener {
@ -11,16 +24,70 @@ public class PlayerDisconnectListener implements Listener {
public void onDisconnect(PlayerDisconnectEvent event) {
ProxiedPlayer proxiedPlayer = event.getPlayer();
//String uuid = ProxySystem.getInstance().getFormatter()
// .formatUuid(proxiedPlayer.getUniqueId().toString());
String uuid = ProxySystem.getInstance().getFormatter()
.formatUuid(proxiedPlayer.getUniqueId().toString());
// redis
RMap<String, String> map = ProxySystem.getInstance().getRedisManager()
.getRedissonClient()
.getMap("player:" + uuid);
// mongo
Publisher<Document> document = ProxySystem.getInstance().getMongoManager()
.getPlayersCollection()
.find(Filters.eq("uuid", uuid)).first();
document.subscribe(new Subscriber<>() {
@Override
public void onSubscribe(Subscription subscription) {
subscription.request(1);
}
@Override
public void onNext(Document document) {
List<Bson> updatesList = new ArrayList<>();
map.forEach((key, value) -> {
if (!Objects.equals(key, "_id") && !Objects.equals(key, "uuid")) {
updatesList.add(Updates.set(key, value));
}
});
Bson updates = Updates.combine(updatesList);
UpdateOptions options = new UpdateOptions().upsert(true);
System.out.println("doc: " + document.keySet());
ProxySystem.getInstance().getMongoManager().getPlayersCollection()
.updateOne(Filters.eq("uuid", uuid), updates);
/*
ProxySystem.getInstance().getPlayerRegistrationProcess()
.deleteOne(Filters.eq("uuid", uuid),
(deleteResult, throwable) -> {
ProxySystem.getInstance().getMongoManager().getPlayersCollection()
.updateOne(document, updates, options, (result, t) -> {
System.out.println(result == null);
System.out.println("delete " + deleteResult.getDeletedCount());
if (result != null) {
System.out.println("Modified document count: " + result.getModifiedCount());
System.out.println("Upserted id: " + result.getUpsertedId());
}
}); */
}
@Override
public void onError(Throwable throwable) {
System.out.println("Mongo player is null on disconnect");
}
@Override
public void onComplete() {
}
});
// redis
if (!map.isEmpty()) {
map.delete();
}
}
}

View File

@ -1,60 +1,125 @@
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.io.IOException;
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;
import org.reactivestreams.Publisher;
import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;
public class PostLoginListener implements Listener {
@EventHandler
public void onPostLogin(PostLoginEvent event) {
public void onPostLogin(PostLoginEvent event) throws IOException {
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
Publisher<Document> document = ProxySystem.getInstance().getMongoManager()
.getPlayersCollection()
.find(Filters.eq("uuid", uuid)).first();
ProxySystem.getInstance().getLogger().info("debug1");
document.subscribe(new Subscriber<>() {
@Override
public void onSubscribe(Subscription subscription) {
subscription.request(1);
ProxySystem.getInstance().getLogger().info("Subscripe");
}
@Override
public void onNext(Document document) {
ProxySystem.getInstance().getLogger().info("Inserted");
ProxySystem.getInstance().getLogger().info("Inserted: " + document);
}
@Override
public void onError(Throwable throwable) {
ProxySystem.getInstance().getLogger().info("Failed " + throwable);
}
@Override
public void onComplete() {
ProxySystem.getInstance().getLogger().info("Completed");
}
});
ProxySystem.getInstance().getLogger().info("debug2 testa");
/*
if (document == null) { // new player - create entries in databases
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");
});
ProxySystem.getInstance().getMongoManager().getPlayersCollection().insertOne(document);
sendVoiceWebCodeUrl(proxiedPlayer, voiceWebCode);
} else {
// check if both sockets connected
int cmdID = ProxySystem.getInstance().getKraProtocol().getCmdID();
ProxySystem.getInstance().getKraProtocol().SendMessage(11, cmdID, 1, uuid, 10, "");
// redis
RMap<String, String> map = ProxySystem.getInstance().getRedisManager()
.getRedissonClient()
.getMap("player:" + uuid);
if (map.isEmpty()) {
map.put("uuid", uuid);
map.put("voiceWebCode", "voiceWebCode");
ProxySystem.getInstance().getLogger().info("PUT !");
} else {
ProxySystem.getInstance().getLogger()
.warning("REDIS player " + uuid + " exists in the cache, but should not exist");
}
} else { // player found in the database
// redis
ProxySystem.getInstance().getLogger().info("mongodb player " + document.keySet());
RMap<String, String> map = ProxySystem.getInstance().getRedisManager()
.getRedissonClient()
.getMap("player:" + uuid);
if (map.isEmpty()) {
map.put("uuid", uuid);
map.put("voiceWebCode", "voiceWebCode");
document.forEach((key, value) -> {
if (!Objects.equals(key, "_id")) {
ProxySystem.getInstance().getLogger()
.info("key " + key + " value " + value.toString());
map.put(key, value.toString());
}
});
ProxySystem.getInstance().getLogger().info("PUT !");
} else {
ProxySystem.getInstance().getLogger()
.warning("REDIS player " + uuid + " exists in the cache, but should not exist");
}
// check if both sockets connected
int cmdID = ProxySystem.getInstance().getKraSocketClientProtocol().generateCmdID();
Document finalDocument = document;
Consumer<KraProtocolMessage> consumer = value -> {
Consumer<KraSocketClientProtocolMessage> consumer = value -> {
if (value.getArgs().equals("1")) {
// connected! Send player to game server
System.out.println(
@ -77,9 +142,8 @@ public class PostLoginListener implements Listener {
UpdateOptions options = new UpdateOptions().upsert(true);
ProxySystem.getInstance().getPlayers()
.updateOne(finalDocument, updates, options, (updateResult, throwable1) -> {
});
ProxySystem.getInstance().getMongoManager().getPlayersCollection()
.updateOne(finalDocument, updates, options);
System.out.println("voiceWebCode " + voiceWebCode);
@ -89,11 +153,66 @@ public class PostLoginListener implements Listener {
System.out.println(
"consumer response value " + value.getUuid() + " " + value.getCmdID());
};
ProxySystem.getInstance().getKraProtocol().getConsumerHashMap().put(cmdID, consumer);
ProxySystem.getInstance().getKraSocketClient().getSocketClient()
.SendMessage(new KraSocketClientProtocolMessage(
KraSocketClientProtocolStatus.GET.getStatus(), cmdID,
KraSocketClientProtocolDest.BACKEND.getStatus(), proxiedPlayer.getUniqueId(),
(short) 10, "", consumer));
}
});
/*
MessageBufferPacker packer = MessagePack.newDefaultBufferPacker();
packer.packString(proxiedPlayer.getName());
packer.packInt(3501983);
packer.packArrayHeader(2);
packer.packString("number 1");
packer.packString("number 2");
packer.close(); */
/*
RBucket<PlayerTest> bucket = ProxySystem.getInstance().getRedisManager().getRedissonClient()
.getBucket("player:" + proxiedPlayer.getUniqueId().toString());
ProxySystem.getInstance().getLogger().info("here1");
if (bucket != null) {
PlayerTest playerTest = bucket.get();
ProxySystem.getInstance().getLogger().info("here2 " + (playerTest == null));
if (playerTest == null) {
playerTest = new PlayerTest(proxiedPlayer.getName(), 250, "scooter");
ProxySystem.getInstance().getLogger()
.info("my playertest " + playerTest.getName() + playerTest.getCar());
bucket.set(playerTest);
ProxySystem.getInstance().getLogger().info("created bucket for playerTest");
} else {
ProxySystem.getInstance().getLogger().info("playerTest " + playerTest);
}
}*/
/*MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(packer.toByteArray());
String playerName = unpacker.unpackString();
int n = unpacker.unpackInt();
int nuArr = unpacker.unpackArrayHeader();
String[] nu = new String[nuArr];
for (int i = 0; i < nuArr; i++) {
nu[i] = unpacker.unpackString();
}
unpacker.close(); */
/*
ProxySystem.getInstance().getLogger()
.info("name: " + playerName + " " + n + " " + nu[0] + " " + nu[1]); */
}
public void sendVoiceWebCodeUrl(ProxiedPlayer proxiedPlayer, String voiceWebCode) {

View File

@ -0,0 +1,214 @@
package net.krakatoa.proxy.listener;
import de.dytanic.cloudnet.driver.CloudNetDriver;
import de.dytanic.cloudnet.driver.service.ServiceConfiguration;
import de.dytanic.cloudnet.driver.service.ServiceInfoSnapshot;
import de.dytanic.cloudnet.driver.service.ServiceTask;
import de.dytanic.cloudnet.ext.bridge.BridgeServiceProperty;
import de.dytanic.cloudnet.ext.bridge.player.ICloudPlayer;
import de.dytanic.cloudnet.ext.bridge.player.IPlayerManager;
import de.dytanic.cloudnet.ext.bridge.player.ServicePlayer;
import earth.krakatao.events.KraSocketClientEventInterface;
import earth.krakatao.protocol.KraSocketClientProtocolDest;
import earth.krakatao.protocol.KraSocketClientProtocolMessage;
import earth.krakatao.protocol.KraSocketClientProtocolStatus;
import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import net.krakatoa.proxy.ProxySystem;
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.handshake.ServerHandshake;
public class SocketClientMessageListener implements KraSocketClientEventInterface {
private final HashMap<String, Collection<ServicePlayer>> playersAutoRestartServerSystem = new HashMap<>();
private final IPlayerManager playerManager = CloudNetDriver.getInstance().getServicesRegistry()
.getFirstService(IPlayerManager.class);
@Override
public void onOpen(ServerHandshake serverHandshake) {
for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) {
proxiedPlayer.sendMessage(new TextComponent("§cSocket §8» §aConnected"));
}
}
@Override
public void onMessage(KraSocketClientProtocolMessage kraProtocolMessage) {
System.out.println(
"kraProtocolMessage cmdID: " + kraProtocolMessage.getCmdID() + " cmdNumber: "
+ kraProtocolMessage.getCmdNumber() + " args: " + kraProtocolMessage.getArgs());
System.out.println(
"sendMessagesQueue size: " + ProxySystem.getInstance().getKraSocketClientProtocol()
.getSendQueueMessages().size());
if (kraProtocolMessage.getStatus() == KraSocketClientProtocolStatus.REPLY.getStatus()
&& ProxySystem.getInstance().getKraSocketClientProtocol().getSendQueueMessages()
.containsKey(kraProtocolMessage.getCmdID())) {
KraSocketClientProtocolMessage kraSocketClientProtocolMessage = ProxySystem.getInstance()
.getKraSocketClientProtocol().getSendQueueMessages().get(kraProtocolMessage.getCmdID());
if (kraSocketClientProtocolMessage.getMessageConsumer() != null) {
ProxySystem.getInstance().getLogger()
.info("accept " + kraProtocolMessage.getCmdID());
kraSocketClientProtocolMessage.getMessageConsumer().accept(kraProtocolMessage);
ProxySystem.getInstance().getKraSocketClientProtocol()
.removeMessageFromSendQueue(kraProtocolMessage.getCmdID());
}
}
switch (kraProtocolMessage.getCmdNumber()) {
case 33329: { // stop server - server auto restart
String serverName = kraProtocolMessage.getArgs().toLowerCase();
if (serverName.equals("lobby")) { // start new lobby
if (CloudNetDriver.getInstance().getServiceTaskProvider().isServiceTaskPresent("Lobby")) {
ServiceTask serviceTask = CloudNetDriver.getInstance().getServiceTaskProvider()
.getServiceTask("Lobby");
if (serviceTask != null) {
ServiceInfoSnapshot serviceInfoSnapshot = ServiceConfiguration.builder(serviceTask)
.build().createNewService();
if (serviceInfoSnapshot != null) {
System.out.println("serviceTask " + serviceInfoSnapshot.getName());
playersAutoRestartServerSystem.put(serviceInfoSnapshot.getName(), null);
serviceInfoSnapshot.provider().start();
}
}
}
} else { // game server
ServiceInfoSnapshot serviceInfoSnapshot = CloudNetDriver.getInstance()
.getCloudServiceProvider()
.getCloudServiceByName(serverName);
if (serviceInfoSnapshot != null) {
serviceInfoSnapshot.getProperty(BridgeServiceProperty.PLAYERS).ifPresent(players -> {
players.forEach(player -> {
ProxiedPlayer proxiedPlayer = ProxySystem.getInstance().getProxy()
.getPlayer(player.getUniqueId());
proxiedPlayer.sendMessage(
new TextComponent("§4AutoRestart §8» §cRestarting server..."));
});
playersAutoRestartServerSystem.put(serverName, players);
});
// stop target server
CloudNetDriver.getInstance().getCloudServiceProvider(serviceInfoSnapshot).stop();
}
}
break;
}
case 59739: { // send players back to server - auto restart system
String serverName = kraProtocolMessage.getArgs().toLowerCase();
System.out.println("servername is " + kraProtocolMessage.getArgs());
if (playersAutoRestartServerSystem.containsKey(
kraProtocolMessage.getArgs())) { // close old lobbies
Collection<ServiceInfoSnapshot> serviceInfoSnapshots = CloudNetDriver.getInstance()
.getCloudServiceProvider()
.getCloudServices("Lobby");
if (serviceInfoSnapshots != null) {
serviceInfoSnapshots.forEach(serviceInfoSnapshot -> {
System.out.println("containsKey" + playersAutoRestartServerSystem.containsKey(
serviceInfoSnapshot.getName()));
if (!playersAutoRestartServerSystem.containsKey(serviceInfoSnapshot.getName())) {
serviceInfoSnapshot.provider().stop();
}
});
playersAutoRestartServerSystem.remove(kraProtocolMessage.getArgs());
}
} else if (playersAutoRestartServerSystem.containsKey(serverName)) { // send players back
playersAutoRestartServerSystem.get(serverName).forEach(servicePlayer -> {
ICloudPlayer cloudPlayer = playerManager.getOnlinePlayer(servicePlayer.getUniqueId());
if (cloudPlayer != null) {
cloudPlayer.getPlayerExecutor().connect(serverName);
ProxiedPlayer proxiedPlayer = ProxySystem.getInstance().getProxy()
.getPlayer(cloudPlayer.getUniqueId());
proxiedPlayer.sendMessage(new TextComponent("§4AutoRestart §8» §aSwitching back"));
}
});
playersAutoRestartServerSystem.remove(serverName);
}
break;
}
case 53874: { // test message - ack
ProxySystem.getInstance().getKraSocketClientProtocol().replyThatWeReceivedAckMessage(
ProxySystem.getInstance().getKraSocketClient().getSocketClient(),
ProxySystem.getInstance().getKraSocketClientProtocol(), kraProtocolMessage.getCmdID(),
KraSocketClientProtocolDest.BACKEND.getStatus(), kraProtocolMessage.getUuid(),
kraProtocolMessage.getCmdNumber());
System.out.println(
"cmdNumber 53874 answered back to uuid:" + kraProtocolMessage.getUuid()
+ " cmdIDByBackend:"
+ kraProtocolMessage.getCmdID());
break;
}
case 13337: // voice connection established
case 37657: // mobile connection established
case 64247: // mobile connection closed
case 22348: { // voice connection closed
ProxyServer.getInstance().getScheduler().runAsync(ProxySystem.getInstance(), () -> {
// ack msg -> Reply to backend that we received the message
ProxySystem.getInstance().getKraSocketClientProtocol()
.replyThatWeReceivedAckMessage(
ProxySystem.getInstance().getKraSocketClient().getSocketClient(),
ProxySystem.getInstance()
.getKraSocketClientProtocol(), kraProtocolMessage.getCmdID(),
KraSocketClientProtocolDest.BACKEND.getStatus(), kraProtocolMessage.getUuid(),
kraProtocolMessage.getCmdNumber());
ProxiedPlayer proxiedPlayer = ProxySystem.getInstance().getProxy()
.getPlayer(kraProtocolMessage.getUuid());
if (proxiedPlayer != null) {
if (kraProtocolMessage.getCmdNumber() == 13337) {
proxiedPlayer.sendMessage(new TextComponent("§dVoice §8» §7Connection §aopened§7!"));
} else if (kraProtocolMessage.getCmdNumber() == 37657) {
proxiedPlayer.sendMessage(new TextComponent("§5Mobile §8» §7Connection §aopened§7!"));
} else if (kraProtocolMessage.getCmdNumber() == 64247) {
proxiedPlayer.sendMessage(new TextComponent("§5Mobile §8» §7Connection §cclosed§7!"));
} else {
proxiedPlayer.sendMessage(new TextComponent("§dVoice §8» §7Connection §cclosed§7!"));
}
}
});
break;
}// voice connection closed
default:
break;
}
}
@Override
public void onClose(int code, String reason, boolean remote) {
for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) {
proxiedPlayer.sendMessage(
new TextComponent(
"§cSocket §8» §c" + (remote ? "Connection! Closed by remote peer" : reason)));
}
if (code != 1) {
ProxyServer.getInstance().getScheduler().schedule(ProxySystem.getInstance(), () -> {
for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) {
proxiedPlayer.sendMessage(new TextComponent("§cSocket §8» §7Reconnecting..."));
}
ProxySystem.getInstance().getKraSocketClient().getSocketClient().Reconnect();
}, 1L, TimeUnit.SECONDS);
}
}
}

View File

@ -1,39 +0,0 @@
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<Document> 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");
}
}

View File

@ -1,119 +0,0 @@
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<Integer> cmdIDs = Lists.newArrayList();
@Getter
HashMap<Integer, Consumer<KraProtocolMessage>> 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);
}
}

View File

@ -1,24 +0,0 @@
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);
}
}

View File

@ -1,5 +0,0 @@
package net.krakatoa.proxy.protocol;
public class KraProtocolMessageHandler {
}

View File

@ -1,21 +0,0 @@
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;
}
}

View File

@ -1,121 +0,0 @@
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();
}
}

View File

@ -1,18 +0,0 @@
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());
}
}

4
src/main/resources/plugin.yml Normal file → Executable file
View File

@ -1,6 +1,8 @@
name: KrakatoaProxySystem
name: KraProxySystem
author: AlexanderRoese
version: 1.0
main: net.krakatoa.proxy.ProxySystem
commands:
code:
sendTestMessage:
krakatoap:

0
target/classes/net/krakatoa/proxy/ProxySystem.class Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

View File

0
target/classes/net/krakatoa/proxy/util/Formatter.class Normal file → Executable file
View File

2
target/classes/plugin.yml Normal file → Executable file
View File

@ -1,4 +1,4 @@
name: KrakatoaProxySystem
name: KraProxySystem
author: AlexanderRoese
version: 1.0
main: net.krakatoa.proxy.ProxySystem

0
target/maven-archiver/pom.properties Normal file → Executable file
View File