initial project version
This commit is contained in:
90
src/main.py
Normal file
90
src/main.py
Normal file
@ -0,0 +1,90 @@
|
||||
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())
|
Reference in New Issue
Block a user