diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc index 5448c31..ac65d44 100644 Binary files a/photo_bot/__pycache__/handlers.cpython-313.pyc and b/photo_bot/__pycache__/handlers.cpython-313.pyc differ diff --git a/photo_bot/handlers.py b/photo_bot/handlers.py index dc90c5e..551e435 100644 --- a/photo_bot/handlers.py +++ b/photo_bot/handlers.py @@ -30,7 +30,6 @@ from utils.texts import ( photo_cancel_text, photo_preview_ready, photo_welcome_with_status, - photo_invalid_cmd, photo_test_welcome, PHOTO_TEST_WELCOME_TEXT, PHOTO_TEST_PREVIEW_TEXT, @@ -224,6 +223,25 @@ async def photo_module_handler(msg: Message): cmd = raw_num break + # --- ТЕСТ-ПОД-РЕЖИМ: 9 = назад в меню фото (не выход из модуля) --- + if in_test_submode(user_id) and cmd == "9" and not is_attachment: + test_submode_users.discard(user_id) + log_menu_stats(user_id, "Photo Bot (TEST)", "Назад из тест-под-режима") + # Висящее тест-фото снимаем (тест-режим: оно никуда не публиковалось) + if user_id in pending_photos: + photo_data = pending_photos[user_id] + if os.path.exists(photo_data['path']): + os.remove(photo_data['path']) + if 'preview_path' in photo_data and os.path.exists(photo_data['preview_path']): + os.remove(photo_data['preview_path']) + del pending_photos[user_id] + status = await check_moderation_status(user_id) + await msg.answer( + photo_welcome_with_status(status, show_test=config.PHOTO_TEST_MODE), + parse_mode="html" + ) + return + # --- ВЫХОД (Кнопки 0 и 9 возвращают в общее меню с очисткой кэша) --- if cmd in ["0", "9", "/start", "меню"]: log_menu_stats(user_id, "Photo Bot", "Выход в главное меню") @@ -250,14 +268,14 @@ async def photo_module_handler(msg: Message): and status.get("moderation_status") == "pending" ) if still_pending: - if config.PHOTO_TEST_MODE and (cmd == "1" or in_test_submode(user_id)): - # Вход в тест-под-режим (кнопка 1) / повтор его сообщения + if config.PHOTO_TEST_MODE and cmd == "1": + # Кнопка 1 — вход в тест-под-режим (можно отправить фото в ИИ) test_submode_users.add(user_id) log_menu_stats(user_id, "Photo Bot (TEST)", "Тест-под-режим (фото на модерации)") - await msg.answer(photo_test_welcome(), parse_mode="html") + await msg.answer(PHOTO_TEST_WELCOME_TEXT, parse_mode="html") else: - # стандартная ошибка: кнопок, кроме 0 (и 1 в тест-режиме), нет - await msg.answer(photo_invalid_cmd(), parse_mode="html") + # Неверная команда → глобальное сообщение + await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") return # Статус изменился (одобрено/отклонено) — разблокируем was_in_test = in_test_submode(user_id) @@ -286,11 +304,6 @@ async def photo_module_handler(msg: Message): # Ошибка проверки — не блокируем, просто логируем logger.warning(f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}") - # --- ТЕСТ-ПОД-РЕЖИМ: нет висящего фото — на любой текст повторяем тест-приветствие --- - if not is_attachment and user_id not in pending_photos and in_test_submode(user_id): - await msg.answer(PHOTO_TEST_WELCOME_TEXT, parse_mode="html") - return - # --- ВХОД В ТЕСТ-ПОД-РЕЖИМ: кнопка 1 в меню фото-режима (тест включен) --- if (not is_attachment and user_id not in pending_photos and not in_test_submode(user_id) @@ -350,9 +363,9 @@ async def photo_module_handler(msg: Message): await msg.answer(PHOTO_TEST_WELCOME_TEXT, parse_mode="html") return - # --- Защита от мусорного ввода при висящем превью (тестовый мод) --- + # --- Неверная команда при висящем превью → глобальное сообщение --- else: - await msg.answer(PHOTO_TEST_PREVIEW_TEXT, parse_mode="html") + await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") return # --- ПОДТВЕРЖДЕНИЕ ОТПРАВКИ (Кнопка 1) --- @@ -421,6 +434,11 @@ async def photo_module_handler(msg: Message): await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") return + # --- НЕВЕРНАЯ КОМАНДА (висящего фото нет) → глобальное сообщение --- + if not is_attachment: + await msg.answer(system_error_text(EMOJI_DIGITS), parse_mode="html") + return + # --- ПРИЕМ НОВОГО ФОТО --- if is_attachment: file_id = getattr(msg.content, "file_id", None) diff --git a/utils/__pycache__/texts.cpython-313.pyc b/utils/__pycache__/texts.cpython-313.pyc index db61716..f22aab0 100644 Binary files a/utils/__pycache__/texts.cpython-313.pyc and b/utils/__pycache__/texts.cpython-313.pyc differ diff --git a/utils/texts.py b/utils/texts.py index 8a155bf..2c094e7 100644 --- a/utils/texts.py +++ b/utils/texts.py @@ -232,13 +232,6 @@ def _photo_unknown(emojis: dict) -> str: f"{emojis['0']} — В главное меню" ) -def _photo_invalid_cmd(emojis: dict) -> str: - return ( - f"⚠️ Неверный выбор пункта меню.\n" - f"Пожалуйста, используйте кнопки из сообщения выше.\n\n" - f"{emojis['0']} — В главное меню" - ) - def _photo_processing_face(emojis: dict) -> str: return "⏳ Ищу лицо на фото, пожалуйста, подождите..." @@ -276,20 +269,15 @@ def _photo_status_info(status: dict = None, emojis: dict = None) -> str | None: ) return None -def _photo_test_welcome(emojis: dict, photo_id: str = None) -> str: - """Тест-приветствие. photo_id — если у пользователя ещё есть фото - на модерации (тестовая проверка его не затрагивает).""" - text = ( +def _photo_test_welcome(emojis: dict) -> str: + """Тест-приветствие: фото уйдёт напрямую в ИИ, никуда не публикуется.""" + return ( f"🧪 Тестовый режим фото-проверки\n\n" f"📸 Пришлите фотографию — она уйдёт напрямую в ИИ.\n" - f"Бот покажет вердикт ИИ. Фото никуда не публикуется." + f"Бот покажет вердикт ИИ. Фото никуда не публикуется.\n\n" + f"{emojis['9']} — Назад\n" + f"{emojis['0']} — В главное меню" ) - if photo_id: - text += ( - f"\n⏳ У вас уже есть фото на модерации (№ {photo_id}).\n" - f"Ожидайте решения модератора. Тестовая проверка его не затрагивает.\n" - ) - return text + f"\n\n{emojis['0']} — В главное меню" def _photo_test_preview(emojis: dict) -> str: return ( @@ -297,6 +285,7 @@ def _photo_test_preview(emojis: dict) -> str: f"Кадр получен. Фото никуда не публикуется.\n\n" f"{emojis['1']} — отправлю фото напрямую в ИИ\n" f"{emojis['2']} — Загрузить другое фото\n" + f"{emojis['9']} — Назад\n" f"{emojis['0']} — В главное меню" ) @@ -414,9 +403,6 @@ PHOTO_MAIN_MENU_TEXT = _photo_welcome(EMOJI_DIGITS) PHOTO_TEST_ENTRY_TEXT = _photo_welcome(EMOJI_DIGITS, show_test=True) PHOTO_UNKNOWN_CMD_TEXT = _photo_unknown(EMOJI_DIGITS) -def photo_invalid_cmd() -> str: - return _photo_invalid_cmd(EMOJI_DIGITS) - def photo_error_handling() -> str: return system_error_text(EMOJI_DIGITS, show_back=False) @@ -455,9 +441,9 @@ def photo_welcome_with_status(status: dict = None, show_test: bool = False) -> s PHOTO_TEST_WELCOME_TEXT = _photo_test_welcome(EMOJI_DIGITS) -def photo_test_welcome(photo_id: str = None) -> str: - """Тест-приветствие; photo_id — если у пользователя ещё фото на модерации.""" - return _photo_test_welcome(EMOJI_DIGITS, photo_id) +def photo_test_welcome() -> str: + """Тест-приветствие (тест-под-режим фото-проверки).""" + return _photo_test_welcome(EMOJI_DIGITS) PHOTO_TEST_PREVIEW_TEXT = _photo_test_preview(EMOJI_DIGITS) PHOTO_TEST_AI_CHECKING_TEXT = _photo_test_ai_checking(EMOJI_DIGITS) PHOTO_TEST_RECEIVING_TEXT = _photo_test_receiving(EMOJI_DIGITS)