W ostatnim odcinku poruszyłem temat przejść między dialogami, niejako przy okazji wynikła nowa rzecz w postaci „gotowca” do pobierania danych oferowanego przez Bot Buildera. W tym wpisie przyjrzymy się dokładniej co oferuje nam klasa PromptDialog :)
Mówiąc krótko – oferuje nam wygodę i pozwala na oszczędzenie pisania nudnego kodu do pobierania danych.
Przypomnijmy sobie kod, którego używaliśmy w części 4 do zbierania danych od użytkownika:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { await result; await context.PostAsync("Jak masz na imię?"); context.Wait(OnNameProvided); } private async Task OnNameProvided(IDialogContext context, IAwaitable<IMessageActivity> result) { _name = (await result).Text; await context.PostAsync("W jakim mieście mieszkasz?"); context.Wait(OnCityProvided); }
Powyższy kod możemy nieco uprościć, wykorzystując gotową klasę PromptDialog w następujący sposób:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { await result; PromptDialog.Text(context, OnNameProvided, "Jak masz na imię?"); } private async Task OnNameProvided(IDialogContext context, IAwaitable<string> result) { _name = await result; PromptDialog.Text(context, OnCityProvided, "W jakim mieście mieszkasz?"); } private async Task OnCityProvided(IDialogContext context, IAwaitable<string> result) { _city = await result; await context.PostAsync($"Witaj {_name} z miasta {_city}!"); }
W analogiczny sposób możemy pytać użytkownika o liczby (double i long) – wystarczy użyć PromptDialog.Number. W tym przypadku PromptDialog zweryfikuje czy podany tekst jest prawidłową liczbą (możemy określić ilość prób w parametrze attemps) a jeśli takowe pobranie się nie powiedzie to otrzymamy wyjątek.
Przy prostym pobieraniu tekstu lub liczb korzyści ze stosowania PromptDialog są, ale stosunkowo niewielkie.
PromptDialog znacznie praktyczniejszy jest w przypadku bardziej złożonych operacji, zwłaszcza takich, które wykorzystują rozszerzenia poszczególnych kanałów typu przyciski konwersacji.
PromptDialog i przyciski w kanale konwersacji
PromptDialog oferuje dwie metody, które wykorzystują możliwości niektórych kanałów (np. Skype, Facebook Messenger) do wyświetlania przycisków konwersacji, które użytkownik może kliknąć zamiast wpisywania treści odpowiedzi. Pierwsza z nich – metoda Confirm – służy do zapytania o potwierdzenie, używamy jej tak:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { await result; PromptDialog.Confirm(context, OnConfirmed, "Czy chcesz złożyć zamówienie?"); } private async Task OnConfirmed(IDialogContext context, IAwaitable<bool> result) { var confirmed = await result; await context.PostAsync(confirmed ? "Zamówienie zostało złożone." : "Zamówienie anulowane."); }
Efekt jest następujący:
Na pierwszy plan pojawia się pewna wada tego rozwiązania – jeśli tworzymy na rynek polski, to będziemy zawiedzeni, że teksty są po angielsku (i wcale nie jest oczywiste jak to zlokalizować na język polski). Poza tym, nawet jeśli się uda to i tak tracimy jeden fajny ficzer, mianowicie:
Tak – PromptDialog jest inteligenty i jest w stanie zrozumieć odpowiedzi inne niż hardcodowane na przyciskach – możemy więc na pytanie o potwierdzenie odpowiedzieć „yes”, jak również „sure”, „ok”, „nope” i inne – a PromptDialog będzie je w stanie dopasować :) (oczywiście nie po polsku :P)
Drugi mechanizm wykorzystujący przyciski to metoda Choice, której implementacja wygląda tak:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) { await result; PromptDialog.Choice(context, OnChosen, new[] { "Telefon", "Poczta elektroniczna", "Skype", "Facebook Messenger" }, "Preferowana forma kontaktu"); } private async Task OnChosen(IDialogContext context, IAwaitable<string> result) { var contactForm = await result; await context.PostAsync($"Wybrałeś formę kontaktu: {contactForm}."); }
A efekt prezentuje się następująco:
Tutaj również do pewnego stopnia działa „inteligencja” i jeśli wpiszemy np. tylko „facebook” to PromptDialog będzie w stanie dopasować odpowiedź.
W następnych częściach…
… poruszymy problem serializacji dialogów w kontekście wstrzykiwania zależności.
Następnie przejdziemy do sztucznej inteligencji w zastosowaniach związanych z chatbotami :)
Aby nie przegapić kolejnych wpisów zapraszam do śledzenia tego bloga, czy to przez kanał RSS, czy też poprzez stronę na Facebooku.
Dodaj komentarz