From 1c2d018be4057799a48b091c3f3b475785bcd7be Mon Sep 17 00:00:00 2001 From: dddennnisss Date: Fri, 21 Aug 2026 22:08:34 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=BE=D1=82=D0=BE:=20=D0=B2=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=BE=D0=B5=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=83=D0=BD=D0=B8=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20(=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8E=20+=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=D0=BC)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/handlers.cpython-313.pyc | Bin 25104 -> 24887 bytes photo_bot/handlers.py | 26 ++++++------ utils/__pycache__/texts.cpython-313.pyc | Bin 0 -> 46868 bytes utils/texts.py | 38 +++++++++++++----- 4 files changed, 43 insertions(+), 21 deletions(-) create mode 100644 utils/__pycache__/texts.cpython-313.pyc diff --git a/photo_bot/__pycache__/handlers.cpython-313.pyc b/photo_bot/__pycache__/handlers.cpython-313.pyc index 3e6d474bfb554af2b3c08c26eeb294029f30f144..681a76c4a26046b988bd5f0595b1223c4bb17b92 100644 GIT binary patch delta 1093 zcmZuvZA?>F7(NFsZMp5erR}PMMJ}{OC|{b2UvpcCT5%3)XqwFNqY&r>1GL`Wj=5+A z_62cKlOt|1k?0m(UA6=))kX(KbQ+f!&y6vVhHU;|F)sT7YW&K6>^;TmpPiiZyzhDM zbDrnTJ?H3kd~pg3j|G88Fcvxo_pBciFjtTt?g%NNKyR?CEz}(h^mZy8fr!$oL?dwr zw|1H6%0|eJBs7eCxF?Hzpj|=4DqU9lv-n|~6JtC1!)A9HHhzdutB6o@E>ma2k9|6y zPz$HokdU{I+_x1Uf@;&7x;^#$&|_7M4#x#BJvs2r;HW3%SGhoYVjgLN;lJN zenlr&S6VeC%+f?w71iaLz0BP5+MJx$6hYUy?`gqxNyejx^Xi-PGdq7)M!bjfqb7Z( z{wDf4GE-D!YS*F0e_`?KvOmV5Is*vX+j-P`_&`FTI_8Zp~rwS@;_=D znGh(ehouUMUQzpKQvDiiCg|uZL6Eu#n=*PS-O?3^NonyroCJ#j=;>N<&9ZdAuhr;z z^-IrvkPc@( zKd(Vc3I;uM98VHX=fOFxFs&_wIcs$d@pIPd*e7?bYX|umUO3_!avl9B<{5NR-aXB^ zRnGm$jm+y8_-sL3C__1GUPNl4p@CA51;?<*z@4irhjhw}Jw|TIve^xr8yf5}aW}LY zmK!lc6T`N}XBOXETDrn=3{>Q92K@jjyjmV6KW!P$IRm>WxmL0=zI*Ez+4vOsr+zaY zBdfMw#ov=h+n*a#IT1zf45v6{UpOd_kZ13Q3yw3LLkzxRU}LbC!ME}L9lzr;CYtt< z&$8@CfRsiKMxtFxDmN(0Avw?;*)9J#?2lxcxLwuSs|tkb zkcei8U+o~mHVx;+;eDC2)&`7+h{0Av{^=;1~)b}j2Rs2p2-ASLPQeik+PU73Q zRC7TsV`M9Udo{h~JE1Eq^1iuNS5Z;{0vw6k#7F#362VqQYV3l_jZn~t$j@r4S_ohR z>a8e+_PVuXYqLQgv}~3httKgZ6*iHyeZQg7&p6Eg;vhe%Y;bpNjS3ppZWj5KLF=YY zUT`?7E^Ck%``R_gw+M%CRSaO4WfYN=)bxK7f;$gTLT6G=??=q&F6HPS{lEBu*Hwxqc6s^b60Y2d+iuqI6Gp z-qS;m1oNKYs>M1RosLrH<9W*y1+f$soc;YrHcI@O;@p;WCixZjM7yYFihykT8HydSR{!TBK32`@F#;H|`0 zu(ym$?{|TktH55K%NY+KFqVzjD{#xE11(_O;jq`p-BGHTF7UV{N(fn%nO7P-cGJ7i zQ5t5zzFrZxNVDYX!5i8u%ryg$nLKn#fj=S@od dict: async def send_dynamic_photo_main_menu(msg: Message, user_id: str): """Вход в раздел фото (паттерн ЛК): модуль сам запрашивает данные и показывает их. - - pending — показать инфо «фото на модерации» и НЕ вводить в модуль + - pending — отдельное сообщение «фото на модерации», модуль НЕ открывается (кнопок загрузки фото нет); - - rejected — показать причину отказа, кнопки остаются (новое фото); - - иначе/ошибка API — штатный вход в модуль. + - rejected — ОДНО сообщение: меню + причина отказа (кнопки на месте); + - иначе/ошибка API — штатное меню входа. """ + status = None 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( @@ -173,22 +175,22 @@ async def send_dynamic_photo_main_menu(msg: Message, user_id: str): parse_mode="html" ) return - elif status.get("status") == "ok" and status.get("moderation_status") == "rejected": - reason = (status.get("rejection_reason") or "Причина не указана.").strip() + if status.get("status") == "ok" and status.get("moderation_status") == "rejected": 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')}" ) + status = None 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" - ) + # Одно универсальное сообщение: меню + (если нужно) причина отказа + if config.PHOTO_TEST_MODE: + entry_text = PHOTO_TEST_ENTRY_TEXT + else: + entry_text = photo_welcome_with_status(status) + await msg.answer(entry_text, parse_mode="html") # ========================================================= diff --git a/utils/__pycache__/texts.cpython-313.pyc b/utils/__pycache__/texts.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2b7bdff47693ce8aaf20a460bc7cac1a838d5ad GIT binary patch literal 46868 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 tQ str: # --- Private functions (Internal logic) --- -def _photo_welcome(emojis: dict, show_test: bool = False) -> str: +def _photo_welcome(emojis: dict, show_test: bool = False, info: str = None) -> str: + """Входное сообщение фото-режима. info — необязательный блок о статусе + модерации (отказ/ожидание) — вставляется перед списком кнопок.""" text = ( f"🖼 Режим обновления фото профиля\n\n" 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']} — В главное меню" @@ -245,12 +249,25 @@ def _photo_moderation_pending(photo_id: str, emojis: dict) -> str: f"{emojis['0']} — В главное меню" ) -def _photo_rejected_notice(reason: str, emojis: dict) -> str: - return ( - f"⚠️ Ваше предыдущее фото было отклонено.\n\n" - f"📝 Причина: {reason}\n\n" - f"Пожалуйста, отправьте новое фото." - ) +def _photo_status_info(status: dict = None, emojis: dict = None) -> str | None: + """Блок о статусе модерации для входного сообщения. Универсальный для всех + случаев: rejected → причина отказа, pending → ожидание, прочее → пусто.""" + if not status or status.get("status") != "ok": + return None + ms = status.get("moderation_status") + if ms == "rejected": + reason = (status.get("rejection_reason") or "Причина не указана.").strip() + return ( + f"⚠️ Ваше предыдущее фото было отклонено.\n" + f"📝 Причина: {reason}\n\n" + f"Пожалуйста, отправьте новое фото." + ) + if ms == "pending": + return ( + f"⏳ У вас уже есть фото на модерации.\n" + f"Ожидайте решения модератора." + ) + return None def _photo_test_welcome(emojis: dict) -> str: return ( @@ -378,8 +395,11 @@ def photo_cancel_text() -> str: def photo_moderation_pending(photo_id: str) -> str: return _photo_moderation_pending(photo_id, EMOJI_DIGITS) -def photo_rejected_notice(reason: str) -> str: - return _photo_rejected_notice(reason, EMOJI_DIGITS) +def photo_welcome_with_status(status: dict = None) -> str: + """Универсальное входное сообщение фото-режима: меню + статус модерации, + если он требует внимания (отказ с причиной).""" + info = _photo_status_info(status, EMOJI_DIGITS) + return _photo_welcome(EMOJI_DIGITS, info=info) PHOTO_TEST_WELCOME_TEXT = _photo_test_welcome(EMOJI_DIGITS) PHOTO_TEST_PREVIEW_TEXT = _photo_test_preview(EMOJI_DIGITS)