Chatbot Telegram: Multiple conversations and messaging confusion

Asked

Viewed 99 times

-1

I’m making a chatbot in java on Telegram, everything flows normally, but when more than one person starts interacting with the bot, it stops working for other users, and it only works for one. I tried several ways, but I couldn’t fix it. follows below the code, did not know which part of the code would be important for this, so I sent all:

public class MainBOT extends TelegramLongPollingBot {

HashMap<Long, String> interacoes = new HashMap<Long, String>();
String contexto = "inicio";
String acao = "";
Prestador p = new Prestador("", "", "");

@Override
public String getBotUsername() {
    return "PegraoAlegriaBot";
}

public void enviarMensagem(long idTelegram, String mensagem) {
    // Mensagem a ser enviada
    SendMessage send = new SendMessage();
    send.setChatId(idTelegram);
    send.setText(mensagem);

    try {
        execute(send);
    } catch (TelegramApiException e) {
        e.printStackTrace();
    }
}

@Override
public void onUpdateReceived(Update u) {
    // Dados da mensagem recebida pelo bot
    String nome = u.getMessage().getFrom().getFirstName();
    long idTelegram = u.getMessage().getChatId();
    String mensagem = u.getMessage().getText();

    System.out.println("Contexto: " + contexto);
    System.out.println("Mensagem: " + mensagem);

    if (contexto == "inicio" || mensagem.contains("menu inicial")) {
        System.out.println("Entrou inicio");
        SendMessage send = new SendMessage();
        send.setChatId(idTelegram);
        send.setText(nome + ", seja bem vindo ao Pregão de Serviços. Selecione uma opção:");

        ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
        List<KeyboardRow> keyboard = new ArrayList<>();

        KeyboardRow row = new KeyboardRow();
        row.add("Menu Serviço");
        keyboard.add(row);

        row = new KeyboardRow();
        row.add("Menu Prestador");
        keyboard.add(row);

        keyboardMarkup.setKeyboard(keyboard);
        keyboardMarkup.setResizeKeyboard(true);
        send.setReplyMarkup(keyboardMarkup);

        try {
            execute(send); // Sending our message object to user
            contexto = "";
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    } else if (mensagem.contains("Menu Prestador") || contexto.contains("Menu Prestador")) {
        System.out.println("Entrou prestador");
        SendMessage send = new SendMessage();
        send.setChatId(idTelegram);
        System.out.println(acao);
        send.setText(nome + ", o que deseja fazer com relação a prestadores? Selecione uma opção:");

        ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
        List<KeyboardRow> keyboard = new ArrayList<>();

        KeyboardRow row = new KeyboardRow();
        row.add("Cadastrar prestador");
        keyboard.add(row);

        row = new KeyboardRow();
        row.add("Listar prestadores");
        keyboard.add(row);

        row = new KeyboardRow();
        row.add("Voltar ao menu inicial");
        keyboard.add(row);

        keyboardMarkup.setKeyboard(keyboard);
        keyboardMarkup.setResizeKeyboard(true);
        send.setReplyMarkup(keyboardMarkup);

        try {
            execute(send); // Sending our message object to user
            contexto = "";
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
    } else if (mensagem.contains("Listar prestadores")) {
        try {
            mensagem = listarPrestador();
            System.out.println(mensagem);
            enviarMensagem(idTelegram, mensagem);
            contexto = "";
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            mensagem = "Erro ao recuperar prestadores!";
        }
    } else if (mensagem.contains("Cadastrar prestador")) {
        contexto = "prestador nome";
        mensagem = "Vamos começar? Primeiro eu preciso do nome do prestador.";
        enviarMensagem(idTelegram, mensagem);
    } else if (contexto.contains("prestador nome")) {
        p.setNome(mensagem);
        contexto = "prestador email";
        mensagem = "Agora eu preciso do email do prestador.";
        enviarMensagem(idTelegram, mensagem);
    } else if (contexto.contains("prestador email")) {
        p.setEmail(mensagem);
        contexto = "prestador telefone";
        mensagem = "Agora eu preciso do telefone do prestador, no formato (99) 99999-9999.";
        enviarMensagem(idTelegram, mensagem);
    } else if (contexto.contains("prestador telefone")) {
        p.setTelefone(mensagem);
        DAOPrestador daoP = new DAOPrestador();
        try {
            daoP.inserir(p);
            mensagem = "Prestador cadastrado com sucesso!";
        } catch (Exception e) {
            mensagem = "Erro no cadastro do prestador.";
        }
        enviarMensagem(idTelegram, mensagem);
        contexto = "Menu Prestador";
    }   

}

private String listarPrestador() throws SQLException{
    String resposta = "";
    DAOPrestador daoP = new DAOPrestador();
    ArrayList<Prestador> prests = daoP.pesquisarTodos();
    if (prests.size() == 0) {
        resposta = "Não existem prestadores cadastrados\n";
    } else {
        resposta = "Lista de prestadores cadastrados:\n";
        for (Prestador prest : prests) {
            resposta = resposta + "Nome: " + prest.getNome() + " E-mail: " + prest.getEmail() + "\n";
        }
    }
    return resposta;
}

@Override
public String getBotToken() {
    // Token gerado na criacao do bot
    return "";
}

public static void main(String[] args) {
    ApiContextInitializer.init();
    TelegramBotsApi telegramBot = new TelegramBotsApi();
    MainBOT bot = new MainBOT();
    Date data = new Date();
    System.out.println(data);

    try {
        telegramBot.registerBot(bot);
    } catch (TelegramApiRequestException e) {
        System.out.println("Erro no Bot");
        e.printStackTrace();
    }
}

}

I made a change to the send methodMensage, and so I was able to have +1 conversation at the same time (I didn’t test for more than 2) however, still it continues with a bug that it uses the response of another user.

for example: he asks

name email number

user 1 answers the name, ai pro usuario 2 it no longer asks the name but the email, and the next question pro user 1 it asks the number, and user 2 gets nothing or Buga. (and vice versa).

code below changed "send":

public synchronized void enviarMensagem(long idTelegram,, String s) {
    SendMessage sendMessage = new SendMessage();
    sendMessage.enableMarkdown(true);
    sendMessage.setChatId(cidTelegram);
    sendMessage.setText(s);
    try {
        sendMessage(sendMessage);
    } catch (TelegramApiException e) {
        e.printStackTrace();
    }
}

1 answer

1


The problem seems to be in managing the state of the application. You have only one instance of the object MainBOT which has an attribute called contexto.

The value of this attribute will be shared by all users causing the problems you are reporting. You need to create a solution to identify the context for each user.

From the code you sent, it seems possible to identify the user based on what you call idTelegram. You could create a Map where the key is the idTelegram and the value is an object with the state of that chat.

  • Thank you very much, I will test these modifications.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.