Files
ServerPulse/src/main/java/de/serverpulse/bungee/commands/BungeeCommand.java
2026-06-15 07:03:50 +02:00

180 lines
9.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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) {}
}