1234567891011121314151617181920212223242526272829303132333435363738 |
- import asyncio
- from aiogram import types, Dispatcher
- from aiogram.dispatcher import DEFAULT_RATE_LIMIT
- from aiogram.dispatcher.handler import CancelHandler, current_handler
- from aiogram.dispatcher.middlewares import BaseMiddleware
- from aiogram.utils.exceptions import Throttled
- class ThrottlingMiddleware(BaseMiddleware):
- """
- Simple middleware
- """
- def __init__(self, limit=DEFAULT_RATE_LIMIT, key_prefix='antiflood_'):
- self.rate_limit = limit
- self.prefix = key_prefix
- super(ThrottlingMiddleware, self).__init__()
- async def on_process_message(self, message: types.Message, data: dict):
- handler = current_handler.get()
- dispatcher = Dispatcher.get_current()
- if handler:
- limit = getattr(handler, "throttling_rate_limit", self.rate_limit)
- key = getattr(handler, "throttling_key", f"{self.prefix}_{handler.__name__}")
- else:
- limit = self.rate_limit
- key = f"{self.prefix}_message"
- try:
- await dispatcher.throttle(key, rate=limit)
- except Throttled as t:
- await self.message_throttled(message, t)
- raise CancelHandler()
- async def message_throttled(self, message: types.Message, throttled: Throttled):
- if throttled.exceeded_count <= 2:
- await message.reply("Too many requests!")
|