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.JsonState
7 import java.time.Instant
9 class EpicGamesFilter : Filter {
11 override fun filter(state: State): State {
12 state as? JsonState ?: throw IllegalArgumentException("state must be a JSON state")
13 return state.jsonNode.at("/data/Catalog/searchStore/elements").map { gameJson: JsonNode ->
14 val title = gameJson.get("title").asText()
15 val imageUrl = gameJson.at("/keyImages/1/url").asText()
16 val startDate = getPromotionalOfferStartDate(gameJson)
17 val endDate = getPromotionalOfferEndDate(gameJson)
18 FreeGame(title, imageUrl, startDate, endDate)
19 }.let { FreeGamesState(it.toSet()) }
22 private fun getPromotionalOfferEndDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "endDate")
23 private fun getPromotionalOfferStartDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "startDate")
25 private fun getPromotionalOfferDate(gameJson: JsonNode, date: String) = listOf("promotionalOffers", "upcomingPromotionalOffers")
26 .map { "/promotions/$it/0/promotionalOffers/0/$date" }
28 .filterNot(JsonNode::isMissingNode)
29 .map(JsonNode::asText)