Telegram aiogram - не обрабатывается одновременное нажатие кнопок разными пользователями

Рейтинг: 2Ответов: 1Опубликовано: 20.02.2023

Бот на aiogram. Пример кода - 2 последовательных шага, второй из которых ловит колбэк по любой нажатой кнопке в first_handler. Все прекрасно работает, когда проходит один юзер, или два, но с некоторым промежутком во времени.

Проблема: когда 2 пользователя проходят один и тот же шаг (например как в примере кода - одновременно нажали одну из btn1-btn3), кнопки в самой телеге перестают отвечать (крутится колесико). Зависает либо сразу у обоих, либо шаг проходит тот, кто чуть раньше нажал. При этом даже когда у второго кнопки уже отвиснут, на повторное нажатие бот уже не реагирует. С остальными кнопками в других местах - то же самое.

Было предположение, что дело в одновременном получении данных из memory storage в state.get_data(), но даже если это исключить или обработать в try except - результат тот же.

async def first_handler(call: types.CallbackQuery, state: FSMContext):

    user = await state.get_data()
    sc = ', '.join(user['selected_cities'][1:])

    btn1 = types.InlineKeyboardButton("btn1", callback_data="btn1")
    btn2 = types.InlineKeyboardButton("btn2", callback_data="btn2")
    btn3 = types.InlineKeyboardButton("btn3", callback_data="btn3")
    visa_keyboard = types.InlineKeyboardMarkup(row_width=1)
    visa_keyboard.add(btn1, btn2, btn3)

    await call.message.edit_text(f'Выбраны города: {sc}')
    await bot.send_message(call.from_user.id, text1, reply_markup=visa_keyboard, parse_mode= 'Markdown')
    await Form.visa_prime_check.set()


async def visa_prime_check (call: types.CallbackQuery, state: FSMContext):

    await state.update_data(visa_type = call.data)
    user = await state.get_data()

    if 'Москва' in user['selected_cities']:

        keyboard = types.InlineKeyboardMarkup()
        yes_button = types.InlineKeyboardButton("Да", callback_data="Да")
        no_button = types.InlineKeyboardButton("Нет", callback_data="Нет")
        keyboard.add(yes_button, no_button)

        await bot.send_message(call.from_user.id, text2, reply_markup=keyboard, parse_mode= 'Markdown')
        await Form.next_step.set()
     else:
        await next_step_handler(call, state)

Ответы

▲ 0

При обработке CallbackQuery необходимо явно сообщить Telegram, что вы обрабатываете это обновление:

await call.answer()