Skip to content

Расширение BaseFilter #38

@Vlad0sZ

Description

@Vlad0sZ

Привет! Интересно знать кое-что про BaseFilter и их поведение.

Допустим, у моего бота есть несколько команд. Но доступ к командам есть не у всех пользователей, либо поведение у них должно быть разное. Вот немного контекста:

  1. У пользователя может быть роль, например administrator, manager, user.
  2. У бота есть команда, например /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'

Это просто банальный пример с ролями, но иногда логика требует чуть больше фильтров.

Возможно, я не совсем правильно понимаю смысл фильтров, тогда хочу получить объяснения тут, как использовать правильно :)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions