Some checks reported errors
continuous-integration/drone/push Build encountered an error
127 lines
5.2 KiB
Python
127 lines
5.2 KiB
Python
|
||
import aiohttp
|
||
from datetime import datetime
|
||
from typing import Optional
|
||
from tg_bot.config.settings import settings
|
||
from tg_bot.infrastructure.http_client import create_http_session
|
||
|
||
|
||
class User:
|
||
"""Модель пользователя для телеграм-бота"""
|
||
def __init__(self, data: dict):
|
||
self.user_id = data.get("user_id")
|
||
self.telegram_id = data.get("telegram_id")
|
||
self.role = data.get("role")
|
||
created_at_str = data.get("created_at")
|
||
if created_at_str:
|
||
try:
|
||
created_at_str = created_at_str.replace("Z", "+00:00")
|
||
self.created_at = datetime.fromisoformat(created_at_str)
|
||
except (ValueError, AttributeError):
|
||
self.created_at = None
|
||
else:
|
||
self.created_at = None
|
||
|
||
premium_until_str = data.get("premium_until")
|
||
if premium_until_str:
|
||
try:
|
||
premium_until_str = premium_until_str.replace("Z", "+00:00")
|
||
self.premium_until = datetime.fromisoformat(premium_until_str)
|
||
except (ValueError, AttributeError):
|
||
self.premium_until = None
|
||
else:
|
||
self.premium_until = None
|
||
|
||
self.is_premium = data.get("is_premium", False)
|
||
self.questions_used = data.get("questions_used", 0)
|
||
|
||
|
||
class UserService:
|
||
"""Сервис для работы с пользователями через API бэкенда"""
|
||
|
||
def __init__(self):
|
||
self.backend_url = settings.BACKEND_URL
|
||
print(f"UserService initialized with BACKEND_URL: {self.backend_url}")
|
||
|
||
async def get_user_by_telegram_id(self, telegram_id: int) -> Optional[User]:
|
||
"""Получить пользователя по Telegram ID"""
|
||
try:
|
||
url = f"{self.backend_url}/users/telegram/{telegram_id}"
|
||
async with create_http_session() as session:
|
||
async with session.get(url) as response:
|
||
if response.status == 200:
|
||
data = await response.json()
|
||
return User(data)
|
||
return None
|
||
except aiohttp.ClientConnectorError as e:
|
||
print(f"Backend not available at {self.backend_url}: {e}")
|
||
return None
|
||
except Exception as e:
|
||
print(f"Error getting user: {e}")
|
||
return None
|
||
|
||
async def get_or_create_user(
|
||
self,
|
||
telegram_id: int,
|
||
username: str = "",
|
||
first_name: str = "",
|
||
last_name: str = ""
|
||
) -> User:
|
||
"""Получить или создать пользователя"""
|
||
user = await self.get_user_by_telegram_id(telegram_id)
|
||
if not user:
|
||
try:
|
||
async with create_http_session() as session:
|
||
async with session.post(
|
||
f"{self.backend_url}/users",
|
||
json={"telegram_id": str(telegram_id), "role": "user"}
|
||
) as response:
|
||
if response.status in [200, 201]:
|
||
data = await response.json()
|
||
return User(data)
|
||
else:
|
||
error_text = await response.text()
|
||
raise Exception(
|
||
f"Backend API returned status {response.status}: {error_text}. "
|
||
f"Make sure the backend server is running at {self.backend_url}"
|
||
)
|
||
except aiohttp.ClientConnectorError as e:
|
||
error_msg = (
|
||
f"Cannot connect to backend API at {self.backend_url}. "
|
||
f"Please ensure the backend server is running on port 8000. "
|
||
f"Start it with: cd project/backend && python run.py"
|
||
)
|
||
print(f"Error creating user: {error_msg}")
|
||
print(f"Original error: {e}")
|
||
raise ConnectionError(error_msg) from e
|
||
except Exception as e:
|
||
error_msg = f"Error creating user: {e}. Backend URL: {self.backend_url}"
|
||
print(error_msg)
|
||
raise
|
||
return user
|
||
|
||
async def update_user_questions(self, telegram_id: int) -> bool:
|
||
"""Увеличить счетчик использованных вопросов"""
|
||
try:
|
||
async with create_http_session() as session:
|
||
async with session.post(
|
||
f"{self.backend_url}/users/telegram/{telegram_id}/increment-questions"
|
||
) as response:
|
||
return response.status == 200
|
||
except Exception as e:
|
||
print(f"Error updating questions: {e}")
|
||
return False
|
||
|
||
async def activate_premium(self, telegram_id: int, days: int = 30) -> bool:
|
||
"""Активировать premium статус"""
|
||
try:
|
||
async with create_http_session() as session:
|
||
async with session.post(
|
||
f"{self.backend_url}/users/telegram/{telegram_id}/activate-premium",
|
||
params={"days": days}
|
||
) as response:
|
||
return response.status == 200
|
||
except Exception as e:
|
||
print(f"Error activating premium: {e}")
|
||
return False
|