Do a little trolling
authorLanius Trolling <lanius@laniustrolling.dev>
Fri, 22 Mar 2024 22:47:37 +0000 (18:47 -0400)
committerLanius Trolling <lanius@laniustrolling.dev>
Fri, 22 Mar 2024 22:47:37 +0000 (18:47 -0400)
src/jvmMain/kotlin/info/mechyrdia/Configuration.kt
src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt
src/jvmMain/kotlin/info/mechyrdia/lore/april_1st.kt [new file with mode: 0644]

index 1de12cdbc4d726874c01877111e32531cd979207..2cfe26a8fabde7dfa76964d72a5862acd8d569a5 100644 (file)
@@ -18,6 +18,7 @@ data class Configuration(
        val templateDir: String = "$rootDir/tpl",
        val jsonDocDir: String = "$rootDir/data",
        val scriptDir: String = "$rootDir/funcs",
+       val april1Dir: String = "$rootDir/funny",
        
        val dbName: String = "nslore",
        val dbConn: String = "mongodb://localhost:27017",
index 12738f51b3833c90db17b936db71b393e168a6aa..1a2ec5e74e6baa7a278d397c9ddc5e4c4fa9699a 100644 (file)
@@ -108,6 +108,9 @@ fun Application.factbooks() {
                exception<HttpRedirectException> { call, (url, permanent) ->
                        call.respondRedirect(url, permanent)
                }
+               exception<AprilFoolsStaticFileRedirectException> { call, (replacement) ->
+                       call.respondFile(replacement)
+               }
                exception<MissingRequestParameterException> { call, _ ->
                        call.respondHtml(HttpStatusCode.BadRequest, call.error400())
                }
@@ -154,6 +157,9 @@ fun Application.factbooks() {
                
                staticFiles("/assets", File(Configuration.CurrentConfiguration.assetDir), index = null) {
                        enableAutoHeadResponse()
+                       modify { file, _ ->
+                               redirectStaticFileOnApril1st(file)
+                       }
                }
                
                get("/map") {
diff --git a/src/jvmMain/kotlin/info/mechyrdia/lore/april_1st.kt b/src/jvmMain/kotlin/info/mechyrdia/lore/april_1st.kt
new file mode 100644 (file)
index 0000000..b075d0d
--- /dev/null
@@ -0,0 +1,30 @@
+package info.mechyrdia.lore
+
+import info.mechyrdia.Configuration
+import io.ktor.util.*
+import java.io.File
+import java.time.Instant
+import java.time.Month
+import java.time.ZoneId
+
+private val myTimeZone: ZoneId = ZoneId.of("America/New_York")
+
+fun isApril1st(time: Instant = Instant.now()): Boolean {
+       val zonedDateTime = time.atZone(myTimeZone)
+       return zonedDateTime.month == Month.APRIL && zonedDateTime.dayOfMonth == 1
+}
+
+data class AprilFoolsStaticFileRedirectException(val replacement: File) : RuntimeException()
+
+fun redirectFileOnApril1st(requestedFile: File): File? {
+       if (!isApril1st()) return null
+       
+       val rootDir = File(Configuration.CurrentConfiguration.rootDir)
+       val requestedPath = requestedFile.absoluteFile.toRelativeString(rootDir.absoluteFile)
+       val funnyFile = File(Configuration.CurrentConfiguration.april1Dir).combineSafe(requestedPath)
+       return funnyFile.takeIf { it.exists() }
+}
+
+fun redirectStaticFileOnApril1st(requestedFile: File) {
+       redirectFileOnApril1st(requestedFile)?.let { throw AprilFoolsStaticFileRedirectException(it) }
+}