plugins {
java
- kotlin("multiplatform") version "1.9.21"
- kotlin("plugin.serialization") version "1.9.21"
+ kotlin("multiplatform") version "1.9.22"
+ kotlin("plugin.serialization") version "1.9.22"
id("com.github.johnrengelman.shadow") version "7.1.2"
application
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")
- implementation("org.jetbrains.kotlinx:kotlinx-html-js:0.10.1")
+ implementation("org.jetbrains.kotlinx:kotlinx-html-js:0.11.0")
implementation(project(":externals"))
}
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.6.2")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.6.2")
- implementation("io.ktor:ktor-server-core-jvm:2.3.7")
- implementation("io.ktor:ktor-server-cio-jvm:2.3.7")
+ implementation("io.ktor:ktor-server-core-jvm:2.3.8")
+ implementation("io.ktor:ktor-server-cio-jvm:2.3.8")
- implementation("io.ktor:ktor-server-caching-headers:2.3.7")
- implementation("io.ktor:ktor-server-call-id:2.3.7")
- implementation("io.ktor:ktor-server-call-logging:2.3.7")
- implementation("io.ktor:ktor-server-conditional-headers:2.3.7")
- implementation("io.ktor:ktor-server-forwarded-header:2.3.7")
- implementation("io.ktor:ktor-server-html-builder:2.3.7")
- implementation("io.ktor:ktor-server-sessions-jvm:2.3.7")
- implementation("io.ktor:ktor-server-status-pages:2.3.7")
+ implementation("io.ktor:ktor-server-caching-headers:2.3.8")
+ implementation("io.ktor:ktor-server-call-id:2.3.8")
+ implementation("io.ktor:ktor-server-call-logging:2.3.8")
+ implementation("io.ktor:ktor-server-conditional-headers:2.3.8")
+ implementation("io.ktor:ktor-server-forwarded-header:2.3.8")
+ implementation("io.ktor:ktor-server-html-builder:2.3.8")
+ implementation("io.ktor:ktor-server-sessions-jvm:2.3.8")
+ implementation("io.ktor:ktor-server-status-pages:2.3.8")
- implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.10.1")
+ implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.11.0")
implementation("io.pebbletemplates:pebble:3.2.2")
implementation("org.apache.groovy:groovy-jsr223:4.0.10")
package externals.threejs
-import org.w3c.dom.HTMLImageElement
import org.w3c.xhr.ProgressEvent
import kotlin.js.Promise
object DOLLY_ROTATE : TOUCH
}
-sealed external class CullFace {
-
-}
+sealed external class CullFace
external var CullFaceNone: CullFace
external var CullFaceFrontBack: CullFace
-sealed external class ShadowMapType {
-
-}
+sealed external class ShadowMapType
external var BasicShadowMap: ShadowMapType
external var VSMShadowMap: ShadowMapType
-sealed external class Side {
-
-}
+sealed external class Side
external var FrontSide: Side
external var DoubleSide: Side
-sealed external class Shading {
-
-}
+sealed external class Shading
external var FlatShading: Shading
external var SmoothShading: Shading
-sealed external class Blending {
-
-}
+sealed external class Blending
external var NoBlending: Blending
external var CustomBlending: Blending
-sealed external class BlendingEquation {
-
-}
+sealed external class BlendingEquation
external var AddEquation: BlendingEquation
external var MaxEquation: BlendingEquation
-sealed external class BlendingDstFactor {
-
-}
+sealed external class BlendingDstFactor
external var ZeroFactor: BlendingDstFactor
external var OneMinusDstColorFactor: BlendingDstFactor
-sealed external class BlendingSrcFactor {
-
-}
+sealed external class BlendingSrcFactor
external var SrcAlphaSaturateFactor: BlendingSrcFactor
-sealed external class DepthModes {
-
-}
+sealed external class DepthModes
external var NeverDepth: DepthModes
external var NotEqualDepth: DepthModes
-sealed external class Combine {
-
-}
+sealed external class Combine
external var MultiplyOperation: Combine
external var AddOperation: Combine
-sealed external class ToneMapping {
-
-}
+sealed external class ToneMapping
external var NoToneMapping: ToneMapping
external var ACESFilmicToneMapping: ToneMapping
-sealed external class Mapping {
-
-}
+sealed external class Mapping
external var UVMapping: Mapping
external var CubeUVRefractionMapping: Mapping
-sealed external class Wrapping {
-
-}
+sealed external class Wrapping
external var RepeatWrapping: Wrapping
external var MirroredRepeatWrapping: Wrapping
-sealed external class TextureFilter {
-
-}
+sealed external class TextureFilter
external var NearestFilter: TextureFilter
external var LinearMipMapLinearFilter: TextureFilter
-sealed external class TextureDataType {
-
-}
+sealed external class TextureDataType
external var UnsignedByteType: TextureDataType
external var UnsignedInt248Type: TextureDataType
-sealed external class PixelFormat {
-
-}
+sealed external class PixelFormat
external var AlphaFormat: PixelFormat
external var RGBAIntegerFormat: PixelFormat
-sealed external class CompressedPixelFormat {
-
-}
+sealed external class CompressedPixelFormat
external var RGB_S3TC_DXT1_Format: CompressedPixelFormat
external var RGBA_BPTC_Format: CompressedPixelFormat
-sealed external class AnimationActionLoopStyles {
-
-}
+sealed external class AnimationActionLoopStyles
external var LoopOnce: AnimationActionLoopStyles
external var LoopPingPong: AnimationActionLoopStyles
-sealed external class InterpolationModes {
-
-}
+sealed external class InterpolationModes
external var InterpolateDiscrete: InterpolationModes
external var InterpolateSmooth: InterpolationModes
-sealed external class InterpolationEndingModes {
-
-}
+sealed external class InterpolationEndingModes
external var ZeroCurvatureEnding: InterpolationEndingModes
external var WrapAroundEnding: InterpolationEndingModes
-sealed external class AnimationBlendMode {
-
-}
+sealed external class AnimationBlendMode
external var NormalAnimationBlendMode: AnimationBlendMode
external var AdditiveAnimationBlendMode: AnimationBlendMode
-sealed external class TrianglesDrawModes {
-
-}
+sealed external class TrianglesDrawModes
external var TrianglesDrawMode: TrianglesDrawModes
external var TriangleFanDrawMode: TrianglesDrawModes
-sealed external class TextureEncoding {
-
-}
+sealed external class TextureEncoding
external var LinearEncoding: TextureEncoding
external var RGBDEncoding: TextureEncoding
-sealed external class DepthPackingStrategies {
-
-}
+sealed external class DepthPackingStrategies
external var BasicDepthPacking: DepthPackingStrategies
external var RGBADepthPacking: DepthPackingStrategies
-sealed external class NormalMapTypes {
-
-}
+sealed external class NormalMapTypes
external var TangentSpaceNormalMap: NormalMapTypes
external var ObjectSpaceNormalMap: NormalMapTypes
-sealed external class StencilOp {
-
-}
+sealed external class StencilOp
external var ZeroStencilOp: StencilOp
external var InvertStencilOp: StencilOp
-sealed external class StencilFunc {
-
-}
+sealed external class StencilFunc
external var NeverStencilFunc: StencilFunc
external var AlwaysStencilFunc: StencilFunc
-sealed external class Usage {
-
-}
+sealed external class Usage
external var StaticDrawUsage: Usage
external var StreamCopyUsage: Usage
-sealed external class GLSLVersion {
-
-}
+sealed external class GLSLVersion
external var GLSL1: GLSLVersion
import io.ktor.util.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runInterruptible
-import kotlinx.coroutines.withContext
import org.slf4j.event.Level
import java.io.File
import java.io.IOException
redirect("/comment/view/$commentId")
}
-suspend fun ApplicationCall.deleteCommentPage(): HTML.() -> Unit {
+private suspend fun ApplicationCall.getCommentForDeletion(): Pair<NationData, Comment> {
val currNation = currentNation() ?: redirectWithError("/auth/login", "You must be logged in to delete comments")
val commentId = Id<Comment>(parameters["id"]!!)
if (currNation.id != comment.submittedBy && currNation.id != OwnerNationId)
throw ForbiddenException("Illegal attempt by ${currNation.id} to delete comment by ${comment.submittedBy}")
+ return currNation to comment
+}
+
+suspend fun ApplicationCall.deleteCommentPage(): HTML.() -> Unit {
+ val (currNation, comment) = getCommentForDeletion()
+
val commentDisplay = CommentRenderData(listOf(comment), nationCache).single()
return page("Confirm Deletion of Commment", standardNavBar()) {
commentBox(commentDisplay, currNation.id)
- form(method = FormMethod.get, action = "/comment/view/$commentId") {
+ form(method = FormMethod.get, action = "/comment/view/${comment.id}") {
submitInput { value = "No, take me back" }
}
- form(method = FormMethod.post, action = "/comment/delete/$commentId") {
+ form(method = FormMethod.post, action = "/comment/delete/$comment.id") {
installCsrfToken(createCsrfToken())
submitInput(classes = "evil") { value = "Yes, delete it" }
}
}
suspend fun ApplicationCall.deleteCommentRoute(): Nothing {
- val currNation = currentNation() ?: redirectWithError("/auth/login", "You must be logged in to delete comments")
-
- val commentId = Id<Comment>(parameters["id"]!!)
- val comment = Comment.Table.get(commentId)!!
-
- if (currNation.id != comment.submittedBy && currNation.id != OwnerNationId)
- throw ForbiddenException("Illegal attempt by ${currNation.id} to delete comment by ${comment.submittedBy}")
+ val (_, comment) = getCommentForDeletion()
- Comment.Table.del(commentId)
- CommentReplyLink.deleteComment(commentId)
+ Comment.Table.del(comment.id)
+ CommentReplyLink.deleteComment(comment.id)
redirect("/lore/${comment.submittedIn}#comments")
}
resolveImports(JsonFileCodec.parseToJsonElement(text), file)
}
- fun loadJsonContext(name: String): Map<String, Any?> = loadJson(name).let { json ->
+ private fun loadJsonContext(name: String): Map<String, Any?> = loadJson(name).let { json ->
val data = convertJson(json)
if (data !is Map<*, *>)
throw IOException("JSON Object expected in file $name, got $json")
return mutableListOf()
}
- override fun apply(input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate?, context: EvaluationContext?, lineNumber: Int): Any? {
+ override fun apply(input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate?, context: EvaluationContext?, lineNumber: Int): Any {
return PebbleJsonLoader.deconvertJson(input).toString()
}
}
return compiledScript
}
- fun runScript(scriptName: String, script: CompiledScript, input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate, context: EvaluationContext, lineNumber: Int): Any? {
+ private fun runScript(scriptName: String, script: CompiledScript, input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate, context: EvaluationContext, lineNumber: Int): Any? {
val bindings = SimpleBindings()
bindings["text"] = input
bindings["stdlib"] = PebbleScriptStdlib(bindings, self, lineNumber)
}
}
- fun runScript(scriptName: String, input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate, context: EvaluationContext, lineNumber: Int): Any? {
+ private fun runScript(scriptName: String, input: Any?, args: MutableMap<String, Any?>, self: PebbleTemplate, context: EvaluationContext, lineNumber: Int): Any? {
val script = loadFunction(scriptName)
?: throw PebbleException(null, "Script $scriptName could not be found", lineNumber, self.name)
import kotlinx.browser.document
import kotlinx.coroutines.*
import kotlinx.dom.clear
-import kotlinx.html.*
+import kotlinx.html.TagConsumer
import kotlinx.html.dom.append
-import kotlinx.html.js.onClickFunction
+import kotlinx.html.p
+import kotlinx.html.style
import kotlin.coroutines.resume
private suspend fun <T> showModalBox(boxBuilder: TagConsumer<*>.((T) -> Unit) -> Unit): T {