diff --git a/src/main/java/net/viper/status/modules/globalchat/GlobalChatModule.java b/src/main/java/net/viper/status/modules/globalchat/GlobalChatModule.java index 86094d5..d101b7b 100644 --- a/src/main/java/net/viper/status/modules/globalchat/GlobalChatModule.java +++ b/src/main/java/net/viper/status/modules/globalchat/GlobalChatModule.java @@ -9,6 +9,8 @@ import net.md_5.bungee.api.chat.HoverEvent.Action; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.ChatEvent; +import net.md_5.bungee.api.event.PostLoginEvent; +import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.event.ServerSwitchEvent; import net.md_5.bungee.api.plugin.Command; @@ -19,8 +21,8 @@ import net.md_5.bungee.event.EventHandler; import net.viper.status.module.Module; import java.io.*; -import java.lang.Class; // WICHTIG für Reflection -import java.lang.reflect.Method; // WICHTIG für Reflection +import java.lang.Class; +import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.text.SimpleDateFormat; @@ -99,6 +101,9 @@ public class GlobalChatModule implements Module, Listener { plugin.getProxy().getPluginManager().registerCommand(plugin, new ReplyCommand()); plugin.getProxy().getPluginManager().registerCommand(plugin, new InfoCommand()); plugin.getProxy().getPluginManager().registerCommand(plugin, new ChatToggleCommand()); + + // NEU: ClearChat Befehl registrieren + plugin.getProxy().getPluginManager().registerCommand(plugin, new ClearChatCommand()); plugin.getLogger().info("§aGlobalChatModule aktiviert (Mit Manuellen Rang-Overrides)!"); } @@ -150,7 +155,7 @@ public class GlobalChatModule implements Module, Listener { serverDisplayNames.clear(); groupFormats.clear(); - manualRanks.clear(); // NEU + manualRanks.clear(); for (String key : props.stringPropertyNames()) { // 1. Manuelle Overrides laden (Höchste Priorität!) @@ -243,6 +248,23 @@ public class GlobalChatModule implements Module, Listener { player.sendMessage(new TextComponent(message)); } + // =========================== + // Global Broadcast Helper + // =========================== + private void broadcastGlobal(TextComponent component) { + if (!isChatEnabled) return; + + String jsonMessage = ComponentSerializer.toString(component); + for (ServerInfo server : plugin.getProxy().getServers().values()) { + if (server.getPlayers().isEmpty()) continue; + try { + server.sendData(CHANNEL_CHAT, jsonMessage.getBytes(StandardCharsets.UTF_8)); + } catch (Exception ex) { + plugin.getLogger().warning("Konnte Nachricht nicht an " + server.getName() + " senden."); + } + } + } + // =========================== // Chatfilter & Global-Chat (RELAY MODE) // =========================== @@ -304,17 +326,8 @@ public class GlobalChatModule implements Module, Listener { String chatOut = out.toString(); TextComponent chatComponent = new TextComponent(chatOut); - String jsonMessage = ComponentSerializer.toString(chatComponent); + broadcastGlobal(chatComponent); - for (ServerInfo server : plugin.getProxy().getServers().values()) { - if (server.getPlayers().isEmpty()) continue; - try { - server.sendData(CHANNEL_CHAT, jsonMessage.getBytes(StandardCharsets.UTF_8)); - } catch (Exception ex) { - plugin.getLogger().warning("Konnte Chat-Nachricht nicht an Server " + server.getName() + " senden."); - } - } - String logEntry = "[" + serverName + "] " + (displayTag.isEmpty() ? "" : stripColor(displayTag) + " ") + player.getName() + @@ -322,6 +335,58 @@ public class GlobalChatModule implements Module, Listener { logMessage(logEntry); } + // =========================== + // Global Join & Quit Events + // =========================== + @EventHandler + public void onPostLogin(PostLoginEvent e) { + if (!isChatEnabled) return; + + ProxiedPlayer player = e.getPlayer(); + + // Willkommensnachricht senden + sendRandomWelcomeMessage(player); + + // Formatierung aus verify.properties nutzen + String[] ps = getPrefixSuffix(player); + String prefix = ps[0]; + String playerColor = ps[2]; + + String displayTag = ""; + if (!prefix.isEmpty()) displayTag = prefix; + if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " "; + + // Nachricht: "Spieler xy hat den Server betreten" + // Der Text "hat den Server betreten" bleibt Grün (Standard), Name und Prefix kommen aus der Config + TextComponent joinMsg = new TextComponent(displayTag + playerColor + player.getName() + " §a§lhat den Server betreten."); + + broadcastGlobal(joinMsg); + logMessage("[JOIN] " + player.getName() + " hat den Server betreten."); + } + + @EventHandler + public void onPlayerDisconnect(PlayerDisconnectEvent e) { + if (!isChatEnabled) return; + + ProxiedPlayer player = e.getPlayer(); + + // Formatierung aus verify.properties nutzen + String[] ps = getPrefixSuffix(player); + String prefix = ps[0]; + String playerColor = ps[2]; + + String displayTag = ""; + if (!prefix.isEmpty()) displayTag = prefix; + if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " "; + + // Nachricht: "Spieler xy hat den Server verlassen" + // Der Text "hat den Server verlassen" bleibt Rot (Standard), Name und Prefix kommen aus der Config + TextComponent quitMsg = new TextComponent(displayTag + playerColor + player.getName() + " §c§lhat den Server verlassen."); + + broadcastGlobal(quitMsg); + logMessage("[QUIT] " + player.getName() + " hat den Server verlassen."); + } + // =========================== // Server Connect & Switch // =========================== @@ -372,34 +437,27 @@ public class GlobalChatModule implements Module, Listener { String[] ps = getPrefixSuffix(player); String prefix = ps[0]; - String suffix = ps[1]; + String playerColor = ps[2]; String displayTag = ""; if (!prefix.isEmpty()) displayTag = prefix; - else if (!suffix.isEmpty()) displayTag = suffix; + // Suffix wird hier ignoriert, da die || Syntax vorausgesetzt wird, aber es schadet nicht + else if (!ps[1].isEmpty()) displayTag = ps[1]; if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " "; StringBuilder msg = new StringBuilder(); msg.append("§7[").append(toDisplay).append("§r§7] "); if (!displayTag.isEmpty()) msg.append(displayTag); - msg.append(player.getName()); + // Hier wird die playerColor aus der verify.properties angewendet + msg.append(playerColor).append(player.getName()); msg.append(" §7hat den Server gewechselt: §e") .append(fromDisplay).append(" §7→ §e").append(toDisplay).append("§7."); String finalMsg = msg.toString(); TextComponent switchComponent = new TextComponent(finalMsg); - String jsonMessage = ComponentSerializer.toString(switchComponent); - - for (ServerInfo server : plugin.getProxy().getServers().values()) { - if (server.getPlayers().isEmpty()) continue; - try { - server.sendData(CHANNEL_CHAT, jsonMessage.getBytes(StandardCharsets.UTF_8)); - } catch (Exception ex) { - plugin.getLogger().warning("Konnte Switch-Nachricht nicht senden."); - } - } + broadcastGlobal(switchComponent); String logEntry = "[" + toName + "] " + (displayTag.isEmpty() ? "" : stripColor(displayTag) + " ") + @@ -633,6 +691,14 @@ public class GlobalChatModule implements Module, Listener { return false; } + + // Überladene Methode für CommandSender (für Console/Check) + private boolean isStaff(CommandSender sender) { + if (sender instanceof ProxiedPlayer) { + return isStaff((ProxiedPlayer) sender); + } + return sender.hasPermission("globalchat.clear"); + } // =========================== // Commands (Inner Classes) @@ -763,4 +829,32 @@ public class GlobalChatModule implements Module, Listener { } } } + + public class ClearChatCommand extends Command { + public ClearChatCommand() { + super("clearchat", "globalchat.clear", "cc"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + // Prüfen, ob der Sender OP / Team ist + // Wir nutzen hier die überladene isStaff Methode für CommandSender + if (!isStaff(sender)) { + sender.sendMessage(new TextComponent("§cKeine Berechtigung!")); + return; + } + + // 100 leere Zeilen senden zum Leeren + TextComponent emptyLine = new TextComponent(" "); + for (int i = 0; i < 100; i++) { + broadcastGlobal(emptyLine); + } + + // Bestätigungsnachricht + TextComponent clearMsg = new TextComponent("§7[GlobalChat] §cDer Chat wurde von " + sender.getName() + " geleert."); + broadcastGlobal(clearMsg); + + sender.sendMessage(new TextComponent("§aChat wurde geleert.")); + } + } } \ No newline at end of file