java - how to allow java telegram bot wait user reply?
问题描述
Good day, all. Can I allow my java telegram bot to wait for user's reply and continue to ask another question?
if(msg.contains("/register"))
{
SendMessage message = SendMessage
.builder()
.chatId(Long.toString(telegram_id))
.text("Please enter your name.\n" +
"/cancelReg To cancel Registration")
.build();
executeMessageMethod(message);
message = SendMessage
.builder()
.chatId(Long.toString(telegram_id))
.text("Please enter your handicap.\n" +
"/cancelReg To cancel Registration")
.build();
executeMessageMethod(message);
}
My code cannot allow my bot to ask 1 question and wait for user's reply... so how I can solve it...
解决方案
你应该明白你的消息接收线程不应该“等待”任何东西。它应该立即处理每条收入消息,否则您的所有收入消息都会卡住等待用户回复。
我会将“dialogId”字段添加到用户对象并以这种方式处理传入的消息:
public void process(Message message) {
User user = UserDAO.getOrCreateUserByChatId(message.fromId);
String msg = message.getMessage();
if (msg.contains("/register")) {
user.dialogId = Dialogs.REGISTER; // Dialogs - your enum or an interface/class with static final fields.
} else if (/*all other commands possible*/) {}
if (user.dialogId == null) {
return;
}
switch (user.dialogId) {
case REGISTER:
processRegister(user, msg);
break;
/*all other dialogs possible*/
}
}
private static final String PLEASE_ENTER_NAME_MESSAGE = "Please enter your name.\n/cancelReg To cancel Registration";
private static final String PLEASE_ENTER_HANDICAP_MESSAGE = "Please enter your handicap.\n/cancelReg To cancel Registration";
private static final String REGISTRATION_SUCCESSFULL_MESSAGE = "Registration successfull";
private void processRegister(User user, String msg) {
if (msg.equals("/register")) {
sendMessage(user.chatId, PLEASE_ENTER_NAME_MESSAGE);
return;
}
if (!user.hasName()) {
user.setName(msg);
sendMessage(user.chatId, PLEASE_ENTER_HANDICAP_MESSAGE);
return;
}
if (!user.hasHandicap()) {
user.setHandicap(msg);
user.dialogId = GENERAL; // for example
sendMessage(user.chatId, REGISTRATION_SUCCESSFULL_MESSAGE);
return;
}
}
private void sendMessage(long chatId, String msg) {
SendMessage message = new SendMessage
.builder()
.chatId(Long.toString(chatId))
.text(msg)
.build();
executeMessageMethod(message);
}
至少,这是我自己发现并成功使用的方式,如果有人能给出如何使其优雅的建议,我将不胜感激。
推荐阅读
- javascript - 无法在 then 方法中调用函数
- excel - VBA Excel:如何将类放入数组中
- arrays - Reactjs:如何检查数组中的数据是否存在?
- c++ - 带有 std::async 的函数在 Linux 上不使用多个内核
- swift - 如何让用户快速在 xib 单元格内的文本字段中输入文本
- swift - 将其转换为所需的 Date.Function 返回 nil 值后获取 nil 值
- html - 单选按钮组的 HTML 5 自定义验证不起作用
- python - 使用 Kivy 将 APK 安装到 Android 设备
- python - (django)我在 django 中创建了一个 todo 应用程序,但每次我更新任务时。它创建一个新对象
- javascript - 格式化“阅读更多”按钮时出现问题