from __future__ import annotations from pathlib import Path from aiogram import Bot from aiogram.exceptions import TelegramBadRequest from aiogram.types import FSInputFile, InputSticker from .service import RemoteSticker class AiogramTelegramGateway: def __init__(self, bot: Bot) -> None: self.bot = bot async def create_pack( self, user_id: int, name: str, title: str, sticker_path: Path, emoji: str, ) -> RemoteSticker: await self.bot.create_new_sticker_set( user_id=user_id, name=name, title=title, stickers=[self._input_sticker(sticker_path, emoji)], sticker_type="regular", ) return await self._last_sticker(name) async def add_sticker( self, user_id: int, name: str, sticker_path: Path, emoji: str, ) -> RemoteSticker: await self.bot.add_sticker_to_set( user_id=user_id, name=name, sticker=self._input_sticker(sticker_path, emoji), ) return await self._last_sticker(name) async def delete_sticker(self, sticker_file_id: str) -> None: await self.bot.delete_sticker_from_set(sticker=sticker_file_id) async def get_pack(self, name: str) -> list[RemoteSticker] | None: try: sticker_set = await self.bot.get_sticker_set(name=name) except TelegramBadRequest as error: if "STICKERSET_INVALID" in error.message.upper(): return None raise return [ RemoteSticker(file_id=item.file_id, unique_id=item.file_unique_id) for item in sticker_set.stickers ] async def _last_sticker(self, name: str) -> RemoteSticker: sticker_set = await self.bot.get_sticker_set(name=name) if not sticker_set.stickers: raise RuntimeError("Telegram вернул пустой стикерпак после добавления.") sticker = sticker_set.stickers[-1] return RemoteSticker(file_id=sticker.file_id, unique_id=sticker.file_unique_id) @staticmethod def _input_sticker(path: Path, emoji: str) -> InputSticker: return InputSticker( sticker=FSInputFile(path, filename="favorite.webm"), format="video", emoji_list=[emoji or "❤️"], )