Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Améliorer ses dialogues de bot avec les PromptDialog

Poster un commentaire

L’article précédent a permis de développer une première façon de créer des dialogues avec un bot. Je présenterai d’autres techniques plus tard. Pour l’instant on va fignoler les détails.

Par exemple comment sélectionner un fichier ou une option parmi une liste? Comment faire un choix?

Les PromptDialog vont nous apporter cette possibilité de façon très simple.

Présentation

Un PromptDialog est une fabrique de formulaires de dialogues plus sophistiqués que l’affichage d’un simple texte.

Un PromptDialog peut:

  • Réclamer une pièce jointe
  • Demander une String, Int ou long
  • Proposer une question O/N
  • Proposer une liste de choix

Et bien testons!

Regardons un premier exemple:

[Serializable]
public class MonDialog : IDialog
{
   int Count { get; set; }
 
   public async Task StartAsync(IDialogContext context)
   {
      await context.PostAsync($"Le compteur vaut **{Count}**");
 
      context.Wait(MessageReceivedAsync);
   }
  
   private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
   {
      PromptDialog.Confirm(
         context,
         AfterResetAsync,
         "Je l'augmente de 1?",
         "Je ne comprends pas votre réponse",
         promptStyle: PromptStyle.Auto);
   }
 
   private async Task AfterResetAsync(IDialogContext context, IAwaitable<bool> result)
   {
      var confirm = await result;
 
      if (confirm)
      {
         Count++;
 
         await context.PostAsync($"Nouveau compteur: **{Count}**");
      }
 
      context.Done(this);
   }
}

Vous notez qu’il n’est pas utile d’ajouter un Wait, c’est déjà fait par PromptDialog. Avec un Wait supplémentaire cela ne marche d’ailleurs pas et provoque un message d’erreur.

 

Visuellement ce dialogue apparaît ainsi:

2017-01-27_23-14-08

Observez la boîte O/N qui serai difficile à faire avec les méthodes rencontrées jusqu’à présent. D’où sort t’elle?

MessageReceivedAsync utilise une nouvelle classe: PromptDialog. Nous appelons sa méthode Confirm() qui affiche précisément ce dialogue.

Globalement la nature des paramètres est claire. La méthode AfterResetAsync est importante, c’est la méthode qui recueille le résultat de la boîte de dialogue, un booléen dans notre cas.

Si on a entré ou saisit OUI, le compteur est incrémenté et sa nouvelle valeur est affichée.

 

Pour changer j’ai terminé la méthode par:


context.Done(this);

Done() renvoie dans le dialogue racine.

 

PromptDialog propose 5 dialogues prédéfinis:

  1. Confirm
  2. Attachement
  3. Choice
  4. Number
  5. Text

 

Ces dialogues attendent une saisie soit manuelle, soit cliquées selon leur nature ou la valeur de PromptStyle. Je ne l’ai pas montré dans l’exemple, mais on peut aussi choisir un nombre max de tentative de saisie (3 par défaut).

 

L’exemple suivant affiche quelques exemples supplémentaires.


var choices = new[] { "Homme", "Femme" };
PromptDialog.Choice(context, Resume, choices, "Quel est votre genre?", promptStyle: PromptStyle.Auto);

Visuellement:

2017-01-28_16-20-22

 

Le canal affiche une liste de sélection. J’ai cliqué en (1), le bot confirme la sélection et donne la main à la méthode Resume qui se chargera de la traiter avant de redonner la main à l’utilisateur avec un petit Wait.

 

On pourrait aussi fournir au bot des fichiers avec un code de ce style:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
   PromptDialog.Attachment(context, AfterAttachementAsync, "Sélectionnez un fichier");
}
 
private async Task AfterAttachementAsync(IDialogContext context, IAwaitable<IEnumerable<Attachment>> result)
{
   var files = await result;
 
   IEnumerator enumerator = files.GetEnumerator();
   while (enumerator.MoveNext())
   {
      Attachment file = enumerator.Current as Attachment;
      // a compléter
   }
 
   context.Wait(MessageReceivedAsync);
}

Et visuellement:

2017-01-28_16-59-38

Pour charger l’image on clique sur le petit icône à gauche de la zone de saisie.

Bibliographie

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s