✨ Магични 🔮 фильтри ✨

Примечание

Эта страница все еще в разработке. Имеет много неправильно сформульованих речень.

Это зовнишний пакет, который пидтримуеться основною командою розробки litegram.

За замовчуванням встановлюеться разом с litegram и, также, доступний в PyPi - magic-filter. Это означае, что Вы можете встановити его и использовать с будь-которыми иншими библиотеками и в собственных проектах, независимо от того установлено litegram или ни.

Использование

Пакет magic_filter реализует класс из короткою названием magic_filter.F, то есть F можно импортувати с litegram или magic_filter. F является псевдонимом для MagicFilter.

Примечание

Заметьте, что litegram имеет невелике розширення для magic-filter, и если Ви хотите использовать это розширення, вам следует импортувати магию с litegram вместо пакета magic_filter

Объект классу MagicFilter можно вызывать, поддерживает некоторые действия и запам’ятовуе ланцюжок атрибутив и дию, которую следует перевиряти на вимогу.

Тож это означае, что вы можете ланцюжком получить атрибути, описать простые проверки данных, а потим вызывать отриманий объект, передаючи один объект как аргумент, например, создать ланцюжок атрибутив F.foo.bar.baz, а потим добавить дию „F.foo.bar.baz == 'spam', после чого вызывать отриманий объект - (F.foo.bar.baz == 'spam').resolve(obj)

Можливи действия

Объект магичного фильтра поддерживает некоторые основни логични операции над атрибутами объекта

Атрибут существует, или не «None»

Дии по умолчанию.

F.photo  # lambda message: message.photo

Проверка на однаковисть

F.text == 'hello'  # lambda message: message.text == 'hello'
F.from_user.id == 42  # lambda message: message.from_user.id == 42
F.text != 'spam'  # lambda message: message.text != 'spam'

Проверка на принадлежность

Може использоваться как метод из названием in_ или как оператор matmul @ с будь-которым итерованим

F.from_user.id.in_({42, 1000, 123123})  # lambda query: query.from_user.id in {42, 1000, 123123}
F.data.in_({'foo', 'bar', 'baz'})  # lambda query: query.data in {'foo', 'bar', 'baz'}

Проверка на наявнисть

F.text.contains('foo')  # lambda message: 'foo' in message.text

Рякк починаеться/закинчуеться на

Може застосовуватися только для текстовых атрибутив

F.text.startswith('foo')  # lambda message: message.text.startswith('foo')
F.text.endswith('bar')  # lambda message: message.text.startswith('bar')

Проверка регулярними виразами

F.text.regexp(r'Hello, .+')  # lambda message: re.match(r'Hello, .+', message.text)

Власни функции

Приймае будь-которую функцию

F.chat.func(lambda chat: chat.id == -42)  # lambda message: (lambda chat: chat.id == -42)(message.chat)

Інвертування результатту

Будь-которая доступна операция может быть инвертована с помощью побитовои инверсии - ~

~F.text  # lambda message: not message.text
~F.text.startswith('spam')  # lambda message: not message.text.startswith('spam')

Комбинация

Все операции можно комбинувати с помощью побитовых и/или операторов - &/|

(F.from_user.id == 42) & (F.text == 'admin')
F.text.startswith('a') | F.text.endswith('b')
(F.from_user.id.in_({42, 777, 911})) & (F.text.startswith('!') | F.text.startswith('/')) & F.text.contains('ban')

Модификатори атрибутив - манипуляции с рядками

Делает текст верхним или нижним регистром

Можна использовать только с рядковими атрибуими.

F.text.lower() == 'test'  # lambda message: message.text.lower() == 'test'
F.text.upper().in_({'FOO', 'BAR'})  # lambda message: message.text.upper() in {'FOO', 'BAR'}
F.text.len() == 5  # lambda message: len(message.text) == 5

Получить результатт фильтра как аргумент обработчика

Ця часть недоступна непосредственно в magic-filter, но её можно использовать с litegram

from litegram import F

...

@router.message(F.text.regexp(r"^(\d+)$").as_("digits"))
async def any_digits_handler(message: Message, digits: Match[str]):
    await message.answer(html.quote(str(digits)))

Использование в litegram

@router.message(F.text == 'hello')
@router.inline_query(F.data == 'button:1')
@router.message(F.text.startswith('foo'))
@router.message(F.content_type.in_({'text', 'sticker'}))
@router.message(F.text.regexp(r'\d+'))

...

# Many others cases when you will need to check any of available event attribute