From dd0fe44c354c306a4c00b77e2c9eedd36a9adbf9 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Wed, 31 Dec 2025 23:09:51 +0000 Subject: [PATCH] Dateien nach "StatusAPI/src/main/java/net/viper/status" hochladen --- .../main/java/net/viper/status/StatusAPI.java | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 StatusAPI/src/main/java/net/viper/status/StatusAPI.java diff --git a/StatusAPI/src/main/java/net/viper/status/StatusAPI.java b/StatusAPI/src/main/java/net/viper/status/StatusAPI.java new file mode 100644 index 0000000..2957d09 --- /dev/null +++ b/StatusAPI/src/main/java/net/viper/status/StatusAPI.java @@ -0,0 +1,146 @@ +package net.viper.status; + +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ListenerInfo; +import net.md_5.bungee.api.plugin.Plugin; + +import java.io.*; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class StatusAPI extends Plugin implements Runnable { + + private Thread thread; + private int port = 9191; + + @Override + public void onEnable() { + getLogger().info("StatusAPI wird aktiviert..."); + getLogger().info("Starte Web-Server auf Port " + port + "..."); + + thread = new Thread(this); + thread.start(); + } + + @Override + public void onDisable() { + getLogger().info("Stoppe Web-Server..."); + if (thread != null) { + thread.interrupt(); + } + } + + @Override + public void run() { + try (ServerSocket serverSocket = new ServerSocket(port)) { + serverSocket.setSoTimeout(1000); + + while (!Thread.interrupted()) { + try { + Socket clientSocket = serverSocket.accept(); + handleConnection(clientSocket); + } catch (java.net.SocketTimeoutException e) { + // Loop Check + } catch (IOException e) { + // Ignorieren + } + } + } catch (IOException e) { + getLogger().severe("Konnte ServerSocket nicht starten auf Port " + port); + e.printStackTrace(); + } + } + + private void handleConnection(Socket clientSocket) { + try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) { + + String inputLine = in.readLine(); + + if (inputLine != null && inputLine.startsWith("GET")) { + + Map data = new HashMap<>(); + data.put("online", true); + + // --- VERSION CLEANUP START --- + String versionRaw = ProxyServer.getInstance().getVersion(); + String versionClean = versionRaw; // Fallback + + // Regex um die saubere Version zu extrahieren (z.B. 1.21-R0.5-SNAPSHOT) + // Aus: git:BungeeCord-Bootstrap:1.21-R0.5-SNAPSHOT:36e6154:2012 + if (versionRaw.matches("git-BungeeCord-Bootstrap:.*")) { + String[] parts = versionRaw.split(":"); + if(parts.length > 2) { + versionClean = parts[2]; + } + } + data.put("version", versionClean); + // --- VERSION CLEANUP ENDE --- + + data.put("max_players", ProxyServer.getInstance().getConfig().getPlayerLimit()); + + String motd = "BungeeCord"; + try { + ListenerInfo listener = ProxyServer.getInstance().getConfig().getListeners().iterator().next(); + if (listener != null) { + motd = listener.getMotd(); + } + } catch (Exception e) { + // Fallback + } + data.put("motd", motd); + + List playerNames = new ArrayList<>(); + for (net.md_5.bungee.api.connection.ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) { + playerNames.add(p.getName()); + } + data.put("players", playerNames); + + String json = buildJsonString(data); + + out.println("HTTP/1.1 200 OK"); + out.println("Content-Type: application/json"); + out.println("Access-Control-Allow-Origin: *"); + out.println("Content-Length: " + json.length()); + out.println("Connection: close"); + out.println(); + out.println(json); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private String buildJsonString(Map data) { + StringBuilder sb = new StringBuilder("{"); + boolean first = true; + for (Map.Entry entry : data.entrySet()) { + if (!first) sb.append(","); + first = false; + sb.append("\"").append(entry.getKey()).append("\":"); + + Object value = entry.getValue(); + if (value instanceof List) { + sb.append("["); + List list = (List) value; + for (int i = 0; i < list.size(); i++) { + if (i > 0) sb.append(","); + sb.append("\"").append(list.get(i)).append("\""); + } + sb.append("]"); + } else if (value instanceof String) { + sb.append("\"").append(((String) value).replace("\"", "\\\"")).append("\""); + } else if (value instanceof Boolean) { + sb.append(value); + } else { + sb.append("\"").append(value).append("\""); + } + } + sb.append("}"); + return sb.toString(); + } +} \ No newline at end of file