Обработка одновременного нажатия от нескольких пользователей на одну 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 шт):
Всё-таки смог придумать решение. Может быть оно немного костыльное, но рабочее. В самом начале функции добавляю метод по удалению клавиатуры у сообщения. В связи с чем другие пользователи просто не успевают нажать на кнопку. Затем уже клавиатура обновляется и выводится с новым расположением кнопок.
@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']:
...