улучшенния в коде и исправление ошибок
This commit is contained in:
126
main.py
126
main.py
@@ -2,6 +2,8 @@
|
||||
Точка входа PrimoGuard Bot
|
||||
"""
|
||||
from asyncio import run
|
||||
import asyncio
|
||||
from typing import List
|
||||
|
||||
from configs import settings
|
||||
from bot import bot, dp, BotInfo, WebhookManager, setup_middlewares, router
|
||||
@@ -11,6 +13,35 @@ from middleware.loggers import logger
|
||||
__all__ = ("main",)
|
||||
|
||||
|
||||
def _start_background_tasks_safe() -> List[asyncio.Task]:
|
||||
"""
|
||||
Безопасный запуск фоновых задач с обработкой ошибок.
|
||||
|
||||
Returns:
|
||||
List[asyncio.Task]: Список запущенных задач (пустой список если модуль не найден)
|
||||
"""
|
||||
try:
|
||||
from bot.tasks import start_background_tasks
|
||||
tasks = start_background_tasks()
|
||||
logger.info(
|
||||
f"🚀 Запущено {len(tasks)} фоновых задач",
|
||||
log_type="STARTUP"
|
||||
)
|
||||
return tasks
|
||||
except ImportError:
|
||||
logger.warning(
|
||||
"⚠️ Модуль 'bot.tasks' не найден, фоновые задачи не запущены",
|
||||
log_type="STARTUP"
|
||||
)
|
||||
return []
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"❌ Ошибка запуска фоновых задач: {e}",
|
||||
log_type="STARTUP"
|
||||
)
|
||||
return []
|
||||
|
||||
|
||||
async def setup_services(setup_webhook: bool = True) -> str:
|
||||
"""
|
||||
Инициализация всех сервисов: БД и бот.
|
||||
@@ -55,7 +86,11 @@ async def on_startup(app) -> None:
|
||||
# 1. Инициализируем всё БЕЗ webhook
|
||||
username = await setup_services(setup_webhook=False)
|
||||
|
||||
# 2. ТЕПЕРЬ устанавливаем webhook (когда всё готово)
|
||||
# 2. Запускаем фоновые задачи
|
||||
background_tasks = _start_background_tasks_safe()
|
||||
app['background_tasks'] = background_tasks
|
||||
|
||||
# 3. ТЕПЕРЬ устанавливаем webhook (когда всё готово)
|
||||
webhook = WebhookManager(bot, dp)
|
||||
|
||||
if settings.WEBHOOK_URL:
|
||||
@@ -87,10 +122,40 @@ async def on_shutdown(app) -> None:
|
||||
logger.info("👋 Остановка бота...", log_type="SHUTDOWN")
|
||||
|
||||
try:
|
||||
# Отменяем фоновые задачи
|
||||
if 'background_tasks' in app and app['background_tasks']:
|
||||
tasks = app['background_tasks']
|
||||
logger.info(
|
||||
f"⏸️ Остановка {len(tasks)} фоновых задач...",
|
||||
log_type="SHUTDOWN"
|
||||
)
|
||||
|
||||
for task in tasks:
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
|
||||
# Ждём завершения с таймаутом 5 секунд
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
asyncio.gather(*tasks, return_exceptions=True),
|
||||
timeout=5.0
|
||||
)
|
||||
logger.info("✅ Фоновые задачи остановлены", log_type="SHUTDOWN")
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(
|
||||
"⚠️ Таймаут остановки фоновых задач (5 сек)",
|
||||
log_type="SHUTDOWN"
|
||||
)
|
||||
|
||||
# Закрываем соединения
|
||||
logger.info("📊 Закрытие базы данных...", log_type="SHUTDOWN")
|
||||
await get_manager().close()
|
||||
|
||||
logger.info("🤖 Закрытие сессии бота...", log_type="SHUTDOWN")
|
||||
await bot.session.close()
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Ошибка при закрытии: {e}", log_type="SHUTDOWN")
|
||||
logger.error(f"❌ Ошибка при закрытии: {e}", log_type="SHUTDOWN")
|
||||
|
||||
logger.success("✅ Бот остановлен", log_type="SHUTDOWN")
|
||||
|
||||
@@ -117,10 +182,16 @@ async def start_polling() -> None:
|
||||
"""Запуск в режиме Polling (асинхронный)."""
|
||||
logger.setup()
|
||||
|
||||
background_tasks: List[asyncio.Task] = []
|
||||
|
||||
try:
|
||||
# 1. Инициализируем сервисы
|
||||
username = await setup_services(setup_webhook=False)
|
||||
|
||||
# Удаляем webhook для polling режима
|
||||
# 2. Запускаем фоновые задачи
|
||||
background_tasks = _start_background_tasks_safe()
|
||||
|
||||
# 3. Удаляем webhook для polling режима
|
||||
webhook = WebhookManager(bot, dp)
|
||||
await webhook.delete(drop_pending_updates=True)
|
||||
|
||||
@@ -129,9 +200,12 @@ async def start_polling() -> None:
|
||||
log_type="STARTUP"
|
||||
)
|
||||
|
||||
# Запускаем polling
|
||||
# 4. Запускаем polling
|
||||
await dp.start_polling(bot, drop_pending_updates=True)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logger.info("⚠️ Получен сигнал остановки (Ctrl+C)", log_type="MAIN")
|
||||
|
||||
except Exception as e:
|
||||
logger.critical(
|
||||
f"🔥 Критическая ошибка: {e}",
|
||||
@@ -140,11 +214,47 @@ async def start_polling() -> None:
|
||||
raise
|
||||
|
||||
finally:
|
||||
logger.info("🧹 Очистка ресурсов...", log_type="SHUTDOWN")
|
||||
|
||||
try:
|
||||
await bot.session.close()
|
||||
# Отменяем фоновые задачи
|
||||
if background_tasks:
|
||||
logger.info(
|
||||
f"⏸️ Остановка {len(background_tasks)} фоновых задач...",
|
||||
log_type="SHUTDOWN"
|
||||
)
|
||||
|
||||
for task in background_tasks:
|
||||
if not task.done():
|
||||
task.cancel()
|
||||
|
||||
# Ждём завершения с таймаутом 5 секунд
|
||||
try:
|
||||
await asyncio.wait_for(
|
||||
asyncio.gather(*background_tasks, return_exceptions=True),
|
||||
timeout=5.0
|
||||
)
|
||||
logger.info("✅ Фоновые задачи остановлены", log_type="SHUTDOWN")
|
||||
except asyncio.TimeoutError:
|
||||
logger.warning(
|
||||
"⚠️ Таймаут остановки фоновых задач (5 сек)",
|
||||
log_type="SHUTDOWN"
|
||||
)
|
||||
|
||||
# Закрываем соединения
|
||||
logger.info("📊 Закрытие базы данных...", log_type="SHUTDOWN")
|
||||
await get_manager().close()
|
||||
except:
|
||||
pass
|
||||
|
||||
logger.info("🤖 Закрытие сессии бота...", log_type="SHUTDOWN")
|
||||
await bot.session.close()
|
||||
|
||||
logger.success("✅ Бот остановлен", log_type="SHUTDOWN")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(
|
||||
f"❌ Ошибка при очистке ресурсов: {e}",
|
||||
log_type="SHUTDOWN"
|
||||
)
|
||||
|
||||
|
||||
def main() -> None:
|
||||
@@ -152,9 +262,11 @@ def main() -> None:
|
||||
try:
|
||||
if settings.WEBHOOK:
|
||||
# ========== WEBHOOK РЕЖИМ ==========
|
||||
logger.info("🔧 Режим: Webhook", log_type="MAIN")
|
||||
start_webhook()
|
||||
else:
|
||||
# ========== POLLING РЕЖИМ ==========
|
||||
logger.info("🔧 Режим: Polling", log_type="MAIN")
|
||||
run(start_polling())
|
||||
|
||||
except KeyboardInterrupt:
|
||||
|
||||
Reference in New Issue
Block a user