KTB-19 Обрабатывать ответы пользователя¶
📝 Описание¶
Необходимо реализовать обработку ответов пользователя при нажатии кнопок с вариантами ответов в боте.
- Проверить, начинается ли значение переменной
dataс префиксаCALLBACK_DATA_ANSWER_PREFIX, используя методstartsWith. Это позволит определить, что нажата кнопка с вариантом ответа. - Извлечь индекс выбранного варианта ответа из поля
data. Для этого использовать методsubstringAfter, который извлечет часть строки после заданного префикса. Преобразовать полученное значение в типInt. - Использовать метод
trainer.checkAnswer(userAnswerIndex), гдеuserAnswerIndex— индекс выбранного варианта ответа. Метод вернет результат проверки.- В случае правильного ответа: Отправить пользователю сообщение "Правильно!".
- В случае неправильного ответа: Отправить сообщение такого вида: “Неправильно! cat – это кошка”. И корректный перевод слова по аналогии с консольным выводом.
- После обработки ответа вызвать функцию
checkNextQuestionAndSend()для предоставления следующего вопроса или уведомления о завершении обучения, если вопросы закончились.
🗒 Задание¶
- Реализовать обработку нажатий кнопок для ответов на вопросы в боте, обеспечив функционал выбора пользователем варианта ответа.
- Проверять правильность ответов с использованием метода
trainer.checkAnswer(index)и отправлять соответствующие сообщения пользователю в зависимости от результата проверки. - Обеспечить переход к следующему вопросу после обработки текущего ответа, вызывая функцию
checkNextQuestionAndSend().
❌ Ошибки¶
✏️ Комментарии¶
Тут могут намудрить с условием if (data?.startsWith(CALLBACK_DATA_ANSWER_PREFIX) == true). Оно немного неочевидно, так как сразу проверяет и на null и на startWith. Иногда делают два, с проверкой на null отдельно. Можно так написать:
⌨️ Решение¶
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)
}
}