ai did his job.
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
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 "❤️"],
|
||||
)
|
||||
Reference in New Issue
Block a user