Implement audio record management features in AsyncBotDB and AudioRepository
- 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.
This commit is contained in:
57
helper_bot/middlewares/rate_limit_middleware.py
Normal file
57
helper_bot/middlewares/rate_limit_middleware.py
Normal file
@@ -0,0 +1,57 @@
|
||||
"""
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user