Использование потоков в Telegram боте на java

219
09 апреля 2022, 16:50

Мой бот авторизуется на стороннем ресурсе. Для этого бот спрашивает пользователя несколько вопросов(местоположение), эти данные нужны для последующих запросов к сайту. После каждого запроса(if) я его блокирую, ставя "flag=false". И из-за этого возникает проблема, другой пользователь бота не сможет авторизоваться. Flag убрать я не могу, так как получится так, что он не будет переходить к следующему вопросу, а отвечать на прошлый. (Надеюсь, понятно объяснил). В связи с этим решил использовать потоки(имплементировал Runnable, добавил код в run()), но ничего не вышло=/. Не знаю куда правильно поместить вызов метода run().

Старый код

`@Override
public void onUpdateReceived(Update update) {
    message = update.getMessage(); // сообщение от пользователя
    idUser = message.getChatId().intValue(); // Идентификатор пользователя
    if(message != null && message.hasText()){ 
        userResponse = new UserResponse(idUser);
        if(message.getText().equals("/start")){ 
            insertNewUser();
            sendMsg(message, "Выберите **"); //сообщение пользователю
        }
            userResponse.setResult(message.getText()); // записываю сообщение пользователя в result
            if (message.getText().equals(userResponse.getEquals())) { 
                String mes = userResponse.getResultNumber(); // записываю ответ пользователя в переменную mes
                System.out.println("pid=" + mes);
                try{
                    statement.execute("UPDATE user SET pid = '"+ mes +"' WHERE id = '"+ idUser+"'");
                }
                catch (SQLException ignored){
                }
                userResponse.areaSelection();
                sendMsg(message, "Выберите ***"); //отправляю сообщение пользователю
                answer = userResponse.getJParseGetAuthorization(); // можно просто сразу передать АРРРЭЫЙ ЛИСТ БЛЕАТЬ!!!!
                flagTwo=true;
            }
            if(message.getText().equals(userResponse.getEquals(answer)) && flagTwo){// если ответ пользователя совпадает и флаг true
                String mes = userResponse.getResultNumber();
                System.out.println("cn=" + mes);
                try{
                    statement.execute("UPDATE user SET cn = '"+ mes +"' WHERE id = '"+ idUser+"'");
                }
                catch (SQLException ignored){
                }
                userResponse.citySelection();
                sendMsg(message,"Выберите ****);
                answer = userResponse.getJParseGetAuthorization();
                flagTwo=false;
                flagThree=true;
            }
            if(message.getText().equals(userResponse.getEquals(answer)) && flagThree){
                String mes = userResponse.getResultNumber();
                System.out.println("sft=" + mes);
                try{
                    statement.execute("UPDATE user SET sft = '"+ mes +"' WHERE id = '"+ idUser+"'");
                }
                catch (SQLException ignored){
                }
                userResponse.schoolSelection();
                sendMsg(message,"Выберите *****");
                answer = userResponse.getJParseGetAuthorization();
                flagThree=false;
                flagFour=true;
            }
            if(message.getText().equals(userResponse.getEquals(answer)) && flagFour){
                String mes = userResponse.getResultNumber();
                System.out.println("scid=" + mes);
                try{
                    statement.execute("UPDATE user SET scid = '"+ mes +"' WHERE id = '"+ idUser+"'");
                }
                catch (SQLException ignored){
                }
                sendMsg(message, "Введете логин и пароль через !. ");
            }
            if(message.getText().contains("!")){
                String mes = message.getText();
                System.out.println("login=" + mes);
                String[] LogPas = mes.split("!");
                if(LogPas[0] != null && LogPas[1] !=null) {
                    String hashPassword = Md5hashing.md5(LogPas[1]);
                    int passwordLength = LogPas[1].length();
                    try{
                        statement.execute("UPDATE user SET login = '"+ LogPas[0] +"',password = '"+hashPassword +"'" +
                                ",paslength = '"+ passwordLength+"'WHERE id = '"+ idUser+"'");
                        statement.close();
                        dataBase.getConnection().close();
                    }
                    catch (SQLException ignored){
                    }
                    login = new LoginAuthorization(idUser);
                    login.postGetData("адрес сайта");
                }
                if(login.getResult() != null) {
                    sendMsg(message, "Авторизация прошла успешно!");
                }
                else sendMsg(message, "Что-то не так, введите /start");
            }
        }`

Этот код я перенес в метод run(). А в метод onUpdateReceived поместил вызов run()(Что не правильно, ведь run()будет вызываться при каждом получении сообщения от пользователя) Подскажите, пожалуйста, как можно правильно это реализовать? Может и потоки не понадобятся?

Answer 1

Вы можете создать БД с этими столбцами ChatID, ChatID, состояние

Таким образом при получении сообщения вы проверите, есть ли такой человек в базе, если есть то проверить состояние(пункт вопроса на котором остановился, например). И от этого отталкиваться в дальнейшей логике. Как один из вариантов.

READ ALSO
Сохранение положения RadioGroup

Сохранение положения RadioGroup

Есть RadioGroup, состоящий из двух элементовКак сохранить их положение (т

163
Проблема с адаптивной версткой

Проблема с адаптивной версткой

Как бороться с зачеркнутыми значениями при адаптивной верстке? Если в медиа выражении на какое-то определенное разрешение экрана ставишь...

126
Подложка (картинка) из CSS в админку WP

Подложка (картинка) из CSS в админку WP

На первом экране сайта, как подложка лежит картинкаОна затянута не через HTML, а через CSS

125