Модуль обработчиков (handlers)

Обзор

Модуль handlers.py содержит все обработчики сообщений и команд Telegram бота, реализующие логику диалога через конечный автомат состояний.

Архитектура обработчиков

Основные обработчики

start(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Начинает диалог и показывает главное меню.

Действия:

  • Логирует начало диалога в БД

  • Сохраняет dialog_id в user_data

  • Показывает приветственное сообщение

  • Возвращает состояние MAIN_MENU

handle_main_menu(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Обрабатывает выбор в главном меню.

Логика:

  • При выборе раздела: сохраняет выбор и переходит к SECTION_MENU

  • При выборе «О проекте»: завершает диалог

  • При неверном вводе: просит повторить выбор

show_section_menu(update: Update, context: ContextTypes.DEFAULT_TYPE, questionary: Questionary) int

Показывает меню выбранного раздела с описанием.

handle_section_choice(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Обрабатывает выбор в разделе.

Варианты:

  • «Главное меню» - возврат к началу

  • «Случайный вопрос» - показывает случайный вопрос и завершает диалог

  • «Выбрать тему» - переход к выбору темы

theme_choice(update: Update, context: ContextTypes.DEFAULT_TYPE, questionary: Questionary) int

Предлагает выбор темы в текущем разделе.

handle_theme_choice(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Обрабатывает выбор темы и показывает случайный вопрос.

Действия:

  • Проверяет существование темы

  • Получает случайный вопрос через Questionary

  • Обновляет состояние диалога в БД

  • Показывает вопрос и переходит к RESULT

handle_result_choice(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Обрабатывает действия после показа вопроса.

Варианты:

  • «Еще вопрос» - показывает другой вопрос из той же темы

  • «Выбрать другую тему» - возврат к выбору темы

  • «Главное меню» - возврат к началу

  • «Завершить» - завершение диалога

cancel(update: Update, context: ContextTypes.DEFAULT_TYPE) int

Завершает диалог по команде /cancel.

Вспомогательные функции

end_dialog(context: ContextTypes.DEFAULT_TYPE, state: str = 'completed')

Завершает диалог в базе данных.

Parameters:

  • context - контекст выполнения

  • state - состояние завершения

Flow данных

Контекст user_data

Обработчики используют context.user_data для хранения:

Обработка ошибок

Все обработчики включают блоки try-except для:

  • Ошибок базы данных

  • Ошибок получения вопросов

  • Непредвиденных исключений

Ошибки логируются, но не прерывают работу бота.

Пример использования

# В main.py
conv_handler = ConversationHandler(
    entry_points=[CommandHandler("start", start)],
    states={
        MAIN_MENU: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_main_menu)],
        SECTION_MENU: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_section_choice)],
        THEME: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_theme_choice)],
        RESULT: [MessageHandler(filters.TEXT & ~filters.COMMAND, handle_result_choice)],
    },
    fallbacks=[CommandHandler("cancel", cancel)],
)

Смотрите также