Пишу телеграмм бота для регистрации задач. Использую библиотеку от rubenlagus. Возникла проблема с обработкой входящих сообщений.
Метод: public void onUpdateReceived(Update update){}
, позволяет обрабатывать каждое отдельное сообщение, вызывать другие методы после получения сообщения к примеру "/newtask", но как сделать так, чтобы после отправки команды боту - бот ожидал следующее сообщение и записывал этот текст например в переменную.
Пример диалога:
User: /newtask
Bot: Введите название задачи
User: Записаться к врачу.
Фразу: "Записаться к врачу", нужно записать в переменную.
В простейшей реализации, можете завести список с идентификаторами пользователей, для которых актива команда /newtask
(ожидается ввод текста).
from scratch (в классе бота):
private List<Integer> processingUsers = new ArrayList<>();
private void handleNewTaskCommand(Update update) {
processingUsers.add(update.getMessage().getFrom().getId());
sendPromtToChat(update);
}
private void handleSimpleMessage(Update update) {
Integer userId = update.getMessage().getFrom().getId();
if (processingUsers.contains(userId)) {
doSomeWithTextForUser(update);
processingUsers.remove(userId);
}
}
Если в методе onUpdateReceived()
определяете, что пришла команда /newtask
, то предаете в handleNewTaskCommand()
, где id пользователя добавится в список активных (processingUsers
);
Если в методе onUpdateReceived()
определяете, что пришел обычный текст, то передаете update в handleSimpleMessage()
, где проверяется, не ожидется ли в данный момент для данного пользователя ввода данных. Если ожидается, удаляете пользователя из спика и производите необходимые вам действия с текстом.
Данная реализация не претендует на лучшую, но для разбора работы бота из библиотеки и api телеграма для дальнейшего планирования приложения будет достаточно.
Так же обратите внимание, что в пришедшем Update
может не оказаться "обычного" сообщения (см. в Update
поля editedMessage
, channelPost
и т.д.), тогда вызов
getFrom()
выбросит NPE. Поэтому прежде чем процессить Update, желательно сначала проверить что он из себя представляет и что в нем в принципе содержится.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
начал разбираться со Spring и AOP, хочу сделать логирование, но столкнулся с проблемойВот классы мои классы Application:
Мне нужно закрывать listening порт(например, 12000, который создается java методом serversocketaccept) в определённый момент(неизвестно когда он наступит)
Вызов данного контроллера выдает ошибку: