2016-06-27 12 views
7

Sto lavorando su un bot con il C# Bot Builder.Come concatenare più finestre di dialogo?

Ora, so che ci sono alcuni esempi su come gestire i dialoghi concatenati. Come FacebookAuthDialog o ChainedEchoDialog.

Cosa voglio fare: un utente deve passare attraverso una finestra di dialogo di autorizzazione e, una volta terminato, voglio mettere immediatamente l'utente nella "UserDialog" dove può utilizzare tutte le funzioni che necessitavano della sua autenticazione.

Ecco il mio codice:

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(); 

Questo tipo di opere. Io chiamo questa finestra dalla MessageController con

await Conversation.SendAsync(message,() => ManagingDialog.dialog); 

Ma questo doesnt sento proprio. Devo anche chiamare questa finestra due volte ogni volta che una finestra di dialogo è finita, perché quando l'utente inserisce qualcosa non succede nulla, poiché questo avvia solo la finestra di dialogo.

Ho provato a inserire un altro ContinueWith dopo l'esecuzione del caso AuthenticationDialog, ma non riuscivo a farlo funzionare.

Apprezzerei molto l'aiuto con alcuni snippet di codice. Sono completamente all'oscuro.

Saluti

risposta

3

Ecco un esempio dalla 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" 
       ); 
     } 
    } 

C'è una buona discussione su questo argomento su BotBuilder's github site

+0

Beh, potreste aver notato, che la domanda iniziale non c'è esattamente uguale a quello che ho chiesto qui. Ecco perché sono lo stesso ragazzo che ha posto la domanda lì. ;) – Eiren

Problemi correlati