Visual Studio bot C# template
Na początku należy zainstalować odpowiednie SDK, więc wystarczy w Visual Studio (na przykładzie Visual Studio 2019) wejść w Extensions -> Manage Extensions i z listy Online wyszukać „Bot Framework v4 SDK Templates” (można też zrobić to osobno, pobierając paczkę pod linkiem).

Następnie możemy utworzyć nowy projekt i przy wyborze wybrać najprostszego Echo bota (będzie odpowiadał to, co się do niego napisze).

I gotowe, cała solucja jest już przygotowana:

BotController
To, na co warto zwrócić na początek uwagę, to jeden controller o nazwie BotController, który obsługuje tylko jedną metodę POST pod url api/messages:
[Route("api/messages")] [ApiController] public class BotController : ControllerBase { private readonly IBotFrameworkHttpAdapter Adapter; private readonly IBot Bot; public BotController(IBotFrameworkHttpAdapter adapter, IBot bot) { Adapter = adapter; Bot = bot; } [HttpPost] public async Task PostAsync() { // Delegate the processing of the HTTP POST to the adapter. // The adapter will invoke the bot. await Adapter.ProcessAsync(Request, Response, Bot); } }
Pod ten endpoint będą wysyłane wszystkie zapytania do bota i jak widać na przykładzie odpowiedni adapter IBotFrameworkHttpAdapter będzie je przeprocesowywał dalej.
Bot Startup
Jeśli chcemy zobaczyć, skąd się wziął adapter, możemy zerknąć do pliku Startup. Najważniejsza jest metoda ConfigureServices():
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); // Create the Bot Framework Adapter with error handling enabled. services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>(); // Create the bot as a transient. In this case the ASP Controller is expecting an IBot. services.AddTransient<IBot, EchoBot>(); }
Rejestruje ona IBotFrameworkHttpAdapter oraz IBot. Zaraz przejdziemy do opisu rejestrowanych klas.
EchoBot
W ważną klasą jest klasa EchoBot, która dziedziczy po klasie ActivityHandler. To ona odpowiada za logikę odpowiedzi bota. W naszym przypadku logika jest prosta i składają się na nią 2 metody:
- OnMessageActivityAsync() – gdy otrzymasz wiadomość od użytkownika, odpisz mu „Echo:” i wiadomość, którą wysłał.
- OnMembersAddedAsync() – gdy jakikolwiek użytkownik dołączy do konwersacji, powitaj go tekstem „Hello and welcome”.
public class EchoBot : ActivityHandler { protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text}"), cancellationToken); } protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken) { foreach (var member in membersAdded) { if (member.Id != turnContext.Activity.Recipient.Id) { await turnContext.SendActivityAsync(MessageFactory.Text($"Hello and welcome!"), cancellationToken); } } } }
BotFrameworkHttpAdapter
Happy path dla bota jest prosty – przywitaj się i odpisz echo. Ale co ma się wydarzyć, gdy coś pójdzie źle? Tutaj właśnie przydaje się nasz adapter AdapterWithErrorHandler. Gdy zostanie wywołany event OnTurnError, ma on 2 zadania:
- Zalogować wyjątek.
- Wysłać wiadomość do użytkownika, że coś poszło nie tak.
public class AdapterWithErrorHandler : BotFrameworkHttpAdapter { public AdapterWithErrorHandler(IConfiguration configuration, ILogger<BotFrameworkHttpAdapter> logger) : base(configuration, logger) { OnTurnError = async (turnContext, exception) => { // Log any leaked exception from the application. logger.LogError($"Exception caught : {exception.Message}"); // Send a catch-all apology to the user. await turnContext.SendActivityAsync("Sorry, it looks like something went wrong."); }; } }
Uruchomienie bota
Po uruchomieniu projektu (wystarczy F5) powinniśmy zobaczyć stronę:

To znaczy, że API naszego bota działa i jest dostępne pod localhost:3978/api/messages.
Bot Framework Emulator
Żeby jednak móc porozmawiać z botem, potrzebujemy specjalnego lokalnego czatu. Potrzebujemy więc pobrać odpowiedni program Bot Framework Emulator.
Po zainstalowaniu i otwarciu programu, wybieramy opcję Open bot z głównego ekranu i wpisujemy url:

Po kliknięciu Connect otwiera nam się nowa zakładka:

Jak widać, bot się z nami przywitał. Po prawej stronie widzimy dokładne logi konwersacji (informacje o requestach i rozpoznanych typach eventów).
Spróbujmy coś napisać do bota:

Odpisał! Działa 🙂
W tym odcinku to tyle. W przyszłym odcinku wykorzystując narzędzie azure-cli zreleasujemy naszego bota. Zasoby bota znajdą się w chmurze i każdy bedzie mógł z nim rozmawiać (będzie publiczny).
Jeśli temat Cię zaciekawił, to zerknij jeszcze na pozostałe posty o tematyce botów 🙂
Post powstał pod patronatem firmy, w której aktualnie pracuję: Objectivity.
Grafikę tytułową zaprojektował niezastąpiony zespół designu!