Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 518536

Класс для работы с Telegram.bot - C#: API, боты

$
0
0
Здравствуйте, пытался разобраться как прикрутить бота к своей программе, но че то безуспешно. Запросы в гугле дают на устаревшие методы реализации бота, а дипсик кидает код с ошибками. Хочется понять, что, зачем и почему и как исправить. Дальше дипсик моих глупых вопрос не выдержал и сломался))

Есть класс допустим 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("Бот остановлен");
}
}


Viewing all articles
Browse latest Browse all 518536

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>