Dateien nach "StatusAPI/src/main/java/net/viper/status" hochladen

This commit is contained in:
2025-12-31 23:09:51 +00:00
parent b9284f7744
commit dd0fe44c35

View File

@@ -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<String, Object> 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<String> 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<String, Object> data) {
StringBuilder sb = new StringBuilder("{");
boolean first = true;
for (Map.Entry<String, Object> 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();
}
}