private async Task <DialogTurnResult> CheckForMultiTurnPrompt(WaterfallStepContext stepContext, CancellationToken cancellationToken) { if (stepContext.Result is List <QueryResult> response && response.Count > 0) { // -Check if context is present and prompt exists // -If yes: Add reverse index of prompt display name and its corresponding qna id // -Set PreviousQnAId as answer.Id // -Display card for the prompt // -Wait for the reply // -If no: Skip to next step var answer = response.First(); if (answer.Context != null && answer.Context.Prompts.Count() > 0) { var dialogOptions = GetDialogOptionsValue(stepContext); var qnaDialogResponseOptions = dialogOptions[QnADialogResponseOptions] as QnADialogResponseOptions; var previousContextData = new Dictionary <string, int>(); if (dialogOptions.ContainsKey(QnAContextData)) { previousContextData = dialogOptions[QnAContextData] as Dictionary <string, int>; } foreach (var prompt in answer.Context.Prompts) { previousContextData.Add(prompt.DisplayText.ToLower(), prompt.QnaId); } dialogOptions[QnAContextData] = previousContextData; dialogOptions[PreviousQnAId] = answer.Id; stepContext.ActiveDialog.State["options"] = dialogOptions; // Get multi-turn prompts card activity. var message = QnACardBuilder.GetQnAPromptsCard(answer, qnaDialogResponseOptions.CardNoMatchText); await stepContext.Context.SendActivityAsync(message).ConfigureAwait(false); return(new DialogTurnResult(DialogTurnStatus.Waiting)); } } return(await stepContext.NextAsync(stepContext.Result, cancellationToken).ConfigureAwait(false)); }
private async Task <DialogTurnResult> CheckForMultiTurnPromptAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var dialogOptions = ObjectPath.GetPathValue <QnAMakerDialogOptions>(stepContext.ActiveDialog.State, Options); if (stepContext.Result is List <QueryResult> response && response.Count > 0) { // -Check if context is present and prompt exists // -If yes: Add reverse index of prompt display name and its corresponding QnA ID // -Set PreviousQnAId as answer.Id // -Display card for the prompt // -Wait for the reply // -If no: Skip to next step var answer = response.First(); if (answer.Context != null && answer.Context.Prompts.Count() > 0) { var previousContextData = ObjectPath.GetPathValue(stepContext.ActiveDialog.State, QnAContextData, new Dictionary <string, int>()); var previousQnAId = ObjectPath.GetPathValue <int>(stepContext.ActiveDialog.State, PreviousQnAId, 0); foreach (var prompt in answer.Context.Prompts) { previousContextData[prompt.DisplayText] = prompt.QnaId; } ObjectPath.SetPathValue(stepContext.ActiveDialog.State, QnAContextData, previousContextData); ObjectPath.SetPathValue(stepContext.ActiveDialog.State, PreviousQnAId, answer.Id); ObjectPath.SetPathValue(stepContext.ActiveDialog.State, Options, dialogOptions); // Get multi-turn prompts card activity. var message = QnACardBuilder.GetQnAPromptsCard(answer, dialogOptions.ResponseOptions.CardNoMatchText); await stepContext.Context.SendActivityAsync(message).ConfigureAwait(false); return(new DialogTurnResult(DialogTurnStatus.Waiting)); } } return(await stepContext.NextAsync(stepContext.Result, cancellationToken).ConfigureAwait(false)); }