1 package net.pterodactylus.rhynodge.filters.webpages.epicgames
3 import com.fasterxml.jackson.databind.JsonNode
4 import net.pterodactylus.rhynodge.Filter
5 import net.pterodactylus.rhynodge.State
6 import net.pterodactylus.rhynodge.states.AbstractState
7 import net.pterodactylus.rhynodge.states.JsonState
8 import java.time.Instant
10 class EpicGamesFilter : Filter {
12 override fun filter(state: State): State {
13 state as? JsonState ?: throw IllegalArgumentException("state must be a JSON state")
14 return state.jsonNode.at("/data/Catalog/searchStore/elements").map { gameJson: JsonNode ->
15 val title = gameJson.get("title").asText()
16 val imageUrl = gameJson.at("/keyImages/1/url").asText()
17 val startDate = getPromotionalOfferStartDate(gameJson)
18 val endDate = getPromotionalOfferEndDate(gameJson)
19 FreeGame(title, imageUrl, startDate, endDate)
20 }.let { FreeGamesState(it.toSet()) }
23 private fun getPromotionalOfferEndDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "endDate")
24 private fun getPromotionalOfferStartDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "startDate")
26 private fun getPromotionalOfferDate(gameJson: JsonNode, date: String) = listOf("promotionalOffers", "upcomingPromotionalOffers")
27 .map { "/promotions/$it/0/promotionalOffers/0/$date" }
28 .map { gameJson.at(it) }
29 .filter { !it.isMissingNode }
39 val startDate: Instant,
43 class FreeGamesState(val games: Set<FreeGame>) : AbstractState(true) {
45 override fun plainText(): String {
46 TODO("Not yet implemented")