Ожидание ответов в телеграмм боте C#
Вопрос с ожиданиями ответа пользователя и последовательными ответами бота - умею реализовывать такую технологию только через машину состояний, работающую на swich-case. Сейчас ищу варианты, как это можно делать красивее и экономнее: условно, чтобы работа бота была разделена на методы, а не была единым 2000-строковым swich-case. Буду рад любым советам, вот код:
internal class Program
{
private static readonly string BotApiKey = "token";
private static DatabaseManager manager = new DatabaseManager();
private static UserBase.User user;
static async Task Main(string[] args)
{
var client = new TelegramBotClient(BotApiKey);
client.StartReceiving(Update, Error);
Console.ReadLine();
}
async static Task Update(ITelegramBotClient botClient, Update update, CancellationToken token)
{
var message = update.Message;
if (message.Chat != null)
{
var chatId = message.Chat.Id;
var username = message.Chat.Username;
if (manager.CheckRecordExists(chatId))
{
var status = manager.GetStatusById(chatId);
if (status == "админ")
user = new Admin();
else
user = new RegularUser();
user.ChatId = chatId;
manager.GetUserData(user);
await botClient.SendTextMessageAsync(chatId, $"{user.Greeting()}");
}
else
{
RegForm form = new RegForm();
var t = form.StageText();
await botClient.SendTextMessageAsync(chatId, t.Item1); //вот тут начинаются вопросы -
//как дальше обрабатывать ответы пользователя?
return;
}
...
internal class RegForm : RegularUser
{
public int stage;
public RegForm() => stage = 1;
public (string, int) StageText()
{
if (stage == 1)
return ("Введите Ваши имя и фамилию, через пробел, пожалуйста:", stage);
if (stage == 2)
return ("Введите дату рождения:", stage);
if (stage == 3)
return ("Введите Вашу страну:", stage);
if (stage == 4)
return ("Введите Ваш пол:", stage);
if (stage == 5)
return ("Введите Ваш номер:", stage);
else
return ("Отправьте боту Вашу электропочту:", stage);
}
public bool SetParam(string param)
{
if (stage == 1)
{
string[] s = param.Split();
Name = s[0];
SecondName = s[1];
}
if (stage == 2)
{
string[] dates = param.Split(".");
short day = Convert.ToInt16(dates[0]);
short month = Convert.ToInt16(dates[1]);
int year = Convert.ToInt16(dates[2]);
DateOfBirth = new DateTime(year, month, day);
}
if (stage == 3)
Country = param;
if (stage == 4)
Gender = param;
if (stage == 5)
Number = param;
if (stage == 6)
Email = param;
stage++;
return true;
}
}