-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();
}
}
Thank you very much, I will test these modifications.
– WeslleyAF