From 37df6e4588bd1b3e0b764d353d9e61fd10301a40 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Mon, 29 Sep 2025 14:29:47 +0000 Subject: [PATCH] Dateien nach "src/main/java/de/viper/globalchat" hochladen --- .../java/de/viper/globalchat/GlobalChat.java | 299 ++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 src/main/java/de/viper/globalchat/GlobalChat.java diff --git a/src/main/java/de/viper/globalchat/GlobalChat.java b/src/main/java/de/viper/globalchat/GlobalChat.java new file mode 100644 index 0000000..4da4892 --- /dev/null +++ b/src/main/java/de/viper/globalchat/GlobalChat.java @@ -0,0 +1,299 @@ +package de.viper.globalchat; + +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.HoverEvent.Action; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.event.ChatEvent; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.api.plugin.Plugin; +import net.md_5.bungee.event.EventHandler; + +import java.io.*; +import java.nio.file.*; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; + +public class GlobalChat extends Plugin implements Listener { + + private List badWords = new ArrayList<>(); + private File logFolder; + private boolean chatMuted = false; // Globaler Mute-Status + + // Spieler-UUID -> isOp (vom Spigot gemeldet) + private final Map playerIsOp = new ConcurrentHashMap<>(); + + // Letzte Support-Kontakte für /reply + private final Map lastSupportContact = new ConcurrentHashMap<>(); + + @Override + public void onEnable() { + getProxy().getPluginManager().registerListener(this, this); + + // Filter laden + loadFilter(); + + // Log-Ordner erstellen + logFolder = new File(getDataFolder(), "logs"); + if (!logFolder.exists()) logFolder.mkdirs(); + cleanupOldLogs(); + + // Befehle registrieren (Support & Info sind für alle verfügbar) + getProxy().getPluginManager().registerCommand(this, new ReloadCommand()); + getProxy().getPluginManager().registerCommand(this, new MuteCommand()); + getProxy().getPluginManager().registerCommand(this, new SupportCommand()); + getProxy().getPluginManager().registerCommand(this, new ReplyCommand()); + getProxy().getPluginManager().registerCommand(this, new InfoCommand()); + + getLogger().info("§aGlobalChat mit Zensur, Logs, Reload, Mute, Support, Reply & Info aktiviert!"); + } + + @Override + public void onDisable() { + getLogger().info("§cGlobalChat deaktiviert!"); + } + + // =========================== + // Chatfilter & Logging + // =========================== + @EventHandler + public void onChat(ChatEvent e) { + if (!(e.getSender() instanceof ProxiedPlayer)) return; + if (e.isCommand()) return; + + ProxiedPlayer player = (ProxiedPlayer) e.getSender(); + String originalMsg = e.getMessage(); + String censoredMsg = originalMsg; + + // Globaler Mute check + if (chatMuted && !player.hasPermission("globalchat.bypass")) { + player.sendMessage(new TextComponent("§cDer globale Chat ist derzeit deaktiviert!")); + e.setCancelled(true); + return; + } + + // Badword-Zensur + for (String bad : badWords) { + if (bad == null || bad.trim().isEmpty()) continue; + censoredMsg = censoredMsg.replaceAll("(?i)" + Pattern.quote(bad), repeat("*", bad.length())); + } + + e.setCancelled(true); + + String serverName = player.getServer().getInfo().getName(); + String chatOut = "§7[" + serverName + "] §b" + player.getName() + "§f: " + censoredMsg; + + for (ProxiedPlayer p : getProxy().getPlayers()) { + p.sendMessage(new TextComponent(chatOut)); + } + + logMessage("[" + serverName + "] " + player.getName() + ": " + originalMsg); + } + + private String repeat(String str, int count) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < count; i++) sb.append(str); + return sb.toString(); + } + + // =========================== + // Filter laden + // =========================== + private void loadFilter() { + File file = new File(getDataFolder(), "filter.yml"); + if (!file.exists()) { + try { + getDataFolder().mkdirs(); + file.createNewFile(); + try (PrintWriter out = new PrintWriter(file)) { + out.println("badwords:"); + out.println(" - arsch"); + out.println(" - hurensohn"); + out.println(" - scheiße"); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + try { + List lines = Files.readAllLines(file.toPath()); + badWords.clear(); + for (String line : lines) { + line = line.trim(); + if (line.startsWith("-")) badWords.add(line.substring(1).trim()); + } + getLogger().info("§eGeladene Filter-Wörter: " + badWords.size()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void cleanupOldLogs() { + File[] files = logFolder.listFiles(); + if (files == null) return; + + long now = System.currentTimeMillis(); + long sevenDays = 1000L * 60 * 60 * 24 * 7; + + for (File f : files) { + if (now - f.lastModified() > sevenDays) { + f.delete(); + } + } + } + + private void logMessage(String message) { + String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + File logFile = new File(logFolder, date + ".log"); + + try (BufferedWriter bw = new BufferedWriter(new FileWriter(logFile, true))) { + String time = new SimpleDateFormat("HH:mm:ss").format(new Date()); + bw.write("[" + time + "] " + message); + bw.newLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + // =========================== + // Staff-Check + // =========================== + private boolean isStaff(ProxiedPlayer p) { + if (p == null) return false; + Boolean reportedOp = playerIsOp.get(p.getUniqueId()); + if (reportedOp != null && reportedOp) return true; + + if (p.hasPermission("team")) return true; + if (p.hasPermission("bungeecord.admin")) return true; + if (p.hasPermission("globalchat.op")) return true; + if (p.hasPermission("*")) return true; + + if (p.hasPermission("bungeecord.command.alert")) return true; + if (p.hasPermission("bungeecord.command.reload")) return true; + if (p.hasPermission("bungeecord.command.kick")) return true; + if (p.hasPermission("bungeecord.command.send")) return true; + if (p.hasPermission("bungeecord.command.perms")) return true; + + return false; + } + + // =========================== + // Commands + // =========================== + public class ReloadCommand extends Command { + public ReloadCommand() { super("globalreload", "globalchat.reload"); } + @Override + public void execute(CommandSender sender, String[] args) { + loadFilter(); + sender.sendMessage(new TextComponent("§aFilter wurde neu geladen!")); + } + } + + public class MuteCommand extends Command { + public MuteCommand() { super("globalmute", "globalchat.mute"); } + @Override + public void execute(CommandSender sender, String[] args) { + chatMuted = !chatMuted; + String status = chatMuted ? "§caktiviert" : "§aaufgehoben"; + for (ProxiedPlayer p : getProxy().getPlayers()) { + p.sendMessage(new TextComponent("§7[GlobalChat] §eDer globale Chat Mute wurde " + status + "§e!")); + } + getLogger().info("GlobalMute wurde " + (chatMuted ? "aktiviert" : "deaktiviert") + "."); + } + } + + public class SupportCommand extends Command { + // kein Permission-Parameter -> für alle verfügbar + public SupportCommand() { super("support"); } + @Override + public void execute(CommandSender sender, String[] args) { + if (!(sender instanceof ProxiedPlayer)) { + sender.sendMessage(new TextComponent("§cNur Spieler können Support-Nachrichten senden.")); + return; + } + + ProxiedPlayer player = (ProxiedPlayer) sender; + if (args.length == 0) { + player.sendMessage(new TextComponent("§cBitte eine Nachricht angeben: /support ")); + return; + } + + String msg = String.join(" ", args); + String serverName = player.getServer().getInfo().getName(); + + TextComponent supportMsg = new TextComponent("§7[Support] §b" + player.getName() + + " §7vom Server §e" + serverName + " §7: §f" + msg); + + // Hover-Text + supportMsg.setHoverEvent(new HoverEvent(Action.SHOW_TEXT, + new ComponentBuilder("Klicke, um /reply " + player.getName() + " zu schreiben").create())); + + // Klick-Event (füllt die Chatbox mit /reply ) + supportMsg.setClickEvent(new net.md_5.bungee.api.chat.ClickEvent( + net.md_5.bungee.api.chat.ClickEvent.Action.SUGGEST_COMMAND, + "/reply " + player.getName() + " " + )); + + for (ProxiedPlayer p : getProxy().getPlayers()) { + if (isStaff(p)) { + p.sendMessage(supportMsg); + lastSupportContact.put(p.getUniqueId(), player.getUniqueId()); + } + } + + player.sendMessage(new TextComponent("§aDeine Support-Nachricht wurde gesendet.")); + logMessage("[Support][" + serverName + "] " + player.getName() + ": " + msg); + } + } + + public class ReplyCommand extends Command { + public ReplyCommand() { super("reply"); } + @Override + public void execute(CommandSender sender, String[] args) { + if (!(sender instanceof ProxiedPlayer)) return; + + ProxiedPlayer staff = (ProxiedPlayer) sender; + UUID targetId = lastSupportContact.get(staff.getUniqueId()); + if (targetId == null) { + staff.sendMessage(new TextComponent("§cKein Spieler zum Antworten gefunden.")); + return; + } + + if (args.length == 0) { + staff.sendMessage(new TextComponent("§cBitte eine Nachricht angeben.")); + return; + } + + ProxiedPlayer target = getProxy().getPlayer(targetId); + if (target == null) { + staff.sendMessage(new TextComponent("§cSpieler ist nicht online.")); + return; + } + + String msg = String.join(" ", args); + target.sendMessage(new TextComponent("§7[Reply von §b" + staff.getName() + "§7]: §f" + msg)); + staff.sendMessage(new TextComponent("§aDeine Nachricht wurde an §b" + target.getName() + "§a gesendet.")); + } + } + + public class InfoCommand extends Command { + // kein Permission-Parameter -> für alle verfügbar + public InfoCommand() { super("info"); } + + @Override + public void execute(CommandSender sender, String[] args) { + sender.sendMessage(new TextComponent("§8§m------------------------------")); + sender.sendMessage(new TextComponent("§6§lGlobalChat Info")); + sender.sendMessage(new TextComponent("§ePlugin-Name: §b" + getDescription().getName())); + sender.sendMessage(new TextComponent("§eVersion: §b" + getDescription().getVersion())); + sender.sendMessage(new TextComponent("§eErsteller: §bM_Viper")); + sender.sendMessage(new TextComponent("§8§m------------------------------")); + } +} +}