JavaRush /Java блог /Random UA /Telegram Ability Bot: бот, що вміє вести діалог: Частина ...
Chundrik
35 рівень
Санкт-Петербург

Telegram Ability Bot: бот, що вміє вести діалог: Частина 2

Стаття з групи Random UA
ЧАСТИНА 1 Щоб пізніше не заплутатися у частинах програми, я намагаюся всю логіку розділяти на окремі класи. Саме фрази, якими буде відповідати бот, будуть зберігатися в інтерфейсі 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();
}
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<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);
    }
Спробуйте перезапустити ваш бот. Тепер він запропонує вбудовану клавіатуру у відповідь ваші дії. Telegram Ability Bot: бот, що вміє вести діалог: Частина 2 - 3Корисні лайфхаки для новачків: Якщо ви користуєтеся Ідеєю і хочете подивитися документацію по класу, то виділіть клас або метод і натисніть Ctrl+J на Mac або Ctrl+Q на Windows. Також можна зробити правою кнопкою миші-> Go to-> Declaration of usages. Таким чином, наприклад, можна дізнатися, що наш AbilityBot насправді успадковується від стандартного TelegramLongPollingBot. Тільки в ньому використовуються лямбди, що суттєво скорочує код. У наступній (фінальній) частині буде розвиток діалогу та деплою на Heroku.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ