BotFramework.NET 3.0.0

The owner has unlisted this package. This could mean that the package is deprecated, has security vulnerabilities or shouldn't be used anymore.
dotnet add package BotFramework.NET --version 3.0.0
NuGet\Install-Package BotFramework.NET -Version 3.0.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="BotFramework.NET" Version="3.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add BotFramework.NET --version 3.0.0
#r "nuget: BotFramework.NET, 3.0.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install BotFramework.NET as a Cake Addin
#addin nuget:?package=BotFramework.NET&version=3.0.0

// Install BotFramework.NET as a Cake Tool
#tool nuget:?package=BotFramework.NET&version=3.0.0

BotFramework

nuget build downloads issues pull requests

Фреймворк для создания ботов под любую платформу

Возможности

  • Последовательное ожидание обновлений от платформы прямо внутри обработчика;
  • Запуск из любого места в приложении;
  • Работа с расширяемыми абстракциями, предназначенные для реализации поддерживаемой логики обработчиков:
    • Безопасная передача типизированного обновления в обработчик;
    • Проверка пользовательских условий перед обработкой обновления.
  • Поддержка Dependency Injection в обработчиках.

Начало работы

Регистрация BotFramework в контейнере зависимостей

Пример регистрации BotFramework с использованием ITelegramBotClient от Telegram.Bot:

var services = new ServiceCollection();
			
// Внедряем нужные сервисы как обычно
services.AddTransient<ISimpleService, SimpleService>();
services.AddTransient<ITelegramBotClient>(provider => new TelegramBotClient("TOKEN"))

// Внедряем BotFramework и обработчики
services.AddBotFramework<ITelegramBotClient>()
        .AddHandler<SimpleHandler>();
Передача обновлений в BotFramework

Для передачи обновлений на обработку используется интерфейс IUpdateReceiver. В нем определен единственный метод Receive(...), который выполнит за Вас все необходимое, чтобы доставить обновление к нужному обработчику:

[ApiController]
[Route("[controller]")]
public class BotController : ControllerBase
{
    private readonly IUpdateReceiver _receiver;
    
    public BotController(IUpdateReceiver receiver)
    {
        _receiver = receiver;
    }
        
    [HttpPost]
    [Route("GetUpdates")]
    public IActionResult Post([FromBody] Update update)
    {
        // Получение новых сообщений от Telegram
        if (update.Type == UpdateType.Message)
        {
            _receiver.Receive(update.Message);
        }

        return Ok();
    }
}

Помните, что IUpdateReceiver регистрируется в контейнере зависимостей, как Singleton. Таким образом, Вы можете вызывать метод Receive(...) из любой точки приложения.

Обработчики

Реализация обработчика

Типичный обработчик выглядит следующим образом:

public class SimpleHandler : IUpdateHandler<string, ITelegramBotClient>
{
    public Task HandleAsync(string update, IBotContext<ITelegramBotClient> context)
    {
        Console.WriteLine($"Получено обновление: {update}");
    }
}

Интерфейс IUpdateHandler реализуется с использованием типа обновления и типа внешней системы. В данном случае, ITelegramBotClient выступает в роли внешней системы, а string - тип обрабатываемого обновления.

Внедрение зависимостей в обработчики

Обработчики внедряются в контейнер зависимостей также, как и прочие пользовательские зависимости. Допустим, у нас есть некоторый внешний сервис, выполняющий сложную логику. Вам достаточно внедрить его в контейнер зависимостей и затем получить через конструктор обработчика:

public class SimpleHandler : IUpdateHandler<string, ITelegramBotClient>
{
    private readonly ISimpleService _simpleService;

    public SimpleHandler(ISimpleService simpleService)
    {
        _simpleService = simpleService;
    }

    public async Task HandleAsync(string update, IBotContext<ITelegramBotClient> context)
    {
        Console.WriteLine($"Получено обновление: {update}");
        
        await _simpleService.DoWorkAsync(update);
    }
}
Условные обработчики

Чтобы BotFramework выполнял конкретный обработчик по условию, необходимо реализовать для него интерфейс IWithAsyncPrerequisite:

public class StartHandler : IUpdateHandler<Message, ITelegramBotClient>, IWithAsyncPrerequisite<Message>
{
    public async Task HandleAsync(Message command, IBotContext<ITelegramBotClient> context)
    {
        await context.Client.SendTextMessageAsync(chatId, "Hello world!");
    }
    
    public async Task<bool> CanHandleAsync(Message command)
    {
        return Task.FromResult(command.Text == "/start");
    }
}

Примечание. Асинхронный дизайн для условия выбран потому, что зачастую в этой части кода возникает необходимость выполнять асинхронные задачи.

Взаимодействие с внешней системой

Для взаимодействия с внешней системой в метод обработчика поставляется интерфейс IBotContext. Он содержит в себе ссылку на внешнюю систему и дополнительный метод, позволяющий создать запрос на ожидание будущего обновления. Отличным примером может служить пошаговая обработка ботом сообщений от пользователя:

public class SimpleHandler : IUpdateHandler<Message, ITelegramBotClient>
{
    private readonly ISimpleService _simpleService;

    public SimpleHandler(ISimpleService simpleService)
    {
        _simpleService = simpleService;
    }

    public async Task HandleAsync(Message command, IBotContext<ITelegramBotClient> context)
    {
        var chatId = update.Chat.Id;
        await context.Client.SendTextMessageAsync(chatId, "Пожалуйста, введите Вашу фамилию");
        
        var lastname = await context.WaitNextUpdateAsync<Message>();
        await context.Client.SendTextMessageAsync(chatId, "Хорошо, теперь введите Ваше имя");
        
        var firstname = await context.WaitNextUpdateAsync<Message>();
        await context.Client.SendTextMessageAsync(chatId, $"{lastname} {firstname}");
    }
}

Примечание. Такой дизайн обработчиков позволяет эффективно сдерживать логику в конкретных местах и не размазывать ее по всему приложению.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated