ЧАСТИНА 1 Щоб пізніше не заплутатися у частинах програми, я намагаюся всю логіку розділяти на окремі класи. Саме фрази, якими буде відповідати бот, будуть зберігатися в інтерфейсі
Тепер бот може вітати його клієнтів у відповідь на стандартну команду
Корисні лайфхаки для новачків: Якщо ви користуєтеся Ідеєю і хочете подивитися документацію по класу, то виділіть клас або метод і натисніть Ctrl+J на Mac або Ctrl+Q на Windows. Також можна зробити правою кнопкою миші-> Go to-> Declaration of usages. Таким чином, наприклад, можна дізнатися, що наш AbilityBot насправді успадковується від стандартного TelegramLongPollingBot. Тільки в ньому використовуються лямбди, що суттєво скорочує код. У наступній (фінальній) частині буде розвиток діалогу та деплою на Heroku.
Constants
. Створимо там рядок:
String START_DESCRIPTION = "Hello";
Потім перейдемо в клас TelegramBot
і вставимо наступний код:
public Ability replyToStart() {
return Ability
.builder()
.name("start")
.info(Constants.START_DESCRIPTION)
.locality(ALL)
.privacy(PUBLIC)
.action(ctx -> silent.send("Hello!", ctx.chatId()))
.build();
}

/start
. Спробуйте запустити його: бот уже трохи живий! Але, як і будь-якого монстра Франкештейна, йому не вистачає парочки кінцівок.
Використання вбудованої клавіатури
Щоб бот зміг побудувати з нами діалог, нам знадобляться ще два класи:MessageFactory
і KeyboardFactory
. Перший зчитуватиме відповіді людей і генеруватиме повідомлення, а другий — створюватиме кнопки з відповідями.
public class KeyboardFactory {
public static ReplyKeyboard startButtons() {
InlineKeyboardMarkup inlineKeyboard = new InlineKeyboardMarkup();
List<list<inlinekeyboardbutton>> rowsInline = new ArrayList<>();
List<inlinekeyboardbutton> 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;
}
}
</inlinekeyboardbutton></list<inlinekeyboardbutton>
Дорогою додамо в Constants
:
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();
}
}
}
Замінимо код у методі Telegrambot.replyToStart()
:
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) {
super(botToken, botUsername);
messageFactory = new MessageFactory(sender);
}
Спробуйте перезапустити ваш бот. Тепер він запропонує вбудовану клавіатуру у відповідь ваші дії. 
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ