diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java index f027dd3..856bb4f 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungeeAPI.java @@ -333,6 +333,30 @@ public class RedisBungeeAPI { return plugin.getUuidTranslator().getTranslatedUuid(name, expensiveLookups); } + + /** + * Kicks a player from the network + * + * @param playerName player name + * @param message kick message that player will see on kick + * @since 0.8.0 + */ + + public void kickPlayer(String playerName, String message) { + plugin.kickPlayer(playerName, message); + } + + /** + * Kicks a player from the network + * + * @param playerUUID player name + * @param message kick message that player will see on kick + * @since 0.8.0 + */ + public void kickPlayer(UUID playerUUID, String message) { + plugin.kickPlayer(playerUUID, message); + } + /** * This gives you instance of Jedis * diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java index 391a9dd..61fe40e 100644 --- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java +++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractDataManager.java @@ -25,7 +25,7 @@ import java.util.concurrent.TimeUnit; * @since 0.3.3 */ public abstract class AbstractDataManager
{ - private final RedisBungeePlugin
plugin; + protected final RedisBungeePlugin
plugin;
private final Cache {
.build();
}
- private final JsonParser parser = new JsonParser();
-
public String getServer(final UUID uuid) {
P player = plugin.getPlayer(uuid);
@@ -174,14 +172,16 @@ public abstract class AbstractDataManager {
public abstract void onPubSubMessage(PS event);
+ public abstract boolean handleKick(UUID target, String message);
+
protected void handlePubSubMessage(String channel, String message) {
if (!channel.equals("redisbungee-data"))
return;
// Partially deserialize the message so we can look at the action
- JsonObject jsonObject = parser.parse(message).getAsJsonObject();
+ JsonObject jsonObject = JsonParser.parseString(message).getAsJsonObject();
- String source = jsonObject.get("source").getAsString();
+ final String source = jsonObject.get("source").getAsString();
if (source.equals(plugin.getConfiguration().getProxyId()))
return;
@@ -190,24 +190,20 @@ public abstract class AbstractDataManager {
switch (action) {
case JOIN:
- final DataManagerMessage {
}.getType());
invalidate(message2.getTarget());
lastOnlineCache.put(message2.getTarget(), message2.getPayload().getTimestamp());
- plugin.executeAsync(new Runnable() {
- @Override
- public void run() {
- Object event;
- try {
- event = plugin.getNetworkQuitEventClass().getDeclaredConstructor(UUID.class).newInstance(message2.getTarget());
- } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
- NoSuchMethodException e) {
- throw new RuntimeException("unable to dispatch an network quit event", e);
- }
- plugin.callEvent(event);
+ plugin.executeAsync(() -> {
+ Object event;
+ try {
+ event = plugin.getNetworkQuitEventClass().getDeclaredConstructor(UUID.class).newInstance(message2.getTarget());
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException |
+ NoSuchMethodException e) {
+ throw new RuntimeException("unable to dispatch an network quit event", e);
}
+ plugin.callEvent(event);
});
break;
case SERVER_CHANGE:
- final DataManagerMessage {
public enum Action {
JOIN,
LEAVE,
+ KICK,
SERVER_CHANGE
}
}
- public static class LoginPayload {
+ public static abstract class Payload {}
+
+ public static class KickPayload extends Payload {
+
+ private final String message;
+
+ public KickPayload(String message) {
+ this.message = message;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+ }
+
+ public static class LoginPayload extends Payload{
private final InetAddress address;
public LoginPayload(InetAddress address) {
@@ -298,7 +308,7 @@ public abstract class AbstractDataManager {
}
}
- public static class ServerChangePayload {
+ public static class ServerChangePayload extends Payload{
private final String server;
private final String oldServer;
@@ -317,7 +327,7 @@ public abstract class AbstractDataManager {
}
- public static class LogoutPayload {
+ public static class LogoutPayload extends Payload{
private final long timestamp;
public LogoutPayload(long timestamp) {
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractRedisBungeeListener.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractRedisBungeeListener.java
index 753207a..f88fc40 100644
--- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractRedisBungeeListener.java
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/AbstractRedisBungeeListener.java
@@ -67,4 +67,6 @@ public abstract class AbstractRedisBungeeListener extends EventsPlatform {
void loadConfig() throws Exception;
+ void kickPlayer(UUID playerUniqueId, String message);
+
+ void kickPlayer(String playerName, String message);
+
RedisBungeeMode getRedisBungeeMode();
Long getRedisClusterTime();
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/RedisUtil.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/RedisUtil.java
index 6abee82..c2c3c21 100644
--- a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/RedisUtil.java
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/RedisUtil.java
@@ -1,48 +1,9 @@
package com.imaginarycode.minecraft.redisbungee.api.util;
import com.google.common.annotations.VisibleForTesting;
-import com.google.gson.Gson;
-import com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI;
-import com.imaginarycode.minecraft.redisbungee.api.AbstractDataManager;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisCluster;
-import redis.clients.jedis.Pipeline;
-
-import java.util.UUID;
@VisibleForTesting
public class RedisUtil {
- private static final Gson gson = new Gson();
-
- public static void cleanUpPlayer(String player, Jedis rsc) {
- rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player);
- rsc.hdel("player:" + player, "server", "ip", "proxy");
- long timestamp = System.currentTimeMillis();
- rsc.hset("player:" + player, "online", String.valueOf(timestamp));
- rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
- UUID.fromString(player), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
- new AbstractDataManager.LogoutPayload(timestamp))));
- }
-
- public static void cleanUpPlayer(String player, Pipeline rsc) {
- rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player);
- rsc.hdel("player:" + player, "server", "ip", "proxy");
- long timestamp = System.currentTimeMillis();
- rsc.hset("player:" + player, "online", String.valueOf(timestamp));
- rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
- UUID.fromString(player), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
- new AbstractDataManager.LogoutPayload(timestamp))));
- }
- public static void cleanUpPlayer(String player, JedisCluster rsc) {
- rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", player);
- rsc.hdel("player:" + player, "server", "ip", "proxy");
- long timestamp = System.currentTimeMillis();
- rsc.hset("player:" + player, "online", String.valueOf(timestamp));
- rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
- UUID.fromString(player), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
- new AbstractDataManager.LogoutPayload(timestamp))));
- }
-
public static boolean isRedisVersionRight(String redisVersion) {
String[] args = redisVersion.split("\\.");
if (args.length < 2) {
diff --git a/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java
new file mode 100644
index 0000000..b077082
--- /dev/null
+++ b/RedisBungee-API/src/main/java/com/imaginarycode/minecraft/redisbungee/api/util/payload/PayloadUtils.java
@@ -0,0 +1,65 @@
+package com.imaginarycode.minecraft.redisbungee.api.util.payload;
+
+import com.google.gson.Gson;
+import com.imaginarycode.minecraft.redisbungee.RedisBungeeAPI;
+import com.imaginarycode.minecraft.redisbungee.api.AbstractDataManager;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.Pipeline;
+
+import java.util.UUID;
+
+public class PayloadUtils {
+ private static final Gson gson = new Gson();
+
+ public static void cleanUpPlayer(String uuid, Jedis rsc) {
+ rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid);
+ rsc.hdel("player:" + uuid, "server", "ip", "proxy");
+ long timestamp = System.currentTimeMillis();
+ rsc.hset("player:" + uuid, "online", String.valueOf(timestamp));
+ rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
+ new AbstractDataManager.LogoutPayload(timestamp))));
+ }
+
+ public static void cleanUpPlayer(String uuid, Pipeline rsc) {
+ rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid);
+ rsc.hdel("player:" + uuid, "server", "ip", "proxy");
+ long timestamp = System.currentTimeMillis();
+ rsc.hset("player:" + uuid, "online", String.valueOf(timestamp));
+ rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
+ new AbstractDataManager.LogoutPayload(timestamp))));
+ }
+
+ public static void cleanUpPlayer(String uuid, JedisCluster rsc) {
+ rsc.srem("proxy:" + RedisBungeeAPI.getRedisBungeeApi().getProxyId() + ":usersOnline", uuid);
+ rsc.hdel("player:" + uuid, "server", "ip", "proxy");
+ long timestamp = System.currentTimeMillis();
+ rsc.hset("player:" + uuid, "online", String.valueOf(timestamp));
+ rsc.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ UUID.fromString(uuid), RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.LEAVE,
+ new AbstractDataManager.LogoutPayload(timestamp))));
+ }
+
+ public static void kickPlayer(UUID uuid, String message, Pipeline pipeline) {
+ System.out.println(uuid);
+ pipeline.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK,
+ new AbstractDataManager.KickPayload(message))));
+ }
+
+ public static void kickPlayer(UUID uuid, String message, Jedis jedis) {
+ System.out.println(uuid);
+ jedis.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK,
+ new AbstractDataManager.KickPayload(message))));
+ }
+
+ public static void kickPlayer(UUID uuid, String message, JedisCluster jedisCluster) {
+ System.out.println(uuid);
+ jedisCluster.publish("redisbungee-data", gson.toJson(new AbstractDataManager.DataManagerMessage<>(
+ uuid, RedisBungeeAPI.getRedisBungeeApi().getProxyId(), AbstractDataManager.DataManagerMessage.Action.KICK,
+ new AbstractDataManager.KickPayload(message))));
+ }
+}
diff --git a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeeDataManager.java b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeeDataManager.java
index bd9e0f6..806fd8c 100644
--- a/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeeDataManager.java
+++ b/RedisBungee-Bungee/src/main/java/com/imaginarycode/minecraft/redisbungee/BungeeDataManager.java
@@ -3,12 +3,16 @@ package com.imaginarycode.minecraft.redisbungee;
import com.imaginarycode.minecraft.redisbungee.events.PubSubMessageEvent;
import com.imaginarycode.minecraft.redisbungee.api.AbstractDataManager;
import com.imaginarycode.minecraft.redisbungee.api.RedisBungeePlugin;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
+import java.util.UUID;
+
public class BungeeDataManager extends AbstractDataManager