Merge branch 'main' into main
This commit is contained in:
@@ -36,11 +36,13 @@ from app.services.referral_contest_service import referral_contest_service
|
||||
from app.services.contest_rotation_service import contest_rotation_service
|
||||
from app.services.nalogo_queue_service import nalogo_queue_service
|
||||
from app.services.traffic_monitoring_service import traffic_monitoring_scheduler
|
||||
from app.services.daily_subscription_service import daily_subscription_service
|
||||
from app.utils.startup_timeline import StartupTimeline
|
||||
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:
|
||||
@@ -174,6 +176,7 @@ async def main():
|
||||
maintenance_task = None
|
||||
version_check_task = None
|
||||
traffic_monitoring_task = None
|
||||
daily_subscription_task = None
|
||||
polling_task = None
|
||||
web_api_server = None
|
||||
telegram_webhook_enabled = False
|
||||
@@ -219,6 +222,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,7 +270,9 @@ 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)
|
||||
daily_subscription_service.set_bot(bot)
|
||||
|
||||
from app.services.admin_notification_service import AdminNotificationService
|
||||
|
||||
@@ -596,6 +629,21 @@ async def main():
|
||||
traffic_monitoring_task = None
|
||||
stage.skip("Мониторинг трафика отключен настройками")
|
||||
|
||||
async with timeline.stage(
|
||||
"Суточные подписки",
|
||||
"💳",
|
||||
success_message="Сервис суточных подписок запущен",
|
||||
) as stage:
|
||||
if daily_subscription_service.is_enabled():
|
||||
daily_subscription_task = asyncio.create_task(
|
||||
daily_subscription_service.start_monitoring()
|
||||
)
|
||||
interval_minutes = daily_subscription_service.get_check_interval_minutes()
|
||||
stage.log(f"Интервал проверки: {interval_minutes} мин")
|
||||
else:
|
||||
daily_subscription_task = None
|
||||
stage.skip("Суточные подписки отключены настройками")
|
||||
|
||||
async with timeline.stage(
|
||||
"Сервис проверки версий",
|
||||
"📄",
|
||||
@@ -647,6 +695,8 @@ async def main():
|
||||
webhook_lines.append(f"WATA: {_fmt(settings.WATA_WEBHOOK_PATH)}")
|
||||
if settings.is_heleket_enabled():
|
||||
webhook_lines.append(f"Heleket: {_fmt(settings.HELEKET_WEBHOOK_PATH)}")
|
||||
if settings.is_freekassa_enabled():
|
||||
webhook_lines.append(f"Freekassa: {_fmt(settings.FREEKASSA_WEBHOOK_PATH)}")
|
||||
|
||||
timeline.log_section(
|
||||
"Активные webhook endpoints",
|
||||
@@ -658,6 +708,7 @@ async def main():
|
||||
f"Мониторинг: {'Включен' if monitoring_task else 'Отключен'}",
|
||||
f"Техработы: {'Включен' if maintenance_task else 'Отключен'}",
|
||||
f"Мониторинг трафика: {'Включен' if traffic_monitoring_task else 'Отключен'}",
|
||||
f"Суточные подписки: {'Включен' if daily_subscription_task else 'Отключен'}",
|
||||
f"Проверка версий: {'Включен' if version_check_task else 'Отключен'}",
|
||||
f"Отчеты: {'Включен' if reporting_service.is_running() else 'Отключен'}",
|
||||
]
|
||||
@@ -712,6 +763,16 @@ async def main():
|
||||
traffic_monitoring_scheduler.start_monitoring()
|
||||
)
|
||||
|
||||
if daily_subscription_task and daily_subscription_task.done():
|
||||
exception = daily_subscription_task.exception()
|
||||
if exception:
|
||||
logger.error(f"Сервис суточных подписок завершился с ошибкой: {exception}")
|
||||
if daily_subscription_service.is_enabled():
|
||||
logger.info("🔄 Перезапуск сервиса суточных подписок...")
|
||||
daily_subscription_task = asyncio.create_task(
|
||||
daily_subscription_service.start_monitoring()
|
||||
)
|
||||
|
||||
if auto_verification_active and not auto_payment_verification_service.is_running():
|
||||
logger.warning(
|
||||
"Сервис автопроверки пополнений остановился, пробуем перезапустить..."
|
||||
@@ -781,6 +842,15 @@ async def main():
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
if daily_subscription_task and not daily_subscription_task.done():
|
||||
logger.info("ℹ️ Остановка сервиса суточных подписок...")
|
||||
daily_subscription_service.stop_monitoring()
|
||||
daily_subscription_task.cancel()
|
||||
try:
|
||||
await daily_subscription_task
|
||||
except asyncio.CancelledError:
|
||||
pass
|
||||
|
||||
logger.info("ℹ️ Остановка сервиса отчетов...")
|
||||
try:
|
||||
await reporting_service.stop()
|
||||
|
||||
Reference in New Issue
Block a user