Суть заключается в том, что последовательность работы бота влияет на всю работу, а не на работу под конкретного пользователя, из-за чего я не понимаю, как это сделать. Как мне это исправить, чтобы в многопоточности бот мог для каждого пользователя адаптировать свою работу?
Библиотеки:
Код:
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}");
}
}
}
}