diff --git a/src/main/java/de/viper/globalchat/suppressor/GlobalChatSuppressor.java b/src/main/java/de/viper/globalchat/suppressor/GlobalChatSuppressor.java index 53117e4..220095a 100644 --- a/src/main/java/de/viper/globalchat/suppressor/GlobalChatSuppressor.java +++ b/src/main/java/de/viper/globalchat/suppressor/GlobalChatSuppressor.java @@ -1,79 +1,112 @@ -package de.viper.globalchat.suppressor; - -import org.bukkit.entity.Player; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.plugin.messaging.PluginMessageListener; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerQuitEvent; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; - -public class GlobalChatSuppressor extends JavaPlugin implements PluginMessageListener, Listener { - - private static final String CHANNEL = "global:control"; - private final Set suppressJoinQuit = new HashSet<>(); - - @Override - public void onEnable() { - getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL, this); - getServer().getMessenger().registerOutgoingPluginChannel(this, CHANNEL); - getServer().getPluginManager().registerEvents(this, this); - getLogger().info("GlobalChatSuppressor aktiviert!"); - } - - @Override - public void onDisable() { - getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL); - getServer().getMessenger().unregisterOutgoingPluginChannel(this, CHANNEL); - getLogger().info("GlobalChatSuppressor deaktiviert!"); - } - - @Override - public void onPluginMessageReceived(String channel, Player player, byte[] message) { - if (!channel.equals(CHANNEL)) return; - - try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(message))) { - String subChannel = in.readUTF(); - if ("suppress".equalsIgnoreCase(subChannel)) { - String uuidStr = in.readUTF(); - UUID playerUUID = UUID.fromString(uuidStr); - suppressJoinQuit.add(playerUUID); - getLogger().info("Suppress für Spieler UUID: " + playerUUID + " aktiviert."); - // Entferne die Unterdrückung nach 2 Sekunden (synchron mit BungeeCord) - getServer().getScheduler().runTaskLater(this, () -> { - suppressJoinQuit.remove(playerUUID); - getLogger().info("Suppress für Spieler UUID: " + playerUUID + " entfernt."); - }, 40L); // 40 Ticks = 2 Sekunden - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - Player player = event.getPlayer(); - if (suppressJoinQuit.contains(player.getUniqueId())) { - event.setJoinMessage(null); - getLogger().info("Join-Nachricht für " + player.getName() + " unterdrückt."); - suppressJoinQuit.remove(player.getUniqueId()); - } - } - - @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - Player player = event.getPlayer(); - if (suppressJoinQuit.contains(player.getUniqueId())) { - event.setQuitMessage(null); - getLogger().info("Quit-Nachricht für " + player.getName() + " unterdrückt."); - suppressJoinQuit.remove(player.getUniqueId()); - } - } +package de.viper.globalchat.suppressor; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.chat.ComponentSerializer; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.messaging.PluginMessageListener; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class GlobalChatSuppressor extends JavaPlugin implements PluginMessageListener, Listener { + + private static final String CHANNEL_CONTROL = "global:control"; + private static final String CHANNEL_CHAT = "global:chat"; // NEU: Kanal für Chat Relay + + private final Set suppressJoinQuit = new HashSet<>(); + + @Override + public void onEnable() { + // Incoming Channels (Daten von BungeeCord) + getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL_CONTROL, this); + getServer().getMessenger().registerIncomingPluginChannel(this, CHANNEL_CHAT, this); + + // Outgoing Channels (Daten zu BungeeCord) + getServer().getMessenger().registerOutgoingPluginChannel(this, CHANNEL_CONTROL); + + getServer().getPluginManager().registerEvents(this, this); + getLogger().info("GlobalChatSuppressor aktiviert (Chat Relay included)!"); + } + + @Override + public void onDisable() { + getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL_CONTROL); + getServer().getMessenger().unregisterIncomingPluginChannel(this, CHANNEL_CHAT); + getServer().getMessenger().unregisterOutgoingPluginChannel(this, CHANNEL_CONTROL); + getLogger().info("GlobalChatSuppressor deaktiviert!"); + } + + @Override + public void onPluginMessageReceived(String channel, Player player, byte[] message) { + if (!channel.equals(CHANNEL_CONTROL) && !channel.equals(CHANNEL_CHAT)) return; + + try { + String data = new String(message, StandardCharsets.UTF_8); + + if (channel.equals(CHANNEL_CHAT)) { + // ========================================== + // NEU: GLOBAL CHAT RELAY LOGIK + // ========================================== + // Wir empfangen JSON von BungeeCord. + BaseComponent[] components = ComponentSerializer.parse(data); + + // An alle Spieler auf diesem Server senden. + // Da dies eine Server-Nachricht ist, bricht sie die Secure Chain nicht. + // Auch der Spieler selbst sieht sie. + for (Player all : Bukkit.getOnlinePlayers()) { + all.spigot().sendMessage(components); + } + // ========================================== + + } else if (channel.equals(CHANNEL_CONTROL)) { + // Alte Suppress Logik (Join/Quit) + try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(message))) { + String subChannel = in.readUTF(); + if ("suppress".equalsIgnoreCase(subChannel)) { + String uuidStr = in.readUTF(); + UUID playerUUID = UUID.fromString(uuidStr); + suppressJoinQuit.add(playerUUID); + getLogger().info("Suppress für Spieler UUID: " + playerUUID + " aktiviert."); + getServer().getScheduler().runTaskLater(this, () -> { + suppressJoinQuit.remove(playerUUID); + getLogger().info("Suppress für Spieler UUID: " + playerUUID + " entfernt."); + }, 40L); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + if (suppressJoinQuit.contains(player.getUniqueId())) { + event.setJoinMessage(null); + getLogger().info("Join-Nachricht für " + player.getName() + " unterdrückt."); + suppressJoinQuit.remove(player.getUniqueId()); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + if (suppressJoinQuit.contains(player.getUniqueId())) { + event.setQuitMessage(null); + getLogger().info("Quit-Nachricht für " + player.getName() + " unterdrückt."); + suppressJoinQuit.remove(player.getUniqueId()); + } + } } \ No newline at end of file