private async Task <DialogTurnResult> DisplayQnAResultAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken) { var dialogOptions = ObjectPath.GetPathValue <QnAMakerDialogOptions>(stepContext.ActiveDialog.State, Options); var reply = stepContext.Context.Activity.Text; if (reply.Equals(dialogOptions.ResponseOptions.CardNoMatchText, StringComparison.OrdinalIgnoreCase)) { var activity = dialogOptions.ResponseOptions.CardNoMatchResponse; if (activity == null) { await stepContext.Context.SendActivityAsync(DefaultCardNoMatchResponse, cancellationToken : cancellationToken).ConfigureAwait(false); } else { await stepContext.Context.SendActivityAsync(activity, cancellationToken : cancellationToken).ConfigureAwait(false); } return(await stepContext.EndDialogAsync().ConfigureAwait(false)); } // If previous QnAId is present, replace the dialog var previousQnAId = ObjectPath.GetPathValue <int>(stepContext.ActiveDialog.State, PreviousQnAId, 0); if (previousQnAId > 0) { // restart the waterfall to step 0 return(await RunStepAsync(stepContext, index : 0, reason : DialogReason.BeginCalled, result : null, cancellationToken : cancellationToken).ConfigureAwait(false)); } // If response is present then show that response, else default answer. if (stepContext.Result is List <QueryResult> response && response.Count > 0) { var message = QnACardBuilder.GetQnADefaultResponse(response.First(), dialogOptions.ResponseOptions.DisplayPreciseAnswerOnly); await stepContext.Context.SendActivityAsync(message, cancellationToken).ConfigureAwait(false); } else { var activity = dialogOptions.ResponseOptions.NoAnswer; if (activity == null) { await stepContext.Context.SendActivityAsync(DefaultNoAnswer, cancellationToken : cancellationToken).ConfigureAwait(false); } else { await stepContext.Context.SendActivityAsync(activity, cancellationToken : cancellationToken).ConfigureAwait(false); } } return(await stepContext.EndDialogAsync().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?.Length > 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.GetQnADefaultResponse(answer, dialogOptions.ResponseOptions.DisplayPreciseAnswerOnly); await stepContext.Context.SendActivityAsync(message).ConfigureAwait(false); return(new DialogTurnResult(DialogTurnStatus.Waiting)); } } return(await stepContext.NextAsync(stepContext.Result, cancellationToken).ConfigureAwait(false)); }