Files
tg-favorite-stickers/src/favorite_stickers/telegram.py
T
krosh a830623fcd
Container / test (push) Canceled after 0s
Container / image (push) Canceled after 0s
ai did his job.
2026-08-08 03:53:10 +03:00

76 lines
2.4 KiB
Python

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 "❤️"],
)