aiogram-bot-template/middlewares/throttling.py
latand 1bbe12e9c1 Изменения шаблона:
1. .env.dist - изменено название переменной, теперь айди админов приписываются сюда через запятую
2. Добавлен .env в .gitignore
3. Вынес пару импортов из функций, переименовал диспатчер в on_startup, чтобы не повторять значение глобальной переменной
4. В config.py теперь используем библиотеку environs. С помощью нее удобнее парсить переменные определенного типа, т.к. имеются методы str, list, dict, int. Переменные теперь upper-case, что как бы указывает, что они константы.
5. В echo.py изменил эхо хендлер, теперь тут 2 хендлера. Один, который принимает текстовые сообщения, если у пользователя не установлено состояние. Второй хендлер, больше для дебаггинга, принимает все типы сообщений (TEXT, PHOTO, DOCUMENT, ...) и в любом состоянии. Так можно отследить необработанные сообщения.
6. Из help.py убрал троттлинг
7. Обновил requirements.txt чтобы отображать только необходимые библиотеки
8. Убрал (возможно) нерабочий код из throttling.py
2021-01-07 13:58:34 +02:00

38 lines
1.3 KiB
Python

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! ')