diff --git a/src/main/java/de/viper/globalchat/GlobalChat.java b/src/main/java/de/viper/globalchat/GlobalChat.java index daac6d9..03aab5b 100644 --- a/src/main/java/de/viper/globalchat/GlobalChat.java +++ b/src/main/java/de/viper/globalchat/GlobalChat.java @@ -14,6 +14,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; @@ -165,6 +167,9 @@ public class GlobalChat extends Plugin implements Listener { getProxy().getPluginManager().registerCommand(this, new ReplyCommand()); getProxy().getPluginManager().registerCommand(this, new InfoCommand()); getProxy().getPluginManager().registerCommand(this, new ChatToggleCommand()); + + // NEU: ClearChat Befehl registrieren + getProxy().getPluginManager().registerCommand(this, new ClearChatCommand()); getLogger().info("§aGlobalChat aktiviert (UUID-Overrides via bungee.yml)!"); } @@ -218,7 +223,7 @@ public class GlobalChat extends Plugin implements Listener { getLogger().info("§eGeladene Chat-Formate: " + groupFormats.size()); } - // NEU: UUID Ränge aus bungee.yml laden + // NEU: UUID Rängen aus bungee.yml laden private void loadManualRanks() { loadConfigData(); // Reload sichern if (config == null) { @@ -261,6 +266,21 @@ public class GlobalChat extends Plugin implements Listener { return ChatColor.translateAlternateColorCodes('&', displayName); } + // =========================== + // Global Broadcast Helper + // =========================== + private void broadcastGlobal(TextComponent component) { + String jsonMessage = ComponentSerializer.toString(component); + for (ServerInfo server : getProxy().getServers().values()) { + if (server.getPlayers().isEmpty()) continue; + try { + server.sendData(CHANNEL_CHAT, jsonMessage.getBytes(StandardCharsets.UTF_8)); + } catch (Exception ex) { + getLogger().warning("Konnte Nachricht nicht an " + server.getName() + " senden."); + } + } + } + // =========================== // Chatfilter & Global-Chat (RELAY MODE) // =========================== @@ -332,19 +352,9 @@ public class GlobalChat extends Plugin implements Listener { String chatOut = out.toString(); - // NEU: Nachricht erstellen und an alle Server senden + // NEU: Nachricht erstellen und an alle Server senden (via Helper) TextComponent chatComponent = new TextComponent(chatOut); - String jsonMessage = ComponentSerializer.toString(chatComponent); - - for (ServerInfo server : getProxy().getServers().values()) { - if (server.getPlayers().isEmpty()) continue; - - try { - server.sendData(CHANNEL_CHAT, jsonMessage.getBytes(StandardCharsets.UTF_8)); - } catch (Exception ex) { - getLogger().warning("Konnte Chat-Nachricht nicht an Server " + server.getName() + " senden."); - } - } + broadcastGlobal(chatComponent); // Loggen (lokal auf Bungee) String logEntry = "[" + serverName + "] " + @@ -354,6 +364,52 @@ public class GlobalChat extends Plugin implements Listener { logMessage(logEntry); } + // =========================== + // Global Join & Quit Events + // =========================== + @EventHandler + public void onPostLogin(PostLoginEvent e) { + ProxiedPlayer player = e.getPlayer(); + + // Willkommensnachricht senden + sendRandomWelcomeMessage(player); + + // Formatierung aus bungee.yml nutzen + String[] ps = getPrefixSuffix(player); + String prefix = ps[0]; + String playerColor = ps[2]; // Namefarbe aus Config + + String displayTag = ""; + if (!prefix.isEmpty()) displayTag = prefix; + if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " "; + + // Nachricht: "Spieler xy hat den Server betreten" + 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) { + ProxiedPlayer player = e.getPlayer(); + + // Formatierung aus bungee.yml nutzen + String[] ps = getPrefixSuffix(player); + String prefix = ps[0]; + String playerColor = ps[2]; // Namefarbe aus Config + + String displayTag = ""; + if (!prefix.isEmpty()) displayTag = prefix; + if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " "; + + // Nachricht: "Spieler xy hat den Server verlassen" + 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 // =========================== @@ -407,37 +463,30 @@ public class GlobalChat extends Plugin implements Listener { String[] ps = getPrefixSuffix(player); String prefix = ps[0]; - String suffix = ps[1]; + String playerColor = ps[2]; // Namefarbe aus Properties für den Switch String displayTag = ""; if (!prefix.isEmpty()) displayTag = prefix; - else if (!suffix.isEmpty()) displayTag = suffix; + // Suffix wird hier ignoriert, da die || Syntax vorausgesetzt wird + 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] "); // FIX: Reset vor der Klammer + msg.append("§7[").append(toDisplay).append("§r§7] "); if (!displayTag.isEmpty()) msg.append(displayTag); - msg.append(player.getName()); + // Hier wird die playerColor aus der bungee.yml 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(); + // NEU: Broadcast Helper nutzen TextComponent switchComponent = new TextComponent(finalMsg); - String jsonMessage = ComponentSerializer.toString(switchComponent); - byte[] data = jsonMessage.getBytes(StandardCharsets.UTF_8); - - for (ServerInfo server : getProxy().getServers().values()) { - if (server.getPlayers().isEmpty()) continue; - try { - server.sendData(CHANNEL_CHAT, data); - } catch (Exception ex) { - getLogger().warning("Konnte Switch-Nachricht nicht senden."); - } - } + broadcastGlobal(switchComponent); String logEntry = "[" + toName + "] " + (displayTag.isEmpty() ? "" : stripColor(displayTag) + " ") + @@ -475,11 +524,8 @@ public class GlobalChat extends Plugin implements Listener { String groupName = "spieler"; // 0. UUID Override aus bungee.yml - // DEBUG LOG zum Finden des Fehlers: - // getLogger().info("DEBUG: Suche Override für UUID: " + player.getUniqueId().toString()); if (manualRanks.containsKey(player.getUniqueId().toString())) { groupName = manualRanks.get(player.getUniqueId().toString()); - // getLogger().info("DEBUG: Override gefunden -> " + groupName); } // 1. LuckPerms via Reflection else { @@ -638,6 +684,15 @@ public class GlobalChat extends Plugin implements Listener { return false; } + + // Überladene Methode für CommandSender (z.B. Console für ClearChat) + private boolean isStaff(CommandSender sender) { + if (sender instanceof ProxiedPlayer) { + return isStaff((ProxiedPlayer) sender); + } + // Console ist meistens Staff + return true; + } // =========================== // Commands (Inner Classes) @@ -772,6 +827,33 @@ public class GlobalChat extends Plugin implements 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 + 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.")); + } + } + // HELPER: LuckPerms Group via Reflection private String getLuckPermsGroup(ProxiedPlayer player) { try {