Телеграмм бот меню java

Как создать многоуровневое меню в 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("Амурская область"); ListkeyboardButtonsRow1 = new ArrayList<>(); List keyboardButtonsRow2 = new ArrayList<>(); keyboardButtonsRow1.add(inlineKeyboardButton1); keyboardButtonsRow2.add(inlineKeyboardButton2); List 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("Бийск"); ListkeyboardButtonsRow1 = new ArrayList<>(); List keyboardButtonsRow2 = new ArrayList<>(); keyboardButtonsRow1.add(inlineKeyboardButton1); keyboardButtonsRow2.add(inlineKeyboardButton2); List 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); >>
execute(new SendMessage().setText( update.getCallbackQuery().getData()) .setChatId(update.getCallbackQuery().getMessage().getChatId()));

нужно передать в аргументы метод обработчик нашего меню, в который обязательно нужно передать chatId и строковое значение, которое приходит из CallbackQuery методом getData(), само строковое значение уже обрабатывать в непосредственно в методе которое выводит меню

execute(menu(update.getCallbackQuery().getMessage().getChatId(), update.getCallbackQuery().getData());

Источник

Telegram Ability Bot: бот, умеющий вести диалог: Часть 2

Java-университет

ЧАСТЬ 1 Чтобы позже не запутаться в частях программы, я стараюсь всю логику разделять на отдельные классы. Собственно фразы, которыми будет отвечать бот, будут хранится в интерфейсе Constants . Создадим там строку:

 String START_DESCRIPTION = "Hello"; 
 public Ability replyToStart() < return Ability .builder() .name("start") .info(Constants.START_DESCRIPTION) .locality(ALL) .privacy(PUBLIC) .action(ctx ->silent.send("Hello!", ctx.chatId())) .build(); > 

Telegram Ability Bot: бот, умеющий вести диалог: Часть 2 - 1Теперь бот может приветствовать его клиентов в ответ на стандартную команду /start . Попробуйте запустить его: бот уже немного живой! Но, как и любому монстру Франкештейна, ему не хватает парочки конечностей.Telegram Ability Bot: бот, умеющий вести диалог: Часть 2 - 2

Использование встроенной клавиатуры

Чтобы бот смог построить с нами диалог, нам понадобятся еще два класса: MessageFactory и KeyboardFactory . Первый будет считывать ответы людей и генерировать сообщения, а второй — создавать кнопки с ответами.

 public class KeyboardFactory < public static ReplyKeyboard startButtons() < InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup(); List> rowsInline = new ArrayList<>(); List rowInline = new ArrayList<>(); rowInline.add(new InlineKeyboardButton().setText("DISCUSSION").setCallbackData(Constants.DISCUSSION)); rowInline.add(new InlineKeyboardButton().setText("SMALL TALK").setCallbackData(Constants.SMALL_TALK)); rowsInline.add(rowInline); inlineKeyboard.setKeyboard(rowsInline); return inlineKeyboard; > > 
 String START_REPLY = "Start using the telegram bot if you are lonely or bored"; String CHOOSE_OPTION = "Make a choice"; String DISCUSSION = "Let's discuss!"; String SMALL_TALK = "Let's talk!"; 

Теперь мы можем просто вызвать статический метод нашей фабрики, чтобы использовать встроенную клавиатуру. Самая важная часть кода — это setCallbackData() . Она распознает, какая кнопка была нажата пользователем. Переходим в MessageFactory :

 public class MessageFactory < private final MessageSender sender; //используется для отправки сообщений обратно пользователю public MessageFactory(MessageSender sender) < this.sender = sender; >public void start (long chatId) < try < sender.execute(new SendMessage() .setText(Constants.START_REPLY) .setChatId(chatId)); sender.execute(new SendMessage() .setText(Constants.CHOOSE_OPTION) .setChatId(chatId) .setReplyMarkup(KeyboardFactory.startButtons())); >catch (TelegramApiException e) < e.printStackTrace(); >> > 
 public Ability replyToStart() < return Ability .builder() .name("start") .info(Constants.START_DESCRIPTION) .locality(ALL) .privacy(PUBLIC) .action(ctx ->messageFactory.start(ctx.chatId())) .build(); > 
 private TelegramBot(String botToken, String botUsername)

Telegram Ability Bot: бот, умеющий вести диалог: Часть 2 - 3

Попробуйте перезапустить ваш бот. Теперь он предложит встроенную клавиатуру в ответ на ваши действия. Полезные лайфхаки для новичков: Если вы пользуетесь Идеей и хотите посмотреть документацию по классу, то выделите класс или метод и нажмите Ctrl+J на Mac или Ctrl+Q на Windows. Также можно сделать правой кнопкой мыши-> Go to-> Declaration of usages. Таким образом, к примеру, можно узнать, что наш AbilityBot на самом деле наследуется от стандартного TelegramLongPollingBot. Только в нем используются лямбды, что существенно сокращает код. В следующей (финальной) части будет развитие диалога и деплой на Heroku.

Источник

Читайте также:  Как заставить питон подождать
Оцените статью