- Added methods to delete audio moderation records and retrieve all audio records in async_db.py. - Enhanced AudioRepository with functionality to delete audio records by file name and retrieve all audio message records. - Improved logging for audio record operations to enhance monitoring and debugging capabilities. - Updated related handlers to ensure proper integration of new audio management features.
58 lines
2.4 KiB
Python
58 lines
2.4 KiB
Python
"""
|
||
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)
|
||
|