Правила
Для того чтобы хендлер ловил только нужные сообщения/другие ивенты, нужны правила (rules, рулзы - устоявшаяся транслитерация в комьюнити вкботла), в вкботле существует множество рулзов прямо из коробки.
Внимание
Все встроенные рулзы работают только с объектом Message, для обработки сырых евентов нужно писать свою реализацию.
Есть несколько способов использования правил:
-
Импортировать их из
vkbottle.dispatch.rules.baseи использовать, инициализируя прямо в декораторе или в любой другой части кода: -
Использовать шорткаты, список с названиями можно найти здесь
Примечание
Некоторые правила принимают в качестве аргумента итерируемый объект.
Например, CommandRule, который принимает два аргумента: command и args_count, но при использовании шортката можно передавать их в кортеже:
@bot.on.message(command=("help", 0))
Создание собственных правил
Примечание
Правило - это класс соответствующий интерфейсу ABCRule, который должен реализовать лишь один асинхронный метод check, принимающий ивент и возвращающий False если проверка пройдена не была и True либо словарь с аргументами, которые будут распакованы в хендлер как непозиционные аргументы
Создание правил напрямую
Чтобы создать правила импортируем ABCRule и имплементируем асинхронный метод check, еще стоит импортировать Union из typing для типизации вашего кода:
Теперь стоит имплементировать логику правила MyRule, пусть оно будет просто проверять что длина сообщения меньше ста символов:
Вот что получилось:
Примечание
Union в данном правиле не понадобился поэтому его допустимо опустить по стандартам mypy, в любом случае на сигнатуру это не повлияет
Теперь правило можно использовать как первым способом:
Вторым способом рулзом MyRule в текущем состоянии воспользоваться не получится, из-за отсутствия каких-либо параметров правила, предлагается его кастомизировать с помощью метода __init__:
Теперь, если предварительно (до объявления хендлеров) зарегистрировать правило в локальный лейблер
Его можно будет использовать и вторым способом:
Создание правил через правила-врапперы
Примечание
Есть так называемые правила-врапперы, правила - которые исполняют какой-то код который получают как параметры
К правилам-врапперам из коробки можно отнести: func, шорткат для FuncRule; coro или coroutine, шорткат для CoroutineRule
FuncRule принимает в качестве аргумента функцию (которая может быть лямбдой). Созданное напрямую правило MyRule можно заменить вот так: