1 package net.pterodactylus.rhynodge.webpages.weather.wetterde
3 import kotlinx.html.body
4 import kotlinx.html.div
6 import kotlinx.html.head
7 import kotlinx.html.html
8 import kotlinx.html.img
9 import kotlinx.html.stream.createHTML
10 import kotlinx.html.style
11 import kotlinx.html.unsafe
12 import net.pterodactylus.rhynodge.Reaction
13 import net.pterodactylus.rhynodge.State
14 import net.pterodactylus.rhynodge.Trigger
15 import net.pterodactylus.rhynodge.output.DefaultOutput
16 import net.pterodactylus.rhynodge.output.Output
17 import java.text.DateFormat
18 import java.time.temporal.ChronoUnit
19 import java.util.Locale
24 * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
26 class WetterDeTrigger : Trigger {
28 private val dateFormatter = DateFormat.getDateInstance(DateFormat.LONG, Locale.ENGLISH)
29 private lateinit var state: WetterDeState
30 private var changed = false
32 override fun mergeStates(previousState: State, currentState: State): State {
33 changed = previousState != currentState
34 state = currentState as WetterDeState
38 override fun triggers(): Boolean {
42 override fun output(reaction: Reaction): Output {
43 val output = DefaultOutput("The Weather (according to wetter.de) on %s".format(dateFormatter.format(state.dateTime.toInstant().toEpochMilli())))
44 output.addText("text/html", generateHtmlOutput())
48 private fun generateHtmlOutput(): String {
49 return createHTML().html {
53 +".hour-state { display: table-row; } "
54 +".hour-state > div { display: table-cell; padding-right: 1em; } "
59 val startTime = state.dateTime.toInstant()
60 h1 { +"The Weather (according to wetter.de) on %s".format(dateFormatter.format(startTime.toEpochMilli())) }
63 div("time") { +"%tH:%<tM".format(startTime.plus(it.hourIndex.toLong(), ChronoUnit.HOURS).toEpochMilli()) }
64 div("temperature") { +"%d °C".format(it.temperature) }
65 div("felt-temperature") { +"(%d °C)".format(it.feltTemperature) }
66 div("rain-probability") { +"%d%%".format((it.rainProbability * 100).toInt()) }
67 div("rain-amount") { +"%s l/m²".format(it.rainAmount.minDigits()) }
68 div("wind-direction") { +it.windDirection.arrow }
69 div("wind-speed") { +"%d km/h".format(it.windSpeed) }
70 div("gust-speed") { +"(up to %d km/h)".format(it.gustSpeed) }
71 div("humidity") { +"%d%%".format((it.humidity * 100).toInt()) }
72 div("description") { +it.description }
73 div("image") { img(src = it.image) }
80 private fun Double.minDigits(): String {
81 return this.toString().replace(Regex("\\.0*$"), "")