X-Git-Url: https://git.pterodactylus.net/?p=rhynodge.git;a=blobdiff_plain;f=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Frhynodge%2Ffilters%2Fwebpages%2Fepicgames%2FEpicGamesFilter.kt;fp=src%2Fmain%2Fkotlin%2Fnet%2Fpterodactylus%2Frhynodge%2Ffilters%2Fwebpages%2Fepicgames%2FEpicGamesFilter.kt;h=31bb11fca2f9fc5a22dc70e029fbb7031d3c78a0;hp=0000000000000000000000000000000000000000;hb=3fa39437688d88f56f9bdeea01f29fc8b9c3cb6c;hpb=3dc17a61f9a05eff6ed71a67a4e2e898435a3c57 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 new file mode 100644 index 0000000..31bb11f --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/rhynodge/filters/webpages/epicgames/EpicGamesFilter.kt @@ -0,0 +1,49 @@ +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 + +class EpicGamesFilter : Filter { + + override fun filter(state: State): State { + state as? JsonState ?: throw IllegalArgumentException("state must be a JSON state") + return state.jsonNode.at("/data/Catalog/searchStore/elements").map { gameJson: JsonNode -> + val title = gameJson.get("title").asText() + val imageUrl = gameJson.at("/keyImages/1/url").asText() + val startDate = getPromotionalOfferStartDate(gameJson) + val endDate = getPromotionalOfferEndDate(gameJson) + FreeGame(title, imageUrl, startDate, endDate) + }.let { FreeGamesState(it.toSet()) } + } + + private fun getPromotionalOfferEndDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "endDate") + private fun getPromotionalOfferStartDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "startDate") + + 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(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") + } + +}