From 721ebd6ad1e0fc416bcd4dc2b5ec3a7ba8deb2b4 Mon Sep 17 00:00:00 2001 From: BRanulf Date: Mon, 14 Apr 2025 20:49:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B5=8C=E5=85=A5=E5=BC=8F?= =?UTF-8?q?=E5=8D=A1=E7=89=87=EF=BC=8C=E8=BF=98=E6=B2=A1=E6=83=B3=E5=A5=BD?= =?UTF-8?q?=E6=80=8E=E4=B9=88=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- .../com/example/playertime/PlayerTimeMod.java | 6 +- .../com/example/playertime/WebServer.java | 66 ++++++++++++- .../assets/playertime/web/index.html | 99 +++++++++++++++++++ 4 files changed, 168 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index f6e01b5..09f4a0d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ minecraft_version=1.21.4 yarn_mappings=1.21.4+build.8 loader_version=0.16.10 # Mod Properties -mod_version=1.14.514.107 +mod_version=1.14.514.111 maven_group=org.example1 archives_base_name=playerOnlineTimeTrackerMod # Dependencies diff --git a/src/main/java/com/example/playertime/PlayerTimeMod.java b/src/main/java/com/example/playertime/PlayerTimeMod.java index 7d0253b..996ecb4 100644 --- a/src/main/java/com/example/playertime/PlayerTimeMod.java +++ b/src/main/java/com/example/playertime/PlayerTimeMod.java @@ -22,13 +22,13 @@ public class PlayerTimeMod implements ModInitializer { try { LOGGER.info("[在线时间] 初始化玩家在线时长视奸MOD"); + // 修改服务器启动部分 ServerLifecycleEvents.SERVER_STARTING.register(server -> { timeTracker = new PlayerTimeTracker(server); try { - // 使用配置中的端口 - webServer = new WebServer(timeTracker, config.getWebPort()); + webServer = new WebServer(timeTracker, config.getWebPort(), server); // 传入 MinecraftServer webServer.start(); - LOGGER.info("[在线时间] Web服务器在端口" + config.getWebPort()+ "启动"); + LOGGER.info("[在线时间] Web服务器在端口 " + config.getWebPort() + " 启动"); } catch (Exception e) { LOGGER.error("[在线时间] 无法启动Web服务器", e); } diff --git a/src/main/java/com/example/playertime/WebServer.java b/src/main/java/com/example/playertime/WebServer.java index ffebeaf..850c7b9 100644 --- a/src/main/java/com/example/playertime/WebServer.java +++ b/src/main/java/com/example/playertime/WebServer.java @@ -4,6 +4,7 @@ import com.google.gson.Gson; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpExchange; +import net.minecraft.server.MinecraftServer; import java.io.*; import java.net.InetSocketAddress; @@ -13,10 +14,13 @@ import java.nio.file.*; import java.util.*; import java.util.concurrent.*; +import static com.mojang.text2speech.Narrator.LOGGER; + public class WebServer { private final HttpServer server; private final PlayerTimeTracker timeTracker; private final ExecutorService executor = Executors.newFixedThreadPool(4); + private final MinecraftServer minecraftServer; private static final Map MIME_TYPES = Map.of( "html", "text/html", "css", "text/css", @@ -24,7 +28,8 @@ public class WebServer { "json", "application/json" ); - public WebServer(PlayerTimeTracker timeTracker, int port) throws IOException { + public WebServer(PlayerTimeTracker timeTracker, int port, MinecraftServer minecraftServer) throws IOException { + this.minecraftServer = minecraftServer; if (port < 1 || port > 65535) { throw new IllegalArgumentException("Invalid port number: " + port); } @@ -88,6 +93,51 @@ public class WebServer { } }); + server.createContext("/embed", exchange -> { + try { + Map stats = timeTracker.getWhitelistedPlayerStats(); + int onlinePlayers = minecraftServer.getPlayerManager().getCurrentPlayerCount(); // 使用 minecraftServer + + String html = """ + + + + + + 服务器状态卡片 + + +
+
+

%s 服务器状态

+
+
+
在线玩家: %d/%d
+
+ %s +
+
+ +
+ + + """.formatted( + minecraftServer.getServerMotd(), // 使用 minecraftServer + onlinePlayers, + minecraftServer.getPlayerManager().getMaxPlayerCount(), + generatePlayerList(stats) + ); + + exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*"); + sendResponse(exchange, 200, html.getBytes(StandardCharsets.UTF_8), "text/html"); + } catch (Exception e) { + LOGGER.error("无法生成嵌入式卡片", e); + sendResponse(exchange, 500, Arrays.toString("Internal Server Error".getBytes(StandardCharsets.UTF_8))); + } + }); + server.setExecutor(executor); } @@ -111,4 +161,18 @@ public class WebServer { server.stop(0); executor.shutdown(); } + + private String generatePlayerList(Map stats) { + if (stats.isEmpty()) return "

暂无玩家数据

"; + + StringBuilder sb = new StringBuilder("
    "); + stats.keySet().stream().limit(5).forEach(player -> { + sb.append("
  • • ").append(player).append("
  • "); + }); + if (stats.size() > 5) { + sb.append("
  • ... 等 ").append(stats.size() - 5).append(" 位玩家
  • "); + } + sb.append("
"); + return sb.toString(); + } } \ No newline at end of file diff --git a/src/main/resources/assets/playertime/web/index.html b/src/main/resources/assets/playertime/web/index.html index 6ab47ed..5f877eb 100644 --- a/src/main/resources/assets/playertime/web/index.html +++ b/src/main/resources/assets/playertime/web/index.html @@ -6,6 +6,59 @@ [在线时间] 玩家在线时间 + +
@@ -38,5 +91,51 @@
+ + +
+
+ 嵌入卡片代码,f12可以抄 + +
+ +
+ + + + \ No newline at end of file