Фото: pending-состояние — модуль остаётся открыт; тест-режим: фото можно отправить на тест; прочий ввод → ошибка неверного выбора

This commit is contained in:
dddennnisss
2026-08-22 00:08:34 +07:00
parent 1bdfd163fe
commit e08c861149
4 changed files with 77 additions and 11 deletions
+52 -7
View File
@@ -31,6 +31,8 @@ from utils.texts import (
photo_preview_ready,
photo_moderation_pending,
photo_welcome_with_status,
photo_invalid_cmd,
photo_test_welcome,
PHOTO_TEST_WELCOME_TEXT,
PHOTO_TEST_PREVIEW_TEXT,
PHOTO_TEST_AI_CHECKING_TEXT,
@@ -51,6 +53,10 @@ pending_photos = {}
# Пользователи, находящиеся в под-режиме «тест проверка фото»
test_submode_users = set()
# Пользователи, у которых фото на модерации (вход заблокирован,
# модуль остаётся открыт: в тест-режиме можно отправить фото на тест)
moderation_pending_users = set()
def in_test_submode(user_id: str) -> bool:
"""Проверяет, находится ли пользователь в под-режиме тест-проверки фото"""
if user_id not in test_submode_users:
@@ -157,8 +163,9 @@ async def check_moderation_status(user_id: str) -> dict:
async def send_dynamic_photo_main_menu(msg: Message, user_id: str):
"""Вход в раздел фото (паттерн ЛК): модуль сам запрашивает данные и показывает их.
- pending — отдельное сообщение «фото на модерации», модуль НЕ открывается
(кнопок загрузки фото нет);
- pending — сообщение «фото на модерации»; модуль остаётся открыт
(цифры → ошибка неверного выбора, 0 — выход). Тест-режим:
фото можно отправить на проверку в ИИ;
- rejected — ОДНО сообщение: меню + причина отказа (кнопки на месте);
- иначе/ошибка API — штатное меню входа.
Статус проверяется и показывается всегда, включая тестовый режим.
@@ -166,13 +173,21 @@ async def send_dynamic_photo_main_menu(msg: Message, user_id: str):
# Статус модерации запрашиваем всегда (и в тестовом режиме тоже)
status = await check_moderation_status(user_id)
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", "Вход заблокирован — фото на модерации")
await msg.answer(
photo_moderation_pending(photo_id),
parse_mode="html"
)
states.set_state(user_id, "PHOTO_MODE")
moderation_pending_users.add(user_id)
if config.PHOTO_TEST_MODE:
# Тест-режим: можно отправить фото на проверку в ИИ
test_submode_users.add(user_id)
await msg.answer(photo_test_welcome(photo_id), parse_mode="html")
else:
await msg.answer(
photo_moderation_pending(photo_id),
parse_mode="html"
)
return
if status.get("status") == "ok" and status.get("moderation_status") == "rejected":
log_menu_stats(user_id, "Photo Bot", "Вход — фото отклонено, показана причина")
@@ -219,6 +234,7 @@ async def photo_module_handler(msg: Message):
log_menu_stats(user_id, "Photo Bot", "Выход в главное меню")
states.clear_state(user_id)
test_submode_users.discard(user_id)
moderation_pending_users.discard(user_id)
if user_id in pending_photos:
photo_data = pending_photos[user_id]
if os.path.exists(photo_data['path']):
@@ -230,6 +246,35 @@ async def photo_module_handler(msg: Message):
await msg.answer(MENU_TEXT, parse_mode="html")
return
# --- СОСТОЯНИЕ «ФОТО НА МОДЕРАЦИИ»: активного фото нет ---
if user_id in moderation_pending_users and user_id not in pending_photos:
if not is_attachment:
status = await check_moderation_status(user_id)
still_pending = (
status.get("status") == "ok"
and status.get("moderation_status") == "pending"
)
if still_pending:
photo_id = status.get("photo_id", "???")
if config.PHOTO_TEST_MODE and in_test_submode(user_id):
# тест-режим: повторяем инфо (можно отправить фото на тест)
await msg.answer(photo_test_welcome(photo_id), parse_mode="html")
else:
# стандартная ошибка: кнопок, кроме 0, нет
await msg.answer(photo_invalid_cmd(), parse_mode="html")
return
# Статус изменился (одобрено/отклонено) — разблокируем
moderation_pending_users.discard(user_id)
if config.PHOTO_TEST_MODE:
await msg.answer(PHOTO_TEST_WELCOME_TEXT, parse_mode="html")
else:
await msg.answer(
photo_welcome_with_status(status), parse_mode="html"
)
return
# is_attachment — пропускаем: фото обрабатывается штатно ниже
# (тест-под-режим: превью + отправка в ИИ)
# --- ПРОВЕРКА СТАТУСА: если нет фото в pending_photos, проверяем статус модерации ---
# (в тестовом режиме статусы тоже показываем — поведение как в обычном режиме)
if user_id not in pending_photos and not is_attachment: