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

from __future__ import annotations

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

from aiogram.dispatcher.middlewares.base import BaseMiddleware
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from typing_extensions import override

from raito.utils.helpers.filters import call_filters

from .registry import ConversationRegistry

if TYPE_CHECKING:
    from aiogram.types import TelegramObject

R = TypeVar("R")


__all__ = ("ConversationMiddleware",)


[документация] class ConversationMiddleware(BaseMiddleware): """Middleware for conversation handling.""" def __init__(self, registry: ConversationRegistry) -> None: """Initialize ConversationMiddleware. :param registry: conversation registry """ self.registry = registry @override async def __call__( self, handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[R]], event: TelegramObject, data: dict[str, Any], ) -> R | None: """Process message with conversation support. :param handler: Next handler in the middleware chain :type handler: Callable :param event: Telegram event (Message) :type event: TelegramObject :param data: Additional data passed through the middleware chain :type data: dict[str, Any] :return: Handler result if not throttled, None if throttled """ if not isinstance(event, Message): return await handler(event, data) context: FSMContext | None = data.get("state") if context is not None: state = await context.get_state() filters = self.registry.get_filters(context.key) if state is None or filters is None: return await handler(event, data) check = await call_filters(event, data, *filters) if not check: return await handler(event, data) self.registry.resolve(context.key, event) return None return await handler(event, data)