Fix Schem Upload

This commit is contained in:
2024-12-21 12:03:43 +01:00
parent 06eec10660
commit 336915dd96
3 changed files with 28 additions and 3 deletions
+1
View File
@@ -53,4 +53,5 @@ dependencies {
implementation(libs.yamlconfig) implementation(libs.yamlconfig)
implementation(libs.kotlinxSerializationCbor) implementation(libs.kotlinxSerializationCbor)
implementation(libs.ktorRateLimit) implementation(libs.ktorRateLimit)
implementation(libs.knbt)
} }
@@ -22,6 +22,7 @@ package de.steamwar.routes
import de.steamwar.plugins.SWAuthPrincipal import de.steamwar.plugins.SWAuthPrincipal
import de.steamwar.plugins.SWPermissionCheck import de.steamwar.plugins.SWPermissionCheck
import de.steamwar.sql.NodeData import de.steamwar.sql.NodeData
import de.steamwar.sql.NodeData.SchematicFormat
import de.steamwar.sql.NodeDownload import de.steamwar.sql.NodeDownload
import de.steamwar.sql.NodeMember import de.steamwar.sql.NodeMember
import de.steamwar.sql.SWException import de.steamwar.sql.SWException
@@ -32,7 +33,10 @@ import io.ktor.server.auth.*
import io.ktor.server.request.* import io.ktor.server.request.*
import io.ktor.server.response.* import io.ktor.server.response.*
import io.ktor.server.routing.* import io.ktor.server.routing.*
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromByteArray
import net.benwoodworth.knbt.*
import java.security.MessageDigest import java.security.MessageDigest
import java.time.Duration import java.time.Duration
import java.time.Instant import java.time.Instant
@@ -71,6 +75,11 @@ data class SchematicCode(val id: Int, val code: String, val expires: Long)
@Serializable @Serializable
data class UploadSchematic(val name: String, val content: String) data class UploadSchematic(val name: String, val content: String)
val nbt = Nbt {
variant = NbtVariant.Java
compression = NbtCompression.Gzip
}
fun Route.configureSchematic() { fun Route.configureSchematic() {
route("/download/{code}") { route("/download/{code}") {
get { get {
@@ -112,14 +121,28 @@ fun Route.configureSchematic() {
val user = call.principal<SWAuthPrincipal>()!!.user val user = call.principal<SWAuthPrincipal>()!!.user
val content = Base64.getDecoder().decode(file.content)
var node = SchematicNode.getSchematicNode(user.id, schemName, 0) var node = SchematicNode.getSchematicNode(user.id, schemName, 0)
if (node == null) { if (node == null) {
node = SchematicNode.createSchematic(user.id, schemName, 0) node = SchematicNode.createSchematic(user.id, schemName, 0)
} }
val data = NodeData(node.id, NodeData.SchematicFormat.V2) val content = Base64.getDecoder().decode(file.content)
data.saveFromStream(content.inputStream(), NodeData.SchematicFormat.V2)
var schem = nbt.decodeFromByteArray<NbtCompound>(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)) call.respond(ResponseSchematic(node))
} }
+1
View File
@@ -165,6 +165,7 @@ dependencyResolutionManagement {
library("yamlconfig", "org.bspfsystems:yamlconfiguration:1.3.0") library("yamlconfig", "org.bspfsystems:yamlconfiguration:1.3.0")
library("kotlinxSerializationCbor", "org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.4.1") library("kotlinxSerializationCbor", "org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.4.1")
library("ktorRateLimit", "io.ktor:ktor-server-rate-limit:$ktorVersion") library("ktorRateLimit", "io.ktor:ktor-server-rate-limit:$ktorVersion")
library("knbt", "net.benwoodworth.knbt:knbt:0.11.7")
} }
} }
} }