2016-06-27 11 views
7

Ich arbeite an einem Bot mit dem C# Bot Builder.So verketten Sie mehrere Dialoge?

Nun weiß ich, dass es einige Beispiele gibt, wie man mit Verkettungsdialogen umgehen kann. Wie der FacebookAuthDialog oder der ChainedEchoDialog.

Was ich tun möchte: Ein Benutzer hat durch einen Berechtigungsdialog gehen und wenn das ist getan, ich will sofort den Benutzer in die „UserDialog“ gebracht, wo er alle Funktionen nutzen zu können, die seine Authentifizierung benötigt.

Hier ist mein Code:

public static readonly IDialog<string> dialog = Chain 
     .PostToChain() 
     .Switch(
      new Case<Message, IDialog<string>>((msg) => 
      { 
       var userInfo = new StorageClient().GetUser(msg.From.Id); 

       if (userInfo != null && userInfo.Activated) 
        return false; 
       else 
        return true; 
      }, (ctx, msg) => 
      { 
       return Chain.ContinueWith(new AuthenticationDialog(), 
          async (context, res) => 
          { 
           var result = await res; 
           return Chain.Return($"You successfully activated your account."); 
          }); 
      }), 
      new Case<Message, IDialog<string>>((msg) => 
      { 
       var userInfo = new StorageClient().GetUser(msg.From.Id); 
       if (userInfo != null && userInfo.Activated) 
        return true; 
       else 
        return false; 
      }, (ctx, msg) => 
      { 
       var service = new LuisService(); 
       // User wants to login, send the message to Facebook Auth Dialog 
       return Chain.ContinueWith(new UserDialog(msg, service), 
        async (context, res) => 
        { 
         return Chain.Return($""); 
        }); 
      }), 
      new DefaultCase<Message, IDialog<string>>((ctx, msg) => 
      { 
       return Chain.Return("Something went wrong."); 
      }) 
      ).Unwrap().PostToUser(); 

Diese Art der Arbeiten. Ich rufe diesen Dialog von der MessageController mit

Aber das fühlt sich nicht richtig an. Ich muss dieses Dialoge auch zweimal jedes Mal aufrufen, wenn ein Dialog beendet ist, denn wenn der Benutzer etwas eingibt, passiert nichts, da dies nur den Dialog startet.

Ich habe versucht, eine andere ContinueWith nach der Ausführung des AuthenticationDialog Case, aber ich konnte es nicht zum Laufen bringen.

Ich würde wirklich einige Hilfe mit vielleicht einigen Codeschnipsel schätzen. Ich bin völlig ahnungslos.

Grüße

Antwort

3

Hier ist ein Beispiel aus dem BotBuilder:

public async Task SampleChain_Quiz() 
    { 
     var quiz = Chain 
      .PostToChain() 
      .Select(_ => "how many questions?") 
      .PostToUser() 
      .WaitToBot() 
      .Select(m => int.Parse(m.Text)) 
      .Select(count => Enumerable.Range(0, count).Select(index => Chain.Return($"question {index + 1}?").PostToUser().WaitToBot().Select(m => m.Text))) 
      .Fold((l, r) => l + "," + r) 
      .Select(answers => "your answers were: " + answers) 
      .PostToUser(); 

     using (var container = Build(Options.ResolveDialogFromContainer)) 
     { 
      var builder = new ContainerBuilder(); 
      builder 
       .RegisterInstance(quiz) 
       .As<IDialog<object>>(); 
      builder.Update(container); 

      await AssertScriptAsync(container, 
       "hello", 
       "how many questions?", 
       "3", 
       "question 1?", 
       "A", 
       "question 2?", 
       "B", 
       "question 3?", 
       "C", 
       "your answers were: A,B,C" 
       ); 
     } 
    } 

Es gibt eine gute Diskussion zu diesem Thema auf BotBuilder's github site

+0

Nun, Sie haben vielleicht bemerkt, dass die erste Frage ist genau das gleiche wie das, was ich hier gefragt habe. Das ist, weil ich derselbe Typ bin, der dort die Frage gestellt hat. ;) – Eiren

Verwandte Themen