Перейти к содержанию

KTB-19 Обрабатывать ответы пользователя

📝 Описание

Необходимо реализовать обработку ответов пользователя при нажатии кнопок с вариантами ответов в боте.

  • Проверить, начинается ли значение переменной data с префикса CALLBACK_DATA_ANSWER_PREFIX, используя метод startsWith. Это позволит определить, что нажата кнопка с вариантом ответа.
  • Извлечь индекс выбранного варианта ответа из поля data. Для этого использовать метод substringAfter, который извлечет часть строки после заданного префикса. Преобразовать полученное значение в тип Int.
  • Использовать метод trainer.checkAnswer(userAnswerIndex), где userAnswerIndex — индекс выбранного варианта ответа. Метод вернет результат проверки.
    • В случае правильного ответа: Отправить пользователю сообщение "Правильно!".
    • В случае неправильного ответа: Отправить сообщение такого вида: “Неправильно! cat – это кошка”. И корректный перевод слова по аналогии с консольным выводом.
  • После обработки ответа вызвать функцию checkNextQuestionAndSend() для предоставления следующего вопроса или уведомления о завершении обучения, если вопросы закончились.

🗒 Задание

  1. Реализовать обработку нажатий кнопок для ответов на вопросы в боте, обеспечив функционал выбора пользователем варианта ответа.
  2. Проверять правильность ответов с использованием метода trainer.checkAnswer(index) и отправлять соответствующие сообщения пользователю в зависимости от результата проверки.
  3. Обеспечить переход к следующему вопросу после обработки текущего ответа, вызывая функцию checkNextQuestionAndSend().

❌ Ошибки

✏️ Комментарии

Тут могут намудрить с условием if (data?.startsWith(CALLBACK_DATA_ANSWER_PREFIX) == true). Оно немного неочевидно, так как сразу проверяет и на null и на startWith. Иногда делают два, с проверкой на null отдельно. Можно так написать:

Можно чуть компактнее:
`data?.startsWith(CALLBACK_DATA_ANSWER_PREFIX) == true`

⌨️ Решение

fun main(args: Array<String>) {

    val botToken = args[0]
    var updateId = 0
    val telegramBotService = TelegramBotService(botToken)
    val trainer = LearnWordsTrainer()

// ...

    while (true) {
        Thread.sleep(2000)

        // ...

        if (data?.startsWith(CALLBACK_DATA_ANSWER_PREFIX) == true) {
            val userAnswerIndex = data.substringAfter(CALLBACK_DATA_ANSWER_PREFIX).toInt()
            if (trainer.checkAnswer(userAnswerIndex)) {
                telegramBotService.sendMessage(chatId, "Правильно!")
            } else {
                telegramBotService.sendMessage(
                    chatId,
                    "Неправильно! ${trainer.question?.correctAnswer?.original} – это ${trainer.question?.correctAnswer?.translate}"
                )
            }
            checkNextQuestionAndSend(trainer, telegramBotService, chatId)
        }

    }
}

fun checkNextQuestionAndSend(trainer: LearnWordsTrainer, service: TelegramBotService, chatId: Int) {
    val question = trainer.getNextQuestion()
    if (question == null) {
        service.sendMessage(chatId, "Вы выучили все слова в базе")
    } else {
        service.sendQuestion(chatId, question)
    }
}