import logging from io import BytesIO import aiohttp import discord from ..core.config import CONFIG _logger = logging.getLogger(__name__) @discord.app_commands.command(name=CONFIG.command_prefix + "advent") async def advent(interaction: discord.Interaction, tag: int | None = None) -> None: """ Türchen vom Lenaisten-Adventskalender öffnen (https://advent.lenaisten.de) """ _logger.debug( f"User {interaction.user.name}({interaction.user.id}) used /advent ({tag = })" ) await interaction.response.defer( thinking=True, # nur für ausführenden User ephemeral=True, ) async with aiohttp.ClientSession( auth=aiohttp.BasicAuth(login="", password="") ) as session: if tag is None: # Kein Tag angegeben => neuesten Tag finden async with session.get( "https://advent.lenaisten.de/api/user/doors" ) as http_response: if http_response.status != 200: # user/doors Anfrage hat nicht geklappt await interaction.followup.send( "Fehler: Ich konnte das aktuelle Türchen nicht finden :zany_face: (Probier's nochmal?)", ) return if not isinstance(doors := await http_response.json(), list): # user/doors Antwort falsches Format (keine Liste) await interaction.followup.send( "Fehler: Ich konnte das aktuelle Türchen nicht finden :sweat_smile: (Probier's nochmal?)", ) return days: list[int] = [] for door in doors: if not isinstance(door, dict) or "day" not in door: # user/doors Antwort falsches Format (Liste enthält falsche Daten) await interaction.followup.send( "Fehler: Ich konnte das aktuelle Türchen nicht finden :face_with_monocle: (Probier's nochmal?)", ) return days.append(door["day"]) tag = max(days) async with session.get( f"https://advent.lenaisten.de/api/user/image_{tag}" ) as http_response: if http_response.status == 401: # Bild (noch) nicht verfügbar await interaction.followup.send( f"Fehler: Tag {tag} kann ich (noch?) nicht abrufen. Netter Versuch! :woman_technologist_tone2:", ) return if http_response.status != 200: # Bild herunterladen fehlgeschlagen await interaction.followup.send(CONFIG.command_failed) return image = discord.File( fp=BytesIO(await http_response.read()), filename="advent.jpg", ) if CONFIG.ev_info.in_allowed_channel(interaction): await interaction.followup.send(":ok:") assert isinstance(interaction.channel, discord.abc.Messageable) target_channel = interaction.channel else: await interaction.followup.send( f"Hier darf ich leider nicht posten, also schicke ich das Bild hier: <#{CONFIG.post.channel}> :incoming_envelope:" ) target_channel = CONFIG.post.get_channel(interaction.client) await target_channel.send( content=f"<@{interaction.user.id}>, hier ist das Adventskalender-Bild für Tag {tag}!", file=image, ) COMMANDS = [ advent, ]