Home Assistant Unofficial Reference 2024.12.1
coordinator.py
Go to the documentation of this file.
1 """The Epic Games Store integration data coordinator."""
2 
3 from __future__ import annotations
4 
5 from datetime import timedelta
6 import logging
7 from typing import Any
8 
9 from epicstore_api import EpicGamesStoreAPI
10 
11 from homeassistant.config_entries import ConfigEntry
12 from homeassistant.const import CONF_COUNTRY, CONF_LANGUAGE
13 from homeassistant.core import HomeAssistant
14 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
15 
16 from .const import DOMAIN, CalendarType
17 from .helper import format_game_data
18 
19 SCAN_INTERVAL = timedelta(days=1)
20 
21 _LOGGER = logging.getLogger(__name__)
22 
23 
25  DataUpdateCoordinator[dict[str, list[dict[str, Any]]]]
26 ):
27  """Class to manage fetching data from the Epic Game Store."""
28 
29  def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None:
30  """Initialize."""
31  self._api_api = EpicGamesStoreAPI(
32  entry.data[CONF_LANGUAGE],
33  entry.data[CONF_COUNTRY],
34  )
35  self.languagelanguage = entry.data[CONF_LANGUAGE]
36 
37  super().__init__(
38  hass,
39  _LOGGER,
40  name=DOMAIN,
41  update_interval=SCAN_INTERVAL,
42  )
43 
44  async def _async_update_data(self) -> dict[str, list[dict[str, Any]]]:
45  """Update data via library."""
46  raw_data = await self.hasshass.async_add_executor_job(self._api_api.get_free_games)
47  _LOGGER.debug(raw_data)
48  data = raw_data["data"]["Catalog"]["searchStore"]["elements"]
49 
50  discount_games = filter(
51  lambda game: game.get("promotions")
52  and (
53  # Current discount(s)
54  game["promotions"]["promotionalOffers"]
55  or
56  # Upcoming discount(s)
57  game["promotions"]["upcomingPromotionalOffers"]
58  ),
59  data,
60  )
61 
62  return_data: dict[str, list[dict[str, Any]]] = {
63  CalendarType.DISCOUNT: [],
64  CalendarType.FREE: [],
65  }
66  for discount_game in discount_games:
67  game = format_game_data(discount_game, self.languagelanguage)
68 
69  if game["discount_type"]:
70  return_data[game["discount_type"]].append(game)
71 
72  return_data[CalendarType.DISCOUNT] = sorted(
73  return_data[CalendarType.DISCOUNT],
74  key=lambda game: game["discount_start_at"],
75  )
76  return_data[CalendarType.FREE] = sorted(
77  return_data[CalendarType.FREE], key=lambda game: game["discount_start_at"]
78  )
79 
80  _LOGGER.debug(return_data)
81  return return_data
dict[str, Any] format_game_data(dict[str, Any] raw_game_data, str language)
Definition: helper.py:9