package fr.Alphart.BAT.Utils; import java.util.UUID; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import com.imaginarycode.minecraft.redisbungee.RedisBungee; import com.imaginarycode.minecraft.redisbungee.events.PubSubMessageEvent; import fr.Alphart.BAT.BAT; import fr.Alphart.BAT.Modules.InvalidModuleException; public class RedisUtils implements Listener { private boolean redis = false; private static String channel = "BungeeAdminTools"; private static String split = "######"; public RedisUtils(final boolean enable) { if(enable){ if (BAT.getInstance().getProxy().getPluginManager().getPlugin("RedisBungee") != null && RedisBungee.getApi() != null) { BAT.getInstance().getLogger().info("Detected RedisBungee. Enabling experimental RedisBungee support. This currently only supports RedisBungee 0.3.3 or higher (but not 0.4)."); BAT.getInstance().getProxy().getPluginManager() .registerListener(BAT.getInstance(), this); RedisBungee.getApi().registerPubSubChannels(channel); redis = true; } else { redis = false; } }else{ redis = false; } } @EventHandler public void onPubSubMessage(final PubSubMessageEvent e) { if (!e.getChannel().equals(channel)) return; String[] message = e.getMessage().split(split); if (message[0].equalsIgnoreCase(RedisBungee.getApi().getServerId()) || message.length < 3) return; String messageType = message[1]; switch (messageType) { case "gkick": recieveGKickPlayer(message[2], message[3]); break; case "message": recieveMessagePlayer(message[2], message[3]); break; case "broadcast": recieveBroadcast(message[2], message[3]); break; case "muteupdate": recieveMuteUpdatePlayer(message[2], message[3]); break; case "movedefaultserver": recieveMoveDefaultServerPlayer(message[2]); break; default: BAT.getInstance().getLogger().warning("Undeclared BungeeAdminTool redis message recieved: " + messageType); break; } } public Boolean isRedisEnabled() { return redis; } public void sendMessagePlayer(UUID pUUID, String message) { if (!redis) return; sendMessage("message", pUUID.toString() + split + message); } private void recieveMessagePlayer(String sUUID, String message) { ProxiedPlayer player = BAT.getInstance().getProxy().getPlayer(UUID.fromString(sUUID)); if (player != null) { player.sendMessage(TextComponent.fromLegacyText(message)); } } public void sendGKickPlayer(UUID pUUID, String reason) { if (!redis) return; sendMessage("gkick", pUUID.toString() + split + reason); } private void recieveGKickPlayer(String sUUID, String reason) { if(BAT.getInstance().getModules().isLoaded("ban") || BAT.getInstance().getModules().isLoaded("kick")){ ProxiedPlayer player = BAT.getInstance().getProxy().getPlayer(UUID.fromString(sUUID)); if (player != null) { BAT.kick(player, reason); } } else{ throw new IllegalStateException("Neither the ban nor the kick module are enabled. The gkick message can't be handled."); } } public void sendBroadcast(String permission, String broadcast) { if (!redis) return; sendMessage("broadcast", permission + split + broadcast); } private void recieveBroadcast(String permission, String broadcast) { BAT.noRedisBroadcast(broadcast, permission); } public void sendMuteUpdatePlayer(UUID pUUID, String server) { if (!redis) return; sendMessage("muteupdate", pUUID.toString() + split + server); } private void recieveMuteUpdatePlayer(String sUUID, String server) { if(BAT.getInstance().getModules().isLoaded("mute")){ ProxiedPlayer player = BAT.getInstance().getProxy().getPlayer(UUID.fromString(sUUID)); if (player != null) { try { BAT.getInstance().getModules().getMuteModule().updateMuteData(player.getName()); } catch (InvalidModuleException ignored) { } } } else{ throw new IllegalStateException("The mute module isn't enabled. The mute message can't be handled."); } } public void sendMoveDefaultServerPlayer(UUID pUUID) { if (!redis) return; sendMessage("movedefaultserver", pUUID.toString()); } private void recieveMoveDefaultServerPlayer(String sUUID) { ProxiedPlayer player = BAT.getInstance().getProxy().getPlayer(UUID.fromString(sUUID)); if (player != null) { player.connect(ProxyServer.getInstance().getServerInfo( player.getPendingConnection().getListener().getDefaultServer())); } } void sendMessage(String messageType, String messageBody) { if (!redis) return; if (messageBody.trim().length() == 0) return; final String message = RedisBungee.getApi().getServerId() + split + messageType + split + messageBody; BAT.getInstance().getProxy().getScheduler().runAsync(BAT.getInstance(), new Runnable() { @Override public void run() { RedisBungee.getApi().sendChannelMessage(channel, message); } }); } public void destroy() { if (!redis) return; RedisBungee.getApi().unregisterPubSubChannels("BungeeAdminTools"); BAT.getInstance().getProxy().getPluginManager() .unregisterListener(this); } }