Aiogram 3 бот не реагирует на изменение условий фильтрации. В чем может быть проблема?
Пишу бота: 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__
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для начала, важно убедиться, что вы правильно настроили условия фильтрации для вашего бота на Aiogram 3. Убедитесь, что вы правильно задали условия в вашем коде, и что они соответствуют ожидаемому поведению бота.
Если вы уверены, что условия фильтрации заданы верно, то возможно проблема кроется в самом Aiogram 3. Возможно, вы столкнулись с каким-то багом или проблемой в библиотеке. В таком случае, рекомендуется обратиться к документации Aiogram 3 или к сообществу разработчиков для получения помощи.
Также, проверьте версию Aiogram 3, которую вы используете. Возможно, проблема была исправлена в более новой версии библиотеки. Попробуйте обновить Aiogram 3 до последней версии и проверьте, решается ли проблема.
Если после всех этих действий проблема все еще не решена, то стоит протестировать ваш код на другой среде выполнения, чтобы исключить возможность проблемы с вашим окружением. Также, можно попробовать написать минимальный пример кода, который демонстрирует проблему, и опубликовать его на форумах или вопросительных ресурсах, чтобы получить помощь от сообщества.
Надеюсь, что мои рекомендации помогут вам решить проблему с нереагирующим на изменение условий фильтрации ботом на Aiogram 3. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их здесь. Удачи!
// Ваш код на PHP здесь// Ваш код на PHP здесь