temp
This commit is contained in:
@@ -34,8 +34,18 @@ async def create_bot() -> tuple[Bot, Dispatcher]:
|
||||
async def start_bot():
|
||||
bot = None
|
||||
try:
|
||||
if not settings.TELEGRAM_BOT_TOKEN or not settings.TELEGRAM_BOT_TOKEN.strip():
|
||||
raise ValueError("TELEGRAM_BOT_TOKEN не установлен в переменных окружения или файле .env")
|
||||
|
||||
bot, dp = await create_bot()
|
||||
|
||||
try:
|
||||
bot_info = await bot.get_me()
|
||||
username = bot_info.username if bot_info.username else f"ID: {bot_info.id}"
|
||||
logger.info(f"Бот успешно подключен: @{username}")
|
||||
except Exception as e:
|
||||
raise ValueError(f"Неверный токен Telegram бота: {e}")
|
||||
|
||||
try:
|
||||
webhook_info = await bot.get_webhook_info()
|
||||
if webhook_info.url:
|
||||
|
||||
@@ -4,14 +4,11 @@ from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton
|
||||
from decimal import Decimal
|
||||
from tg_bot.config.settings import settings
|
||||
from tg_bot.payment.yookassa.client import yookassa_client
|
||||
from tg_bot.infrastructure.database.database import AsyncSessionLocal
|
||||
from tg_bot.infrastructure.database.models import PaymentModel
|
||||
from tg_bot.domain.services.user_service import UserService
|
||||
from sqlalchemy import select
|
||||
import uuid
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
|
||||
router = Router()
|
||||
user_service = UserService()
|
||||
|
||||
|
||||
@router.message(Command("buy"))
|
||||
@@ -19,23 +16,21 @@ async def cmd_buy(message: Message):
|
||||
user_id = message.from_user.id
|
||||
username = message.from_user.username or f"user_{user_id}"
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
user_service = UserService(session)
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
try:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
|
||||
if user and user.is_premium and user.premium_until and user.premium_until > datetime.now():
|
||||
days_left = (user.premium_until - datetime.now()).days
|
||||
await message.answer(
|
||||
f"<b>У вас уже есть активная подписка!</b>\n\n"
|
||||
f"• Статус: Premium активен\n"
|
||||
f"• Действует до: {user.premium_until.strftime('%d.%m.%Y')}\n"
|
||||
f"• Осталось дней: {days_left}\n\n"
|
||||
f"Новая подписка будет добавлена к текущей.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
if user and user.is_premium and user.premium_until and user.premium_until > datetime.now():
|
||||
days_left = (user.premium_until - datetime.now()).days
|
||||
await message.answer(
|
||||
f"<b>У вас уже есть активная подписка!</b>\n\n"
|
||||
f"• Статус: Premium активен\n"
|
||||
f"• Действует до: {user.premium_until.strftime('%d.%m.%Y')}\n"
|
||||
f"• Осталось дней: {days_left}\n\n"
|
||||
f"Новая подписка будет добавлена к текущей.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
await message.answer(
|
||||
"*Создаю ссылку для оплаты...*\n\n"
|
||||
@@ -49,24 +44,8 @@ async def cmd_buy(message: Message):
|
||||
description=f"Подписка VibeLawyerBot для @{username}",
|
||||
user_id=user_id
|
||||
)
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
payment = PaymentModel(
|
||||
payment_id=str(uuid.uuid4()),
|
||||
user_id=user_id,
|
||||
amount=str(settings.PAYMENT_AMOUNT),
|
||||
currency="RUB",
|
||||
status="pending",
|
||||
yookassa_payment_id=payment_data["id"],
|
||||
description="Оплата подписки VibeLawyerBot"
|
||||
)
|
||||
session.add(payment)
|
||||
await session.commit()
|
||||
print(f"Платёж сохранён в БД: {payment.payment_id}")
|
||||
except Exception as e:
|
||||
print(f"Ошибка сохранения платежа в БД: {e}")
|
||||
await session.rollback()
|
||||
|
||||
print(f"Платёж создан в ЮKассе: {payment_data['id']}")
|
||||
|
||||
keyboard = InlineKeyboardMarkup(
|
||||
inline_keyboard=[
|
||||
@@ -139,27 +118,15 @@ async def check_payment_status(callback_query: types.CallbackQuery):
|
||||
payment = YooPayment.find_one(yookassa_id)
|
||||
|
||||
if payment.status == "succeeded":
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
result = await session.execute(
|
||||
select(PaymentModel).filter_by(yookassa_payment_id=yookassa_id)
|
||||
)
|
||||
db_payment = result.scalar_one_or_none()
|
||||
|
||||
if db_payment:
|
||||
db_payment.status = "succeeded"
|
||||
user_service = UserService(session)
|
||||
success = await user_service.activate_premium(user_id)
|
||||
if success:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
await session.commit()
|
||||
if not user:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
|
||||
try:
|
||||
success = await user_service.activate_premium(user_id)
|
||||
if success:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
if user:
|
||||
await callback_query.message.answer(
|
||||
"<b>Оплата подтверждена!</b>\n\n"
|
||||
f"Ваш premium-доступ активирован до: "
|
||||
f"<b>{user.premium_until.strftime('%d.%m.%Y')}</b>\n\n"
|
||||
f"<b>{user.premium_until.strftime('%d.%m.%Y') if user.premium_until else 'Не указано'}</b>\n\n"
|
||||
"Теперь вы можете:\n"
|
||||
"• Задавать неограниченное количество вопросов\n"
|
||||
"• Получать приоритетные ответы\n"
|
||||
@@ -169,12 +136,23 @@ async def check_payment_status(callback_query: types.CallbackQuery):
|
||||
)
|
||||
else:
|
||||
await callback_query.message.answer(
|
||||
"<b>Платёж найден в ЮKассе, но не в нашей БД</b>\n\n"
|
||||
"<b>Оплата подтверждена, но не удалось активировать premium</b>\n\n"
|
||||
"Пожалуйста, обратитесь к администратору.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Ошибка обработки платежа: {e}")
|
||||
else:
|
||||
await callback_query.message.answer(
|
||||
"<b>Оплата подтверждена, но не удалось активировать premium</b>\n\n"
|
||||
"Пожалуйста, обратитесь к администратору.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Ошибка обработки платежа: {e}")
|
||||
await callback_query.message.answer(
|
||||
"<b>Ошибка активации premium</b>\n\n"
|
||||
"Пожалуйста, обратитесь к администратору.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
elif payment.status == "pending":
|
||||
await callback_query.message.answer(
|
||||
@@ -206,42 +184,13 @@ async def check_payment_status(callback_query: types.CallbackQuery):
|
||||
|
||||
@router.message(Command("mypayments"))
|
||||
async def cmd_my_payments(message: Message):
|
||||
user_id = message.from_user.id
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
result = await session.execute(
|
||||
select(PaymentModel).filter_by(user_id=user_id).order_by(PaymentModel.created_at.desc()).limit(10)
|
||||
)
|
||||
payments = result.scalars().all()
|
||||
|
||||
if not payments:
|
||||
await message.answer(
|
||||
"<b>У вас пока нет платежей</b>\n\n"
|
||||
"Используйте команду /buy чтобы оформить подписку.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
return
|
||||
|
||||
response = ["<b>Ваши последние платежи:</b>\n"]
|
||||
|
||||
for i, payment in enumerate(payments, 1):
|
||||
status_text = "Успешно" if payment.status == "succeeded" else "Ожидание" if payment.status == "pending" else "Ошибка"
|
||||
response.append(
|
||||
f"\n<b>{i}. {payment.amount} руб. ({status_text})</b>\n"
|
||||
f"Статус: {payment.status}\n"
|
||||
f"Дата: {payment.created_at.strftime('%d.%m.%Y %H:%M')}\n"
|
||||
f"ID: <code>{payment.payment_id[:8]}...</code>"
|
||||
)
|
||||
|
||||
response.append("\n\n<i>Полный доступ открывается после успешной оплаты</i>")
|
||||
|
||||
await message.answer(
|
||||
"\n".join(response),
|
||||
parse_mode="HTML"
|
||||
)
|
||||
except Exception as e:
|
||||
print(f"Ошибка получения платежей: {e}")
|
||||
await message.answer(
|
||||
"<b>История платежей</b>\n\n"
|
||||
"История платежей хранится в системе оплаты ЮKassa.\n"
|
||||
"Для проверки статуса подписки используйте команду /stats.\n\n"
|
||||
"Для оформления новой подписки используйте команду /buy",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
|
||||
@router.message(Command("testcards"))
|
||||
|
||||
@@ -2,17 +2,16 @@ from aiogram import Router
|
||||
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery
|
||||
from aiogram.filters import Command
|
||||
import aiohttp
|
||||
from tg_bot.config.settings import settings
|
||||
|
||||
router = Router()
|
||||
|
||||
BACKEND_URL = "http://localhost:8001/api/v1"
|
||||
|
||||
|
||||
async def get_user_collections(telegram_id: str):
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/collections/",
|
||||
f"{settings.BACKEND_URL}/collections/",
|
||||
headers={"X-Telegram-ID": telegram_id}
|
||||
) as response:
|
||||
if response.status == 200:
|
||||
@@ -27,7 +26,7 @@ async def get_collection_documents(collection_id: str, telegram_id: str):
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/documents/collection/{collection_id}",
|
||||
f"{settings.BACKEND_URL}/documents/collection/{collection_id}",
|
||||
headers={"X-Telegram-ID": telegram_id}
|
||||
) as response:
|
||||
if response.status == 200:
|
||||
@@ -42,7 +41,7 @@ async def search_in_collection(collection_id: str, query: str, telegram_id: str)
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/documents/collection/{collection_id}",
|
||||
f"{settings.BACKEND_URL}/documents/collection/{collection_id}",
|
||||
params={"search": query},
|
||||
headers={"X-Telegram-ID": telegram_id}
|
||||
) as response:
|
||||
|
||||
@@ -3,14 +3,12 @@ from aiogram.types import Message
|
||||
from datetime import datetime
|
||||
import aiohttp
|
||||
from tg_bot.config.settings import settings
|
||||
from tg_bot.infrastructure.database.database import AsyncSessionLocal
|
||||
from tg_bot.infrastructure.database.models import UserModel
|
||||
from tg_bot.domain.services.user_service import UserService
|
||||
from tg_bot.domain.services.user_service import UserService, User
|
||||
from tg_bot.application.services.rag_service import RAGService
|
||||
|
||||
router = Router()
|
||||
BACKEND_URL = "http://localhost:8001/api/v1"
|
||||
rag_service = RAGService()
|
||||
user_service = UserService()
|
||||
|
||||
@router.message()
|
||||
async def handle_question(message: Message):
|
||||
@@ -19,58 +17,37 @@ async def handle_question(message: Message):
|
||||
if question_text.startswith('/'):
|
||||
return
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
user_service = UserService(session)
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
try:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
|
||||
if not user:
|
||||
user = await user_service.get_or_create_user(
|
||||
user_id,
|
||||
message.from_user.username or "",
|
||||
message.from_user.first_name or "",
|
||||
message.from_user.last_name or ""
|
||||
)
|
||||
await ensure_user_in_backend(str(user_id), message.from_user)
|
||||
|
||||
if user.is_premium:
|
||||
await process_premium_question(message, user, question_text, user_service)
|
||||
|
||||
elif user.questions_used < settings.FREE_QUESTIONS_LIMIT:
|
||||
await process_free_question(message, user, question_text, user_service)
|
||||
|
||||
else:
|
||||
await handle_limit_exceeded(message, user)
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error processing question: {e}")
|
||||
await message.answer(
|
||||
"Произошла ошибка. Попробуйте позже.",
|
||||
parse_mode="HTML"
|
||||
if not user:
|
||||
user = await user_service.get_or_create_user(
|
||||
user_id,
|
||||
message.from_user.username or "",
|
||||
message.from_user.first_name or "",
|
||||
message.from_user.last_name or ""
|
||||
)
|
||||
|
||||
if user.is_premium:
|
||||
await process_premium_question(message, user, question_text)
|
||||
|
||||
elif user.questions_used < settings.FREE_QUESTIONS_LIMIT:
|
||||
await process_free_question(message, user, question_text)
|
||||
|
||||
else:
|
||||
await handle_limit_exceeded(message, user)
|
||||
|
||||
async def ensure_user_in_backend(telegram_id: str, telegram_user):
|
||||
try:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/users/telegram/{telegram_id}"
|
||||
) as response:
|
||||
if response.status == 200:
|
||||
return
|
||||
|
||||
async with session.post(
|
||||
f"{BACKEND_URL}/users",
|
||||
json={"telegram_id": telegram_id, "role": "user"}
|
||||
) as create_response:
|
||||
if create_response.status in [200, 201]:
|
||||
print(f"Пользователь {telegram_id} создан в backend")
|
||||
except Exception as e:
|
||||
print(f"Error creating user in backend: {e}")
|
||||
print(f"Error processing question: {e}")
|
||||
await message.answer(
|
||||
"Произошла ошибка. Попробуйте позже.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
|
||||
async def process_premium_question(message: Message, user: UserModel, question_text: str, user_service: UserService):
|
||||
await user_service.update_user_questions(user.telegram_id)
|
||||
async def process_premium_question(message: Message, user: User, question_text: str):
|
||||
await user_service.update_user_questions(int(user.telegram_id))
|
||||
user = await user_service.get_user_by_telegram_id(int(user.telegram_id))
|
||||
|
||||
await message.bot.send_chat_action(message.chat.id, "typing")
|
||||
|
||||
@@ -129,9 +106,9 @@ async def process_premium_question(message: Message, user: UserModel, question_t
|
||||
await message.answer(response, parse_mode="HTML")
|
||||
|
||||
|
||||
async def process_free_question(message: Message, user: UserModel, question_text: str, user_service: UserService):
|
||||
await user_service.update_user_questions(user.telegram_id)
|
||||
user = await user_service.get_user_by_telegram_id(user.telegram_id)
|
||||
async def process_free_question(message: Message, user: User, question_text: str):
|
||||
await user_service.update_user_questions(int(user.telegram_id))
|
||||
user = await user_service.get_user_by_telegram_id(int(user.telegram_id))
|
||||
remaining = settings.FREE_QUESTIONS_LIMIT - user.questions_used
|
||||
|
||||
await message.bot.send_chat_action(message.chat.id, "typing")
|
||||
@@ -201,9 +178,11 @@ async def process_free_question(message: Message, user: UserModel, question_text
|
||||
|
||||
async def save_conversation_to_backend(telegram_id: str, question: str, answer: str, sources: list):
|
||||
try:
|
||||
from tg_bot.config.settings import settings
|
||||
backend_url = settings.BACKEND_URL
|
||||
async with aiohttp.ClientSession() as session:
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/users/telegram/{telegram_id}"
|
||||
f"{backend_url}/users/telegram/{telegram_id}"
|
||||
) as user_response:
|
||||
if user_response.status != 200:
|
||||
return
|
||||
@@ -211,7 +190,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
user_uuid = user_data.get("user_id")
|
||||
|
||||
async with session.get(
|
||||
f"{BACKEND_URL}/collections/",
|
||||
f"{backend_url}/collections/",
|
||||
headers={"X-Telegram-ID": telegram_id}
|
||||
) as collections_response:
|
||||
collections = []
|
||||
@@ -223,7 +202,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
collection_id = collections[0].get("collection_id")
|
||||
else:
|
||||
async with session.post(
|
||||
f"{BACKEND_URL}/collections",
|
||||
f"{backend_url}/collections",
|
||||
json={
|
||||
"name": "Основная коллекция",
|
||||
"description": "Коллекция по умолчанию",
|
||||
@@ -239,7 +218,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
return
|
||||
|
||||
async with session.post(
|
||||
f"{BACKEND_URL}/conversations",
|
||||
f"{backend_url}/conversations",
|
||||
json={"collection_id": str(collection_id)},
|
||||
headers={"X-Telegram-ID": telegram_id}
|
||||
) as conversation_response:
|
||||
@@ -252,7 +231,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
return
|
||||
|
||||
await session.post(
|
||||
f"{BACKEND_URL}/messages",
|
||||
f"{backend_url}/messages",
|
||||
json={
|
||||
"conversation_id": str(conversation_id),
|
||||
"content": question,
|
||||
@@ -262,7 +241,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
)
|
||||
|
||||
await session.post(
|
||||
f"{BACKEND_URL}/messages",
|
||||
f"{backend_url}/messages",
|
||||
json={
|
||||
"conversation_id": str(conversation_id),
|
||||
"content": answer,
|
||||
@@ -276,7 +255,7 @@ async def save_conversation_to_backend(telegram_id: str, question: str, answer:
|
||||
print(f"Error saving conversation: {e}")
|
||||
|
||||
|
||||
async def handle_limit_exceeded(message: Message, user: UserModel):
|
||||
async def handle_limit_exceeded(message: Message, user: User):
|
||||
response = (
|
||||
f"<b>Лимит бесплатных вопросов исчерпан!</b>\n\n"
|
||||
|
||||
|
||||
@@ -4,10 +4,10 @@ from aiogram.types import Message
|
||||
from datetime import datetime
|
||||
|
||||
from tg_bot.config.settings import settings
|
||||
from tg_bot.infrastructure.database.database import AsyncSessionLocal
|
||||
from tg_bot.domain.services.user_service import UserService
|
||||
|
||||
router = Router()
|
||||
user_service = UserService()
|
||||
|
||||
@router.message(Command("start"))
|
||||
async def cmd_start(message: Message):
|
||||
@@ -16,22 +16,19 @@ async def cmd_start(message: Message):
|
||||
username = message.from_user.username or ""
|
||||
first_name = message.from_user.first_name or ""
|
||||
last_name = message.from_user.last_name or ""
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
user_service = UserService(session)
|
||||
existing_user = await user_service.get_user_by_telegram_id(user_id)
|
||||
user = await user_service.get_or_create_user(
|
||||
user_id,
|
||||
username,
|
||||
first_name,
|
||||
last_name
|
||||
)
|
||||
if not existing_user:
|
||||
print(f"Новый пользователь: {user_id}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка сохранения пользователя: {e}")
|
||||
await session.rollback()
|
||||
try:
|
||||
existing_user = await user_service.get_user_by_telegram_id(user_id)
|
||||
user = await user_service.get_or_create_user(
|
||||
user_id,
|
||||
username,
|
||||
first_name,
|
||||
last_name
|
||||
)
|
||||
if not existing_user:
|
||||
print(f"Новый пользователь: {user_id}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Ошибка сохранения пользователя: {e}")
|
||||
welcome_text = (
|
||||
f"<b>Привет, {first_name}!</b>\n\n"
|
||||
f"Я <b>VibeLawyerBot</b> - ваш помощник в юридических вопросах.\n\n"
|
||||
|
||||
@@ -4,58 +4,56 @@ from aiogram.filters import Command
|
||||
from aiogram.types import Message
|
||||
|
||||
from tg_bot.config.settings import settings
|
||||
from tg_bot.infrastructure.database.database import AsyncSessionLocal
|
||||
from tg_bot.domain.services.user_service import UserService
|
||||
|
||||
router = Router()
|
||||
user_service = UserService()
|
||||
|
||||
|
||||
@router.message(Command("stats"))
|
||||
async def cmd_stats(message: Message):
|
||||
user_id = message.from_user.id
|
||||
|
||||
async with AsyncSessionLocal() as session:
|
||||
try:
|
||||
user_service = UserService(session)
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
try:
|
||||
user = await user_service.get_user_by_telegram_id(user_id)
|
||||
|
||||
if user:
|
||||
stats_text = (
|
||||
f"<b>Ваша статистика</b>\n\n"
|
||||
f"<b>Основное:</b>\n"
|
||||
f"• ID: <code>{user_id}</code>\n"
|
||||
f"• Premium: {'Да' if user.is_premium else 'Нет'}\n"
|
||||
f"• Вопросов использовано: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n\n"
|
||||
)
|
||||
|
||||
if user.is_premium:
|
||||
stats_text += (
|
||||
f"<b>Premium статус:</b>\n"
|
||||
f"• Активен до: {user.premium_until.strftime('%d.%m.%Y') if user.premium_until else 'Не указано'}\n"
|
||||
f"• Лимит вопросов: безлимитно\n\n"
|
||||
)
|
||||
else:
|
||||
remaining = max(0, settings.FREE_QUESTIONS_LIMIT - user.questions_used)
|
||||
stats_text += (
|
||||
f"<b>Бесплатный доступ:</b>\n"
|
||||
f"• Осталось вопросов: {remaining}\n"
|
||||
f"• Для безлимита: /buy\n\n"
|
||||
)
|
||||
else:
|
||||
stats_text = (
|
||||
f"<b>Добро пожаловать!</b>\n\n"
|
||||
f"Вы новый пользователь.\n"
|
||||
f"• Ваш ID: <code>{user_id}</code>\n"
|
||||
f"• Бесплатных вопросов: {settings.FREE_QUESTIONS_LIMIT}\n"
|
||||
f"• Для начала работы просто задайте вопрос!\n\n"
|
||||
f"<i>Используйте /buy для получения полного доступа</i>"
|
||||
)
|
||||
|
||||
await message.answer(stats_text, parse_mode="HTML")
|
||||
|
||||
except Exception as e:
|
||||
await message.answer(
|
||||
f"<b>Ошибка получения статистики</b>\n\n"
|
||||
f"Попробуйте позже.",
|
||||
parse_mode="HTML"
|
||||
if user:
|
||||
stats_text = (
|
||||
f"<b>Ваша статистика</b>\n\n"
|
||||
f"<b>Основное:</b>\n"
|
||||
f"• ID: <code>{user_id}</code>\n"
|
||||
f"• Premium: {'Да' if user.is_premium else 'Нет'}\n"
|
||||
f"• Вопросов использовано: {user.questions_used}/{settings.FREE_QUESTIONS_LIMIT}\n\n"
|
||||
)
|
||||
|
||||
if user.is_premium:
|
||||
stats_text += (
|
||||
f"<b>Premium статус:</b>\n"
|
||||
f"• Активен до: {user.premium_until.strftime('%d.%m.%Y') if user.premium_until else 'Не указано'}\n"
|
||||
f"• Лимит вопросов: безлимитно\n\n"
|
||||
)
|
||||
else:
|
||||
remaining = max(0, settings.FREE_QUESTIONS_LIMIT - user.questions_used)
|
||||
stats_text += (
|
||||
f"<b>Бесплатный доступ:</b>\n"
|
||||
f"• Осталось вопросов: {remaining}\n"
|
||||
f"• Для безлимита: /buy\n\n"
|
||||
)
|
||||
else:
|
||||
stats_text = (
|
||||
f"<b>Добро пожаловать!</b>\n\n"
|
||||
f"Вы новый пользователь.\n"
|
||||
f"• Ваш ID: <code>{user_id}</code>\n"
|
||||
f"• Бесплатных вопросов: {settings.FREE_QUESTIONS_LIMIT}\n"
|
||||
f"• Для начала работы просто задайте вопрос!\n\n"
|
||||
f"<i>Используйте /buy для получения полного доступа</i>"
|
||||
)
|
||||
|
||||
await message.answer(stats_text, parse_mode="HTML")
|
||||
|
||||
except Exception as e:
|
||||
await message.answer(
|
||||
f"<b>Ошибка получения статистики</b>\n\n"
|
||||
f"Попробуйте позже.",
|
||||
parse_mode="HTML"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user