docs: подробная документация (UX + код), фикс дублей, /help без подписки, v0.1.0+19

This commit is contained in:
admin committed 2026-10-06 18:31:44 +02:00
1 parent f5d6fa95bd
commit a2927052f4
5 files changed
+243 -123

No files matched your search

+7 -82
View File
@@ -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: