фильтр на роутер? и опять, как взять коннект для этого?
https://docs.aiogram.dev/en/dev-3.x/dispatcher/router.html#how-it-works
Делаешь фильтр, в нём пихаешь проверку, что юзер зареган (или НЕ зареган). Вешаешь фильтр на роутер. Вот тут я вешаю magic-filter (что-то типа лямбды), но ты можешь передать свой полноценный фильтр, о них читай тут. Ну дальше регаешь этот роутер первым. При приходе сообщения возьмётся первый роутер, выполнится фильтр. Если фильтр прошёл, апдейт попадает в этот роутер. Если не прошёл, идёт дальше
спасибо а как можно передать в фильтр коннет? или пул? при регистрации фильтра это можно сделать как с мидлварью?
Кстати, в тройке обычные фильтры можно инвертировать?
тож хз, сам пока во всём этом разбираюсь
У меня не заработало прост, пишет что нет соответствующего метода. А делать наследование и прочие извращения как не очень
Подобным образом https://paste.aiogram.dev/luxozanumu.py
Тильда не работает, разве только вот такая хрень: class IsRegistered(BaseFilter): invert = False async def __call__(self, message: Message, *args, **kwargs): db = kwargs.get('db') async with db() as session: async with session.begin(): status: Exists = await session.execute( exists().select_from(Users).where(Users.telegram_id == message.from_user.id).select() ) status = status.scalar() return status if self.invert else not status Причём отнаследоваться и сделать свой BaseFilter мешает пайдантик, в сочетании с моими пробелами в знаниях
нет, но можно будет
возможно в b3
Окей, жаль. А чего пайдантик мешает сделать наследника для BaseFilter? Выбивает ошибку несуществующего поля
Например class MyBaseFilter(BaseFilter): def __init__(self, **data: Any): super().__init__(**data) self._invert = False def __invert__(self): self._invert = True class IsRegistered(MyBaseFilter): async def __call__(self, message: Message, *args, **kwargs): checker = kwargs.get('checker') return checker(...) ValueError: "IsRegistered" object has no field "_invert"
Да и не очень понятно, учитывая что __call__ переопределяется, как туда приделать обработку инверсии. Нужно как-то перехватить return и внутри обработать флаг инверсии...
Обсуждают сегодня