StatusAPI/src/main/java/net/viper/status/StatusAPI.java aktualisiert
This commit is contained in:
@@ -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<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();
|
||||
}
|
||||
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<String, Object> 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<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);
|
||||
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<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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user