1 package net.pterodactylus.sone.web.ajax
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.parameters
7 import net.pterodactylus.sone.web.WebInterface
8 import net.pterodactylus.sone.web.page.FreenetRequest
9 import java.text.SimpleDateFormat
10 import java.util.TimeZone
13 * Ajax page that returns a formatted, relative timestamp for replies or posts.
15 class GetTimesAjaxPage(webInterface: WebInterface,
16 private val timeTextConverter: TimeTextConverter,
17 private val l10nFilter: L10nFilter,
18 timeZone: TimeZone) : JsonPage("getTimes.ajax", webInterface) {
20 private val dateTimeFormatter = SimpleDateFormat("MMM d, yyyy, HH:mm:ss").apply {
21 this.timeZone = timeZone
24 override val needsFormPassword = false
25 override val requiresLogin = false
27 override fun createJsonObject(request: FreenetRequest) =
28 createSuccessJsonObject().apply {
29 put("postTimes", request.parameters["posts"]!!.idsToJson { core.getPost(it)?.let { it.id to it.time } })
30 put("replyTimes", request.parameters["replies"]!!.idsToJson { core.getPostReply(it)?.let { it.id to it.time } })
33 private fun String.idsToJson(transform: (String) -> Pair<String, Long>?) =
34 split(",").mapNotNull(transform).toJson()
36 private fun List<Pair<String, Long>>.toJson() = jsonObject {
37 this@toJson.map { (id, time) ->
38 val timeText = timeTextConverter.getTimeText(time)
40 "timeText" to l10nFilter.format(null, timeText.l10nText, emptyMap()),
41 "refreshTime" to timeText.refreshTime / 1000,
42 "tooltip" to synchronized(dateTimeFormatter) {
43 dateTimeFormatter.format(time)
45 }.forEach { this@jsonObject.set(it.first, it.second) }