feat: add polish and fallback handlers

- Add fallback handler for unexpected text messages
- Remove unused require_states alias
- Update TASK.md - all stages complete
This commit is contained in:
2026-02-02 21:31:51 +03:00
parent 613e492b2d
commit 52dce1b2b8
3 changed files with 28 additions and 8 deletions

View File

@@ -24,6 +24,7 @@ from src.handlers import (
handle_rerecord_previous, handle_rerecord_previous,
handle_restart_track, handle_restart_track,
handle_save_track, handle_save_track,
handle_unexpected_text,
handle_voice_message, handle_voice_message,
start_command, start_command,
) )
@@ -76,10 +77,9 @@ def main() -> None:
# Message handlers # Message handlers
app.add_handler(MessageHandler(filters.VOICE, handle_voice_message)) app.add_handler(MessageHandler(filters.VOICE, handle_voice_message))
app.add_handler(
MessageHandler(filters.TEXT & ~filters.COMMAND, handle_replica_number_input)
)
app.add_handler(MessageHandler(filters.Document.ALL, handle_admin_document)) 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))
logger.info("Бот запущен") logger.info("Бот запущен")
app.run_polling() app.run_polling()

View File

@@ -71,6 +71,3 @@ def require_state(*states: UserState):
return decorator return decorator
def require_states(*states: UserState):
"""Алиас для require_state с несколькими состояниями."""
return require_state(*states)

View File

@@ -630,11 +630,13 @@ async def handle_voice_message(
@with_user_and_session @with_user_and_session
@require_state(UserState.ASK_REPLICA_NUMBER)
async def handle_replica_number_input( async def handle_replica_number_input(
update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession | None
) -> None: ) -> None:
"""Обработчик ввода номера реплики.""" """Обработчик ввода номера реплики."""
if not session or session.state != UserState.ASK_REPLICA_NUMBER:
return # Пропускаем, fallback обработает
text = update.message.text.strip() text = update.message.text.strip()
track_length = get_track_length(session.scenario_id, session.speaker_id) track_length = get_track_length(session.scenario_id, session.speaker_id)
@@ -703,3 +705,24 @@ async def handle_admin_document(
) )
session.last_bot_message_id = msg_id session.last_bot_message_id = msg_id
upsert_user_session(session) upsert_user_session(session)
# === Fallback handlers ===
VOICE_EXPECTED_TEXT = "❌ Пожалуйста, отправьте голосовое сообщение с озвучкой реплики."
@with_user_and_session
async def handle_unexpected_text(
update: Update, context: ContextTypes.DEFAULT_TYPE, user: User, session: UserSession | None
) -> None:
"""Обработчик неожиданных текстовых сообщений."""
if not session:
await update.message.reply_text("Используйте /start для начала работы с ботом.")
return
voice_states = {UserState.FIRST_REPLICA, UserState.SHOW_REPLICA, UserState.REPEAT_REPLICA}
if session.state in voice_states:
await update.message.reply_text(VOICE_EXPECTED_TEXT)
# В других состояниях игнорируем текст (например, INTRO, NO_MORE_SCENARIOS)