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
38 lines
1.3 KiB
Python
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! ')
|