Быстрый старт

Чтобы начать использовать maxo.dialogs, давайте создадим простое эхо-меню с кнопкой.

Подготовка состояний

Каждое окно в диалоге привязывается к состоянию из StatesGroup.

from maxo.fsm import State, StatesGroup

class MyDialog(StatesGroup):
    main = State()

Создание окна и диалога

Окно содержит элементы UI (виджеты). Соберем диалог из одного окна:

from maxo.dialogs import Dialog, DialogManager, Window
from maxo.dialogs.widgets.kbd import Button
from maxo.dialogs.widgets.text import Const
from maxo.routing.updates import MessageCallback

async def on_click(callback: MessageCallback, button: Button, manager: DialogManager):
    await manager.answer_callback()

dialog = Dialog(
    Window(
        Const("Привет! Это твой первый диалог на maxo.dialogs."),
        Button(Const("Нажми меня"), id="btn1", on_click=on_click),
        state=MyDialog.main,
    ),
)

Точка входа

Теперь нам нужен хэндлер (например, на команду /start), который запустит диалог. Чтобы запустить диалог, используйте метод start() у DialogManager:

from maxo import Router
from maxo.dialogs import DialogManager, StartMode
from maxo.routing.filters import Command
from maxo.routing.updates import MessageCreated

router = Router()

@router.message_created(Command("start"))
async def start_handler(message: MessageCreated, dialog_manager: DialogManager):
    await dialog_manager.start(MyDialog.main, mode=StartMode.RESET_STACK)

Регистрация в приложении

Осталось только собрать всё вместе и зарегистрировать систему диалогов в корневом роутере. Вызовите setup_dialogs(dp).

from maxo import Bot, Dispatcher, Router
from maxo.dialogs import setup_dialogs
from maxo.fsm.key_builder import DefaultKeyBuilder
from maxo.transport.long_polling import LongPolling

def main():
    key_builder = DefaultKeyBuilder(with_destiny=True)

    bot = Bot("ВАШ ТОКЕН БОТА")
    dp = Dispatcher(key_builder=key_builder)

    # Подключаем роутер с хэндлером и роутер (диалог)
    dp.include(router)
    dp.include(dialog)

    # Важно! Инициализируем систему диалогов
    setup_dialogs(dp)

    LongPolling(dp).run(bot)

if __name__ == "__main__":
    main()

Примечание

При использовании setup_dialogs с FSM-хранилищем необходимо всегда передавать KeyBuilder с with_destiny=True:

from maxo.fsm.key_builder import DefaultKeyBuilder

key_builder = DefaultKeyBuilder(with_destiny=True)
dp = Dispatcher(key_builder=key_builder)

Подробнее: issue #34.