diff --git a/WebsiteBackend/build.gradle.kts b/WebsiteBackend/build.gradle.kts index 2cf527a7..f93dacde 100644 --- a/WebsiteBackend/build.gradle.kts +++ b/WebsiteBackend/build.gradle.kts @@ -53,4 +53,5 @@ dependencies { implementation(libs.yamlconfig) implementation(libs.kotlinxSerializationCbor) implementation(libs.ktorRateLimit) + implementation(libs.knbt) } \ No newline at end of file diff --git a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt index 006b914e..0dea01f7 100644 --- a/WebsiteBackend/src/de/steamwar/routes/Schematic.kt +++ b/WebsiteBackend/src/de/steamwar/routes/Schematic.kt @@ -22,6 +22,7 @@ package de.steamwar.routes import de.steamwar.plugins.SWAuthPrincipal import de.steamwar.plugins.SWPermissionCheck import de.steamwar.sql.NodeData +import de.steamwar.sql.NodeData.SchematicFormat import de.steamwar.sql.NodeDownload import de.steamwar.sql.NodeMember import de.steamwar.sql.SWException @@ -32,7 +33,10 @@ import io.ktor.server.auth.* import io.ktor.server.request.* import io.ktor.server.response.* import io.ktor.server.routing.* +import kotlinx.coroutines.launch import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromByteArray +import net.benwoodworth.knbt.* import java.security.MessageDigest import java.time.Duration import java.time.Instant @@ -71,6 +75,11 @@ data class SchematicCode(val id: Int, val code: String, val expires: Long) @Serializable data class UploadSchematic(val name: String, val content: String) +val nbt = Nbt { + variant = NbtVariant.Java + compression = NbtCompression.Gzip +} + fun Route.configureSchematic() { route("/download/{code}") { get { @@ -112,14 +121,28 @@ fun Route.configureSchematic() { val user = call.principal()!!.user - val content = Base64.getDecoder().decode(file.content) var node = SchematicNode.getSchematicNode(user.id, schemName, 0) if (node == null) { node = SchematicNode.createSchematic(user.id, schemName, 0) } - val data = NodeData(node.id, NodeData.SchematicFormat.V2) - data.saveFromStream(content.inputStream(), NodeData.SchematicFormat.V2) + val content = Base64.getDecoder().decode(file.content) + + var schem = nbt.decodeFromByteArray(content) + + if (schem.size == 1) schem = schem[schem.keys.first()] as NbtCompound + + val version = schem.let { + if (it.containsKey("Materials")) + return@let SchematicFormat.MCEDIT + else if (it.containsKey("Blocks")) + return@let SchematicFormat.SPONGE_V3 + else + return@let SchematicFormat.SPONGE_V2 + } + + val data = NodeData(node.id, version) + data.saveFromStream(content.inputStream(), version) call.respond(ResponseSchematic(node)) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 69d5c67b..07242d37 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -165,6 +165,7 @@ dependencyResolutionManagement { library("yamlconfig", "org.bspfsystems:yamlconfiguration:1.3.0") library("kotlinxSerializationCbor", "org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.4.1") library("ktorRateLimit", "io.ktor:ktor-server-rate-limit:$ktorVersion") + library("knbt", "net.benwoodworth.knbt:knbt:0.11.7") } } }