Как сделать многопользовательский режим для телеграм-бота (библиотека Telegram.Bot)
Недавно начал изучать эту тему с телеграм-ботами. Я написал небольшой код на основе примера c сохранением сообщений в базе данных. Использовал библиотеку Telegram.Bot. Вылезла проблема, что бот работает только с одним пользователем, а если пользователей больше 2-х, то бот сохраняет ответы в одну строку. Как исправить или дополнить код, чтобы бот работал для нескольких пользователей? Код прикрепляю ниже, заранее спасибо за помощь.
using Microsoft.VisualBasic;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using Microsoft.Data.SqlClient;
class Program
{
public static int h = 0;
private static ITelegramBotClient _botClient;
// public int h = 0;
private static ReceiverOptions _receiverOptions;
private static string connectionString = "Server=(localdb)\\mssqllocaldb;Database=tgServer;Trusted_Connection=True;";
static async Task Main()
{
_botClient = new TelegramBotClient("token"); // Присваиваем нашей переменной значение, в параметре передаем Token, полученный от BotFather
_receiverOptions = new ReceiverOptions // Также присваем значение настройкам бота
{
AllowedUpdates = new[] // Тут указываем типы получаемых Update`ов, о них подробнее расказано тут https://core.telegram.org/bots/api#update
{
UpdateType.Message, // Сообщения (текст, фото/видео, голосовые/видео сообщения и т.д.)
},
// Параметр, отвечающий за обработку сообщений, пришедших за то время, когда ваш бот был оффлайн
// True - не обрабатывать, False (стоит по умолчанию) - обрабаывать
ThrowPendingUpdates = true,
};
using var cts = new CancellationTokenSource();
// UpdateHander - обработчик приходящих Update`ов
// ErrorHandler - обработчик ошибок, связанных с Bot API
_botClient.StartReceiving(UpdateHandler, ErrorHandler, _receiverOptions, cts.Token); // Запускаем бота
var me = await _botClient.GetMeAsync(); // Создаем переменную, в которую помещаем информацию о нашем боте.
Console.WriteLine($"{me.FirstName} запущен!");
await Task.Delay(-1); // Устанавливаем бесконечную задержку, чтобы наш бот работал постоянно
}
public static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
// Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок
try
{
// Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update
switch (update.Type)
{
case UpdateType.Message:
{
// эта переменная будет содержать в себе все связанное с сообщениями
var message = update.Message;
// From - это от кого пришло сообщение
var user = message.From;
// Выводим на экран то, что пишут нашему боту, а также небольшую информацию об отправителе
Console.WriteLine($"{user.FirstName} ({user.Id}) написал сообщение: {message.Text}");
// Chat - содержит всю информацию о чате
var chat = message.Chat;
// Добавляем проверку на тип Message
switch (message.Type)
{
// Тут понятно, текстовый тип
case MessageType.Text:
{
// тут обрабатываем команду /start, остальные аналогично
if (message.Text == "/start")
{
h = 0;
await botClient.SendTextMessageAsync(
chat.Id,
"напиши /new:\n");
return;
}
if (message.Text != null)
{
h++;
if (h == 1)
{
string sqlExpression = $"INSERT INTO usertest1 (IdUser,Name) VALUES ('{chat.Id}',N'{message.Text}')";
using (SqlConnection connection = new SqlConnection(connectionString))
{
await connection.OpenAsync();
// добавление
SqlCommand command = new SqlCommand(sqlExpression, connection);
int number = await command.ExecuteNonQueryAsync();
}
}
else
{
string s = $"q{h}";
string sqlExpression = $"UPDATE usertest1 SET {s} = N'{message.Text}' WHERE Name = N'{chat.Id}'";
using (SqlConnection connection = new SqlConnection(connectionString))
{
await connection.OpenAsync();
// добавление
SqlCommand command = new SqlCommand(sqlExpression, connection);
int number = await command.ExecuteNonQueryAsync();
}
}
return;
}
return;
}
// Добавил default , чтобы показать вам разницу типов Message
default:
{
await botClient.SendTextMessageAsync(
chat.Id,
"Используй только текст!");
return;
}
}
return;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private static Task ErrorHandler(ITelegramBotClient botClient, Exception error, CancellationToken cancellationToken)
{
// Тут создадим переменную, в которую поместим код ошибки и её сообщение
var ErrorMessage = error switch
{
ApiRequestException apiRequestException
=> $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
_ => error.ToString()
};
Console.WriteLine(ErrorMessage);
return Task.CompletedTask;
}
}