From 0b2364d79f91f33cf8423b792f3dd3c43172a7ca Mon Sep 17 00:00:00 2001 From: dddennnisss Date: Fri, 21 Aug 2026 21:21:14 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=BE=D1=82=D0=BE:=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D1=83?= =?UTF-8?q?=D1=81=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B8=D0=B7=20main.py=20=D0=B2=20=D0=BC=D0=BE=D0=B4?= =?UTF-8?q?=D1=83=D0=BB=D1=8C=20photo=5Fbot=20(=D0=BF=D0=B0=D1=82=D1=82?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=20=D0=9B=D0=9A)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/main.cpython-313.pyc | Bin 0 -> 11153 bytes main.py | 28 +----------- .../__pycache__/handlers.cpython-313.pyc | Bin 0 -> 25104 bytes photo_bot/handlers.py | 41 ++++++++++++++++++ 4 files changed, 43 insertions(+), 26 deletions(-) create mode 100644 __pycache__/main.cpython-313.pyc create mode 100644 photo_bot/__pycache__/handlers.cpython-313.pyc diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..080bf7356dc5b5f3d44df9b70be4b67aacf4caaf GIT binary patch literal 11153 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 310ff87..352f2b1 100644 --- a/main.py +++ b/main.py @@ -123,32 +123,8 @@ async def main_menu(msg: Message): return elif action == "PHOTO": USER_MENU_SHOWN[user_id] = True - from photo_bot.handlers import check_moderation_status - from utils.texts import photo_moderation_pending, photo_rejected_notice - if not PHOTO_TEST_MODE: - status = await check_moderation_status(user_id) - if status.get("status") == "ok" and status.get("moderation_status") == "pending": - photo_id = status.get("photo_id", "???") - log_menu_stats(user_id, "Photo Bot", "Вход заблокирован — фото на модерации") - await msg.answer( - photo_moderation_pending(photo_id), - parse_mode="html" - ) - return - elif status.get("status") == "ok" and status.get("moderation_status") == "rejected": - reason = (status.get("rejection_reason") or "Причина не указана.").strip() - log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина") - await msg.answer(photo_rejected_notice(reason), parse_mode="html") - # Кнопки остаются: пользователь отправляет новое фото (меню ниже) - elif status.get("status") != "ok": - logger.warning(f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}") - set_state(user_id, "PHOTO_MODE") - log_menu_stats(user_id, "Photo Bot (TEST)" if PHOTO_TEST_MODE else "Photo Bot", "Вход") - from utils.texts import PHOTO_TEST_ENTRY_TEXT - await msg.answer( - PHOTO_TEST_ENTRY_TEXT if PHOTO_TEST_MODE else PHOTO_MAIN_MENU_TEXT, - parse_mode="html" - ) + from photo_bot.handlers import send_dynamic_photo_main_menu + await send_dynamic_photo_main_menu(msg, user_id) return elif action == "TRANSCRIPTION": USER_MENU_SHOWN[user_id] = True diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3e6d474bfb554af2b3c08c26eeb294029f30f144 GIT binary patch literal 25104 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 dict: return {"status": "error", "reason": str(e)} +# ========================================================= +# ВХОД В РАЗДЕЛ ФОТО: проверка статуса модерации + показ меню +# ========================================================= +async def send_dynamic_photo_main_menu(msg: Message, user_id: str): + """Вход в раздел фото (паттерн ЛК): модуль сам запрашивает данные и показывает их. + + - pending — показать инфо «фото на модерации» и НЕ вводить в модуль + (кнопок загрузки фото нет); + - rejected — показать причину отказа, кнопки остаются (новое фото); + - иначе/ошибка API — штатный вход в модуль. + """ + if not config.PHOTO_TEST_MODE: + status = await check_moderation_status(user_id) + if status.get("status") == "ok" and status.get("moderation_status") == "pending": + photo_id = status.get("photo_id", "???") + log_menu_stats(user_id, "Photo Bot", "Вход заблокирован — фото на модерации") + await msg.answer( + photo_moderation_pending(photo_id), + parse_mode="html" + ) + return + elif status.get("status") == "ok" and status.get("moderation_status") == "rejected": + reason = (status.get("rejection_reason") or "Причина не указана.").strip() + log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина") + await msg.answer(photo_rejected_notice(reason), parse_mode="html") + # Меню показывается ниже: кнопки остаются, пользователь шлёт новое фото + elif status.get("status") != "ok": + logger.warning( + f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}" + ) + + states.set_state(user_id, "PHOTO_MODE") + log_menu_stats(user_id, "Photo Bot (TEST)" if config.PHOTO_TEST_MODE else "Photo Bot", "Вход") + await msg.answer( + PHOTO_TEST_ENTRY_TEXT if config.PHOTO_TEST_MODE else PHOTO_MAIN_MENU_TEXT, + parse_mode="html" + ) + + # ========================================================= # ОСНОВНОЙ ОБРАБОТЧИК # =========================================================