76 lines
2.4 KiB
Python
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 "❤️"],
|
|
)
|