-
Notifications
You must be signed in to change notification settings - Fork 28
Closed
Description
Привет! Интересно знать кое-что про BaseFilter и их поведение.
Допустим, у моего бота есть несколько команд. Но доступ к командам есть не у всех пользователей, либо поведение у них должно быть разное. Вот немного контекста:
- У пользователя может быть роль, например
administrator,manager,user. - У бота есть команда, например
/tasks- которая для administrator показывает все "задачи", для manager только его задачи, а пользователь ее вообще вводить не должен.
Мне было бы удобно реализовать такой router:
class UserRoleFilter(BaseFilter):
def __init__(self, targetRole: Literal['administrator', 'manager', 'user']):
self.role = targetRole
def __call__(self, event: UpdateUnion):
# вот здесь я хочу получить роль текущего пользователя, а она установлена например в context
return user.role == self.role
@router.message_created(Command('/tasks'), UserRoleFilter('administrator'))
async def handle_get_all_tasks_for_admin(event_object: MessageCreated, context: MemoryContext):
pass
@router.message_created(Command('/tasks'), UserRoleFilter('manager'))
async def handle_get_own_tasks_for_manager(event_object: MessageCreated, context: MemoryContext):
pass
Как будто бы мне для этого не хвататет получения context в BaseFilter:
def __call__(self, event: UpdateUnion, context: MemoryContext): # Тогда dispatcher явно передает туда context
def __call__(self, event: UpdateUnion, data: Dict[str, Any]): # Либо как в middleware, dispatcher передает всю data.
Без этого просто один большой метод с кучей проверок:
@router.message_created(Command('/tasks'))
if context.user.role == 'administrator'
elif context.user.role == 'manager'
Это просто банальный пример с ролями, но иногда логика требует чуть больше фильтров.
Возможно, я не совсем правильно понимаю смысл фильтров, тогда хочу получить объяснения тут, как использовать правильно :)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels