Контекст и состояния¶
MemoryContext¶
Встроенная система состояний для диалогов. Контекст автоматически передается в обработчики:
from maxapi.context import MemoryContext, StatesGroup, State
from maxapi.types import MessageCreated, Command
class Form(StatesGroup):
name = State()
age = State()
@dp.message_created(Command('start'))
async def start_handler(event: MessageCreated, context: MemoryContext):
await context.set_state(Form.name)
await event.message.answer("Как вас зовут?")
@dp.message_created(Form.name)
async def name_handler(event: MessageCreated, context: MemoryContext):
await context.update_data(name=event.message.body.text)
await context.set_state(Form.age)
await event.message.answer("Сколько вам лет?")
@dp.message_created(Form.age)
async def age_handler(event: MessageCreated, context: MemoryContext):
data = await context.get_data()
await event.message.answer(
f"Приятно познакомиться, {data['name']}! "
f"Вам {event.message.body.text} лет."
)
await context.set_state(None) # Сброс состояния
Методы MemoryContext¶
set_state(state)— установить состояние (State или None для сброса)get_state()— получить текущее состояниеget_data()— получить все данные контекстаupdate_data(**kwargs)— обновить данныеset_data(data)— полностью заменить данныеclear()— очистить контекст и сбросить состояние
StatesGroup¶
Группа состояний для FSM:
class Form(StatesGroup):
name = State() # Автоматически получит имя 'Form:name'
age = State() # Автоматически получит имя 'Form:age'
Фильтрация по состояниям¶
Вы можете ограничивать выполнение хендлеров определенными состояниями:
# Только в состоянии Form.name
@dp.message_created(Form.name)
async def name_handler(event: MessageCreated, context: MemoryContext):
...
# Только когда НЕТ активного состояния
@dp.message_created(None)
async def no_state_handler(event: MessageCreated):
...
# В любом из перечисленных состояний
@dp.message_created(Form.name, Form.age)
async def multi_state_handler(event: MessageCreated):
...