Исходный код raito.plugins.album.middleware

from __future__ import annotations

from asyncio import sleep
from collections.abc import Awaitable, Callable
from typing import TYPE_CHECKING, Any, TypeVar

from aiogram.dispatcher.event.bases import REJECTED
from aiogram.dispatcher.middlewares.base import BaseMiddleware
from aiogram.types import Message
from cachetools import TTLCache
from typing_extensions import override

if TYPE_CHECKING:
    from aiogram.types import TelegramObject

R = TypeVar("R")


__all__ = ("AlbumMiddleware",)


[документация] class AlbumMiddleware(BaseMiddleware): """Middleware for album handling.""" def __init__( self, delay: float = 0.6, max_size: int = 10_000, ) -> None: """Initialize AlbumMiddleware. :param flag_name: flag name to filter :type flag_name: str """ self.delay = delay self._album_data: TTLCache[str, list[Message]] = TTLCache(maxsize=max_size, ttl=delay * 5) @override async def __call__( self, handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[R]], event: TelegramObject, data: dict[str, Any], ) -> R | None: """Process message with album support. :param handler: Next handler in the middleware chain :param event: Telegram event (Message or CallbackQuery) :param data: Additional data passed through the middleware chain :return: Handler result """ if not isinstance(event, Message): return await handler(event, data) if not event.media_group_id: return await handler(event, data) if album_data := self._album_data.get(event.media_group_id): album_data.append(event) return REJECTED self._album_data[event.media_group_id] = [event] await sleep(self.delay) # after sending all media files: data["album"] = self._album_data.pop(event.media_group_id) return await handler(event, data)