From 519bb5161e1e320a9a369bbedc87fb4ba9ff4a40 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 1 Jan 2026 21:49:10 +0000 Subject: [PATCH] StatusAPI/src/main/java/net/viper/status/StatusAPI.java aktualisiert --- .../main/java/net/viper/status/StatusAPI.java | 312 ++++++++++-------- 1 file changed, 167 insertions(+), 145 deletions(-) diff --git a/StatusAPI/src/main/java/net/viper/status/StatusAPI.java b/StatusAPI/src/main/java/net/viper/status/StatusAPI.java index 2957d09..ee4b2ad 100644 --- a/StatusAPI/src/main/java/net/viper/status/StatusAPI.java +++ b/StatusAPI/src/main/java/net/viper/status/StatusAPI.java @@ -1,146 +1,168 @@ -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(); - } +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) { + BufferedReader in = null; + OutputStream out = null; + + try { + in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + out = clientSocket.getOutputStream(); + + 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; + + if (versionRaw.contains("BungeeCord-Bootstrap:")) { + String[] parts = versionRaw.split(":"); + if(parts.length >= 3) { + versionClean = parts[2]; + } + } + data.put("version", versionClean); + // --- VERSION CLEANUP ENDE --- + + data.put("max_players", String.valueOf(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); + byte[] jsonBytes = json.getBytes("UTF-8"); + + // HTTP Response mit korrekter Byte-Length + StringBuilder response = new StringBuilder(); + response.append("HTTP/1.1 200 OK\r\n"); + response.append("Content-Type: application/json; charset=UTF-8\r\n"); + response.append("Access-Control-Allow-Origin: *\r\n"); + response.append("Content-Length: ").append(jsonBytes.length).append("\r\n"); + response.append("Connection: close\r\n"); + response.append("\r\n"); + + // Header senden + out.write(response.toString().getBytes("UTF-8")); + // Body senden + out.write(jsonBytes); + out.flush(); + } + } catch (Exception e) { + getLogger().severe("Fehler beim Verarbeiten der Anfrage: " + e.getMessage()); + e.printStackTrace(); + } finally { + // Sauber aufräumen + try { + if (out != null) out.close(); + if (in != null) in.close(); + if (clientSocket != null && !clientSocket.isClosed()) { + clientSocket.close(); + } + } catch (IOException e) { + // Ignorieren + } + } + } + + 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