Как считать данные с отправленного сообщения в telegram bot
Использую Telegram LongPollingBot, возник вопрос, как мне в методе-ответе на сообщение, взять отправленный текст человеком (update) и сделать из него String для дальнейшего использования?
// Ответ на команду /add
private void addAnswer(long chatId, Update update) {
String name = null;
String messageName =
"Окно для добавления пользователя в таблицу\n"
+ "\nВведите имя пользователя\n"
+ "\n_(подсказка - введите username без @)_";
sendMessage(chatId, messageName, false);
// По моей логике, я должен заняться обработкой update нового, но как именно сказать боту
// что я хочу обработать новый update?
if (update.hasMessage() && update.getMessage().hasText()) {
name = update.getMessage().getText();
sendMessage(chatId, "2 этап после скана", false);
}
}
Ответы (2 шт):
Самый лаконичный вариант (вернее, вариант со сном и отдыхом, а не 24/7 залипанием в экран в поиске ответа) - изначально вводить команду как /add (name) {point} (Мне нужны и баллы еще)
Далее, преобразовывать введенное значение в char[], затем с начала массива искать "(", с конца ")" а, то что посередине преобразовывать в отдельный массив, далее в нужную переменную (аналогично с {})
И все, вуа-ля вы получили 2 переменные из одной команды
Практично? - ДА! Идеально? - Явно нет(
Все равно это для администраторов и тратить на это время я не хочу совсем
String command = "/add (yasha) {100}";
char[] arrayOfCommand = command.toCharArray();
String first = "(";
char first0 = first.charAt(0);
String second = ")";
char second0 = second.charAt(0);
String third = "{";
char third0 = third.charAt(0);
String fourth = "}";
char fourth0 = fourth.charAt(0);
int index1 = 0;
int index2 = 0;
int index3 = 0;
int index4 = 0;
// [/, a, d, d, , (, y, a, s, h, a, ), , {, 1, 0, 0, }]
for(int i = 0; i<arrayOfCommand.length; i++)
{
if (command.charAt(i) == first0)
{
index1 = i;
}
else if (command.charAt(i) == second0)
{
index2 = i;
}
else if (command.charAt(i) == third0)
{
index3 = i;
}
else if (command.charAt(i) == fourth0)
{
index4 = i;
}
}
//( - 5, ) - 11, { - 13, } - 17
// Между 5 и 11 - name
// Между 13 и 17 points
char firstWordOfName = arrayOfCommand[index1+1]; // Первая буква имени [6]
char lastWordOfName = arrayOfCommand[index2-1]; // Последняя буква имени [10]
char[] arrayName = new char[index2-index1-1]; // 5 символов как у имени
for (int i = 0; i<arrayName.length; i++)
{
if (i<index2-1)
arrayName[i] = arrayOfCommand[index1+1+i];
else
arrayName[i] = arrayOfCommand[index2-1-i];
}
String name = new String(arrayName);
Придумал альтернативный вариант, думаю будет полезен всем тем, кто не знает как заставить бота "ждать" ответ:
boolean startWait = false; // <- Инициализация булеан переменной в самом начале
@Override
public void onUpdateReceived(Update update) {
if (update.hasMessage() && update.getMessage().hasText() && startWait == false) { // Переменная = false значит идет "запрос" на продолжение
String command = update.getMessage().getText();
if (command.equals("/start")) {
sendMessage(update, "*Напиши текст!*");
startWait = true; // Переменная = true в этом цикле она не будет false, а значит будет считка сообщения до те пор, пока она снова не станет false
}
}
else if (update.hasMessage() && update.getMessage().hasText() && startWait == true) {
sendMessage(update, "Вы ввели - "+update.getMessage().getText());
startWait = false; // "Считка" закончена
}
}