第 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();
}
现在,机器人可以响应标准命令来迎接其客户/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);
}
尝试重新启动您的机器人。它现在将提供内置键盘来响应您的操作。对初学者有用的生活窍门: 如果您正在使用 Idea 并且想要查看某个类的文档,请选择该类或方法,然后按 Ctrl+J(Mac 上)或 Ctrl+Q(Windows 上)。您还可以右键单击->转到->用法声明。因此,例如,您可以发现我们的AbilityBot实际上继承自标准TelegramLongPollingBot。只是它使用了 lambda,这大大减少了代码。 下一个(最后)部分将开发 Heroku 上的对话和部署。
GO TO FULL VERSION