138 lines
4.8 KiB
Python
138 lines
4.8 KiB
Python
"""
|
||
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")
|
||
|
||
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
|