diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc index d4257db..5448c31 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 93333d6..dc90c5e 100644 --- a/photo_bot/handlers.py +++ b/photo_bot/handlers.py @@ -29,7 +29,6 @@ from utils.texts import ( photo_error_already_pending, photo_cancel_text, photo_preview_ready, - photo_moderation_pending, photo_welcome_with_status, photo_invalid_cmd, photo_test_welcome, @@ -175,22 +174,15 @@ async def send_dynamic_photo_main_menu(msg: Message, user_id: str): if status.get("status") == "ok" and status.get("moderation_status") == "pending": # Фото на модерации — штатная загрузка заблокирована, # но модуль остаётся открыт (PHOTO_MODE), чтобы цифры не ушли в главное меню - photo_id = status.get("photo_id", "???") - log_menu_stats(user_id, "Photo Bot", "Вход заблокирован — фото на модерации") + log_menu_stats(user_id, "Photo Bot", "Вход — фото на модерации") states.set_state(user_id, "PHOTO_MODE") moderation_pending_users.add(user_id) - if config.PHOTO_TEST_MODE: - # Единый вход: меню + «фото на модерации» + кнопка «1 — тест проверка фото». - # Описание тест-режима показываем ТОЛЬКО после нажатия кнопки 1 - await msg.answer( - photo_welcome_with_status(status, show_test=True), - parse_mode="html" - ) - else: - await msg.answer( - photo_moderation_pending(photo_id), - parse_mode="html" - ) + # Единый вход: «фото на модерации» (+ кнопка 1 — тест, если тест-режим включён). + # Описание тест-режима показываем ТОЛЬКО после нажатия кнопки 1 + await msg.answer( + photo_welcome_with_status(status, show_test=config.PHOTO_TEST_MODE), + parse_mode="html" + ) return if status.get("status") == "ok" and status.get("moderation_status") == "rejected": log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина") @@ -258,12 +250,11 @@ async def photo_module_handler(msg: Message): and status.get("moderation_status") == "pending" ) if still_pending: - photo_id = status.get("photo_id", "???") if config.PHOTO_TEST_MODE and (cmd == "1" or in_test_submode(user_id)): # Вход в тест-под-режим (кнопка 1) / повтор его сообщения test_submode_users.add(user_id) log_menu_stats(user_id, "Photo Bot (TEST)", "Тест-под-режим (фото на модерации)") - await msg.answer(photo_test_welcome(photo_id), parse_mode="html") + await msg.answer(photo_test_welcome(), parse_mode="html") else: # стандартная ошибка: кнопок, кроме 0 (и 1 в тест-режиме), нет await msg.answer(photo_invalid_cmd(), parse_mode="html") @@ -286,9 +277,8 @@ async def photo_module_handler(msg: Message): if user_id not in pending_photos and not is_attachment: status = await check_moderation_status(user_id) if status.get("status") == "ok" and status.get("moderation_status") == "pending": - photo_id = status.get("photo_id", "???") await msg.answer( - photo_moderation_pending(photo_id), + photo_welcome_with_status(status, show_test=config.PHOTO_TEST_MODE), parse_mode="html" ) return diff --git a/utils/__pycache__/texts.cpython-313.pyc b/utils/__pycache__/texts.cpython-313.pyc index d162623..db61716 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 98e6ddd..8a155bf 100644 --- a/utils/texts.py +++ b/utils/texts.py @@ -202,17 +202,24 @@ def sd_file_upload_error() -> str: # --- Private functions (Internal logic) --- -def _photo_welcome(emojis: dict, show_test: bool = False, info: str = None) -> str: +def _photo_welcome(emojis: dict, show_test: bool = False, info: str = None, pending: bool = False) -> str: """Входное сообщение фото-режима. info — необязательный блок о статусе - модерации (отказ/ожидание) — вставляется перед списком кнопок.""" - text = ( - f"🖼 Режим обновления фото профиля\n\n" - f"📸 Пришлите мне вашу фотографию.\n\n" - f"Бот автоматически найдёт лицо, покажет превью\n" - f"и отправит фото на публикацию в ваши корпоративные сервисы.\n\n" - ) - if info: - text += info + "\n\n" + модерации (отказ). pending=True — фото уже на модерации: без призыва + отправить фото, только статус.""" + text = f"🖼 Режим обновления фото профиля\n\n" + if pending: + text += ( + f"⏳ У вас уже есть фото на модерации.\n" + f"Ожидайте решения модератора.\n\n" + ) + else: + text += ( + f"📸 Пришлите мне вашу фотографию.\n\n" + f"Бот автоматически найдёт лицо, покажет превью\n" + f"и отправит фото на публикацию в ваши корпоративные сервисы.\n\n" + ) + if info: + text += info + "\n\n" if show_test: text += f"{emojis['1']} — тест проверка фото\n" return text + f"{emojis['0']} — В главное меню" @@ -249,13 +256,6 @@ def _photo_ai_processing(emojis: dict) -> str: "Пожалуйста, не закрывайте чат и подождите..." ) -def _photo_moderation_pending(photo_id: str, emojis: dict) -> str: - return ( - f"⏳ У вас уже есть фото на модерации.\n\n" - f"Ожидайте решения модератора.\n\n" - f"{emojis['0']} — В главное меню" - ) - def _photo_status_info(status: dict = None, emojis: dict = None) -> str | None: """Блок о статусе модерации для входного сообщения. Универсальный для всех случаев: rejected → причина отказа, pending → ожидание, прочее → пусто.""" @@ -270,10 +270,8 @@ def _photo_status_info(status: dict = None, emojis: dict = None) -> str | None: f"Пожалуйста, отправьте новое фото." ) if ms == "pending": - photo_id = status.get("photo_id") - num = f" (№ {photo_id})" if photo_id not in (None, "", "???") else "" return ( - f"⏳ У вас уже есть фото на модерации{num}.\n" + f"⏳ У вас уже есть фото на модерации.\n" f"Ожидайте решения модератора." ) return None @@ -284,7 +282,7 @@ def _photo_test_welcome(emojis: dict, photo_id: str = None) -> str: text = ( f"🧪 Тестовый режим фото-проверки\n\n" f"📸 Пришлите фотографию — она уйдёт напрямую в ИИ.\n" - f"Бот покажет вердикт ИИ. Фото никуда не публикуется.\n" + f"Бот покажет вердикт ИИ. Фото никуда не публикуется." ) if photo_id: text += ( @@ -444,15 +442,16 @@ def photo_error_already_pending() -> str: def photo_cancel_text() -> str: return _photo_cancel(EMOJI_DIGITS) -def photo_moderation_pending(photo_id: str) -> str: - return _photo_moderation_pending(photo_id, EMOJI_DIGITS) - def photo_welcome_with_status(status: dict = None, show_test: bool = False) -> str: - """Универсальное входное сообщение фото-режима: меню + статус модерации, - если он требует внимания (отказ с причиной). + """Универсальное входное сообщение фото-режима: меню + статус модерации. + pending — только статус (без призыва отправить фото); show_test — добавить кнопку тест-проверки (PHOTO_TEST_MODE).""" info = _photo_status_info(status, EMOJI_DIGITS) - return _photo_welcome(EMOJI_DIGITS, show_test=show_test, info=info) + pending = bool( + status and status.get("status") == "ok" + and status.get("moderation_status") == "pending" + ) + return _photo_welcome(EMOJI_DIGITS, show_test=show_test, info=info, pending=pending) PHOTO_TEST_WELCOME_TEXT = _photo_test_welcome(EMOJI_DIGITS)