X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Frhynodge%2Fwebpages%2Fweather%2Fwettercom%2FWetterComFilter.kt;h=9f253343d34e8596af3f64422259d17ef51399a7;hb=e016992e3fc3123213871f772419284bea7401b1;hp=1c8d59bcc0cbc573f473e06e8b9b90d1ece508b4;hpb=2330b650352517b47d1c6aa0dc054f6d29164157;p=rhynodge.git diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/webpages/weather/wettercom/WetterComFilter.kt b/src/main/kotlin/net/pterodactylus/rhynodge/webpages/weather/wettercom/WetterComFilter.kt index 1c8d59b..9f25334 100644 --- a/src/main/kotlin/net/pterodactylus/rhynodge/webpages/weather/wettercom/WetterComFilter.kt +++ b/src/main/kotlin/net/pterodactylus/rhynodge/webpages/weather/wettercom/WetterComFilter.kt @@ -4,9 +4,15 @@ 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.HourState +import net.pterodactylus.rhynodge.webpages.weather.WeatherState +import net.pterodactylus.rhynodge.webpages.weather.WindDirection +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 +24,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) { @@ -31,55 +37,56 @@ class WetterComFilter : Filter { private fun parseWetterComState(state: HtmlState): State { val dateTime = parseDateTime(state.document()) ?: return FailedState(IllegalArgumentException("no date present")) - val wetterComState = WetterComState(dateTime) - parseHourStates(state.document()).forEach { wetterComState.addHour(it) } + val wetterComState = WeatherState("wetter.com", dateTime) + parseHourStates(state.document()).forEach { wetterComState += it } 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 { + private fun parseHourStates(document: Document): List { 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) - .temperature(parseTemperature(hourElement)) - .rainProbability(parseRainProbability(hourElement)) - .rainAmount(parseRainAmount(hourElement)) - .windFrom(parseWindDirection(hourElement)) - .at(parseWindSpeed(hourElement)) - .describedAs(parseDescription(hourElement)) - .withImage(parseImageUrl(hourElement)) - .build() + private fun parseHourState(index: Int, hourElement: Element): HourState { + return HourState( + hourIndex = index, + temperature = hourElement.temperature, + rainProbability = hourElement.rainProbability, + rainAmount = hourElement.rainAmount, + windDirection = hourElement.windDirection, + windSpeed = hourElement.windSpeed, + description = hourElement.description, + image = hourElement.imageUrl + ) } - private fun parseTemperature(hourElement: Element) = - hourElement.extractText(".weather-strip__2 .item-weathericon .palm-hide").filter { (it >= '0') and (it <= '9') }.toDouble() + private val Element.temperature: Int + get() = extractText(".weather-strip__2 .item-weathericon .palm-hide").filter { (it >= '0') and (it <= '9') }.toInt() - private fun parseRainProbability(hourElement: Element) = - hourElement.extractText(".weather-strip__3 .text--left:eq(0) .flag__body span:eq(0)").filter { (it >= '0') and (it <= '9') }.toDouble() / 100.0 + private val Element.rainProbability: Double + get() = 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() + private val Element.rainAmount: Double + get() = 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() + private val Element.windDirection: WindDirection + get() = extractText(".weather-strip__3 .text--left:eq(1) .flag__body span:eq(0)").trim().split(",")[0].toWindDirection() - private fun parseWindSpeed(hourElement: Element) = - hourElement.extractText(".weather-strip__3 .text--left:eq(1) .flag__body span:eq(0)").split(Regex("[, ]+"))[1].toDouble() + private val Element.windSpeed: Int + get() = extractText(".weather-strip__3 .text--left:eq(1) .flag__body span:eq(0)").split(Regex("[, ]+"))[1].toInt() - private fun parseDescription(hourElement: Element) = - hourElement.extractText(".weather-strip__1 .vhs-text--small") + private val Element.description: String + get() = extractText(".weather-strip__1 .vhs-text--small") - private fun parseImageUrl(hourElement: Element) = - hourElement.select(".weather-strip__2 img").firstOrNull()?.attr("src") ?: "" + private val Element.imageUrl: String + get() = select(".weather-strip__2 img").firstOrNull()?.attr("src") ?: "" private fun Element.extractText(selector: String) = select(selector).firstOrNull()?.text() ?: ""