Исходный код raito.plugins.scenes.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.types import CallbackQuery, Message
from typing_extensions import override
if TYPE_CHECKING:
from aiogram.types import TelegramObject
from .manager import SceneManager
R = TypeVar("R")
__all__ = ("SceneMiddleware",)
[документация]
class SceneMiddleware(BaseMiddleware):
"""Middleware that drops a stale scene before its step runs.
Installed on both the message and callback query observers, so a stale scene
is dropped whether the next step expects text or an inline button.
"""
def __init__(self, manager: SceneManager[Any]) -> None:
"""Initialize SceneMiddleware.
:param manager: scene this middleware clears stale state for
"""
self.manager = manager
@override
async def __call__(
self,
handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[R]],
event: TelegramObject,
data: dict[str, Any],
) -> R | None:
"""Clear a stale scene before the next handler runs.
:param handler: next handler in the middleware chain
:param event: incoming Telegram event
:param data: contextual data passed through the chain
:return: handler result
"""
if not isinstance(event, Message | CallbackQuery):
return await handler(event, data)
if await self.manager.cleanup(data.get("state"), data.get("raw_state")):
data["raw_state"] = None
if isinstance(event, CallbackQuery):
await event.answer()
return await handler(event, data)