aiogram?
например, если бот уже запущен командой /start, то вторая команда /start не будет воспринята
думал через состояния это сделать и именно на уровне middlware для практики)
понимаю, что практически можно и в самом хендлере обработать или через БД сделать...
рассчитываю на элегантное решение)
Я написал декоратор, которым помечаю определённые хэндлеры, и middleware срабатывает только с теми хэндлерами, у которых есть этот декоратор. Этим декоратором можно обернуть хэндлер /start, чтобы при каждом старте бота срабатывала middleware, проверяющая, есть ли этот пользователь в БД, или нет. Думаю, что не стоит использовать для этого state. В моём боте есть authorization_middlware, где реализована авторизация пользователей по внутренним данным: она срабатывает перед хэндлером, смотрит в БД, а затем передаёт в хэндлер объект с нужными данными о пользователе, либо отменяет хэндлер и перенаправляет на цепочку для авторизации.
какая логика фильтрации? что выполняет декоратор? Можно пример кода посмотреть?) если это ок, то можно в лс благодарю
Декоратор просто устанавливает атрибут функции (функции — это тоже объекты, у них могут быть атрибуты). def user_auth_required(message_handler): setattr(message_handler, 'user_auth_required', True) return message_handler Оборачиваю так: @user_auth_required async def my_handler(message: Message): ...
Мидлварь проверяет, что у хэндлера установлен флаг user_auth_required: class UserAuthorizationMiddleware(BaseMiddleware): @staticmethod async def on_process_message(message: types.Message, data: dict): handler = current_handler.get() if (not handler) or (not getattr(handler, 'user_auth_required', False)): return ...
Обсуждают сегодня