-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbot.py
More file actions
99 lines (81 loc) · 4.18 KB
/
bot.py
File metadata and controls
99 lines (81 loc) · 4.18 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
87
88
89
90
91
92
93
94
95
96
97
98
"""
Точка входа для Telegram бота
"""
import asyncio
import logging
import sys
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.enums import ParseMode
from config import config
# Настройка логирования
logging.basicConfig(
level=getattr(logging, config.LOG_LEVEL),
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
async def main():
"""Основная функция запуска бота"""
try:
# Валидация конфигурации
config.validate()
# Инициализация сессии Telegram (при необходимости через прокси)
session = None
if config.TELEGRAM_PROXY:
logger.info(f"Telegram API будет использовать прокси: {config.TELEGRAM_PROXY}")
session = AiohttpSession(proxy=config.TELEGRAM_PROXY)
# Инициализация бота и диспетчера
bot = Bot(
token=config.TELEGRAM_TOKEN,
session=session,
default=DefaultBotProperties(parse_mode=ParseMode.MARKDOWN)
)
dp = Dispatcher()
# Регистрация обработчиков
from handlers import commands, messages, voice, media, callbacks
dp.include_router(commands.router)
dp.include_router(callbacks.router) # Обработка inline-кнопок
dp.include_router(voice.router)
dp.include_router(media.router)
dp.include_router(messages.router) # В конце, чтобы обрабатывать все остальные сообщения
# Инициализация базы данных
from utils.db_helpers import get_db, close_db
db = await get_db()
logger.info("База данных инициализирована")
# Инициализация администраторов из конфигурации
if config.ADMIN_TELEGRAM_IDS:
logger.info(f"Инициализация администраторов: {config.ADMIN_TELEGRAM_IDS}")
for admin_id in config.ADMIN_TELEGRAM_IDS:
try:
await db.set_user_admin(admin_id, is_admin=True)
logger.info(f"Администратор {admin_id} инициализирован")
except Exception as e:
logger.error(f"Ошибка при инициализации администратора {admin_id}: {e}")
# Регистрация middleware для проверки доступа
from middleware.access_control import AccessControlMiddleware
dp.update.middleware(AccessControlMiddleware())
logger.info("Middleware для проверки доступа зарегистрирован")
# Инициализация синхронизации с NextCloud
from services.sync_service import SyncService
sync_service = SyncService()
logger.info("Инициализация синхронизации с NextCloud...")
await sync_service.initialize()
logger.info("Синхронизация инициализирована")
# Запуск периодической синхронизации (если включена)
if config.ENABLE_SYNC and config.AUTO_SYNC:
sync_task = asyncio.create_task(sync_service.start_periodic_sync())
logger.info("Периодическая синхронизация запущена")
logger.info("Бот запущен")
# Запуск polling
await dp.start_polling(bot)
except Exception as e:
logger.error(f"Ошибка при запуске бота: {e}", exc_info=True)
sys.exit(1)
finally:
# Закрыть соединения
from utils.db_helpers import close_db
await close_db()
await bot.session.close()
if __name__ == "__main__":
asyncio.run(main())