feat: 화이트리스트 API 엔드포인트 추가

- GET /whitelist - 화이트리스트 조회 (whitelist.json, server.properties)
- WhitelistPlayer, WhitelistResponse 데이터 클래스 추가
- white-list 값만 체크하여 활성화 상태 반환
This commit is contained in:
Caadiq 2025-12-23 12:18:19 +09:00
parent 054d7b896a
commit d4faf31b73

View file

@ -41,6 +41,7 @@ class HttpApiServer(private val port: Int) {
server?.createContext("/logfiles", LogFilesHandler()) server?.createContext("/logfiles", LogFilesHandler())
server?.createContext("/logfile", LogFileDownloadHandler()) server?.createContext("/logfile", LogFileDownloadHandler())
server?.createContext("/banlist", BanlistHandler()) server?.createContext("/banlist", BanlistHandler())
server?.createContext("/whitelist", WhitelistHandler())
server?.start() server?.start()
ServerStatusMod.LOGGER.info( 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<List<WhitelistPlayer>>(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<WorldInfo>) @Serializable data class WorldsResponse(val worlds: List<WorldInfo>)
@ -505,3 +563,8 @@ data class BannedPlayer(
) )
@Serializable data class BanlistResponse(val banList: List<BannedPlayer>) @Serializable data class BanlistResponse(val banList: List<BannedPlayer>)
@Serializable data class WhitelistPlayer(val uuid: String, val name: String)
@Serializable
data class WhitelistResponse(val enabled: Boolean, val players: List<WhitelistPlayer>)