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
/**
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) {
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))
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()