@deathmurder

Как создать многоуровневое меню в TelegramBots API JAVA?

Не врублюсь как сделать многоуровневое меню inlineKeybords на JAVA в Telegram. Пытался добавлять условия и по callbackQuery, и по getMessage. Результат один, проверка не проходит и меню не открывается. Весь гугл перерыл. Есть такие туториалы на Pyton, но в питоне я даже синтаксиса не знаю.

import org.telegram.telegrambots.ApiContextInitializer;

import org.telegram.telegrambots.bots.TelegramLongPollingBot;
import org.telegram.telegrambots.meta.TelegramBotsApi;
import org.telegram.telegrambots.meta.api.methods.send.SendMessage;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.Update;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.ReplyKeyboardMarkup;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardButton;
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.KeyboardRow;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;

import java.util.ArrayList;
import java.util.List;

public class Bot extends TelegramLongPollingBot {
    public static void main(String[] args) {
        System.out.println("бот стартанул");
        disableWarning();
        ApiContextInitializer.init();

        TelegramBotsApi botsApi = new TelegramBotsApi();
        try {
            botsApi.registerBot(new Bot());
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }
    public String getBotUsername() {
        return "BotName";
        //возвращаем юзера
    }

    public void onUpdateReceived(Update update) {
        if (update.hasMessage()) {
//            Message msg = update.getMessage(); // Это нам понадобится
//            String txt = msg.getText();
            if (update.getMessage().hasText()) {
                if (update.getMessage().getText().equals("/start")) {
                    sendMsg(update.getMessage(), "Hello, world! This is simple bot!");
                    try {

                        execute(sendInlineKeyBoardMessage(update.getMessage().getChatId()));
                    } catch (TelegramApiException e) {
                        e.printStackTrace();
                    }
                }
//                } else if (update.getMessage().getText().equals("Алтайский край")) {
//                    try {
//                        execute(sendCityOfStateMenuAltay(update.getMessage().getChatId()));
//                    } catch (TelegramApiException e) {
//                        e.printStackTrace();
//                    }
//                }

//                else if (update.getCallbackQuery().getMessage().getText().equals("/Алтайский край")) {
//                    try {
//                        execute(sendCityOfStateMenuAltay(update.getMessage().getChatId()));
//                    } catch (TelegramApiException e) {
//                        e.printStackTrace();
//                    }
//                }
            }
        } else if (update.hasCallbackQuery()) {
//            try {
//                execute(sendMsg(update.getMessage());
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            if (update.getCallbackQuery().getData().equals("Алтайский край")) {
                try {
                    execute(new SendMessage().setText(
                            update.getCallbackQuery().getData())
                            .setChatId(update.getCallbackQuery().getMessage().getChatId()));
                } catch (TelegramApiException e) {
                    e.printStackTrace();
                }
//            }
        }
    }


    @Override
    public String getBotToken() {
        return "";
    }
    private void sendMsg(Message msg, String text) {

        SendMessage s = new SendMessage();
        s.setChatId(msg.getChatId());
        s.setText(text);

        try { 
            execute(s);
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    }


    public static SendMessage sendInlineKeyBoardMessage(long chatId) {
        InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
        InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton();
        InlineKeyboardButton inlineKeyboardButton2 = new InlineKeyboardButton();
        inlineKeyboardButton1.setText("Алтайский край");
        inlineKeyboardButton1.setCallbackData("Алтайский край");
        inlineKeyboardButton2.setText("Амурская область");
        inlineKeyboardButton2.setCallbackData("Амурская область");
        List<InlineKeyboardButton> keyboardButtonsRow1 = new ArrayList<>();
        List<InlineKeyboardButton> keyboardButtonsRow2 = new ArrayList<>();
        keyboardButtonsRow1.add(inlineKeyboardButton1);
        keyboardButtonsRow2.add(inlineKeyboardButton2);
        List<List<InlineKeyboardButton>> rowList = new ArrayList<>();
        rowList.add(keyboardButtonsRow1);
        rowList.add(keyboardButtonsRow2);
        inlineKeyboardMarkup.setKeyboard(rowList);
        return new SendMessage().setChatId(chatId).setText("Выберите область").setReplyMarkup(inlineKeyboardMarkup);
    }
    public static SendMessage sendCityOfStateMenuAltay(long chatId) {
        InlineKeyboardMarkup inlineKeyboardMarkup = new InlineKeyboardMarkup();
        InlineKeyboardButton inlineKeyboardButton1 = new InlineKeyboardButton();
        InlineKeyboardButton inlineKeyboardButton2 = new InlineKeyboardButton();
        inlineKeyboardButton1.setText("Барнаул");
        inlineKeyboardButton1.setCallbackData("Барнаул");
        inlineKeyboardButton2.setText("Бийск");
        inlineKeyboardButton2.setCallbackData("Бийск");
        List<InlineKeyboardButton> keyboardButtonsRow1 = new ArrayList<>();
        List<InlineKeyboardButton> keyboardButtonsRow2 = new ArrayList<>();
        keyboardButtonsRow1.add(inlineKeyboardButton1);
        keyboardButtonsRow2.add(inlineKeyboardButton2);
        List<List<InlineKeyboardButton>> rowList = new ArrayList<>();
        rowList.add(keyboardButtonsRow1);
        rowList.add(keyboardButtonsRow2);
        inlineKeyboardMarkup.setKeyboard(rowList);
        return new SendMessage().setChatId(chatId).setText("Выберите город").setReplyMarkup(inlineKeyboardMarkup);
    }


    public static void disableWarning() {
        System.err.close();
        System.setErr(System.out);
    }
}
  • Вопрос задан
  • 2766 просмотров
Решения вопроса 1
@deathmurder Автор вопроса
в этом куске кода
execute(new SendMessage().setText(
                            update.getCallbackQuery().getData())
                            .setChatId(update.getCallbackQuery().getMessage().getChatId()));

нужно передать в аргументы метод обработчик нашего меню, в который обязательно нужно передать chatId и строковое значение, которое приходит из CallbackQuery методом getData(), само строковое значение уже обрабатывать в непосредственно в методе которое выводит меню
execute(menu(update.getCallbackQuery().getMessage().getChatId(), update.getCallbackQuery().getData());
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы