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
This commit is contained in:
@@ -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<String> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user