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

from __future__ import annotations

from collections.abc import Callable, Coroutine
from dataclasses import dataclass
from typing import TYPE_CHECKING

from aiogram.dispatcher.event.handler import CallbackType
from aiogram.fsm.context import FSMContext
from aiogram.types import Message
from typing_extensions import Any

if TYPE_CHECKING:
    from raito import Raito

__all__ = ("Waiter", "wait_for")


[документация] @dataclass class Waiter: """Container for conversation result. :param text: Raw text of the message :param number: Parsed integer if ``text`` is a digit, otherwise ``None`` :param message: Original :class:`aiogram.types.Message` object :param retry: Callable coroutine for repeating the same wait """ text: str number: int | None message: Message retry: Callable[[], Coroutine[Any, Any, Waiter]]
[документация] async def wait_for( raito: Raito, context: FSMContext, *filters: CallbackType, ) -> Waiter: """Wait for the next message from user that matches given filters. This function sets special state ``raito__conversation`` in FSM and suspends coroutine execution until user sends a message that passes all provided filters. Result is wrapped into :class:`Waiter`. :param raito: Current :class:`Raito` instance :param context: FSM context for current chat :param filters: Sequence of aiogram filters :return: Conversation result with text, parsed number and original message :raises RuntimeError: If handler object not found during filter execution :raises asyncio.CancelledError: If conversation was cancelled """ await context.set_state(raito.registry.STATE) message = await raito.registry.listen(context.key, *filters) async def retry() -> Waiter: return await wait_for(raito, context, *filters) text = message.text or message.caption or "" return Waiter( text=text, number=int(text) if text.isdigit() else None, message=message, retry=retry, )