From 948df7f19c2fb9fa33b64db0e042075ae90babe4 Mon Sep 17 00:00:00 2001 From: Arity-T Date: Mon, 9 Feb 2026 09:56:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=87=D0=B8=D0=BD=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=20=D0=BD=D0=BE=D0=BC?= =?UTF-8?q?=D0=B5=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 14 ++------------ src/handlers.py | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 25 deletions(-) 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,