From 4d7375e5f7800732abefbf71090f2677a1b9d8e9 Mon Sep 17 00:00:00 2001 From: Lanius Trolling Date: Fri, 22 Mar 2024 18:47:37 -0400 Subject: [PATCH] Do a little trolling --- .../kotlin/info/mechyrdia/Configuration.kt | 1 + .../kotlin/info/mechyrdia/Factbooks.kt | 6 ++++ .../kotlin/info/mechyrdia/lore/april_1st.kt | 30 +++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 src/jvmMain/kotlin/info/mechyrdia/lore/april_1st.kt diff --git a/src/jvmMain/kotlin/info/mechyrdia/Configuration.kt b/src/jvmMain/kotlin/info/mechyrdia/Configuration.kt index 1de12cd..2cfe26a 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/Configuration.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/Configuration.kt @@ -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", diff --git a/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt b/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt index 12738f5..1a2ec5e 100644 --- a/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt +++ b/src/jvmMain/kotlin/info/mechyrdia/Factbooks.kt @@ -108,6 +108,9 @@ fun Application.factbooks() { exception { call, (url, permanent) -> call.respondRedirect(url, permanent) } + exception { call, (replacement) -> + call.respondFile(replacement) + } exception { 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 index 0000000..b075d0d --- /dev/null +++ b/src/jvmMain/kotlin/info/mechyrdia/lore/april_1st.kt @@ -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) } +} -- 2.25.1