Здравствуйте, пытался разобраться как прикрутить бота к своей программе, но че то безуспешно. Запросы в гугле дают на устаревшие методы реализации бота, а дипсик кидает код с ошибками. Хочется понять, что, зачем и почему и как исправить. Дальше дипсик моих глупых вопрос не выдержал и сломался))
Есть класс допустим TelegramBotClass. Код большой.
Есть класс допустим TelegramBotClass. Код большой.
:
using Arbtr_app.Interfaces;
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
public class TelegramBotClass : IDisposable
{
private readonly ITelegramBotClient _botClient; // я так понимаю это интерефейс пакета nuget Telegram.Bot,
// которое скачали 26 ляма раз
private readonly CancellationTokenSource _cts; // здесь как я понял, нужен для остановки асинхронных методов
private bool _isRunning; // какой то флаг, чтоб понять работает что-то или нет.
private User _botUser; // Объявляем поле класса
public event Action<string>? OnLogMessage; // я так понимаю событие на приход сообщений в бот.
IInput _input; // интерфейс реализующий ввод
IOutput _output;// интерфейс реализующий вывод
public TelegramBotClass(string botToken, IInput input, IOutput output)// сам конструктор класса
{// принимающий токен бота, и классы реализующие эти интерфейсы на ввод и вывод
if (string.IsNullOrWhiteSpace(botToken))
{// проверка на то что строка с токеном не пустая
throw new ArgumentException("Bot token не может быть пустым!");
}
else
{
_input= input;
_output= output;
_botClient = new TelegramBotClient(botToken); // инициализация переменной класса TelegramBotClient
// в котором реализованы методы интерфейса ITelegramBotClient
_cts = new CancellationTokenSource(); // инициализация переменной класса CancellationTokenSource
}
}
// методы на замену ввода и вывода(файл, телеграм, консоль и так далее)
public void ChangeInput(IInput input)
{
_input = input;
}
public void ChangeOutput(IOutput output)
{
_output = output;
}
public async Task StartAsync()
{
if (_isRunning) return; // проверка флага, на то что бот запущен.
try
{
// Проверка подключения
var me = await _botClient.GetMe();
_input.SendMessage(($"Bot @{me.Username} started successfully"));
_isRunning = true;
// Настройка получения сообщений
var receiverOptions = new ReceiverOptions
{// вот здесь не понятно, что за настройка за что отвечает.
AllowedUpdates = Array.Empty<UpdateType>()
};
// Динамическая установка свойства (для любой версии)
SetPendingUpdatesOption(receiverOptions, true);
// метод который принимает два параметра
// Скорее всего метод запускающий самого бота.
_botClient.StartReceiving(
HandleUpdateAsync,
HandleErrorAsync,
receiverOptions,
_cts.Token
);
// про этот метод не вкурил зачем он нужен.
void SetPendingUpdatesOption(ReceiverOptions options, bool value)
{
var prop = options.GetType().GetProperty("IgnorePendingUpdates")
?? options.GetType().GetProperty("ThrowPendingUpdates");
prop?.SetValue(options, value);
}
// зачем два раза запускать?
_botClient.StartReceiving(
updateHandler: HandleUpdateAsync,
errorHandler: HandleErrorAsync,
receiverOptions: receiverOptions,
cancellationToken: _cts.Token);
}
catch (Exception ex)
{
_input.SendMessage(($"Start failed: {ex.Message}"));
throw;
}
}
// Метод обработки входящих сообщений
private async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
try
{
if (update.Message is not { Type: MessageType.Text } message)
return;
var chatId = message.Chat.Id;
var text = message.Text;
var username = message.From?.Username ?? message.From?.FirstName ?? "Пользователь";
Console.WriteLine($"{username}: {text}");
string response = text switch
{
"/start" => $"Привет, {username}! Я бот {_botUser?.Username}.",
"/help" => "Доступные команды:\n/start - начало работы\n/help - помощь",
_ => $"Вы написали: {text}"
};
await botClient.SendTextMessageAsync(
chatId: chatId,
text: response,
cancellationToken: cancellationToken);
// Вот тут выдает ошибку "ITelegramBotClient" не содержит определения "SendTextMessageAsync",
//и не удалось найти доступный метод расширения "SendTextMessageAsync", принимающий тип "ITelegramBotClient"
// в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку).
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка обработки сообщения: {ex.Message}");
}
}
// Метод обработки ошибок
private Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
var errorMessage = exception switch
{
ApiRequestException apiEx => $"Ошибка Telegram API ({apiEx.ErrorCode}): {apiEx.Message}",
_ => exception.ToString()
};
Console.WriteLine(errorMessage);
return Task.CompletedTask;
}// Универсальный метод для настройки игнорирования сообщений
private void SetIgnorePendingUpdates(ReceiverOptions options, bool value)
{
var prop = options.GetType().GetProperty("IgnorePendingUpdates")
?? options.GetType().GetProperty("ThrowPendingUpdates");
prop?.SetValue(options, value);
}
public void Dispose()
{
_cts.Cancel();
_cts.Dispose();
_input.SendMessage("Бот остановлен");
}
}