feat(subscription): добавлены новые функции для управления тарифами и трафиком

- Обновлены схемы и маршруты для поддержки покупки тарифов и управления трафиком.
- Реализована синхронизация тарифов и серверов из RemnaWave при запуске.
- Добавлены новые параметры в тарифы: server_traffic_limits и allow_traffic_topup.
- Обновлены настройки и логика для проверки доступности докупки трафика в зависимости от тарифа.
- Внедрены новые эндпоинты для работы с колесом удачи и обработка платежей через Stars.

Обновлён .env.example с новыми параметрами для режима продаж подписок.
This commit is contained in:
PEDZEO
2026-01-12 07:41:10 +03:00
parent 805e3847b9
commit 0e24a5505c
37 changed files with 5722 additions and 80 deletions
+30
View File
@@ -41,6 +41,7 @@ from app.utils.timezone import TimezoneAwareFormatter
from app.utils.log_handlers import LevelFilterHandler, ExcludePaymentFilter
from app.utils.payment_logger import payment_logger, configure_payment_logger
from app.services.log_rotation_service import log_rotation_service
from app.services.ban_notification_service import ban_notification_service
class GracefulExit:
@@ -219,6 +220,34 @@ async def main():
"SKIP_MIGRATION=true",
)
async with timeline.stage(
"Синхронизация тарифов из конфига",
"💰",
success_message="Тарифы синхронизированы",
) as stage:
try:
from app.database.crud.tariff import ensure_tariffs_synced
from app.database.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
await ensure_tariffs_synced(db)
except Exception as error:
stage.warning(f"Не удалось синхронизировать тарифы: {error}")
logger.error(f"❌ Не удалось синхронизировать тарифы: {error}")
async with timeline.stage(
"Синхронизация серверов из RemnaWave",
"🖥️",
success_message="Серверы синхронизированы",
) as stage:
try:
from app.database.crud.server_squad import ensure_servers_synced
from app.database.database import AsyncSessionLocal
async with AsyncSessionLocal() as db:
await ensure_servers_synced(db)
except Exception as error:
stage.warning(f"Не удалось синхронизировать серверы: {error}")
logger.error(f"❌ Не удалось синхронизировать серверы: {error}")
async with timeline.stage(
"Загрузка конфигурации из БД",
"⚙️",
@@ -239,6 +268,7 @@ async def main():
monitoring_service.bot = bot
maintenance_service.set_bot(bot)
broadcast_service.set_bot(bot)
ban_notification_service.set_bot(bot)
traffic_monitoring_scheduler.set_bot(bot)
from app.services.admin_notification_service import AdminNotificationService