Как ответить на replyMarkup с помощью Telegram Java TdApi? - PullRequest
0 голосов
/ 07 июля 2019

Я делаю клиент телеграммы на Java, используя код из https://github.com/tdlib/td/tree/master/example/java Мне нужно общаться с ботом telegram из моего приложения. Бот отправляет сообщения с прикрепленными InlineKeyboardButtons. Как я могу отправить ответы на эти сообщения, например, если я нажму на кнопки?

У TdApi есть класс "AnswerInlineQuery", но я не могу понять, как адаптировать его для своего кода и где я должен принимать параметры для создания этого объекта ответа. Я попытался сделать ответ, используя функцию "sendMessage" с параметром "replyToMessageId".

Вот структура полученных сообщений

UpdateNewMessage { message = Message {
    id = 969932800
    senderUserId = 0
    chatId = -1001418532179
    sendingState = null
    isOutgoing = false
    canBeEdited = false
    canBeForwarded = true
    canBeDeletedOnlyForSelf = false
    canBeDeletedForAllUsers = false
    isChannelPost = true
    containsUnreadMention = false
    date = 1562509621
    editDate = 0
    forwardInfo = null
    replyToMessageId = 0
    ttl = 0
    ttlExpiresIn = 0.000000
    viaBotUserId = 0
    authorSignature = ""
    views = 1
    mediaAlbumId = 0
    content = MessageText {
      text = FormattedText {
        text = "опрос"
        entities = Array[0] {
        }
      }
      webPage = null
    }
    replyMarkup = ReplyMarkupInlineKeyboard {
      rows = Array[1] {
        Array[3] {
          InlineKeyboardButton {
            text = "1"
            type = InlineKeyboardButtonTypeCallback {
              data = bytes [15] { 73 65 6E 64 5F 72 65 61 63 74 69 6F 6E 5F 30 }
            }
          }
          InlineKeyboardButton {
            text = "2"
            type = InlineKeyboardButtonTypeCallback {
              data = bytes [15] { 73 65 6E 64 5F 72 65 61 63 74 69 6F 6E 5F 31 }
            }
          }
          InlineKeyboardButton {
            text = "3"
            type = InlineKeyboardButtonTypeCallback {
              data = bytes [15] { 73 65 6E 64 5F 72 65 61 63 74 69 6F 6E 5F 32 }
            }
          }
        }
      }
    }
  }
}

И вот я получаю сообщения

        @Override
        public void onResult(TdApi.Object object) {
            switch (object.getConstructor()) {
                case TdApi.UpdateNewMessage.CONSTRUCTOR:
                    TdApi.UpdateNewMessage updateNewMessage = (TdApi.UpdateNewMessage) object;
                    TdApi.ReplyMarkupInlineKeyboard buttons = (TdApi.ReplyMarkupInlineKeyboard) updateNewMessage.message.replyMarkup;
                    if (buttons.rows[0][0].text.compareTo("1") == 0) {
                        System.out.println("found button");
                        TdApi.InlineKeyboardButton btn = buttons.rows[0][0];
                        TdApi.InlineKeyboardButtonTypeCallback resp = 
    (TdApi.InlineKeyboardButtonTypeCallback) btn.type;
                    }
                    // TdApi.MessageText messageText = 
    (TdApi.MessageText)updateNewMessage.message.content;
                    // System.out.println(messageText.text.text);
                    break;

Какую функцию и с какими параметрами следует использовать для отправки ответа?

1 Ответ

0 голосов
/ 11 июля 2019

Существует метод GetCallbackQueryAnswer для отправки запроса обратного вызова боту, передающему CallbackQueryPayloadData с данными из кнопки в качестве полезной нагрузки.Я использую этот метод:

private static void replyMessage( long chatId, long messageId, byte[] data) {
    TdApi.CallbackQueryPayloadData payloadData = new TdApi.CallbackQueryPayloadData(data);
    TdApi.GetCallbackQueryAnswer answer = new TdApi.GetCallbackQueryAnswer(chatId,messageId, payloadData);
    client.send(answer, defaultHandler);
}

Где data - байты от InlineKeyboardButtonTypeCallback

...