diff --git a/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java b/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java deleted file mode 100644 index 7c2a3f4..0000000 --- a/src/main/java/net/viper/status/modules/AutoMessage/AutoMessageModule.java +++ /dev/null @@ -1,163 +0,0 @@ -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(); - ensureMessagesFileExists(); - - if (!enabled) return; - - registerReloadCommand(); - scheduleTask(); - } - - @Override - public void onDisable(Plugin plugin) { - cancelTask(); - } - - private void ensureMessagesFileExists() { - File dataFolder = api.getDataFolder(); - if (!dataFolder.exists()) dataFolder.mkdirs(); - - File target = new File(dataFolder, fileName); - if (target.exists()) return; - - // Datei aus den Plugin-Ressourcen kopieren - try (java.io.InputStream in = api.getResourceAsStream(fileName)) { - if (in != null) { - Files.copy(in, target.toPath()); - api.getLogger().info("[AutoMessage] " + fileName + " wurde aus den Ressourcen erstellt."); - return; - } - } catch (IOException e) { - api.getLogger().warning("[AutoMessage] Konnte " + fileName + " nicht aus Ressourcen kopieren: " + e.getMessage()); - } - - // Fallback: leere Datei mit Hinweis anlegen - try { - Files.write(target.toPath(), - ("# AutoMessage – eine Nachricht pro Zeile\n" + - "# Farben mit & oder §-Codes, z.B. &aGrüner Text\n" + - "# Kommentarzeilen (# ...) und Leerzeilen werden ignoriert\n").getBytes(StandardCharsets.UTF_8)); - api.getLogger().info("[AutoMessage] " + fileName + " wurde als leere Vorlage erstellt."); - } catch (IOException e) { - api.getLogger().severe("[AutoMessage] Konnte " + fileName + " nicht erstellen: " + e.getMessage()); - } - } - - 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; - } - } -}