docs: подробная документация (UX + код), фикс дублей, /help без подписки, v0.1.0+19
This commit is contained in:
1 parent
f5d6fa95bd
commit
a2927052f4
5 files changed
+243
-123
No files matched your search
@@ -163,48 +163,6 @@ async def start(message: Message) -> None:
|
||||
)
|
||||
|
||||
|
||||
async def balance_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
sub = await asyncio.to_thread(subscription_row, message.from_user.id)
|
||||
await _show_subscription_info(message, sub)
|
||||
|
||||
|
||||
async def subscribe_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
await asyncio.to_thread(ensure_subscription, message.from_user.id)
|
||||
await message.answer(
|
||||
f"Активирую подписку на 30 дней. "
|
||||
f"Для оплаты пришли {SUBSCRIPTION_PRICE_STARS} звёзд в этом чате.\n\n"
|
||||
f"Жду оплаты..."
|
||||
)
|
||||
days = await asyncio.to_thread(activate_subscription, message.from_user.id, months=1)
|
||||
await asyncio.sleep(0.6)
|
||||
await message.answer(
|
||||
f"Подписка активирована на {days} дн. Спасибо за оплату {SUBSCRIPTION_PRICE_STARS} звёзд!\n\n"
|
||||
f"Теперь доступны генерация постов, идей и голосовые."
|
||||
)
|
||||
|
||||
|
||||
async def clear_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
await asyncio.to_thread(clear_user_data, message.from_user.id)
|
||||
await message.answer(
|
||||
"Команда /clear полностью обнулила твои данные: Tone of Voice, тексты со скриншотов, историю постов, историю идей и настройки. "
|
||||
"API-логи для отладки сохранены. Пришли новые скриншоты, чтобы настроить стиль заново."
|
||||
)
|
||||
deactivate_subscription(message.from_user.id)
|
||||
await message.answer(
|
||||
"Подписка обнулена. У тебя нет активной подписки и триала — сгенерировать пост нельзя. "
|
||||
f"Чтобы продолжить, купи подписку за {SUBSCRIPTION_PRICE_STARS} звёзд командой /subscribe."
|
||||
)
|
||||
|
||||
|
||||
async def _show_subscription_info(message: Message, sub: sqlite3.Row | None) -> None:
|
||||
if not sub:
|
||||
await message.answer("У тебя нет активной подписки или триала. Начни с команды /subscribe.")
|
||||
@@ -258,32 +216,6 @@ async def subscribe_command(message: Message) -> None:
|
||||
)
|
||||
|
||||
|
||||
async def balance_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
sub = await asyncio.to_thread(subscription_row, message.from_user.id)
|
||||
await _show_subscription_info(message, sub)
|
||||
|
||||
|
||||
async def subscribe_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
await asyncio.to_thread(ensure_subscription, message.from_user.id)
|
||||
await message.answer(
|
||||
f"Активирую подписку на 30 дней. "
|
||||
f"Для оплаты пришли {SUBSCRIPTION_PRICE_STARS} звёзд в этом чате.\n\n"
|
||||
f"Жду оплаты..."
|
||||
)
|
||||
days = await asyncio.to_thread(activate_subscription, message.from_user.id, months=1)
|
||||
await asyncio.sleep(0.6)
|
||||
await message.answer(
|
||||
f"Подписка активирована на {days} дн. Спасибо за оплату {SUBSCRIPTION_PRICE_STARS} звёзд!\n\n"
|
||||
f"Теперь доступны генерация постов, идей и голосовые."
|
||||
)
|
||||
|
||||
|
||||
async def clear_command(message: Message) -> None:
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
@@ -333,16 +265,6 @@ async def _send_three_posts(message: Message, posts: list[str], user_id: int | N
|
||||
await asyncio.to_thread(save_generated_posts, user_id, posts, origin)
|
||||
|
||||
|
||||
async def _check_subscription(message: Message) -> bool:
|
||||
if message.from_user is None:
|
||||
return False
|
||||
if not await asyncio.to_thread(is_subscribed, message.from_user.id):
|
||||
sub = await asyncio.to_thread(subscription_row, message.from_user.id)
|
||||
await _show_subscription_info(message, sub)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def typing_status(bot: Bot, chat_id: int):
|
||||
@@ -374,10 +296,13 @@ async def _classify_and_respond(message: Message, text: str, show_typing: bool =
|
||||
if message.from_user is None:
|
||||
await message.answer("Не удалось определить пользователя.")
|
||||
return
|
||||
# Если подписка не активна — блокируем генерацию, но пропускаем /help
|
||||
if text.strip() != "/help":
|
||||
if not await _check_subscription(message):
|
||||
return
|
||||
# /help всегда доступен, даже без подписки
|
||||
if text.strip().casefold() == "/help":
|
||||
await help_command(message)
|
||||
return
|
||||
# Если подписка не активна — блокируем генерацию
|
||||
if not await _check_subscription(message):
|
||||
return
|
||||
reply_message = message.reply_to_message
|
||||
original_post = ""
|
||||
if reply_message and reply_message.from_user and reply_message.from_user.is_bot:
|
||||
|
||||
Reference in new issue
Block a user