2016-06-27 2 views
7

Im работает над ботом с C# Bot Builder.Как объединить несколько диалогов?

Теперь я знаю, что существует довольно много примеров того, как иметь дело с цепочками диалогов. Подобно FacebookAuthDialog или ChainedEchoDialog.

Что я хочу сделать: пользователю необходимо пройти диалог авторизации, и, когда это будет сделано, я хочу немедленно поместить пользователя в «UserDialog», где он может использовать все функции, необходимые для его аутентификации.

Вот мой код:

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

Этот вид работ. Я вызываю это диалоговое окно из MessageController с помощью

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

Но это не кажется правильным. Я также должен вызывать этот диалог дважды каждый раз, когда диалог завершается, потому что когда пользователь вводит что-то, ничего не происходит, так как это только запускает диалог.

Я попытался поставить еще один ContinueWith после выполнения проверки подлинностиDialog Case, но я не мог заставить его работать.

Я бы очень признателен за помощь в некоторых фрагментах кода. Я совершенно не знаю.

Привет

ответ

3

Вот пример из 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" 
       ); 
     } 
    } 

Существует хорошая дискуссия по этому вопросу на BotBuilder's github site

+0

Ну, вы, возможно, заметили, что первоначальный вопрос есть точно так же, как тот, который я задал здесь. Это потому, что я тот же парень, который задал вопрос. ;) – Eiren

Смежные вопросы