Replace get times ajax page with Kotlin version
[Sone.git] / src / main / kotlin / net / pterodactylus / sone / web / ajax / GetTimesAjaxPage.kt
1 package net.pterodactylus.sone.web.ajax
2
3 import net.pterodactylus.sone.freenet.L10nFilter
4 import net.pterodactylus.sone.text.TimeTextConverter
5 import net.pterodactylus.sone.utils.jsonObject
6 import net.pterodactylus.sone.utils.let
7 import net.pterodactylus.sone.utils.parameters
8 import net.pterodactylus.sone.web.WebInterface
9 import net.pterodactylus.sone.web.page.FreenetRequest
10 import java.text.SimpleDateFormat
11
12 /**
13  * Ajax page that returns a formatted, relative timestamp for replies or posts.
14  */
15 class GetTimesAjaxPage(webInterface: WebInterface,
16                 private val timeTextConverter: TimeTextConverter,
17                 private val l10nFilter: L10nFilter) : JsonPage("getTimes.ajax", webInterface) {
18
19         private val dateTimeFormatter = SimpleDateFormat("MMM d, yyyy, HH:mm:ss")
20
21         override fun needsFormPassword() = false
22         override fun requiresLogin() = false
23
24         override fun createJsonObject(request: FreenetRequest) =
25                         createSuccessJsonObject().apply {
26                                 put("postTimes", request.parameters["posts"]!!.idsToJson { webInterface.core.getPost(it)?.let { it.id to it.time } })
27                                 put("replyTimes", request.parameters["replies"]!!.idsToJson { webInterface.core.getPostReply(it)?.let { it.id to it.time } })
28                         }
29
30         private fun String.idsToJson(transform: (String) -> Pair<String, Long>?) =
31                         split(",").mapNotNull(transform).toJson()
32
33         private fun List<Pair<String, Long>>.toJson() = jsonObject {
34                 this@toJson.map { (id, time) ->
35                         val timeText = timeTextConverter.getTimeText(time)
36                         id to jsonObject(
37                                         "timeText" to l10nFilter.format(null, timeText.l10nText, emptyMap()),
38                                         "refreshTime" to timeText.refreshTime / 1000,
39                                         "tooltip" to dateTimeFormatter.format(time))
40                 }.forEach { this@jsonObject.put(it.first, it.second) }
41         }
42
43 }