Встроенные фильтры¶
По умолчанию в VkWave есть несколько фильтров, которые импортируются как from vkwave.bots.core.dispatching import filters
:
EventTypeFilter¶
Отсеивает по типу события (новое сообщение, пользователь разрешил писать ему от имени бота и пр. Полный список событий в документации ВК)
# Ловит все разрешения на отправку сообщений...
@bot.handler(filters.EventTypeFilter("message_allow"))
def only_allows(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
TextFilter¶
Отсеивает по тексту пришедшего сообщения
# Ловит все сообщения, в которых есть hi
@bot.message_handler(filters.TextFilter("hi"))
def only_hi_in_text(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
Можно передать список из нескольких строк, тогда обработчик сработает, когда хотя бы строка из списка встретилась в сообщении
# Ловит все сообщения, в которых есть hi или hello или привет или ку
@bot.message_handler(filters.TextFilter(["hi", "hello", "привет", "ку"]))
def only_greetings_in_text(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
PayloadFilter¶
Отсеивает по payload`у (полезная нагрузка) пришедшего сообщения (Скрытая строка, которая приходит, когда пользователь нажимает на кнопку встроенной клавиатуры. Подробнее о клавиатурах)
# Ловит все сообщения, пейлоад которых равен {"button": "start"}
@bot.message_handler(filters.PayloadFilter({"button": "start"}))
def only_start_button_pressed(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
ChatActionFilter¶
Отсеивает по событию в беседе (например, новый участник беседы. Полный список событий беседы в описании поля action)
# Ловит все приглашения новых участников беседы
@bot.message_handler(filters.ChatActionFilter("chat_invite_user"))
def only_new_user_invited(event: SimpleBotEvent):
event.ans("Добро пожаловать!") # ...и отвечает на них
CommandsFilter¶
Отсеивает по наличию команд в тексте сообщения. По умолчанию командой считаются сообщения, начинающиеся с !
или /
, но это можно настроить, передав фильтру аргумент prefixes
со списком или кортежем
# Ловит все сообщения с командой `/hello` или `!hello`
@bot.message_handler(filters.CommandsFilter("hello"))
def only_new_user_invited(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
RegexFilter¶
Отсеивает по тексту сообщения (с использованием регулярных выражений)
# Ловит все сообщения со словом, первая буква которого `п`, последняя `т`
@bot.message_handler(filters.RegexFilter(r"^п\w*т$"))
def only_matched_by_regex(event: SimpleBotEvent):
event.ans("Сообщение соответствует регулярке!") # ...и отвечает на них
MessageFromConversationTypeFilter¶
Отсеивает по типу диалога, откуда пришло сообщение
Доступные типы диалогов:
Личные | Беседы |
---|---|
from_pm , from_dm , from_direct |
from_chat , chat |
# Ловит все сообщения из личных переписок бота
@bot.message_handler(filters.MessageFromConversationTypeFilter("from_pm"))
def only_private_messages(event: SimpleBotEvent):
event.ans("Новое сообщение из личного чата!") # ...и отвечает на них
FromMeFilter¶
Отсеивает по отправителю сообщения (бот или его собеседник). Работает только для юзерботов.
# Ловит все сообщения от бота
@bot.message_handler(filters.FromMeFilter(True)
def only_by_me(event: SimpleBotEvent):
event.ans("Новое сообщение от меня") # ...и отвечает на них
MessageArgsFilter¶
Отсеивает по количеству аргументов в команде
Имеет два параметра:
Параметр | Описание |
---|---|
args_count |
Количество аргументов |
command_length |
Количество слов в команде |
# Ловит все сообщения в которых есть два аргумента (например, "/start arg1 arg2")
@bot.message_handler(filters.MessageArgsFilter(args_count=2))
def only_with_two_args(event: SimpleBotEvent):
event.ans("В сообщении два аргумента: {0}!".format(event['args'])) # ...и отвечает на них
FwdMessagesFilter¶
Отсеивает по количеству пересланных сообщений
Если число не указано, реагирует на любое количество
# Ловит все сообщения от бота, в которых есть пересылаемые сообщения
@bot.message_handler(filters.FwdMessagesFilter()
def only_by_me(event: SimpleBotEvent):
event.ans("Переслали сообщение") # ...и отвечает на них
ReplyMessageFilter¶
Отсеивает по наличию ответа на сообщение
# Ловит все сообщения от бота, которые отвечают на сообщение
@bot.message_handler(filters.ReplyMessageFilter(True)
def only_by_me(event: SimpleBotEvent):
event.ans("Есть ответ на сообщение") # ...и отвечает на них
TextStartswithFilter¶
Отсеивает по тому, начинается ли текст сообщения с указанной строки (может принимать список, тогда фильтр сработает, если хотя бы одна проверка сработала)
# Ловит все сообщения, начинающиеся на "приве"
@bot.message_handler(filters.TextStartsWithFilter("приве")
def only_by_me(event: SimpleBotEvent):
event.ans("Привет!") # ...и отвечает на них
PayloadContainsFilter¶
Отсеивает по наличию ключа в пейлоаде (значение при этом не проверяется)
# Ловит все сообщения, в пейлоаде которых есть ключ button
@bot.message_handler(filters.PayloadContainsFilter("button")
def only_by_me(event: SimpleBotEvent):
event.ans("Нажата кнопка с пейлоадом button!") # ...и отвечает на них