updated main.py
This commit is contained in:
63
src/main.py
63
src/main.py
@@ -16,14 +16,17 @@ from action_reporter import init_action_reporter
|
|||||||
|
|
||||||
from config import MODULES_DIR
|
from config import MODULES_DIR
|
||||||
|
|
||||||
load_dotenv() # Загружаем токен бота из .env
|
# Загружаем токен бота из .env
|
||||||
|
load_dotenv()
|
||||||
bot = AsyncTeleBot(os.getenv("BOT_TOKEN"), parse_mode="html")
|
bot = AsyncTeleBot(os.getenv("BOT_TOKEN"), parse_mode="html")
|
||||||
|
|
||||||
# Загружаем ID админ-чата из .env и инициализируемся для логов в чат
|
# Загружаем ID админ-чата из .env и инициализируемся для логов в чат
|
||||||
init_action_reporter(bot, os.getenv("ADMIN_CHAT_ID"), os.getenv("LOG_THREAD_ID"))
|
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):
|
class UserUpdateMiddleware(BaseMiddleware):
|
||||||
def __init__(self, db):
|
def __init__(self, db):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -32,6 +35,7 @@ class UserUpdateMiddleware(BaseMiddleware):
|
|||||||
self.update_types = ['message', 'chat_member']
|
self.update_types = ['message', 'chat_member']
|
||||||
self.db = db
|
self.db = db
|
||||||
|
|
||||||
|
# Обработчик, вызываемый ДО обработки сообщения основными хэндлерами
|
||||||
async def pre_process(self, message, data):
|
async def pre_process(self, message, data):
|
||||||
|
|
||||||
# Обработка пользователей, отправившие сообщение
|
# Обработка пользователей, отправившие сообщение
|
||||||
@@ -52,43 +56,78 @@ class UserUpdateMiddleware(BaseMiddleware):
|
|||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
# Обработчик, вызываемый ПОСЛЕ обработки сообщения основными хэндлерами
|
||||||
async def post_process(self, message, data, exception):
|
async def post_process(self, message, data, exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Регистрируем middleware
|
# Регистрируем middleware
|
||||||
bot.setup_middleware(UserUpdateMiddleware(db))
|
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):
|
for filename in os.listdir(modules_path):
|
||||||
|
|
||||||
|
# Если файл содержит в конце .py (кроме __init__.py)
|
||||||
if filename.endswith(".py") and filename != "__init__.py":
|
if filename.endswith(".py") and filename != "__init__.py":
|
||||||
module_name = filename[:-3] # Убираем расширение .py
|
|
||||||
|
# Убираем расширение .py
|
||||||
|
module_name = filename[:-3]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|
||||||
|
# Импортируем модуль (modules.start)
|
||||||
module = importlib.import_module(f"{MODULES_DIR}.{module_name}")
|
module = importlib.import_module(f"{MODULES_DIR}.{module_name}")
|
||||||
|
|
||||||
|
# Если присутствует register_handlers
|
||||||
if hasattr(module, "register_handlers"):
|
if hasattr(module, "register_handlers"):
|
||||||
|
|
||||||
module.register_handlers(bot)
|
module.register_handlers(bot)
|
||||||
loaded_count += 1
|
loaded_count += 1
|
||||||
logger.info(f"Модуль {module_name} успешно загружен.")
|
logger.info(f"Модуль {module_name} успешно загружен.")
|
||||||
|
|
||||||
|
# Если нет register_handlers
|
||||||
else:
|
else:
|
||||||
|
|
||||||
|
# Записываем действие в логи
|
||||||
logger.warning(f"Модуль {module_name} не содержит функцию register_handlers.")
|
logger.warning(f"Модуль {module_name} не содержит функцию register_handlers.")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
||||||
|
# Записываем ошибку в логи
|
||||||
logger.error(f"Ошибка при загрузке модуля {module_name}: {str(e)}")
|
logger.error(f"Ошибка при загрузке модуля {module_name}: {str(e)}")
|
||||||
|
|
||||||
|
# Записываем отчет о модулях в логи
|
||||||
logger.info(f"Загружено модулей: {loaded_count} шт. Бот запущен.")
|
logger.info(f"Загружено модулей: {loaded_count} шт. Бот запущен.")
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
os.system('clear') # Очищаем терминал
|
|
||||||
|
# Очищаем терминал
|
||||||
|
os.system('clear')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await load_modules() # Проверяем и загружаем модули
|
|
||||||
await bot.infinity_polling() # Запускаем бота
|
# Проверяем и загружаем модули
|
||||||
except (KeyboardInterrupt, asyncio.CancelledError):
|
await load_modules()
|
||||||
logger.info("Бот остановлен.")
|
|
||||||
|
# Запускаем бота
|
||||||
|
await bot.infinity_polling()
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
||||||
|
# Записываем критическую ошибку в логи
|
||||||
logger.critical(f"Критическая ошибка: {str(e)}")
|
logger.critical(f"Критическая ошибка: {str(e)}")
|
||||||
|
|
||||||
|
# Завершаем скрипт с критической ошибкой
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
Reference in New Issue
Block a user