/// <summary> /// Called when the dialog is started and pushed onto the dialog stack. /// </summary> /// <param name="dc">The <see cref="DialogContext"/> for the current turn of conversation.</param> /// <param name="options">Optional, initial information to pass to the dialog.</param> /// <param name="cancellationToken">A cancellation token that can be used by other objects /// or threads to receive notice of cancellation.</param> /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns> /// <remarks>If the task is successful, the result indicates whether the dialog is still /// active after the turn has been processed by the dialog. /// /// You can use the <paramref name="options"/> parameter to include the QnA Maker context data, /// which represents context from the previous query. To do so, the value should include a /// `context` property of type <see cref="QnAResponseContext"/>.</remarks> /// <seealso cref="DialogContext.BeginDialogAsync(string, object, CancellationToken)"/> public override async Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken)) { if (dc == null) { throw new ArgumentNullException(nameof(dc)); } if (dc.Context?.Activity?.Type != ActivityTypes.Message) { return(EndOfTurn); } var dialogOptions = new QnAMakerDialogOptions() { QnAMakerOptions = await GetQnAMakerOptionsAsync(dc).ConfigureAwait(false), ResponseOptions = await GetQnAResponseOptionsAsync(dc).ConfigureAwait(false) }; if (options != null) { dialogOptions = ObjectPath.Assign <QnAMakerDialogOptions>(dialogOptions, options); } ObjectPath.SetPathValue(dc.ActiveDialog.State, Options, dialogOptions); return(await base.BeginDialogAsync(dc, dialogOptions, cancellationToken).ConfigureAwait(false)); }
private static void ResetOptions(DialogContext dc, QnAMakerDialogOptions dialogOptions) { // Resetting context and QnAId dialogOptions.QnAMakerOptions.QnAId = 0; dialogOptions.QnAMakerOptions.Context = new QnARequestContext(); // -Check if previous context is present, if yes then put it with the query // -Check for id if query is present in reverse index. var previousContextData = ObjectPath.GetPathValue <Dictionary <string, int> >(dc.ActiveDialog.State, QnAContextData, new Dictionary <string, int>()); var previousQnAId = ObjectPath.GetPathValue <int>(dc.ActiveDialog.State, PreviousQnAId, 0); if (previousQnAId > 0) { dialogOptions.QnAMakerOptions.Context = new QnARequestContext { PreviousQnAId = previousQnAId }; if (previousContextData.TryGetValue(dc.Context.Activity.Text, out var currentQnAId)) { dialogOptions.QnAMakerOptions.QnAId = currentQnAId; } } }