Обработка одновременного нажатия от нескольких пользователей на одну Inline кнопку в телеграм

Проблема в следующем. У меня написан телеграм бот по обработке заявок. Они выводятся в виде сообщения с Inline кнопками в группе из нескольких человек. И возникает проблема, что хэндлер срабатывает, при одновременном нажатии на одну кнопку, несколько раз, что неправильно. При правильной работе, пользователь жмёт на кнопку, выполняются соответствующие действия (запросы в базу и т. д.), кнопка удаляется из списка и это сообщение обновляется.

Как можно исправить проблему с одновременным нажатием?

сообщение с кнопками

Функция обработчик основных кнопок (18. 123, 20. Пробник 2 и т. д.)

@router_callback_public.callback_query(QueriesCD.filter(), IsKurator())
async def queries(c: CallbackQuery, callback_data: QueriesCD, state: FSMContext, session: AsyncSession):
    async with lock:
        await c.answer('Вы взяли заявку', show_alert=True)
        # await state.update_data(press_flag=True)
        # flag = await state.get_data()
        # if not flag['press_flag']:
        #     return
        # else:
        #     await state.update_data(press_flag=False)
        kurator_user_id = c.from_user.id
        kurator_username = c.from_user.username
        query_data = callback_data.query_name.split('_')
        #Получение сообщений того, что нужно переправлять и их пересылка куратору
        #ЧТОБЫ ПОЛУЧИТЬ СООБЩЕНИЯ, КУРАТОР ДОЛЖЕН АКТИВИРОВАТЬ ЛИЧНЫЙ ДИАЛОГ С БОТОМ
        in_process = await query_in_progress(kurator_user_id)
        if not in_process:
            try:
                messages_ids, chat_id, kurator_id, id_query, query_name, progress = await forward_messages_from_db(session,
                                                                                                                   kurator_user_id,
                                                                                                                   query_data,
                                                                                                                   kurator_username)
                query_db = select(KuratorsDB.user_id).where(KuratorsDB.username == kurator_username)
                data_raw = await session.execute(query_db)
                kurator_id_from_kuratorDB = data_raw.scalar_one()
                await state.update_data({'dialog_data': (chat_id, kurator_id)})
                await c.bot.send_message(chat_id=kurator_id, text=f'Заявка № {id_query}. Краткое описание:\n {query_name}.',
                                         reply_markup=keyboard_for_keys(send_answer='Отправить ответ'))
                await c.bot.copy_messages(kurator_id, chat_id, messages_ids)
                lst = []
                for name in await select_queries_without_kurator(session):
                    lst.append(name)
                await state.set_state(TempData.temp_data)
                await state.update_data(temp_data=lst)
                #Копируем состояние куратора в состояние юзера
                user_state = FSMContext(
                    storage=state.storage,
                    key=StorageKey(
                        bot_id=c.bot.id,
                        user_id=kurator_id_from_kuratorDB,
                        chat_id=kurator_id_from_kuratorDB
                    )
                )
                await user_state.set_state(KuratorAnswer.answer)
                await user_state.update_data(answer_messages=[])
                await user_state.update_data(query_id=id_query)
                await c.message.edit_reply_markup(reply_markup=keyboard_for_paginator_queries(lst))
            except Exception as e:
                print(e)
                await c.message.answer(f'Не удалось переслать сообщения. Что-то пошло не так')
        else:
            await c.answer('У вас уже есть активная заявка', show_alert=True)

Ответы (1 шт):

Автор решения: Vilgefortz

Всё-таки смог придумать решение. Может быть оно немного костыльное, но рабочее. В самом начале функции добавляю метод по удалению клавиатуры у сообщения. В связи с чем другие пользователи просто не успевают нажать на кнопку. Затем уже клавиатура обновляется и выводится с новым расположением кнопок.

@router_callback_public.callback_query(QueriesCD.filter(), IsKurator())
async def queries(c: CallbackQuery, callback_data: QueriesCD, state: FSMContext, session: AsyncSession):
    await c.message.edit_reply_markup()
    async with lock:
        await c.answer('Вы взяли заявку', show_alert=True)
        # await state.update_data(press_flag=True)
        # flag = await state.get_data()
        # if not flag['press_flag']:   
        ...
→ Ссылка