@nikolasdreams

Как реализовать последовательное выполнение telegram бота?

Мне нужно, чтобы после условного оператора /start работал и условный оператор /syntax. То есть мне необходимо, чтобы вложенный условный оператор работал, после выполнения основного. Был совет реализовать конечный автомат, но я не понимаю как.

КОД:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Args;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
 
namespace Kursovay
{
    class Program
    {
        
        public static Update update;
        private static string token = "TOKEN";
        private static TelegramBotClient botClient;
        static void Main(string[] args)
        {
            botClient = new TelegramBotClient(token);
            botClient.StartReceiving();
            botClient.OnMessage += Bot_OnMessage;
            Console.ReadLine();
            botClient.StopReceiving();
        }
 
        private static async void Bot_OnMessage(object sender, MessageEventArgs e)
        {
            if (e.Message.Type == MessageType.Text)
            {
                if (e.Message.Text == "/start")
                {
                    await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Здравствуйте, вас привествует телеграм бот по изучению языка программирования C Sharp. Выбирите необходимый блок для изучения:" + "\nСинтаксис /syntax" + "\nТипы данных и использование /data_types" + "\nУправляющие конструкции  /Control_structures" + "\nМассивы и строки /arrays_and_strings" + "\nФункции и процедуры /functions_and_procedures" + "\nФайлы /files");
 
 
                    if (e.Message.Text == "/syntax")
                    {
                        InlineKeyboardMarkup myInlineKeyboard = new InlineKeyboardMarkup(
                                       new InlineKeyboardButton[][]
                                       {
                                            new InlineKeyboardButton[] // First row
                                            {
                                                InlineKeyboardButton.WithCallbackData( // First Column
                                                    "Назад", // Button Name
                                                    "CallbackQuery1" // Answer you'll recieve
                                                ),
                                                InlineKeyboardButton.WithCallbackData( //Second column
                                                    "Далее", // Button Name
                                                    "CallbackQuery2" // Answer you'll recieve
                                                )
                                            }
                                       }
                                   );
 
                        // Отправляем сообщение с кнопками inline
                        await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Текст сообщения", replyMarkup: myInlineKeyboard);
 
                        botClient.OnCallbackQuery += async (object sc, CallbackQueryEventArgs ev) =>
                        {
                            if (ev.CallbackQuery.Data == "CallbackQuery1")
                            {
                                // Изменяем текст сообщения на "Текст сообщения - Назад"
                                await botClient.EditMessageTextAsync(
                                        chatId: ev.CallbackQuery.Message.Chat.Id,
                                        messageId: ev.CallbackQuery.Message.MessageId,
                                        text: "Текст сообщения - Назад",
                                        replyMarkup: myInlineKeyboard);
                            }
                            else if (ev.CallbackQuery.Data == "CallbackQuery2")
                            {
                                // Изменяем текст сообщения на "Текст сообщения - Далее"
                                await botClient.EditMessageTextAsync(
                                        chatId: ev.CallbackQuery.Message.Chat.Id,
                                        messageId: ev.CallbackQuery.Message.MessageId,
                                        text: "Текст сообщения - Далее",
                                        replyMarkup: myInlineKeyboard);
                            }
                        };
 
                        if (e.Message.Text == "/data_types") { }
                        if (e.Message.Text == "/control_structures") { }
                        if (e.Message.Text == "/arrays_and_strings") { }
                        if (e.Message.Text == "/functions_and_procedures") { }
                        if (e.Message.Text == "/control_structures") { }
                        if (e.Message.Text == "/files") { }
                    }
                }
            }
        }
    }
}
  • Вопрос задан
  • 355 просмотров
Пригласить эксперта
Ответы на вопрос 1
@barbashin_andrey
Если просто: создайте базу данных (хоть SQLite), в которой будете хранить текущую "позицию" пользователя в диалоге
В логике приложения будете связывать ID диалога с пользователем в базе данных и получать текущую "позицию"
Затем, получив эту самую позицию, вступает в ход любимый хаос из if'ов или switch-case'ов
Переводя описание в псевдокод:
Пользователь пользователь = базаДанных.Пользователи.Где(пользователь.АйдиДиалога == айдиДиалогаПришедшегоСообщения);
если (пользователь == null)
{
# бла-бла
базаДанных.Пользователи.Добавить(новый Пользователь(айдиДиалогаПришедшегоСообщения));
}
иначе если (пользователь.Позиция == "начало"):
{
# бла-бла
пользователь.Позиция = "синтаксис";
}
иначе если (пользователь.Позиция == "синтаксис")
{
# бла-бла
пользователь.Позиция = "следующая позиция";
}
базаДанных.СохранитьИзменения();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы