from telebot.async_telebot import AsyncTeleBot from telebot.asyncio_handler_backends import BaseMiddleware import asyncio import os import sys import importlib from dotenv import load_dotenv import logging from logger import setup_logging from database import db from config import MODULES_DIR load_dotenv() # Загружаем токен бота из .env bot = AsyncTeleBot(os.getenv("BOT_TOKEN"), parse_mode="html") logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля class UserUpdateMiddleware(BaseMiddleware): def __init__(self, db): super().__init__() # message - все обычные сообщения # chat_member - события изменения статуса участников чата self.update_types = ['message', 'chat_member'] self.db = db async def pre_process(self, message, data): # Обработка пользователей, отправившие сообщение if message.content_type == 'text': self.db.add_or_update_user( user_id=message.from_user.id, nickname=message.from_user.first_name, tag=message.from_user.username ) # Обработка новых участников группы elif message.content_type == 'new_chat_members': for new_member in message.new_chat_members: self.db.add_or_update_user( user_id=new_member.id, nickname=new_member.first_name, tag=new_member.username ) return data async def post_process(self, message, data, exception): pass # Регистрируем middleware bot.setup_middleware(UserUpdateMiddleware(db)) async def load_modules(): # Загружает все модули из директории /modules setup_logging() # Инициализация логирования loaded_count = 0 # Переменная для подсчёта модулей modules_path = os.path.join(os.path.dirname(__file__), MODULES_DIR) # Импортируем относительный путь проекта for filename in os.listdir(modules_path): if filename.endswith(".py") and filename != "__init__.py": module_name = filename[:-3] # Убираем расширение .py try: module = importlib.import_module(f"{MODULES_DIR}.{module_name}") if hasattr(module, "register_handlers"): module.register_handlers(bot) loaded_count += 1 logger.info(f"Модуль {module_name} успешно загружен") else: logger.warning(f"Модуль {module_name} не содержит функцию register_handlers") except Exception as e: logger.error(f"Ошибка при загрузке модуля {module_name}: {str(e)}") logger.info(f"Загружено модулей: {loaded_count} шт. Бот запущен.") async def main(): os.system('clear') # Очищаем терминал try: await load_modules() # Проверяем и загружаем модули await bot.infinity_polling() # Запускаем бота except (KeyboardInterrupt, asyncio.CancelledError): logger.info("Бот остановлен.") except Exception as e: logger.critical(f"Критическая ошибка: {str(e)}") sys.exit(1) if __name__ == "__main__": asyncio.run(main())