didier/didier/data/rss_feeds/free_games.py

52 lines
1.5 KiB
Python

import logging
from http import HTTPStatus
import feedparser
from aiohttp import ClientSession
from sqlalchemy.ext.asyncio import AsyncSession
from database.crud.free_games import add_free_games, filter_present_games
from didier.data.embeds.free_games import SEPARATOR, FreeGameEmbed
logger = logging.getLogger(__name__)
__all__ = ["fetch_free_games"]
async def fetch_free_games(http_session: ClientSession, database_session: AsyncSession) -> list[FreeGameEmbed]:
"""Get a fresh list of free games"""
url = "https://pepeizqdeals.com/rss-en.xml"
async with http_session.get(url) as response:
if response.status != HTTPStatus.OK:
logger.error("Free games GET-request failed with status code %d." % response.status)
return []
feed = feedparser.parse(await response.text())
games: list[FreeGameEmbed] = []
game_ids: list[int] = []
for entry in feed["entries"]:
# Game isn't free
if SEPARATOR not in entry["title"]:
continue
game = FreeGameEmbed.model_validate(entry)
games.append(game)
game_ids.append(game.id)
# Filter out games that we already know
filtered_ids = await filter_present_games(database_session, game_ids)
# Insert new games into the database
await add_free_games(database_session, filtered_ids)
games = list(filter(lambda x: x.id in filtered_ids, games))
# Look up additional info
for game in games:
await game.update(http_session)
return games