KPoseidon
@KPoseidon
Шарпист с косяками

Как сделать последовательность в тг боте, которая работает для каждого юзера?

Суть заключается в том, что последовательность работы бота влияет на всю работу, а не на работу под конкретного пользователя, из-за чего я не понимаю, как это сделать. Как мне это исправить, чтобы в многопоточности бот мог для каждого пользователя адаптировать свою работу?

Библиотеки:
  • Telegram.Bot 16.0.1


Код:
using System;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Args;
using Telegram.Bot.Types.ReplyMarkups;

namespace RiceVPN_bot
{
    class Program
    {
        private static TelegramBotClient bot;
        private static string token { get; set; } = "токен_бота";
        private static string nickName { get; set; }
        private static string password { get; set; }

        static void Main(string[] args)
        {
            bot = new TelegramBotClient(token);
            bot.StartReceiving(new UpdateType[] {UpdateType.Message, UpdateType.CallbackQuery});
            bot.OnMessage += OnMessageHandler;
            bot.OnCallbackQuery += OnCallbackQueryHandler;
            Console.Title = "RiceVPN Bot";
            Console.WriteLine("Бот запущен!");
            Thread.Sleep(Timeout.Infinite);
            bot.StopReceiving();

        }

        private static async void OnCallbackQueryHandler(object? sender, CallbackQueryEventArgs e)
        {
            var callback = e.CallbackQuery;
            var data = callback.Data;
            var userId = callback.From.Id;
            var firstName = callback.From.FirstName;

            if (data != null)
            {
                Console.WriteLine($"New inline click from id{userId}: {data}");
            }
            if (data == "registration")
            {
                await bot.SendTextMessageAsync(userId, "Напишите ваш никнейм:");
                bot.OnMessage += RegistrationHandler;
                bot.OnMessage -= OnMessageHandler;
                bot.OnCallbackQuery -= OnCallbackQueryHandler;
            }
        }

        private static async void OnMessageHandler(object sender, MessageEventArgs e)
        {
            var msg = e.Message;
            var Username = msg.From.Username;
            var UserId = msg.From.Id;
            var sms = msg.Text;
            var firstName = msg.From.FirstName;

            InlineKeyboardButton registration = new InlineKeyboardButton();
            InlineKeyboardButton signIn = new InlineKeyboardButton();
            InlineKeyboardButton aboutProject = new InlineKeyboardButton();
            InlineKeyboardButton statusServers = new InlineKeyboardButton();

            registration.Text = "Зарегистрироваться";
            registration.CallbackData = "registration";

            signIn.Text = "Войти";
            signIn.CallbackData = "signIn";

            aboutProject.Text = "О проекте";
            aboutProject.CallbackData = "aboutProject";

            statusServers.Text = "Cтатусы серверов";
            statusServers.Url = "https://status.libreto.space/status/rice";

            InlineKeyboardButton[] row1 = new InlineKeyboardButton[] { registration, signIn };
            InlineKeyboardButton[] row2 = new InlineKeyboardButton[] { aboutProject, statusServers };

            InlineKeyboardButton[][] buttons = new InlineKeyboardButton[][] { row1, row2 };
            InlineKeyboardMarkup keyboard = new InlineKeyboardMarkup(buttons);

            if (msg != null)
            {
                Console.WriteLine($"New message from id{UserId} | usname @{Username} | frstName {firstName}: {sms}");
            }

            if(sms != null)
            {
                if (sms == "/start")
                {
                    await bot.SendTextMessageAsync(UserId, $"Здравствуйте, {firstName}!\nЗдесь вы можете купить ключ доступа к VPN серверу.", replyMarkup: keyboard);
                }
            }

        }

        private static async void RegistrationHandler(object? sender, MessageEventArgs e)
        {
            var msg = e.Message;
            Console.WriteLine("User start registration");
            if(msg.Text.Count() > 20)
            {
                await bot.SendTextMessageAsync(msg.From.Id, "Ваш никнейм превышает 20 символов!\nПожалуйста, введите никнейм меньше 20 символов");
            }
            else if(msg.Text.Contains(" "))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В никнейме содержатся пробелы!");
            }
            else if(msg.Text.Count() < 3)
            {
                await bot.SendTextMessageAsync(msg.From.Id, "Слишком короткий никнейм!");
            }
            else
            {
                nickName = msg.Text;
                await bot.SendTextMessageAsync(msg.From.Id, "Отлично! Теперь введите пароль от аккаунта, чтобы в дальнейшем использовать его:");
                bot.OnCallbackQuery -= OnCallbackQueryHandler;
                bot.OnMessage -= RegistrationHandler;
                bot.OnMessage += RegistrationSetPasswordHandler;
            }
        }

        private static async void RegistrationSetPasswordHandler(object? sender, MessageEventArgs e)
        {
            var msg = e.Message;
            if(msg.Text.Contains(" "))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся пробелы!");
            }
            else if (msg.Text.Contains("."))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся запрещённые символы(\".\")!");
            }
            else if (msg.Text.Contains(","))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся запрещённые символы(\",\")!");
            }
            else if (msg.Text.Contains("{") | msg.Text.Contains("}"))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся запрещённые символы(\"{}\")!");
            }
            else if (msg.Text.Contains("$"))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся запрещённые символы(\"$\")!");
            }
            else if (msg.Text.Contains("#"))
            {
                await bot.SendTextMessageAsync(msg.From.Id, "В пароле содержатся запрещённые символы(\"#\")!");
            }
            else if (msg.Text.Count() < 8)
            {
                await bot.SendTextMessageAsync(msg.From.Id, "Пароль слишком короткий!\nМинимальная длина: 8 символов");
            }
            else
            {
                InlineKeyboardMarkup answer = new InlineKeyboardMarkup(new[]
                {
                    new[]
                    {
                        InlineKeyboardButton.WithCallbackData("Да", "Yes"),
                        InlineKeyboardButton.WithCallbackData("Нет", "No")
                    }
                }
                    );
                password = msg.Text;
                var myMsg = await bot.SendTextMessageAsync(msg.From.Id, "Пароль принят!");
                await Task.Delay(1500);
                await bot.EditMessageTextAsync(msg.From.Id, myMsg.MessageId, $"Ваш Никнейм:{nickName}\nВаш пароль: ||{password}||\n\nВы подтверждаете регистрацию?", replyMarkup: answer);
                bot.OnMessage -= RegistrationSetPasswordHandler;
                bot.OnCallbackQuery += RegistrationFinalHandler;
            }
        }

        private static async void RegistrationFinalHandler(object? sender, CallbackQueryEventArgs e)
        {
            var callback = e.CallbackQuery;
            
            if (callback.Data == "Yes")
            {
                await bot.SendTextMessageAsync(callback.From.Id, "Регистрация пройдена!");
                bot.OnCallbackQuery -= RegistrationFinalHandler;
                bot.OnCallbackQuery += OnCallbackQueryHandler;
                bot.OnMessage += OnMessageHandler;
                Console.WriteLine($"New click from id{callback.From.Id} | frstName {callback.From.FirstName} | usrname {callback.From.Username}: {callback.Data}");
            }
            if (callback.Data == "No")
            {
                await bot.SendTextMessageAsync(callback.From.Id, "Регистрация отменена!");
                bot.OnCallbackQuery += OnCallbackQueryHandler;
                bot.OnCallbackQuery -= RegistrationFinalHandler;
                bot.OnMessage += OnMessageHandler;
                Console.WriteLine($"New click from id{callback.From.Id} | frstName {callback.From.FirstName} | usrname {callback.From.Username}: {callback.Data}");
            }
        }
    }
}
  • Вопрос задан
  • 592 просмотра
Решения вопроса 1
KPoseidon
@KPoseidon Автор вопроса
Шарпист с косяками
берём и долбашим стейты с юзерайди в бд sqlite
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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