""" Middleware для автоматического применения rate limiting ко всем входящим сообщениям """ from typing import Callable, Dict, Any, Awaitable, Union from aiogram import BaseMiddleware from aiogram.types import Message, CallbackQuery, InlineQuery, ChatMemberUpdated, Update from aiogram.exceptions import TelegramRetryAfter, TelegramAPIError from logs.custom_logger import logger from helper_bot.utils.rate_limiter import telegram_rate_limiter class RateLimitMiddleware(BaseMiddleware): """Middleware для автоматического rate limiting входящих сообщений""" def __init__(self): super().__init__() self.rate_limiter = telegram_rate_limiter async def __call__( self, handler: Callable[[Update, Dict[str, Any]], Awaitable[Any]], event: Union[Update, Message, CallbackQuery, InlineQuery, ChatMemberUpdated], data: Dict[str, Any] ) -> Any: """Обрабатывает событие с rate limiting""" # Извлекаем сообщение из Update message = None if isinstance(event, Update): message = event.message elif isinstance(event, Message): message = event # Применяем rate limiting только к сообщениям if message is not None: chat_id = message.chat.id # Обертываем handler в rate limiting async def rate_limited_handler(): try: return await handler(event, data) except (TelegramRetryAfter, TelegramAPIError) as e: logger.warning(f"Rate limit error in middleware: {e}") # Middleware не должен перехватывать эти ошибки, # пусть их обрабатывает rate_limiter в функциях отправки raise # Применяем rate limiting к handler return await self.rate_limiter.send_with_rate_limit( rate_limited_handler, chat_id ) else: # Для других типов событий просто вызываем handler return await handler(event, data)