-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
86 lines (68 loc) · 3.31 KB
/
main.py
File metadata and controls
86 lines (68 loc) · 3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# distudio_bot/main.py
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from core.config import config
from core.logging_config import logger
from database.migrations import init_db
# === Роутеры ===
from handlers.start import router as start_router
from handlers.user_handlers import router as user_handlers_router
from handlers.admin_handlers import router as admin_handlers_router
from handlers.developer_handlers import router as developer_handlers_router
# === Сервисы ===
from services.notification_service import NotificationService
from services.backup_service import BackupService
async def start_scheduled_broadcast_loop(notification_service: NotificationService):
"""Фоновый цикл для отправки запланированных рассылок каждую минуту"""
logger.info("⏰ Сервис запланированных рассылок запущен (проверка каждую минуту)")
while True:
try:
await notification_service.send_scheduled_broadcasts()
await asyncio.sleep(60) # Проверяем каждую минуту
except Exception as e:
logger.error(f"Ошибка в цикле запланированных рассылок: {e}")
await asyncio.sleep(60)
async def main():
# Инициализация базы данных
await init_db()
logger.info("✅ База данных инициализирована")
# Создание бота и диспетчера
bot = Bot(
token=config.BOT_TOKEN,
default=DefaultBotProperties(parse_mode=ParseMode.HTML)
)
dp = Dispatcher()
# Передаём общие данные в диспетчер
dp["user_count"] = 0 # будет обновляться при рассылке
# Подключение роутеров
dp.include_router(start_router)
dp.include_router(user_handlers_router)
dp.include_router(admin_handlers_router)
dp.include_router(developer_handlers_router)
logger.info("🚀 Бот запускается...")
# Запуск фоновых задач
# Передаем только bot, сессию сервис получит сам через get_db_session()
notification_service = NotificationService(bot, None)
reminder_task = asyncio.create_task(notification_service.start_reminder_loop())
scheduled_broadcast_task = asyncio.create_task(start_scheduled_broadcast_loop(notification_service))
backup_task = asyncio.create_task(BackupService(bot).auto_backup_loop())
try:
# Запуск polling
await dp.start_polling(bot, allowed_updates=dp.resolve_used_update_types())
except Exception as e:
logger.error(f"❌ Ошибка при запуске бота: {e}")
finally:
# Отмена фоновых задач
reminder_task.cancel()
scheduled_broadcast_task.cancel()
backup_task.cancel()
await bot.session.close()
logger.info("🛑 Бот остановлен.")
if __name__ == "__main__":
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.info("👋 Бот остановлен вручную.")