From: David ‘Bombe’ Roden Date: Thu, 11 Apr 2024 09:46:27 +0000 (+0200) Subject: 🔀 Merge branch 'website/epic-games' into next X-Git-Tag: v2^0 X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=593dff9452ddfd852786c98e86cec0c4b76fe160;hp=f0824d2a3ad6713fed7a11d65535e9ec7a81a904;p=rhynodge.git 🔀 Merge branch 'website/epic-games' into next --- diff --git a/build.gradle b/build.gradle index 85cf007..9e286ff 100644 --- a/build.gradle +++ b/build.gradle @@ -55,7 +55,7 @@ dependencies { implementation group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.2' testImplementation group: "junit", name: "junit", version: "4.13.2" - testImplementation group: "org.hamcrest", name: "hamcrest-library", version: "1.3" + testImplementation group: "org.hamcrest", name: "hamcrest", version: "2.2" testImplementation group: "org.mockito", name: "mockito-core", version: "5.11.0" testImplementation group: "com.spotify", name: "hamcrest-jackson", version: "1.3.2" } diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesFilter.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesFilter.kt index 31bb11f..e159dff 100644 --- a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesFilter.kt +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesFilter.kt @@ -3,7 +3,6 @@ package net.pterodactylus.rhynodge.filters.webpages.epicgames import com.fasterxml.jackson.databind.JsonNode import net.pterodactylus.rhynodge.Filter import net.pterodactylus.rhynodge.State -import net.pterodactylus.rhynodge.states.AbstractState import net.pterodactylus.rhynodge.states.JsonState import java.time.Instant @@ -25,25 +24,10 @@ class EpicGamesFilter : Filter { private fun getPromotionalOfferDate(gameJson: JsonNode, date: String) = listOf("promotionalOffers", "upcomingPromotionalOffers") .map { "/promotions/$it/0/promotionalOffers/0/$date" } - .map { gameJson.at(it) } - .filter { !it.isMissingNode } - .map { it.asText() } + .map(gameJson::at) + .filterNot(JsonNode::isMissingNode) + .map(JsonNode::asText) .map(Instant::parse) .first() } - -data class FreeGame( - val title: String, - val imageUrl: String, - val startDate: Instant, - val endDate: Instant -) - -class FreeGamesState(val games: Set) : AbstractState(true) { - - override fun plainText(): String { - TODO("Not yet implemented") - } - -} diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesMerger.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesMerger.kt new file mode 100644 index 0000000..80ab923 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesMerger.kt @@ -0,0 +1,18 @@ +package net.pterodactylus.rhynodge.filters.webpages.epicgames + +import net.pterodactylus.rhynodge.Merger +import net.pterodactylus.rhynodge.State + +class EpicGamesMerger : Merger { + + override fun mergeStates(previousState: State, currentState: State): State { + previousState as? FreeGamesState ?: throw IllegalArgumentException("previousState is not a FreeGamesState") + currentState as? FreeGamesState ?: throw IllegalArgumentException("currentState is not a FreeGamesState") + + val oldGames = previousState.games + val newGames = currentState.games + + return FreeGamesState(newGames, (newGames - oldGames).isNotEmpty()) + } + +} diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGame.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGame.kt new file mode 100644 index 0000000..e5d4abf --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGame.kt @@ -0,0 +1,10 @@ +package net.pterodactylus.rhynodge.filters.webpages.epicgames + +import java.time.Instant + +data class FreeGame( + val title: String, + val imageUrl: String, + val startDate: Instant, + val endDate: Instant +) diff --git a/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGamesState.kt b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGamesState.kt new file mode 100644 index 0000000..47a78fd --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/FreeGamesState.kt @@ -0,0 +1,67 @@ +package net.pterodactylus.rhynodge.filters.webpages.epicgames + +import kotlinx.html.body +import kotlinx.html.div +import kotlinx.html.dom.createHTMLDocument +import kotlinx.html.dom.serialize +import kotlinx.html.head +import kotlinx.html.html +import kotlinx.html.img +import kotlinx.html.style +import kotlinx.html.unsafe +import net.pterodactylus.rhynodge.states.AbstractState +import java.time.ZoneId +import java.util.Comparator.comparing + +class FreeGamesState(val games: Set, private val triggered: Boolean = false, private val timezone: ZoneId = ZoneId.systemDefault()) : AbstractState(true) { + + override fun plainText() = games + .sortedWith(comparing(FreeGame::startDate).thenBy(FreeGame::title)) + .joinToString("\n") { game -> + "${game.title}: ${"%tF % + div("game") { + div("game-image") { + img(src = game.imageUrl) + } + div("game-title") { + +game.title + } + div("game-start") { + +"%tF %