Как сделать ожидание ввода данных от пользователя через Телеграмм бота на C#
Я делаю телеграмм бота на C#, стоит задача следующая: Бот просит пользователя ввести название поста, после ожидает ввода от пользователя, дальше просит ввести жанры, описание и т.д. соответственно после каждого запроса он должен ожидать ввода данных от пользователя. Я столкнулся с проблемой, что не знаю, каким способом это реализовать, единственный работающий, но очень не удобный с точки зрения пользователя - вводить всё одной строкой в каком-то формате, а дальше парсить её ботом.
Пробовал сделать ожидание данных, но возникли два случая в разных реализациях,
- после первого ввода блокируется поток
- после того, как бот запрашивает ввод, переменной названия присваивается текст последнего введенного пользователем сообщения, то есть после запроса сразу предопределенно значение.(Прикрепил картинку) Есть также вариант, что при первом запросе он всё-таки дожидается ответа и делает всё как нужно, но при следующем запросе присваивает текст первого запроса.
Хочу узнать, можно ли как-то исправить код, чтобы добиться нужного результата или есть другие способы добиться желаемого?
Методы с запросом ввода от пользователя:
private async static Task<Task> CreatePost(ITelegramBotClient client, Telegram.Bot.Types.Update update, CancellationToken token)
{
var message = update.Message;
if ((message.Text == "Создать пост" || message.Text == "/createpost") && message != null && message.Text != "")
{
var tcs = new TaskCompletionSource<bool>();
//await client.SendTextMessageAsync(message.Chat.Id, "Создайте пост(шаблон создания можно узнать по команде /template): ");
await client.SendTextMessageAsync(message.Chat.Id, "Введите название: ");
var article = await WaitForMessageAsync(client, message.Chat.Id, token);
string article1 = article;
await client.SendTextMessageAsync(message.Chat.Id, "Введите название 2: ");
var article2 = await WaitForMessageAsync(client, message.Chat.Id, token);
string article3 = article;
#region test
//while (message.Text == "")
//{
// var updates = client.GetUpdatesAsync();
// if (updates.Result.Length > 0)
// message.Text = updates.Result.Last().Message.Text;
//}
//string temp = message.Text;
#endregion
await client.SendTextMessageAsync(message.Chat.Id, "Вы ввели название:\n " + article1.ToString() + " " + article3.ToString());
tcs.SetResult(true);
return tcs.Task;
}
return Task.CompletedTask;
}
private static async Task<string> WaitForMessageAsync(ITelegramBotClient client, long chatId, CancellationToken token)
{
while (!token.IsCancellationRequested)
{
var updates = client.GetUpdatesAsync(offset: 0, limit: 100, timeout: 0).Result;
var message = updates.LastOrDefault(u => u.Message != null && u.Message.Chat.Id == chatId)?.Message.Text;
if (message != null && message != "" && message != "Создать пост" && message != "/createpost")
{
return message;
}
await Task.Delay(1000);
}
throw new OperationCanceledException();
}
Источник: Stack Overflow на русском