async def __call__(self, event: ChatMemberUpdated) -> bool:
return isinstance(event.new_chat_member, (ChatMemberMember, ChatMemberRestricted))
class BotIsAdmin(BaseFilter):
can_restrict: bool
async def __call__(self, event: ChatMemberUpdated) -> bool:
if not isinstance(event.new_chat_member, ChatMemberAdministrator):
return False
return event.new_chat_member.can_restrict_members == self.can_restrict
У первого не задан шорткат, у второго задан как can_restrict
Вопрос: надо ли оба фильтра биндить в роутер? Второй точно да, не понимаю насчёт первого
default_router.my_chat_member.bind_filter(BotIsMember)
default_router.my_chat_member.bind_filter(BotIsAdmin)
почему бы не ебать себе мозг, и сделать все хендлеры асинхронными?
Причём тут хэндлер вообще?
да мне так, чисто интересно
Не понял, куда туда?
Давай ещё раз: Есть вызов регистрации хэндлера: router.my_chat_member.register(func) Есть асинхронная функция async def my_filter(event: ChatMemberUpdated): pass Как мне правильно эту функцию передать первый вызов? С какими аргументами?
Не, не понимаю) Тебе нужно повесить этот фильтр на весь роутер? Или только на данный хендлер?
Только на данный хэндлер
https://docs.aiogram.dev/en/dev-3.x/dispatcher/observer.html#telegrameventobserver
Я это видел, нихуя не понятно совершенно
Просто следующим аргументом передаешь фильтр
Как фильтр понимает, что ему передаётся на вход?
https://github.com/aiogram/aiogram/blob/6e39f9fada99906567d889c9618f65bc2f089c44/aiogram/dispatcher/event/handler.py#L29
Видимо типы не проверяются
Ладно, давай пока про другое: Вот код: https://paste.aiogram.dev/axezarevan.py Шаги для воспроизведения: 1) Добавляешь бота в группу (он че-то напишет, пофиг) 2) Перезапускаешь бота. 3) Делаешь бота админом БЕЗ права блокировать (restrict) Ожидаемое поведение: Бот отправит сообщение "It works (BotIsAdminFilter)" Реальное поведение: Бот пишет в лог только это: update xxx is not handled Checking BotIsMemberFilter Checking BotIsMemberFilter и ничего не срабатывает
Я не понимаю, почему два раза проверяется один и тот же фильтр, а второй не проверяется вообще
Если закомментировать 46 строчку, то всё работает как ожидалось. Как я понимаю, BotIsMemberFilter не имеет keywordа, поэтому происходит хрень какая-то
Биндить имеет смысл, если нужен вызов через keyword, а так незачем
Понял, спасибо, попробую подредактировать и протестировать
Шикарно, спасибо)
Обсуждают сегодня