@TopGear28

Как сделать так, чтобы Telegram bot работал для каждого пользователя отдельно (JAVA)?

Здравствуйте. Я написал телеграмм бота, он авторизуется на сайте электронного дневника и выдает расписание, дз и так далее.
Моя проблема заключается в том, что бот работает в одном экземпляре для всех пользователей. Подскажите, пожалуйста, что нужно сделать, чтобы для каждого пользователя создавался новый экземпляр бота. Спасибо.
Вот часть кода моего бота:
public void onUpdateReceived(Update update) {

 if(message != null && message.hasText()){

        if(message.getText().equals("/start")){
            sendMsg(message, area.toString());
            flag = true;
            flagTwo = true;

        }
        result = message.getText();

        if (message.getText().equals(eq()) && flag) {
            GetAutorization  get = new GetAutorization();
            String mes = message.getText();
            prefs.put("pid", mes);
            get.getArea();
            parseGet = new JParseGetAuthorization();
            parseGet.jParse(get.getResponse());
            ArrayList<School> school = parseGet.getSchool();
            StringBuilder builder = new StringBuilder();
            for(int i = 0; i < school.size(); i++){
                School schools = school.get(i);
                builder.append(schools.getId()).append(": ").append(schools.getName()).append("\n");
            }

            sendMsg(message,builder.toString());
            flag = false;
        }

        if(message.getText().equals(eq(parseGet)) && flagTwo){
            GetAutorization  get = new GetAutorization();
            String mes = message.getText();
            prefs.put("cn", mes);
            get.getCity();
            parseGet = new JParseGetAuthorization();
            parseGet.jParse(get.getResponse());
            ArrayList<School> school = parseGet.getSchool();
            StringBuilder builder = new StringBuilder();
            for(int i = 0; i < school.size(); i++){
                School schools = school.get(i);
                builder.append(schools.getId()).append(": ").append(schools.getName()).append("\n");
            }

            sendMsg(message,builder.toString());
            flagTwo =false;
        }
private void sendMsg(Message message, String str) {

    SendMessage sendMessage = new SendMessage();
    sendMessage.setChatId(message.getChatId().toString());
    sendMessage.setText(str);
    try{
        execute(sendMessage);
    }catch (TelegramApiException ex){
        ex.printStackTrace();
    }

}
  • Вопрос задан
  • 1673 просмотра
Пригласить эксперта
Ответы на вопрос 1
RATlius
@RATlius
Разработчик Android
Сталкивался с похожей проблемой в разработке своего бота. Исправил эту проблему так:
Создал поле Map userMap; и Набор состояний отдельным классом State (можно реализовать через enum или иным удобным образом)
при обращении пользователя к боту вносил его в это поле, когда приходил новый запрос к боту - проверял есть ли пользователя в userMap. Если есть пользователь в списке - продолжить с его State, если нету - начать со стартового state
Код
@Override
    public void onUpdateReceived(Update update) {
        if (update.hasMessage()) {
            Message inMessage = update.getMessage();
            long chatId = inMessage.getChatId();
            botState = switchBot(inMessage.getFrom());

            if (botState == State.main) {
                if (inMessage.hasText()) {
                ...
            } else if (botState == State.newOrder) {//заявка записаться
                String positiveAnswer = "Спасибо, мы Вам перезвоним";
                String messageAdminsText = "";
                ...
            } else if (botState == State.dev) { //команды разработчика
                if (inMessage.hasText() && inMessage.getFrom().getUserName().equals(Const.DEV)) {
                ...


Это не лучший способ, можно сделать лучше и через потоки, но я не стал сильно заморачиваться с этим
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы