首页 > 解决方案 > 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...

enter image description here

标签: javatelegram-bot

解决方案


你应该明白你的消息接收线程不应该“等待”任何东西。它应该立即处理每条收入消息,否则您的所有收入消息都会卡住等待用户回复。

我会将“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);
}

至少,这是我自己发现并成功使用的方式,如果有人能给出如何使其优雅的建议,我将不胜感激。


推荐阅读