package de.serverpulse.bungee.commands; import de.serverpulse.bungee.BungeePlugin; import de.serverpulse.bungee.models.ServerData; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.plugin.Command; /** * /bpulse Befehlsverarbeitung für BungeeCord. * Unterbefehle: status | network | servers | reload */ public class BungeeCommand extends Command { private final BungeePlugin plugin; public BungeeCommand(BungeePlugin plugin) { super("bpulse", "serverpulse.bungee.use", "bsp", "networkpulse"); this.plugin = plugin; } @Override public void execute(CommandSender sender, String[] args) { if (args.length == 0) { sendHelp(sender); return; } switch (args[0].toLowerCase()) { case "status" -> handleStatus(sender); case "network" -> handleNetwork(sender); case "servers" -> handleServers(sender); case "reload" -> handleReload(sender); case "report" -> handleReport(sender); default -> sendHelp(sender); } } // ────────────────────────────────────────── // STATUS // ────────────────────────────────────────── private void handleStatus(CommandSender sender) { send(sender, ""); send(sender, "§8§m──────────────────────────────────────────"); send(sender, " §b§lServerPulse §8– §7Netzwerk-Status"); send(sender, "§8§m──────────────────────────────────────────"); send(sender, " §7Spieler gesamt: §f" + plugin.getDataStore().getTotalOnlinePlayers()); send(sender, " §7Server online: §f" + plugin.getDataStore().getOnlineServerCount() + " §8/ §f" + plugin.getDataStore().getServerCount()); send(sender, " §7Ø TPS (Netz): " + formatTps(plugin.getDataStore().getNetworkAverageTps())); send(sender, " §7Min TPS: " + formatTps(plugin.getDataStore().getLowestTps())); send(sender, " §7RAM gesamt: §f" + plugin.getDataStore().getTotalRamUsedMb() + " MB" + " §8/ §f" + plugin.getDataStore().getTotalRamMaxMb() + " MB"); send(sender, "§8§m──────────────────────────────────────────"); } // ────────────────────────────────────────── // NETWORK // ────────────────────────────────────────── private void handleNetwork(CommandSender sender) { send(sender, ""); send(sender, "§b§lServerPulse §8– §7Netzwerk-Übersicht"); send(sender, "§8§m──────────────────────────────────────────"); for (DataEntry entry : java.util.List.of( new DataEntry("Online Spieler", String.valueOf(plugin.getDataStore().getTotalOnlinePlayers())), new DataEntry("Aktive Server", plugin.getDataStore().getOnlineServerCount() + " / " + plugin.getDataStore().getServerCount()), new DataEntry("Ø Netz-TPS", String.format("%.2f", plugin.getDataStore().getNetworkAverageTps())), new DataEntry("Niedrigste TPS", String.format("%.2f", plugin.getDataStore().getLowestTps())), new DataEntry("RAM gesamt", plugin.getDataStore().getTotalRamUsedMb() + " MB / " + plugin.getDataStore().getTotalRamMaxMb() + " MB"))) { send(sender, " §7" + entry.label + ": §f" + entry.value); } send(sender, "§8§m──────────────────────────────────────────"); } // ────────────────────────────────────────── // SERVERS // ────────────────────────────────────────── private void handleServers(CommandSender sender) { send(sender, ""); send(sender, "§b§lServerPulse §8– §7Server-Details"); send(sender, "§8§m──────────────────────────────────────────"); for (ServerData data : plugin.getDataStore().getAll()) { String status = data.isOnline() ? "§a●" : "§c●"; if (data.isOnline()) { send(sender, " " + status + " §f§l" + data.getServerName()); send(sender, " §7TPS: " + formatTps(data.getTps()) + " §7MSPT: §f" + String.format("%.1f", data.getMspt()) + "ms"); send(sender, " §7RAM: §f" + data.getRamUsedMb() + "MB §8/ §f" + data.getRamMaxMb() + "MB" + " §7Spieler: §f" + data.getOnlinePlayers()); send(sender, " §7Entities: §f" + data.getTotalEntities() + " §7Chunks: §f" + data.getLoadedChunks()); if (!data.getLastAlert().isEmpty()) { String color = data.getLastAlertSeverity().equals("CRITICAL") ? "§c" : "§e"; send(sender, " §7Letzter Alert: " + color + data.getLastAlert()); } } else { send(sender, " " + status + " §7" + data.getServerName() + " §8(Offline)"); } } if (plugin.getDataStore().getAll().isEmpty()) { send(sender, " §7Noch keine Server-Daten empfangen."); } send(sender, "§8§m──────────────────────────────────────────"); } // ────────────────────────────────────────── // REPORT // ────────────────────────────────────────── private void handleReport(CommandSender sender) { if (!plugin.getBungeeConfig().isDiscordEnabled()) { send(sender, "§cDiscord ist nicht aktiviert. Report kann nicht gesendet werden."); return; } send(sender, "§aSende täglichen Netzwerk-Report an Discord..."); plugin.getProxy().getScheduler().runAsync(plugin, () -> plugin.getDiscordWebhook().sendDailyReport()); send(sender, "§aReport wurde gesendet!"); } // ────────────────────────────────────────── // RELOAD // ────────────────────────────────────────── private void handleReload(CommandSender sender) { if (!sender.hasPermission("serverpulse.bungee.admin")) { send(sender, "§cKeine Berechtigung."); return; } plugin.getBungeeConfig().load(); send(sender, "§aKonfiguration wurde neu geladen."); } // ────────────────────────────────────────── // HILFE // ────────────────────────────────────────── private void sendHelp(CommandSender sender) { send(sender, "§8§m──────────────────────────────────────────"); send(sender, " §b§lServerPulse BungeeCord §8– §7Befehle"); send(sender, "§8§m──────────────────────────────────────────"); send(sender, " §b/bpulse status §8– §7Netzwerk-Schnellübersicht"); send(sender, " §b/bpulse network §8– §7Netzwerk-Statistiken"); send(sender, " §b/bpulse servers §8– §7Details aller Sub-Server"); send(sender, " §b/bpulse report §8– §7Discord-Report senden"); send(sender, " §b/bpulse reload §8– §7Konfiguration neu laden"); send(sender, "§8§m──────────────────────────────────────────"); } // ────────────────────────────────────────── // HILFSMETHODEN // ────────────────────────────────────────── private void send(CommandSender sender, String message) { sender.sendMessage(new TextComponent(ChatColor.translateAlternateColorCodes('§', message))); } private String formatTps(double tps) { if (tps >= 18.0) return "§a" + String.format("%.2f", tps); if (tps >= 15.0) return "§e" + String.format("%.2f", tps); return "§c" + String.format("%.2f", tps); } private record DataEntry(String label, String value) {} }