From d4faf31b73515f072277bc67763ebe52e8c1d162 Mon Sep 17 00:00:00 2001 From: Caadiq Date: Tue, 23 Dec 2025 12:18:19 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=99=94=EC=9D=B4=ED=8A=B8=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20API=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GET /whitelist - 화이트리스트 조회 (whitelist.json, server.properties) - WhitelistPlayer, WhitelistResponse 데이터 클래스 추가 - white-list 값만 체크하여 활성화 상태 반환 --- .../serverstatus/network/HttpApiServer.kt | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/ServerStatus/src/main/kotlin/co/caadiq/serverstatus/network/HttpApiServer.kt b/ServerStatus/src/main/kotlin/co/caadiq/serverstatus/network/HttpApiServer.kt index c28f4cb..b06c3d1 100644 --- a/ServerStatus/src/main/kotlin/co/caadiq/serverstatus/network/HttpApiServer.kt +++ b/ServerStatus/src/main/kotlin/co/caadiq/serverstatus/network/HttpApiServer.kt @@ -41,6 +41,7 @@ class HttpApiServer(private val port: Int) { server?.createContext("/logfiles", LogFilesHandler()) server?.createContext("/logfile", LogFileDownloadHandler()) server?.createContext("/banlist", BanlistHandler()) + server?.createContext("/whitelist", WhitelistHandler()) server?.start() ServerStatusMod.LOGGER.info( @@ -482,6 +483,63 @@ class HttpApiServer(private val port: Int) { } } } + + /** GET /whitelist - 화이트리스트 조회 (whitelist.json 읽기) */ + inner class WhitelistHandler : HttpHandler { + override fun handle(exchange: HttpExchange) { + if (exchange.requestMethod == "OPTIONS") { + sendJsonResponse(exchange, "") + return + } + + try { + val server = net.neoforged.neoforge.server.ServerLifecycleHooks.getCurrentServer() + val whitelistFile = + server?.serverDirectory?.resolve("whitelist.json")?.toFile() + ?: java.io.File("whitelist.json") + + // 화이트리스트 활성화 여부 확인 (server.properties의 white-list 값) + val propsFile = + server?.serverDirectory?.resolve("server.properties")?.toFile() + ?: java.io.File("server.properties") + var enabled = false + if (propsFile.exists()) { + propsFile.readLines().forEach { line -> + if (line.startsWith("white-list=")) { + enabled = line.substringAfter("=").trim().lowercase() == "true" + } + } + } + + val players = + if (whitelistFile.exists()) { + try { + val content = whitelistFile.readText(Charsets.UTF_8) + Json.decodeFromString>(content) + } catch (e: Exception) { + ServerStatusMod.LOGGER.error( + "[${ServerStatusMod.MOD_ID}] 화이트리스트 파싱 오류: ${e.message}" + ) + emptyList() + } + } else { + emptyList() + } + + val response = WhitelistResponse(enabled, players) + sendJsonResponse(exchange, Json.encodeToString(response)) + } catch (e: Exception) { + ServerStatusMod.LOGGER.error( + "[${ServerStatusMod.MOD_ID}] 화이트리스트 조회 오류: ${e.message}" + ) + sendJsonResponse( + exchange, + """{"enabled": false, "players": [], "error": "${e.message}"}""", + 500 + ) + } + } + } } @Serializable data class WorldsResponse(val worlds: List) @@ -505,3 +563,8 @@ data class BannedPlayer( ) @Serializable data class BanlistResponse(val banList: List) + +@Serializable data class WhitelistPlayer(val uuid: String, val name: String) + +@Serializable +data class WhitelistResponse(val enabled: Boolean, val players: List)