Фото: входное сообщение универсальное (меню + статус модерации одним сообщением)
This commit is contained in:
Binary file not shown.
+14
-12
@@ -30,7 +30,7 @@ from utils.texts import (
|
|||||||
photo_cancel_text,
|
photo_cancel_text,
|
||||||
photo_preview_ready,
|
photo_preview_ready,
|
||||||
photo_moderation_pending,
|
photo_moderation_pending,
|
||||||
photo_rejected_notice,
|
photo_welcome_with_status,
|
||||||
PHOTO_TEST_ENTRY_TEXT,
|
PHOTO_TEST_ENTRY_TEXT,
|
||||||
PHOTO_TEST_WELCOME_TEXT,
|
PHOTO_TEST_WELCOME_TEXT,
|
||||||
PHOTO_TEST_PREVIEW_TEXT,
|
PHOTO_TEST_PREVIEW_TEXT,
|
||||||
@@ -158,14 +158,16 @@ async def check_moderation_status(user_id: str) -> dict:
|
|||||||
async def send_dynamic_photo_main_menu(msg: Message, user_id: str):
|
async def send_dynamic_photo_main_menu(msg: Message, user_id: str):
|
||||||
"""Вход в раздел фото (паттерн ЛК): модуль сам запрашивает данные и показывает их.
|
"""Вход в раздел фото (паттерн ЛК): модуль сам запрашивает данные и показывает их.
|
||||||
|
|
||||||
- pending — показать инфо «фото на модерации» и НЕ вводить в модуль
|
- pending — отдельное сообщение «фото на модерации», модуль НЕ открывается
|
||||||
(кнопок загрузки фото нет);
|
(кнопок загрузки фото нет);
|
||||||
- rejected — показать причину отказа, кнопки остаются (новое фото);
|
- rejected — ОДНО сообщение: меню + причина отказа (кнопки на месте);
|
||||||
- иначе/ошибка API — штатный вход в модуль.
|
- иначе/ошибка API — штатное меню входа.
|
||||||
"""
|
"""
|
||||||
|
status = None
|
||||||
if not config.PHOTO_TEST_MODE:
|
if not config.PHOTO_TEST_MODE:
|
||||||
status = await check_moderation_status(user_id)
|
status = await check_moderation_status(user_id)
|
||||||
if status.get("status") == "ok" and status.get("moderation_status") == "pending":
|
if status.get("status") == "ok" and status.get("moderation_status") == "pending":
|
||||||
|
# Фото на модерации — не вводим в модуль (кнопок загрузки нет)
|
||||||
photo_id = status.get("photo_id", "???")
|
photo_id = status.get("photo_id", "???")
|
||||||
log_menu_stats(user_id, "Photo Bot", "Вход заблокирован — фото на модерации")
|
log_menu_stats(user_id, "Photo Bot", "Вход заблокирован — фото на модерации")
|
||||||
await msg.answer(
|
await msg.answer(
|
||||||
@@ -173,22 +175,22 @@ async def send_dynamic_photo_main_menu(msg: Message, user_id: str):
|
|||||||
parse_mode="html"
|
parse_mode="html"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
elif status.get("status") == "ok" and status.get("moderation_status") == "rejected":
|
if status.get("status") == "ok" and status.get("moderation_status") == "rejected":
|
||||||
reason = (status.get("rejection_reason") or "Причина не указана.").strip()
|
|
||||||
log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина")
|
log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина")
|
||||||
await msg.answer(photo_rejected_notice(reason), parse_mode="html")
|
|
||||||
# Меню показывается ниже: кнопки остаются, пользователь шлёт новое фото
|
|
||||||
elif status.get("status") != "ok":
|
elif status.get("status") != "ok":
|
||||||
logger.warning(
|
logger.warning(
|
||||||
f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}"
|
f"Не удалось проверить статус модерации для {user_id}: {status.get('reason')}"
|
||||||
)
|
)
|
||||||
|
status = None
|
||||||
|
|
||||||
states.set_state(user_id, "PHOTO_MODE")
|
states.set_state(user_id, "PHOTO_MODE")
|
||||||
log_menu_stats(user_id, "Photo Bot (TEST)" if config.PHOTO_TEST_MODE else "Photo Bot", "Вход")
|
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,
|
if config.PHOTO_TEST_MODE:
|
||||||
parse_mode="html"
|
entry_text = PHOTO_TEST_ENTRY_TEXT
|
||||||
)
|
else:
|
||||||
|
entry_text = photo_welcome_with_status(status)
|
||||||
|
await msg.answer(entry_text, parse_mode="html")
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
|
|||||||
Binary file not shown.
+25
-5
@@ -202,13 +202,17 @@ def sd_file_upload_error() -> str:
|
|||||||
|
|
||||||
# --- Private functions (Internal logic) ---
|
# --- 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 = (
|
text = (
|
||||||
f"🖼 <b>Режим обновления фото профиля</b>\n\n"
|
f"🖼 <b>Режим обновления фото профиля</b>\n\n"
|
||||||
f"📸 Пришлите мне вашу фотографию.\n\n"
|
f"📸 Пришлите мне вашу фотографию.\n\n"
|
||||||
f"Бот автоматически найдёт лицо, покажет превью\n"
|
f"Бот автоматически найдёт лицо, покажет превью\n"
|
||||||
f"и отправит фото на публикацию в ваши корпоративные сервисы.\n\n"
|
f"и отправит фото на публикацию в ваши корпоративные сервисы.\n\n"
|
||||||
)
|
)
|
||||||
|
if info:
|
||||||
|
text += info + "\n\n"
|
||||||
if show_test:
|
if show_test:
|
||||||
text += f"{emojis['1']} — тест проверка фото\n"
|
text += f"{emojis['1']} — тест проверка фото\n"
|
||||||
return text + f"{emojis['0']} — В главное меню"
|
return text + f"{emojis['0']} — В главное меню"
|
||||||
@@ -245,12 +249,25 @@ def _photo_moderation_pending(photo_id: str, emojis: dict) -> str:
|
|||||||
f"{emojis['0']} — В главное меню"
|
f"{emojis['0']} — В главное меню"
|
||||||
)
|
)
|
||||||
|
|
||||||
def _photo_rejected_notice(reason: str, emojis: dict) -> str:
|
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 (
|
return (
|
||||||
f"⚠️ <b>Ваше предыдущее фото было отклонено.</b>\n\n"
|
f"⚠️ <b>Ваше предыдущее фото было отклонено.</b>\n"
|
||||||
f"📝 Причина: {reason}\n\n"
|
f"📝 Причина: {reason}\n\n"
|
||||||
f"Пожалуйста, отправьте новое фото."
|
f"Пожалуйста, отправьте новое фото."
|
||||||
)
|
)
|
||||||
|
if ms == "pending":
|
||||||
|
return (
|
||||||
|
f"⏳ <b>У вас уже есть фото на модерации.</b>\n"
|
||||||
|
f"Ожидайте решения модератора."
|
||||||
|
)
|
||||||
|
return None
|
||||||
|
|
||||||
def _photo_test_welcome(emojis: dict) -> str:
|
def _photo_test_welcome(emojis: dict) -> str:
|
||||||
return (
|
return (
|
||||||
@@ -378,8 +395,11 @@ def photo_cancel_text() -> str:
|
|||||||
def photo_moderation_pending(photo_id: str) -> str:
|
def photo_moderation_pending(photo_id: str) -> str:
|
||||||
return _photo_moderation_pending(photo_id, EMOJI_DIGITS)
|
return _photo_moderation_pending(photo_id, EMOJI_DIGITS)
|
||||||
|
|
||||||
def photo_rejected_notice(reason: str) -> str:
|
def photo_welcome_with_status(status: dict = None) -> str:
|
||||||
return _photo_rejected_notice(reason, EMOJI_DIGITS)
|
"""Универсальное входное сообщение фото-режима: меню + статус модерации,
|
||||||
|
если он требует внимания (отказ с причиной)."""
|
||||||
|
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_WELCOME_TEXT = _photo_test_welcome(EMOJI_DIGITS)
|
||||||
PHOTO_TEST_PREVIEW_TEXT = _photo_test_preview(EMOJI_DIGITS)
|
PHOTO_TEST_PREVIEW_TEXT = _photo_test_preview(EMOJI_DIGITS)
|
||||||
|
|||||||
Reference in New Issue
Block a user