2017-01-23 11 views
0

Это несколько опирается на проактивные примеры USECASE и у меня есть простой случай использования:начать FormDialog из сохраненного разговора

  1. Когда пользователь инициирует разговор с ботом - бот сохраняет объект активность
  2. АНИ конечной точки существует
  3. При срабатывании конечной точки api
  4. объект активности извлекается, из-за его замены на - и сообщение отправляется обратно пользователю через SendToConversationAsync.

Вместо того, чтобы просто воспроизвести обратно сообщение активности пользователя, можно пнуть из FormDialog по какому-то образом извлечению или воссоздания объекта iDialogue так, что context.Call может быть вызван с соответствующей формой?

Я пробовал использовать разные вещи, но ничего не появляется на стороне пользователя; В частности, я попытался

await Conversation.SendAsync(message,() => new MakeSomeFormDialog()); 

и

Chain.From(() => FormDialog.FromForm(SomeForm.BuildForm, FormOptions.PromptInStart)); 

и интерактивный пример -

Task Interactive(IDialog form) where T : class 

однако, я думаю, интерактивный пример, но я думаю, что это пытается опубликовать в ЪоТ?

+0

Да, это должно быть возможно. У вас есть более конкретный вопрос? –

+0

обновил вопрос - спасибо. – zxed

ответ

0

Получилось довольно прямолинейно. Я попросил помощи у представителя, и я указал в правильном направлении.

Профилактические примеры бот, которые охватывают этот случай здесь https://github.com/MicrosoftDX/botFramework-proactiveMessages

конкретно этот бит кода https://github.com/MicrosoftDX/botFramework-proactiveMessages/blob/master/csharp/startNewDialogWithPrompt/ConversationStarter.cs#L31

общественного класса ConversationStarter { // Примечание: Конечно, вы не хотите, чтобы это здесь. В конце концов вам нужно будет сохранить это в некоторой таблице // Имея это здесь как статическую переменную, мы можем запомнить только одного пользователя :) public static string resumptionCookie;

//This will interrupt the conversation and send the user to SurveyDialog, then wait until that's done 
    public static async Task Resume() 
    { 
     var message = ResumptionCookie.GZipDeserialize(resumptionCookie).GetMessage(); 
     var client = new ConnectorClient(new Uri(message.ServiceUrl)); 


     using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
     { 
      var botData = scope.Resolve<IBotData>(); 
      await botData.LoadAsync(CancellationToken.None); 
      var stack = scope.Resolve<IDialogStack>(); 

      //interrupt the stack 
      var dialog =new SurveyDialog(); 
      stack.Call(dialog.Void<object, IMessageActivity>(), null); 
      await stack.PollAsync(CancellationToken.None); 

      //flush dialog stack 
      await botData.FlushAsync(CancellationToken.None); 

     } 
    } 
} 

получает вас контекст назад и прервать с другим диалогом (который может быть диалогом формы)