♻️ Extract FreeGame 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.AbstractState
7 import net.pterodactylus.rhynodge.states.JsonState
8 import java.time.Instant
9
10 class EpicGamesFilter : Filter {
11
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()) }
21         }
22
23         private fun getPromotionalOfferEndDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "endDate")
24         private fun getPromotionalOfferStartDate(gameJson: JsonNode) = getPromotionalOfferDate(gameJson, "startDate")
25
26         private fun getPromotionalOfferDate(gameJson: JsonNode, date: String) = listOf("promotionalOffers", "upcomingPromotionalOffers")
27                 .map { "/promotions/$it/0/promotionalOffers/0/$date" }
28                 .map(gameJson::at)
29                 .filterNot(JsonNode::isMissingNode)
30                 .map(JsonNode::asText)
31                 .map(Instant::parse)
32                 .first()
33
34 }
35
36 class FreeGamesState(val games: Set<FreeGame>) : AbstractState(true) {
37
38         override fun plainText(): String {
39                 TODO("Not yet implemented")
40         }
41
42 }