✨ Магични 🔮 фильтри ✨¶
Примечание
Эта страница все еще в разработке. Имеет много неправильно сформульованих речень.
Это зовнишний пакет, который пидтримуеться основною командою розробки 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