From 386ddfdc0a25aa4b77de76702c95946f9068c740 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 7 May 2026 19:39:37 +0000 Subject: [PATCH] Soft-delete copy _trash/2026-05-07T19-39-34-009Z/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java --- .../AutoMessage/AutoMessageModule.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 _trash/2026-05-07T19-39-34-009Z/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java diff --git a/_trash/2026-05-07T19-39-34-009Z/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java b/_trash/2026-05-07T19-39-34-009Z/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java new file mode 100644 index 0000000..7f2f1f6 --- /dev/null +++ b/_trash/2026-05-07T19-39-34-009Z/_trash/2026-05-07T19-39-23-130Z/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java @@ -0,0 +1,132 @@ +package net.viper.status.modules.AutoMessage; + +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.Plugin; +import net.viper.status.StatusAPI; +import net.viper.status.module.Module; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * AutoMessageModule + * + * Fix #5: + * - Nachrichten werden bei jedem Zyklus frisch aus der Datei gelesen, + * damit Änderungen an messages.txt sofort wirken ohne Neustart. + * - Neuer Befehl /automessage reload (Permission: statusapi.automessage) + * lädt die Konfiguration neu und setzt den Zähler zurück. + * - TextComponent.fromLegacy() → ChatColor.translateAlternateColorCodes für §-Codes. + */ +public class AutoMessageModule implements Module { + + private int taskId = -1; + private StatusAPI api; + private final AtomicInteger currentIndex = new AtomicInteger(0); + + // Konfiguration (für Reload zugänglich) + private volatile boolean enabled = false; + private volatile int intervalSeconds = 300; + private volatile String fileName = "messages.txt"; + private volatile String prefix = ""; + + @Override + public String getName() { return "AutoMessage"; } + + @Override + public void onEnable(Plugin plugin) { + this.api = (StatusAPI) plugin; + loadSettings(); + + if (!enabled) return; + + registerReloadCommand(); + scheduleTask(); + } + + @Override + public void onDisable(Plugin plugin) { + cancelTask(); + } + + private void loadSettings() { + Properties props = api.getVerifyProperties(); + enabled = Boolean.parseBoolean(props.getProperty("automessage.enabled", "false")); + String rawInterval = props.getProperty("automessage.interval", "300"); + try { intervalSeconds = Integer.parseInt(rawInterval); } + catch (NumberFormatException e) { api.getLogger().warning("Ungültiges Intervall für AutoMessage! Nutze Standard (300s)."); intervalSeconds = 300; } + fileName = props.getProperty("automessage.file", "messages.txt"); + prefix = props.getProperty("automessage.prefix", ""); + } + + private void registerReloadCommand() { + ProxyServer.getInstance().getPluginManager().registerCommand(api, new Command("automessage", "statusapi.automessage") { + @Override + public void execute(CommandSender sender, String[] args) { + if (args.length > 0 && "reload".equalsIgnoreCase(args[0])) { + cancelTask(); + loadSettings(); + currentIndex.set(0); + if (enabled) { + scheduleTask(); + sender.sendMessage(ChatColor.GREEN + "[AutoMessage] Neu geladen. Intervall: " + intervalSeconds + "s"); + } else { + sender.sendMessage(ChatColor.YELLOW + "[AutoMessage] Modul ist deaktiviert (automessage.enabled=false)."); + } + } else { + sender.sendMessage(ChatColor.YELLOW + "/automessage reload"); + } + } + }); + } + + private void scheduleTask() { + taskId = ProxyServer.getInstance().getScheduler().schedule(api, () -> { + File messageFile = new File(api.getDataFolder(), fileName); + if (!messageFile.exists()) { + api.getLogger().warning("[AutoMessage] Datei nicht gefunden: " + messageFile.getAbsolutePath()); + return; + } + + // Fix #5: Datei bei jedem Tick neu einlesen → Änderungen wirken sofort + List messages; + try { + messages = Files.readAllLines(messageFile.toPath(), StandardCharsets.UTF_8); + } catch (IOException e) { + api.getLogger().severe("[AutoMessage] Fehler beim Lesen von '" + fileName + "': " + e.getMessage()); + return; + } + messages.removeIf(line -> line.trim().isEmpty() || line.trim().startsWith("#")); + if (messages.isEmpty()) return; + + // Index wrappen (threadsafe) + int idx = currentIndex.getAndUpdate(i -> (i + 1) % messages.size()); + if (idx >= messages.size()) idx = 0; + + String raw = messages.get(idx); + String prefixPart = prefix.isEmpty() ? "" : ChatColor.translateAlternateColorCodes('&', prefix) + " "; + // Fix: §-Codes direkt übersetzen (messages.txt nutzt §-Codes) + String text = prefixPart + ChatColor.translateAlternateColorCodes('&', + raw.replace("\u00a7", "&").replace("§", "&")); + + ProxyServer.getInstance().broadcast(new TextComponent(text)); + }, intervalSeconds, intervalSeconds, TimeUnit.SECONDS).getId(); + } + + private void cancelTask() { + if (taskId != -1) { + ProxyServer.getInstance().getScheduler().cancel(taskId); + taskId = -1; + } + } +}