Как реализовать обработу callback'ов telegram боте для группового чата?
Пишу телеграм бота, который бы реализовывал логику простого квиза для чатика друзей. Один пользователь запускает бота, всплывает вопрос с инлайновыми кнопками и тот пользователь чата, кто первый нажмет правильный ответ, поулчает баллы, после чего клавиатура на этом сообщении скрывается.
На данном этапе у меня возникла проблема, что если несколько пользователей нажимают на инлайновую кнопку одновременно или кто-то ещё успевает нажать кнопку до сокрытия клавиатуры, то засчитываются все нажатия от разных пользователей.
Собственно можете подсказать как реализовать обработку нескольких одновременных callback'ов с одного чата и одного сообщения, так чтобы вычленить первый и обработать только его? Ну или как реализовать такую логику иначе?
Код:
final BotConfig config;
public TelegramBot(BotConfig config) {
this.config = config;
}
@Override
public void onUpdateReceived(Update update) {
if (update.hasMessage() && update.getMessage().hasText()) {
String messageText = update.getCallbackQuery().getMessage().getText();
long chatId = update.getMessage().getChatId(); //в какой чат отправили
switch (messageText) {
case "/start@dr_camp_bot", "/start" -> {
askQuestion(chatId);
}
}
}
if (update.hasCallbackQuery()) {
String callbackData = update.getCallbackQuery().getData();
String text = update.getCallbackQuery().getMessage().getText();
int messageId = update.getCallbackQuery().getMessage().getMessageId();
long chatId = update.getCallbackQuery().getMessage().getChatId();
String userName = update.getCallbackQuery().getFrom().getUserName();
if(callbackData.equals("ANSWER1")) {
changeMessage(text,messageId,chatId);//старое сообщение заменяется и клавиатура исчезает
String answer = userName+" корректно ответил на вопрос. +25 баллов.";
sendSimpleMessage(chatId,answer);//в чат выкидывается сообщение, что вот этот конкретный пользователь правильно ответил
//тут какая-то логика начисления баллов
}
}
}
private void askQuestion(long chatId) {
SendMessage message = new SendMessage();
message.setChatId(String.valueOf(chatId));
message.setText("Сложный вопрос");
InlineKeyboardMarkup markupInLine = new InlineKeyboardMarkup();
List<List<InlineKeyboardButton>> rowsInLine = new ArrayList<>();
List<InlineKeyboardButton> rowInLine1 = new ArrayList<>();
var answerButton1 = new InlineKeyboardButton();
answerButton1.setText("Первый вариант");
answerButton1.setCallbackData("ANSWER1");
var answerButton2 = new InlineKeyboardButton();
answerButton2.setText("Второй вариант");
answerButton2.setCallbackData("ANSWER2");
rowInLine1.add(answerButton1);
rowInLine1.add(answerButton2);
rowsInLine.add(rowInLine1);
markupInLine.setKeyboard(rowsInLine);
message.setReplyMarkup(markupInLine);
try {
execute(message);
}catch(TelegramApiException e) {
log.error("Error occurred: "+e.getMessage());
}
}
private void sendSimpleMessage(long chatId,String text) {
SendMessage message = new SendMessage();
message.setChatId(String.valueOf(chatId));
message.setText(text);
try {
execute(message);
}catch(TelegramApiException e) {
log.error("Error occurred: "+e.getMessage());
}
}
private void changeMessage(String newText, int messageId, long chatId) {
EditMessageText message = new EditMessageText();
message.setChatId(String.valueOf(chatId));
message.setText(newText);
message.setMessageId(messageId);
try {
execute(message);
}catch(TelegramApiException e) {
log.error("Error occurred: "+e.getMessage());
}
}
@Override
public String getBotUsername() {
return config.getBotName();
}
@Override
public String getBotToken() {
return config.getToken();
}
}