телеграмма с длинным тянущим ботом не справилась с тестом - PullRequest
0 голосов
/ 12 мая 2018

Итак, ребята, я работаю с длинным телеграммным ботом, через Java, через API телеграмм-ботов.Я сделал целое число для теста, чтобы сделать +1 после хорошего ответа и ничего с целым числом, в то время как ответ неправильный.

public void onUpdateReceived(Update update) {
    int i=0;

в самом начале получения обновления.и когда пользователь начинает тестирование, он видит клавиатуру с разметкой с первым вопросом и 4 ответами

      else if (message_text.equals("test"))
        {
            SendMessage message = new SendMessage() // Create a message object object
                    .setChatId(chat_id)
                    .setText("Test");
            // Create ReplyKeyboardMarkup object
            ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
            // Create the keyboard (list of keyboard rows)
            List<KeyboardRow> keyboard = new ArrayList<>();
            // Create a keyboard row
            KeyboardRow row = new KeyboardRow();
            // Set each button, you can also use KeyboardButton objects if you need something else than text
            row.add("1. М");
            row.add("2. end");

            // Add the first row to the keyboard
            keyboard.add(row);
            // Create another keyboard row
            row = new KeyboardRow();
            row.add("3. К");
            row.add("4. Т");
            keyboard.add(row);
            // Set the keyboard to the markup
            keyboardMarkup.setKeyboard(keyboard);
            // Add it to the message
            message.setReplyMarkup(keyboardMarkup);
            try
            {
                sendMessage(message); // Call method to send the photo
            }
            catch (TelegramApiException e)
            {
                e.printStackTrace();

            }
        }
        else if (message_text.equals("1. М"))
        {
            i=i+1;
            SendMessage message = new SendMessage() // Create a message object object
                    .setChatId(chat_id)
                    .setText("Test");
            ReplyKeyboardMarkup keyboardMarkup = new ReplyKeyboardMarkup();
            List<KeyboardRow> keyboard = new ArrayList<>();
            KeyboardRow row = new KeyboardRow();
            row.add("1. М");
            row.add("2. end");
            keyboard.add(row);
            row = new KeyboardRow();
            row.add("3. К");
            row.add("4. Т");
            keyboard.add(row);
            keyboardMarkup.setKeyboard(keyboard);
            message.setReplyMarkup(keyboardMarkup);
            try
            {
                sendMessage(message);
            }
            catch (TelegramApiException e)
            {
                e.printStackTrace();

            }
        }
        else if (message_text.equals("2. end"))
        {
            if (i == 1) {
                SendMessage message = new SendMessage()
                        .setChatId(chat_id)
                        .setText("roflan");

                try {
                    sendMessage(message);
                } catch (TelegramApiException e) {
                    e.printStackTrace();

                }
            }
        }

, если я напишу «! = 1», после «2. end» он всегда показывает результат.Неважно, сколько раз пользователь ответит на первую кнопку, i + 1 не работает.Где проблема с моей логикой?

1 Ответ

0 голосов
/ 13 мая 2018

Давайте забудем об Telegram API, просто чтобы посмотреть, что происходит с вашей переменной int i.

Каждый раз, когда вызывается onUpdateReceived(), int i объявляется внутри этого метода и инициализируется значением 0.

Это выглядит так

public class Scope {
    public static void main(String[] args) {
        System.out.println(getI());
        System.out.println(getI());
    }
    private static int getI() {
        int i = 0;
        i++;
        return i;
    }
}

Выход будет

1
1

Чтобы ваша программа работала так, как вы ожидаете, вы должны объявить int i вне области действия onUpdateReceived(). Наиболее очевидный способ - создание статической переменной.

public class Scope {
    public static void main(String[] args) {
        System.out.println(getI());
        System.out.println(getI());
        System.out.println(getI());
        System.out.println(getI());
    }
    private static int i = 0;
    private static int getI() {
        i++;
        return i;
    }
}

Выход будет

1
2
3
4

Итак, теперь ваш код должен выглядеть следующим образом

public class Bot extends TelegramLongPollingBot {

    private static int i = 0;

    public void onUpdateReceived() {
        /*...*/
        else if (update.hasMessage() && update.getMessage().hasText() && update.getMessage().getText().equals("1. M")) {
            i++;
        } else if (update.hasMessage() && update.getMessage().hasText() && update.getMessage().getText().equals("1. end")) {
            System.out.println(i);
        }
        /*...*/
    }

    public String getBotToken() {
        return "...";
    }

    public String getBotUsername() {
        return "...";
    }
}
...