180 lines
9.7 KiB
Java
180 lines
9.7 KiB
Java
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) {}
|
||
}
|