Модуль обработчиков (handlers)
Обзор
Модуль handlers.py содержит все обработчики сообщений и команд Telegram бота,
реализующие логику диалога через конечный автомат состояний.
Архитектура обработчиков
Основные обработчики
- start(update: Update, context: ContextTypes.DEFAULT_TYPE) int
Начинает диалог и показывает главное меню.
Действия:
Логирует начало диалога в БД
Сохраняет dialog_id в user_data
Показывает приветственное сообщение
Возвращает состояние MAIN_MENU
Обрабатывает выбор в главном меню.
Логика:
При выборе раздела: сохраняет выбор и переходит к SECTION_MENU
При выборе «О проекте»: завершает диалог
При неверном вводе: просит повторить выбор
Показывает меню выбранного раздела с описанием.
- 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)],
)
Смотрите также
Главный модуль (main) - Регистрация обработчиков
Модуль вопросов (questionary) - Получение вопросов
Модуль базы данных (database) - Логирование диалогов
Модуль конфигурации (config) - Состояния и клавиатуры