StatusAPI/src/main/java/net/viper/status/StatusAPI.java aktualisiert

This commit is contained in:
2026-01-01 21:49:10 +00:00
parent 395a26f023
commit 519bb5161e

View File

@@ -1,146 +1,168 @@
package net.viper.status; package net.viper.status;
import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ListenerInfo; import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
import java.io.*; import java.io.*;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class StatusAPI extends Plugin implements Runnable { public class StatusAPI extends Plugin implements Runnable {
private Thread thread; private Thread thread;
private int port = 9191; private int port = 9191;
@Override @Override
public void onEnable() { public void onEnable() {
getLogger().info("StatusAPI wird aktiviert..."); getLogger().info("StatusAPI wird aktiviert...");
getLogger().info("Starte Web-Server auf Port " + port + "..."); getLogger().info("Starte Web-Server auf Port " + port + "...");
thread = new Thread(this); thread = new Thread(this);
thread.start(); thread.start();
} }
@Override @Override
public void onDisable() { public void onDisable() {
getLogger().info("Stoppe Web-Server..."); getLogger().info("Stoppe Web-Server...");
if (thread != null) { if (thread != null) {
thread.interrupt(); thread.interrupt();
} }
} }
@Override @Override
public void run() { public void run() {
try (ServerSocket serverSocket = new ServerSocket(port)) { try (ServerSocket serverSocket = new ServerSocket(port)) {
serverSocket.setSoTimeout(1000); serverSocket.setSoTimeout(1000);
while (!Thread.interrupted()) { while (!Thread.interrupted()) {
try { try {
Socket clientSocket = serverSocket.accept(); Socket clientSocket = serverSocket.accept();
handleConnection(clientSocket); handleConnection(clientSocket);
} catch (java.net.SocketTimeoutException e) { } catch (java.net.SocketTimeoutException e) {
// Loop Check // Loop Check
} catch (IOException e) { } catch (IOException e) {
// Ignorieren // Ignorieren
} }
} }
} catch (IOException e) { } catch (IOException e) {
getLogger().severe("Konnte ServerSocket nicht starten auf Port " + port); getLogger().severe("Konnte ServerSocket nicht starten auf Port " + port);
e.printStackTrace(); e.printStackTrace();
} }
} }
private void handleConnection(Socket clientSocket) { private void handleConnection(Socket clientSocket) {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); BufferedReader in = null;
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) { OutputStream out = null;
String inputLine = in.readLine(); try {
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
if (inputLine != null && inputLine.startsWith("GET")) { out = clientSocket.getOutputStream();
Map<String, Object> data = new HashMap<>(); String inputLine = in.readLine();
data.put("online", true);
if (inputLine != null && inputLine.startsWith("GET")) {
// --- VERSION CLEANUP START ---
String versionRaw = ProxyServer.getInstance().getVersion(); Map<String, Object> data = new HashMap<>();
String versionClean = versionRaw; // Fallback data.put("online", true);
// Regex um die saubere Version zu extrahieren (z.B. 1.21-R0.5-SNAPSHOT) // --- VERSION CLEANUP START ---
// Aus: git:BungeeCord-Bootstrap:1.21-R0.5-SNAPSHOT:36e6154:2012 String versionRaw = ProxyServer.getInstance().getVersion();
if (versionRaw.matches("git-BungeeCord-Bootstrap:.*")) { String versionClean = versionRaw;
String[] parts = versionRaw.split(":");
if(parts.length > 2) { if (versionRaw.contains("BungeeCord-Bootstrap:")) {
versionClean = parts[2]; String[] parts = versionRaw.split(":");
} if(parts.length >= 3) {
} versionClean = parts[2];
data.put("version", versionClean); }
// --- VERSION CLEANUP ENDE --- }
data.put("version", versionClean);
data.put("max_players", ProxyServer.getInstance().getConfig().getPlayerLimit()); // --- VERSION CLEANUP ENDE ---
String motd = "BungeeCord"; data.put("max_players", String.valueOf(ProxyServer.getInstance().getConfig().getPlayerLimit()));
try {
ListenerInfo listener = ProxyServer.getInstance().getConfig().getListeners().iterator().next(); String motd = "BungeeCord";
if (listener != null) { try {
motd = listener.getMotd(); ListenerInfo listener = ProxyServer.getInstance().getConfig().getListeners().iterator().next();
} if (listener != null) {
} catch (Exception e) { motd = listener.getMotd();
// Fallback }
} } catch (Exception e) {
data.put("motd", motd); // Fallback
}
List<String> playerNames = new ArrayList<>(); data.put("motd", motd);
for (net.md_5.bungee.api.connection.ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
playerNames.add(p.getName()); List<String> playerNames = new ArrayList<>();
} for (net.md_5.bungee.api.connection.ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) {
data.put("players", playerNames); playerNames.add(p.getName());
}
String json = buildJsonString(data); data.put("players", playerNames);
out.println("HTTP/1.1 200 OK"); String json = buildJsonString(data);
out.println("Content-Type: application/json"); byte[] jsonBytes = json.getBytes("UTF-8");
out.println("Access-Control-Allow-Origin: *");
out.println("Content-Length: " + json.length()); // HTTP Response mit korrekter Byte-Length
out.println("Connection: close"); StringBuilder response = new StringBuilder();
out.println(); response.append("HTTP/1.1 200 OK\r\n");
out.println(json); response.append("Content-Type: application/json; charset=UTF-8\r\n");
} response.append("Access-Control-Allow-Origin: *\r\n");
} catch (Exception e) { response.append("Content-Length: ").append(jsonBytes.length).append("\r\n");
e.printStackTrace(); response.append("Connection: close\r\n");
} response.append("\r\n");
}
// Header senden
private String buildJsonString(Map<String, Object> data) { out.write(response.toString().getBytes("UTF-8"));
StringBuilder sb = new StringBuilder("{"); // Body senden
boolean first = true; out.write(jsonBytes);
for (Map.Entry<String, Object> entry : data.entrySet()) { out.flush();
if (!first) sb.append(","); }
first = false; } catch (Exception e) {
sb.append("\"").append(entry.getKey()).append("\":"); getLogger().severe("Fehler beim Verarbeiten der Anfrage: " + e.getMessage());
e.printStackTrace();
Object value = entry.getValue(); } finally {
if (value instanceof List) { // Sauber aufräumen
sb.append("["); try {
List<?> list = (List<?>) value; if (out != null) out.close();
for (int i = 0; i < list.size(); i++) { if (in != null) in.close();
if (i > 0) sb.append(","); if (clientSocket != null && !clientSocket.isClosed()) {
sb.append("\"").append(list.get(i)).append("\""); clientSocket.close();
} }
sb.append("]"); } catch (IOException e) {
} else if (value instanceof String) { // Ignorieren
sb.append("\"").append(((String) value).replace("\"", "\\\"")).append("\""); }
} else if (value instanceof Boolean) { }
sb.append(value); }
} else {
sb.append("\"").append(value).append("\""); private String buildJsonString(Map<String, Object> data) {
} StringBuilder sb = new StringBuilder("{");
} boolean first = true;
sb.append("}"); for (Map.Entry<String, Object> entry : data.entrySet()) {
return sb.toString(); 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();
}
} }