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",
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())
}
staticFiles("/assets", File(Configuration.CurrentConfiguration.assetDir), index = null) {
enableAutoHeadResponse()
+ modify { file, _ ->
+ redirectStaticFileOnApril1st(file)
+ }
}
get("/map") {
--- /dev/null
+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) }
+}