Aiogram 3 бот не реагирует на изменение условий фильтрации. В чем может быть проблема?

Ссылка скопирована
1 ответ

Пишу бота: Python 3.9, Aiogram 3.4.1. Тестирую и планирую запускать в окружении docker compose. (Кастомный python image и базовый mysql:latest)
В боте подразумевается 3 уровня доступа: админ, кастомер и юзер. Я написал фильтры для кастомера и для админа, а запросы от юзеров обрабатываются без фильтра.
Юзер может зарегистрироваться и стать кастомером: для этого я вношу тг id в базу данных mysql. Из админки видно сразу что есть новая запись в таблице. Но когда я отправляю команду /start (после удачного прохождения регистрации) бот все еще видит меня как юзера, а должен как кастомера. Но если я останавливаю docker-compose, потом делаю docker-compose up --build, то бот уже видит меня как кастомера.

Логи после docker-compose up --build

bot            | 2024-03-21 04:12:32.750 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.755 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.756 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.757 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.758 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.759 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot            | 2024-03-21 04:12:32.760 | INFO     | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>]

bot | 2024-03-21 04:12:32.750 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.755 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.756 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.757 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.758 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.759 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>] bot | 2024-03-21 04:12:32.760 | INFO | utils.db_utils:get_customers_id_list:71 - get_customers_id_list: [<my_tg_id>]

вот именно в таком количестве он сразу при старте выдает логи но при этом каких-то сообщений в чат не приходит.

class IsCustomer(Filter):     def __init__(self) -> None:         # get_customers_id_list() - возвращает список с интами: list[int]         self.customers = get_customers_id_list()      async def __call__(self, message: Union[Message, CallbackQuery]) -> bool:         return message.from_user.id in self.customers

class IsCustomer(Filter): def __init__(self) -> None: # get_customers_id_list() - возвращает список с интами: list[int] self.customers = get_customers_id_list() async def __call__(self, message: Union[Message, CallbackQuery]) -> bool: return message.from_user.id in self.customers

Пример функции с фильтром:

@customers.message(IsCustomer(), F.text == run) async def get_items_processing(message: Message, state: FSMContext):     await state.set_state(TaskReservation.choose_item)     ....

@customers.message(IsCustomer(), F.text == run) async def get_items_processing(message: Message, state: FSMContext): await state.set_state(TaskReservation.choose_item) ....

Что можно сделать чтобы бот сразу видел что теперь зарегистрированный айдишник это кастомер?

Дополнительно:

Ответы:

ну так разберись когда отрабатывает __init__ и когда у тебя появляется юзер

  • Запускаю бот (судя по логам - почему то 7 раз вызывается IsCustomer, get_customers_id_list используется только тут) пишу в бот до регистрации отвечают те функции которые должны (те которые без фильтров), регистрируюсь (функциями которые без фильтров) по идее появляется кастомер, но бот все еще отвечает функциями без фильтров.
  • Alexandr_Golubkin, ну так вот, только при запуске, а далее все новые кастомеры у тебя отсутствуют в self.customers
  • Окей, я понял, стоило дополнить вопрос:
    @customers.message(IsCustomer(), F.text == run) async def get_items_processing(message: Message, state: FSMContext):     await state.set_state(TaskReservation.choose_item)     ...

    @customers.message(IsCustomer(), F.text == run) async def get_items_processing(message: Message, state: FSMContext): await state.set_state(TaskReservation.choose_item) ...

    а если я вот так проставляю фильтр, разве __init__ у IsCustomer не должен отрабатывать каждый раз при приеме сообщения?

  • Alexandr_Golubkin, ну так глянь свои логи, ты же фиксируешь работу get_customers_id_list, появляется у тебя об этом запись? ну и раз тебе нужно его вызывать при каждом приеме, может сразу стоит из __init__ перенести в __call__?
  • Everything_is_bad, Фак! Да! спасибо!!!!

Перенести вызов функции со списком id из бд в фильтре в блока из __init__ в __call__

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Антон С. Ответ

Для начала, важно убедиться, что вы правильно настроили условия фильтрации для вашего бота на Aiogram 3. Убедитесь, что вы правильно задали условия в вашем коде, и что они соответствуют ожидаемому поведению бота.

Если вы уверены, что условия фильтрации заданы верно, то возможно проблема кроется в самом Aiogram 3. Возможно, вы столкнулись с каким-то багом или проблемой в библиотеке. В таком случае, рекомендуется обратиться к документации Aiogram 3 или к сообществу разработчиков для получения помощи.

Также, проверьте версию Aiogram 3, которую вы используете. Возможно, проблема была исправлена в более новой версии библиотеки. Попробуйте обновить Aiogram 3 до последней версии и проверьте, решается ли проблема.

Если после всех этих действий проблема все еще не решена, то стоит протестировать ваш код на другой среде выполнения, чтобы исключить возможность проблемы с вашим окружением. Также, можно попробовать написать минимальный пример кода, который демонстрирует проблему, и опубликовать его на форумах или вопросительных ресурсах, чтобы получить помощь от сообщества.

Надеюсь, что мои рекомендации помогут вам решить проблему с нереагирующим на изменение условий фильтрации ботом на Aiogram 3. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их здесь. Удачи!

// Ваш код на PHP здесь

// Ваш код на PHP здесь

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно