При использовании Telegram бота пользователь iOS может одновременно нажать две инлайн кнопки и отправить два калбека. Как решить эту проблему?
При установке флага некоторые дубли всё равно успевают проскочить:
class PreventDuplicateAnswerMiddleware(BaseMiddleware):
async def __call__(
self,
handler: Callable[[CallbackQuery, Dict[str, Any]], Awaitable[Any]],
event: CallbackQuery,
data: Dict[str, Any]
) -> Any:
logger.info(
'Вошли в миддлварь %s, тип события %s',
__class__.__name__,
event.__class__.__name__
)
state: FSMContext = data["state"]
state_data = await state.get_data()
if state_data.get("has_answered"):
logger.info(f"Ответ пользователя был обработан ранее.")
return
await state.update_data(has_answered=True)
updated_state_data = await state.get_data()
logger.info(
f"Ответ пользователя передан на обработку. "
f"Обновлёно состояние ответа: has_answered={updated_state_data.get('has_answered')}"
)
result = await handler(event, data)
logger.info('Выходим из миддлвари %s', __class__.__name__)
await state.update_data(has_answered=False)
final_state_data = await state.get_data()
logger.info(
f"Ответ пользователя обработан. "
f"Обновлёно состояние ответа: has_answered={final_state_data.get('has_answered')}"
)
return result