Перейти к содержанию

Кастомные фильтры

Вы можете писать свои фильтры, если встроенных недостаточно.

Предусмотрено несколько способов для создания кастомных фильтров:

Объектно-ориентированный BaseFilter

Для этого нужно создать класс, унаследовавшись от BaseFilter из vkwave.bots.core.dispatching.filters.base

Логика фильтрации должна быть определена в методе check, который принимает аргумент event — свежепришедшее событие

from vkwave.bots.core.dispatching.filters import base, builtin


class AttachmentsFilter(base.BaseFilter):
    """Фильтр-пример.

    Проверяет наличие вложений в сообщении.
    """

    async def check(self, event: SimpleBotEvent) -> base.FilterResult:
        """Метод, в котором определяется логика фильтрации.

        Должен возвращать FilterResult со значением True или False, от которого зависит успех фильтра.
        """
        builtin.is_message_event(event)

        return base.FilterResult(event.object.object.message.attachments is not None)

Функциональный filter_caster

Любую функцию/лямбду/корутину можно превратить в фильтр используя filter_caster

from vkwave.bots.core.dispatching.filters import filter_caster

has_attachments = filter_caster.cast(lambda event: event.object.object.message.attachments is not None)

Если указывать функцию/лямбду/корутину напрямую в определении хендлера, то можно не вызывать filter.caster, он сработает под капотом автоматически:

@bot.message_handler(lambda event: event.object.object.message.attachments is not None)
async def handler(event):
    await event.answer("Найдены вложения")