Files
PrimoGuardBot-/bot/middlewares/__init__.py

143 lines
4.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
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 = False,
enable_subscription_check: bool = False,
) -> 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