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)