From a60c6b2ee9c1492972aa5cd3b632edd9d1d56f56 Mon Sep 17 00:00:00 2001 From: Muzifs Date: Thu, 14 Aug 2025 14:01:06 +0300 Subject: [PATCH] updated main.py --- src/main.py | 63 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 12 deletions(-) diff --git a/src/main.py b/src/main.py index 53d22df..338aa13 100644 --- a/src/main.py +++ b/src/main.py @@ -16,14 +16,17 @@ from action_reporter import init_action_reporter from config import MODULES_DIR -load_dotenv() # Загружаем токен бота из .env +# Загружаем токен бота из .env +load_dotenv() bot = AsyncTeleBot(os.getenv("BOT_TOKEN"), parse_mode="html") # Загружаем ID админ-чата из .env и инициализируемся для логов в чат init_action_reporter(bot, os.getenv("ADMIN_CHAT_ID"), os.getenv("LOG_THREAD_ID")) -logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля +# Получаем логгер для текущего модуля +logger = logging.getLogger(__name__) +# Middleware для автоматического обновления информации о пользователях в базе данных class UserUpdateMiddleware(BaseMiddleware): def __init__(self, db): super().__init__() @@ -32,6 +35,7 @@ class UserUpdateMiddleware(BaseMiddleware): self.update_types = ['message', 'chat_member'] self.db = db + # Обработчик, вызываемый ДО обработки сообщения основными хэндлерами async def pre_process(self, message, data): # Обработка пользователей, отправившие сообщение @@ -52,43 +56,78 @@ class UserUpdateMiddleware(BaseMiddleware): ) return data + # Обработчик, вызываемый ПОСЛЕ обработки сообщения основными хэндлерами async def post_process(self, message, data, exception): pass # Регистрируем middleware bot.setup_middleware(UserUpdateMiddleware(db)) -async def load_modules(): # Загружает все модули из директории /modules +# Загружает все модули из директории /modules +async def load_modules(): - setup_logging() # Инициализация логирования + # Инициализация логирования + setup_logging() - loaded_count = 0 # Переменная для подсчёта модулей - modules_path = os.path.join(os.path.dirname(__file__), MODULES_DIR) # Импортируем относительный путь проекта + # Переменная для подсчёта модулей + loaded_count = 0 + + # Импортируем относительный путь проекта + modules_path = os.path.join(os.path.dirname(__file__), MODULES_DIR) for filename in os.listdir(modules_path): + + # Если файл содержит в конце .py (кроме __init__.py) if filename.endswith(".py") and filename != "__init__.py": - module_name = filename[:-3] # Убираем расширение .py + + # Убираем расширение .py + module_name = filename[:-3] + try: + + # Импортируем модуль (modules.start) module = importlib.import_module(f"{MODULES_DIR}.{module_name}") + + # Если присутствует register_handlers if hasattr(module, "register_handlers"): + module.register_handlers(bot) loaded_count += 1 logger.info(f"Модуль {module_name} успешно загружен.") + + # Если нет register_handlers 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') # Очищаем терминал + + # Очищаем терминал + os.system('clear') + try: - await load_modules() # Проверяем и загружаем модули - await bot.infinity_polling() # Запускаем бота - except (KeyboardInterrupt, asyncio.CancelledError): - logger.info("Бот остановлен.") + + # Проверяем и загружаем модули + await load_modules() + + # Запускаем бота + await bot.infinity_polling() + except Exception as e: + + # Записываем критическую ошибку в логи logger.critical(f"Критическая ошибка: {str(e)}") + + # Завершаем скрипт с критической ошибкой sys.exit(1) if __name__ == "__main__":