Перейти к содержанию

FSM

Finite State Machine помогает вести многошаговый диалог. aiomax2 предоставляет State, StatesGroup, FSMContext, стратегии ключей и async storage API.

Анкета: имя и возраст

from aiomax2 import Router
from aiomax2.filters import CommandStart
from aiomax2.fsm import FSMContext, State, StatesGroup
from aiomax2.types import Message

router = Router()


class Form(StatesGroup):
    name = State()
    age = State()


@router.message(CommandStart())
async def start(message: Message, state: FSMContext) -> None:
    await state.set_state(Form.name)
    await message.answer("Как вас зовут?")


@router.message(Form.name)
async def save_name(message: Message, state: FSMContext) -> None:
    if not message.text:
        await message.answer("Отправьте имя текстом")
        return
    await state.update_data(name=message.text)
    await state.set_state(Form.age)
    await message.answer("Сколько вам лет?")


@router.message(Form.age)
async def save_age(message: Message, state: FSMContext) -> None:
    if not message.text or not message.text.isdigit():
        await message.answer("Отправьте возраст числом")
        return
    data = await state.update_data(age=int(message.text))
    await message.answer(f"Готово: {data['name']}, {data['age']}")
    await state.clear()

Dispatcher по умолчанию использует стратегию USER_IN_CHAT: состояние разделяется по bot, chat и user. Доступны также CHAT и GLOBAL_USER.

Storage

По умолчанию создаётся MemoryStorage. Оно подходит для тестов, локальной разработки и простого single-process bot, но данные теряются при перезапуске и не разделяются между workers.

Для multi-process production потребуется внешнее storage. Redis storage и event isolation находятся в roadmap. До их появления можно реализовать собственный BaseStorage и передать его в Dispatcher(storage=...).