Как создать ожидание ответа от юзера в телеграм боте?
Пишу бота. Просто калькулятор. Пользователь присылает две цифры и бот возвращает результат вычислений. Пишу вот такой код:
async static Task Update(ITelegramBotClient botClient, Update update, CancellationToken token)
{
double price = 0;
double discount = 0;
var message = update.Message;
if (message.Text.ToLower().Contains("посчитать"))
{
await botClient.SendTextMessageAsync(message.Chat.Id, "Пришли стоимость");
price = Convert.ToDouble(message.Text);
//итд
}
}
В общем бот должен взять число из сообщения пользователя, чтобы использовать его в дальнейшем для расчётов. Но бот за это сообщение берёт не сообщение пользователя, а своё же сообщение "Пришли стоимость". Из-за этого программа падает, так как не может текст в цифры перевести.
Судя по всему мне нужно как-то ожидать сообщение от пользователя перед последней строчкой. Что-то типа Console.Readline() как в консольных приложениях. Подскажите пожалуйста как мне это реализовать. Желательно с примером
Ответы (1 шт):
Вы можете обрабатывать входящие данные по нажатию кнопок в боте как в моем примере используя bool. По другому никак. Также если bool принял состояние true и если пользователь нажал в боте другую кнопку, прописывайте чтобы прежний bool стал false иначе сработает не нужный метод.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Extensions.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
namespace BotCalculate
{
public class TgBot
{
//Переменная для активации метода проверки прайса
bool CheckPrice = false;
public async void Start()
{
TelegramBotClient botClient = new TelegramBotClient(Token);
CancellationTokenSource cts = new CancellationTokenSource();
var receiverOptions = new ReceiverOptions
{
AllowedUpdates = Array.Empty<UpdateType>()
};
User me = await botClient.GetMeAsync();
Console.WriteLine($"{me.Username} запущен!");
botClient.StartReceiving(HandleUpdateAsync, HandlePollingErrorAsync, receiverOptions, cts.Token);
Console.WriteLine($"Start listening for @{me.Username}");
await SendCalculate(botClient);
Console.ReadLine();
}
async void SendCalculate(ITelegramBotClient botClient)
{
Message message = await botClient.SendTextMessageAsync(chatId, "Пришли стоимость");
CheckPrice = true;
}
//Метод получает данные от пользователей
static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
//Если сообщение не null и тип сообщение сообщение, то обрабатываем текст
if (update.Type == UpdateType.Message && update.Message != null && update.Message.Text != null)
{
var message = update.Message.Text;
if (CheckPrice)
{
var price = Convert.ToDouble(message);
CheckPrice = false;
await botClient.SendTextMessageAsync(update.Message.Chat.Id, $"Вы присали {price}");
}
}
}
static Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
var ErrorMessage = exception switch
{
ApiRequestException apiRequestException
=> $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
_ => exception.ToString()
};
Console.WriteLine(ErrorMessage);
return Task.CompletedTask;
}
}
}