♻️ Extract FreeGamesState into its own file
[rhynodge.git] / src / main / kotlin / net / pterodactylus / rhynodge / filters / webpages / epicgames / EpicGamesFilter.kt
1 package net.pterodactylus.rhynodge.filters.webpages.epicgames
2
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
8
9 class EpicGamesFilter : Filter {
10
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()) }
20         }
21
22         private fun getPromotionalOfferEndDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "endDate")
23         private fun getPromotionalOfferStartDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "startDate")
24
25         private fun getPromotionalOfferDate(gameJson: JsonNode, date: String) = listOf("promotionalOffers", "upcomingPromotionalOffers")
26                 .map { "/promotions/$it/0/promotionalOffers/0/$date" }
27                 .map(gameJson::at)
28                 .filterNot(JsonNode::isMissingNode)
29                 .map(JsonNode::asText)
30                 .map(Instant::parse)
31                 .first()
32
33 }