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

Машина состояний

FSM хранит состояние и произвольные данные для ключа чата/пользователя. По умолчанию Dispatcher включает FSM с хранилищем в памяти.

Объявление состояний

from pyromax.fsm.state import State, StatesGroup


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

Использование FSMContext

from pyromax.filters import Command
from pyromax.fsm.context import FSMContext
from pyromax.models import Message


@dispatcher.message(Command("survey"))
async def begin(message: Message, state: FSMContext) -> None:
    await state.set_state(Survey.name)
    await message.reply("Как вас зовут?")


@dispatcher.message(Survey.name)
async def receive_name(message: Message, state: FSMContext) -> None:
    await state.update_data(name=message.text)
    await state.set_state(Survey.age)
    await message.reply("Сколько вам лет?")


@dispatcher.message(Survey.age)
async def finish(message: Message, state: FSMContext) -> None:
    data = await state.get_data()
    await message.reply(f"Сохранено: {data['name']}, {message.text}")
    await state.clear()

Стратегии

  • FSMStrategy.USER_IN_CHAT: отдельное состояние пользователя в каждом чате (по умолчанию).
  • FSMStrategy.CHAT: общее состояние всего чата.
  • FSMStrategy.GLOBAL_USER: одно состояние пользователя во всех чатах.

Хранилища

dispatcher = Dispatcher(storage=MemoryStorage())

MemoryStorage подходит для разработки, но теряет данные после перезапуска. RedisStorage и PyMongoStorage используют дополнительные зависимости и сохраняют состояние постоянно. Передайте совместимый клиент и при необходимости DefaultKeyBuilder. Event isolation последовательно обрабатывает события с одинаковым FSM-ключом.

При завершении polling Dispatcher закрывает FSM storage и isolation.