diff --git a/main.py b/main.py index 626f964..49e91e5 100644 --- a/main.py +++ b/main.py @@ -10,7 +10,6 @@ from src.config import BOT_TOKEN from src.database import init_db from src.handlers import ( admin_command, - handle_accept_intro, handle_admin_document, handle_ask_replica_number, handle_cancel_ask_number, @@ -23,14 +22,13 @@ from src.handlers import ( handle_confirm_upload, handle_delete_scenario_list, handle_exit_admin, - handle_replica_number_input, handle_rerecord_last, handle_rerecord_previous, handle_restart_track, handle_save_track, handle_select_gender, handle_select_scenario_delete, - handle_unexpected_text, + handle_text_message, handle_voice_message, start_command, ) @@ -49,11 +47,6 @@ def main() -> None: app.add_handler(CommandHandler("start", start_command)) app.add_handler(CommandHandler("admin", admin_command)) - # Message handlers для текстовых ответов (должны быть перед остальными) - app.add_handler( - MessageHandler(filters.TEXT & ~filters.COMMAND, handle_accept_intro) - ) - # Callback query handlers app.add_handler( CallbackQueryHandler(handle_select_gender, pattern="^select_gender:") @@ -111,10 +104,7 @@ def main() -> None: app.add_handler(MessageHandler(filters.VOICE, handle_voice_message)) app.add_handler(MessageHandler(filters.Document.ALL, handle_admin_document)) app.add_handler( - MessageHandler(filters.TEXT & ~filters.COMMAND, handle_replica_number_input) - ) - app.add_handler( - MessageHandler(filters.TEXT & ~filters.COMMAND, handle_unexpected_text) + MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text_message) ) logger.info("Бот запущен") diff --git a/src/handlers.py b/src/handlers.py index 4eec39e..209ede4 100644 --- a/src/handlers.py +++ b/src/handlers.py @@ -323,16 +323,13 @@ async def admin_command(update: Update, context: ContextTypes.DEFAULT_TYPE) -> N # === Callback handlers === -@with_user_and_session async def handle_accept_intro( update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, - session: UserSession | None, + session: UserSession, ) -> None: """Обработчик согласия с условиями.""" - if not session or session.state != UserState.INTRO: - return # Пропускаем, следующий обработчик обработает text = update.message.text.strip() @@ -911,16 +908,13 @@ async def handle_voice_message( upsert_user_session(session) -@with_user_and_session async def handle_replica_number_input( update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, - session: UserSession | None, + session: UserSession, ) -> None: """Обработчик ввода номера реплики.""" - if not session or session.state != UserState.ASK_REPLICA_NUMBER: - return # Пропускаем, fallback обработает text = update.message.text.strip() track_length = get_track_length(session.scenario_id, session.speaker_id) @@ -947,6 +941,32 @@ async def handle_replica_number_input( upsert_user_session(session) +@with_user_and_session +async def handle_text_message( + update: Update, + context: ContextTypes.DEFAULT_TYPE, + user: User, + session: UserSession | None, +) -> None: + """Диспетчер для всех текстовых сообщений.""" + if not session: + await update.message.reply_text("Используйте /start для начала работы с ботом.") + return + + # INTRO - ожидание согласия + if session.state == UserState.INTRO: + await handle_accept_intro(update, context, user, session) + return + + # ASK_REPLICA_NUMBER - ввод номера реплики + if session.state == UserState.ASK_REPLICA_NUMBER: + await handle_replica_number_input(update, context, user, session) + return + + # Для остальных состояний - обработка неожиданного текста + await handle_unexpected_text(update, context, user, session) + + @with_user_and_session @require_state(UserState.ADMIN) async def handle_admin_document( @@ -996,17 +1016,13 @@ async def handle_admin_document( # === Fallback handlers === -@with_user_and_session async def handle_unexpected_text( update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, - session: UserSession | None, + session: UserSession, ) -> None: """Обработчик неожиданных текстовых сообщений.""" - if not session: - await update.message.reply_text("Используйте /start для начала работы с ботом.") - return voice_states = { UserState.FIRST_REPLICA,