Move WindDirection to parent package
[rhynodge.git] / src / main / kotlin / net / pterodactylus / rhynodge / webpages / weather / wettercom / WetterComFilter.kt
index 1c8d59b..dc33b65 100644 (file)
@@ -4,9 +4,12 @@ import net.pterodactylus.rhynodge.Filter
 import net.pterodactylus.rhynodge.State
 import net.pterodactylus.rhynodge.states.FailedState
 import net.pterodactylus.rhynodge.states.HtmlState
+import net.pterodactylus.rhynodge.webpages.weather.toWindDirection
 import org.jsoup.nodes.Document
 import org.jsoup.nodes.Element
 import java.time.LocalDateTime
+import java.time.ZoneId.of
+import java.time.ZonedDateTime
 import java.time.format.DateTimeFormatter
 
 /**
@@ -18,8 +21,8 @@ class WetterComFilter : Filter {
 
     private val dateTimeFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm")
 
-    override fun filter(state: State?): State {
-        if (state?.success()?.not() ?: true) {
+    override fun filter(state: State): State {
+        if (state.success().not()) {
             return FailedState.from(state)
         }
         if (state !is HtmlState) {
@@ -36,20 +39,20 @@ class WetterComFilter : Filter {
         return wetterComState
     }
 
-    private fun parseDateTime(document: Document): LocalDateTime? {
+    private fun parseDateTime(document: Document): ZonedDateTime? {
         val dateElement = document.select("#furtherDetails .portable-mb h3")
                 .single()?.text()?.split(",")?.get(1)?.trim() ?: return null
         val timeElement = document.select(".weather-strip--detail .delta.palm-hide")
                 .first()?.text()?.split(" ")?.first() ?: return null
-        return LocalDateTime.from(dateTimeFormatter.parse("%s %s".format(dateElement, timeElement)))
+        return LocalDateTime.from(dateTimeFormatter.parse("%s %s".format(dateElement, timeElement))).atZone(of("Europe/Berlin"))
     }
 
-    private fun parseHourStates(document: Document): List<WetterComState.HourState> {
+    private fun parseHourStates(document: Document): List<HourState> {
         return document.select(".weather-strip--detail").mapIndexed { index, element -> parseHourState(index, element) }
     }
 
-    private fun parseHourState(index: Int, hourElement: Element): WetterComState.HourState {
-        return WetterComState.HourState.atHour(index)
+    private fun parseHourState(index: Int, hourElement: Element): HourState {
+        return HourState.atHour(index)
                 .temperature(parseTemperature(hourElement))
                 .rainProbability(parseRainProbability(hourElement))
                 .rainAmount(parseRainAmount(hourElement))
@@ -67,7 +70,7 @@ class WetterComFilter : Filter {
             hourElement.extractText(".weather-strip__3 .text--left:eq(0) .flag__body span:eq(0)").filter { (it >= '0') and (it <= '9') }.toDouble() / 100.0
 
     private fun parseRainAmount(hourElement: Element) =
-            hourElement.extractText(".weather-strip__3 .text--left:eq(0) .flag__body span:eq(1)").trim().split(" ")[1].toDouble()
+            hourElement.extractText(".weather-strip__3 .text--left:eq(0) .flag__body span:eq(1)").trim().split(" ").getOrNull(1)?.toDouble() ?: 0.0
 
     private fun parseWindDirection(hourElement: Element) =
             hourElement.extractText(".weather-strip__3 .text--left:eq(1) .flag__body span:eq(0)").trim().split(",")[0].toWindDirection()