Update project configuration and codebase

This commit is contained in:
2026-04-12 12:19:53 +07:00
parent 0ed0ad2b92
commit 0ac8ed8d64
25 changed files with 273 additions and 310 deletions

View File

@@ -1,7 +1,6 @@
import logging
from dataclasses import dataclass
from datetime import datetime, timedelta, timezone
from typing import Optional
from datetime import UTC, datetime, timedelta
from uuid import UUID
from remnawave import RemnawaveSDK
@@ -23,9 +22,9 @@ class RWUserInfo:
expire_at: datetime
used_traffic_bytes: float
traffic_limit_bytes: int # 0 = unlimited
hwid_device_limit: Optional[int] # None = unlimited
hwid_device_limit: int | None # None = unlimited
active_squads: list[dict] # [{"uuid": "...", "name": "..."}]
description: Optional[str]
description: str | None
short_uuid: str
@@ -74,7 +73,7 @@ def _parse_user(user_dto) -> RWUserInfo:
async def get_user_by_telegram_id(
sdk: RemnawaveSDK,
telegram_id: int,
) -> Optional[RWUserInfo]:
) -> RWUserInfo | None:
"""
Получить первого пользователя Remnawave, привязанного к Telegram ID.
Возвращает None, если пользователь не найден или Remnawave недоступен.
@@ -115,7 +114,7 @@ async def add_days(
sdk: RemnawaveSDK,
user_uuid: str,
days: int,
) -> Optional[datetime]:
) -> datetime | None:
"""
Добавить N дней к expire_at пользователя.
Возвращает новую дату окончания или None при ошибке.
@@ -131,7 +130,7 @@ async def add_days(
# Обеспечиваем timezone-aware datetime
current_expire = user_dto.expire_at
if current_expire.tzinfo is None:
current_expire = current_expire.replace(tzinfo=timezone.utc)
current_expire = current_expire.replace(tzinfo=UTC)
new_expire = current_expire + timedelta(days=days)
@@ -146,7 +145,7 @@ async def add_days(
new_dt = result.expire_at
if new_dt is not None and new_dt.tzinfo is None:
new_dt = new_dt.replace(tzinfo=timezone.utc)
new_dt = new_dt.replace(tzinfo=UTC)
return new_dt
except Exception as exc:
logger.warning("Failed to add %d days for user %s: %s", days, user_uuid, exc)
@@ -157,7 +156,7 @@ async def remove_days(
sdk: RemnawaveSDK,
user_uuid: str,
days: int,
) -> Optional[datetime]:
) -> datetime | None:
"""
Вычесть N дней из expire_at пользователя.
Возвращает новую дату окончания или None при ошибке.
@@ -170,7 +169,7 @@ async def remove_days(
current_expire = user_dto.expire_at
if current_expire.tzinfo is None:
current_expire = current_expire.replace(tzinfo=timezone.utc)
current_expire = current_expire.replace(tzinfo=UTC)
new_expire = current_expire - timedelta(days=days)
@@ -185,7 +184,7 @@ async def remove_days(
new_dt = result.expire_at
if new_dt is not None and new_dt.tzinfo is None:
new_dt = new_dt.replace(tzinfo=timezone.utc)
new_dt = new_dt.replace(tzinfo=UTC)
return new_dt
except Exception as exc:
logger.warning("Failed to remove %d days for user %s: %s", days, user_uuid, exc)
@@ -203,7 +202,7 @@ async def set_hwid_limit(
Возвращает True при успехе, False при ошибке.
"""
try:
hwid_value: Optional[int] = None if limit == 0 else limit
hwid_value: int | None = None if limit == 0 else limit
await sdk.users.update_user(
UpdateUserRequestDto(
uuid=UUID(user_uuid),