""" Middleware для бота PrimoGuardBot. Порядок выполнения middleware важен: 1. TimingMiddleware - замер времени выполнения 2. LoggingMiddleware - логирование всех событий 3. BanCheckMiddleware - проверка статуса бана (блокирует забаненных) 4. ErrorHandlingMiddleware - обработка ошибок (последний) Message-level middleware: 1. RateLimitMiddleware/AntiSpamMiddleware - защита от флуда 2. SubscriptionMiddleware - проверка подписки на каналы 3. ReferralMiddleware - обработка реферальных ссылок """ from aiogram import Dispatcher, Bot from configs import settings from middleware.loggers import logger from .error_mdw import ErrorHandlingMiddleware from .logging_mdw import LoggingMiddleware from .referal_mdw import ReferralMiddleware from .spam_mdw import AntiSpamMiddleware, spam_stats from .sub_mdw import SubscriptionMiddleware from .time_mdw import TimingMiddleware from .banwords_mdw import BanWordsMiddleware __all__ = ( # Middleware классы "TimingMiddleware", "LoggingMiddleware", "ErrorHandlingMiddleware", "AntiSpamMiddleware", "SubscriptionMiddleware", "ReferralMiddleware", "BanWordsMiddleware", # Статистика "spam_stats", # Утилиты "setup_middlewares", ) def setup_middlewares( dp: Dispatcher, bot: Bot, admin_ids: list[int] = settings.ADMIN_ID+settings.OWNER_ID, channel_ids: list[int | str] | None = None, enable_spam_check: bool = settings.enable_spam_check, enable_subscription_check: bool = settings.enable_subscription_check, ) -> dict: """ Регистрирует все middleware в диспетчере. Args: dp: Диспетчер aiogram bot: Экземпляр бота admin_ids: ID администраторов (для защиты и уведомлений) channel_ids: ID каналов для проверки подписки enable_spam_check: Включить антиспам enable_subscription_check: Включить проверку подписки Returns: dict: Словарь с экземплярами middleware для доступа к методам """ channel_ids = channel_ids or [] # === UPDATE LEVEL MIDDLEWARE (для всех событий) === middlewares_updates = [] instances = {} # 1. Timing - замер времени (первый!) timing_mdw = TimingMiddleware() middlewares_updates.append(timing_mdw) instances['timing'] = timing_mdw # 2. Logging - логирование всех событий loggings_mdw = LoggingMiddleware() middlewares_updates.append(loggings_mdw) instances['logging'] = loggings_mdw # 3. ErrorHandling - обработка ошибок (последний!) errors_mdw = ErrorHandlingMiddleware(admin_ids=admin_ids) middlewares_updates.append(errors_mdw) instances['error'] = errors_mdw # === MESSAGE LEVEL MIDDLEWARE (только для сообщений) === middlewares_msg = [] # 1. AntiSpam - защита от флуда (опционально) if enable_spam_check: spams_mdw = AntiSpamMiddleware() middlewares_msg.append(spams_mdw) instances['spam'] = spams_mdw # 2. Subscription - проверка подписки на каналы (опционально) if enable_subscription_check and channel_ids: subs_mdw = SubscriptionMiddleware(bot=bot, channels=channel_ids) middlewares_msg.append(subs_mdw) instances['subscription'] = subs_mdw dp.message.middleware(BanWordsMiddleware()) # 3. Referral - обработка реферальных ссылок referral_mdw = ReferralMiddleware() middlewares_msg.append(referral_mdw) instances['referral'] = referral_mdw # === РЕГИСТРАЦИЯ MIDDLEWARE === # Регистрируем update-level middleware for middleware in middlewares_updates: dp.update.middleware(middleware) # Регистрируем message-level middleware for middleware in middlewares_msg: dp.message.middleware(middleware) # Логируем успешную регистрацию enabled_features = [] if enable_spam_check: enabled_features.append("AntiSpam") if enable_subscription_check: enabled_features.append("Subscription") dp.channel_post.middleware(LoggingMiddleware()) dp.edited_channel_post.middleware(LoggingMiddleware()) logger.info( text=( f"Middleware зарегистрированы: " f"Update={len(middlewares_updates)}, " f"Message={len(middlewares_msg)}, " f"Функции=[{', '.join(enabled_features) if enabled_features else 'базовые'}]" ), log_type="MIDDLEWARE_SETUP" ) return instances