diff --git a/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/FoundationCorePlugin.kt b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/FoundationCorePlugin.kt index 51e2301..c914eec 100644 --- a/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/FoundationCorePlugin.kt +++ b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/FoundationCorePlugin.kt @@ -5,6 +5,7 @@ import cloud.kubelet.foundation.core.devupdate.DevUpdateServer import cloud.kubelet.foundation.core.persist.PersistentStore import cloud.kubelet.foundation.core.persist.setAllProperties import io.papermc.paper.event.player.AsyncChatEvent +import kotlinx.serialization.ExperimentalSerializationApi import net.kyori.adventure.text.Component import net.kyori.adventure.text.TextComponent import org.bukkit.GameMode @@ -17,6 +18,7 @@ import java.nio.file.Path import java.time.Instant import java.util.concurrent.ConcurrentHashMap +@ExperimentalSerializationApi class FoundationCorePlugin : JavaPlugin(), Listener { internal val persistentStores = ConcurrentHashMap() private lateinit var _pluginDataPath: Path diff --git a/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdatePayload.kt b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdatePayload.kt new file mode 100644 index 0000000..a23a8c8 --- /dev/null +++ b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdatePayload.kt @@ -0,0 +1,13 @@ +package cloud.kubelet.foundation.core.devupdate + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.JsonElement + +@Serializable +class DevUpdatePayload( + @SerialName("object_kind") + val objectKind: String, + @SerialName("object_attributes") + val objectAttributes: Map +) diff --git a/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdateServer.kt b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdateServer.kt index 42327e4..77226f7 100644 --- a/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdateServer.kt +++ b/foundation-core/src/main/kotlin/cloud/kubelet/foundation/core/devupdate/DevUpdateServer.kt @@ -5,13 +5,24 @@ import cloud.kubelet.foundation.core.Util import com.charleskorn.kaml.Yaml import com.sun.net.httpserver.HttpExchange import com.sun.net.httpserver.HttpServer +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import kotlinx.serialization.json.jsonPrimitive import java.net.InetSocketAddress import kotlin.io.path.inputStream +@ExperimentalSerializationApi class DevUpdateServer(val plugin: FoundationCorePlugin) { private lateinit var config: DevUpdateConfig private var server: HttpServer? = null + private val json = Json { + prettyPrint = true + prettyPrintIndent = " " + ignoreUnknownKeys = true + } + fun enable() { val configPath = Util.copyDefaultConfig( plugin.slF4JLogger, @@ -58,6 +69,23 @@ class DevUpdateServer(val plugin: FoundationCorePlugin) { return@setHandler } + val payload: DevUpdatePayload + try { + payload = json.decodeFromStream(exchange.requestBody) + } catch (e: Exception) { + plugin.slF4JLogger.error("Failed to decode request body.", e) + exchange.respond(400, "Bad Request") + return@setHandler + } + + if (payload.objectKind != "pipeline" || + payload.objectAttributes["ref"]?.jsonPrimitive?.content != "main" || + payload.objectAttributes["status"]?.jsonPrimitive?.content != "success" + ) { + exchange.respond(200, "Event was not relevant for update.") + return@setHandler + } + exchange.respond(200, "Success.") plugin.server.scheduler.runTask(plugin) { -> plugin.slF4JLogger.info("DevUpdate Server Restart")