/// <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> public override async Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default) { if (Disabled != null && Disabled.GetValue(dc.State)) { return(await dc.EndDialogAsync(cancellationToken : cancellationToken).ConfigureAwait(false)); } // Update the dialog options with the runtime settings. DialogOptions.BotId = BotId.GetValue(dc.State); DialogOptions.SkillHostEndpoint = new Uri(SkillHostEndpoint.GetValue(dc.State)); DialogOptions.ConversationIdFactory = dc.Context.TurnState.Get <SkillConversationIdFactoryBase>() ?? throw new NullReferenceException("Unable to locate SkillConversationIdFactoryBase in HostContext"); DialogOptions.SkillClient = dc.Context.TurnState.Get <BotFrameworkClient>() ?? throw new NullReferenceException("Unable to locate BotFrameworkClient in HostContext"); DialogOptions.ConversationState = dc.Context.TurnState.Get <ConversationState>() ?? throw new NullReferenceException($"Unable to get an instance of {nameof(ConversationState)} from TurnState."); DialogOptions.ConnectionName = ConnectionName.GetValue(dc.State); // Set the skill to call DialogOptions.Skill.Id = DialogOptions.Skill.AppId = SkillAppId.GetValue(dc.State); DialogOptions.Skill.SkillEndpoint = new Uri(SkillEndpoint.GetValue(dc.State)); // Store the initialized DialogOptions in state so we can restore these values when the dialog is resumed. dc.ActiveDialog.State[_dialogOptionsStateKey] = DialogOptions; // Get the activity to send to the skill. Activity activity = null; if (Activity != null && ActivityProcessed.GetValue(dc.State)) { // The parent consumed the activity in context, use the Activity property to start the skill. activity = await Activity.BindAsync(dc, cancellationToken : cancellationToken).ConfigureAwait(false); } // Call the base to invoke the skill // (If the activity has not been processed, send the turn context activity to the skill (pass through)). return(await base.BeginDialogAsync(dc, new BeginSkillDialogOptions { Activity = activity ?? dc.Context.Activity }, cancellationToken).ConfigureAwait(false)); }
public override async Task <DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default) { var dcState = dc.GetState(); if (Disabled != null && Disabled.GetValue(dcState)) { return(await dc.EndDialogAsync(cancellationToken : cancellationToken).ConfigureAwait(false)); } // Update the dialog options with the runtime settings. DialogOptions.BotId = BotId.GetValue(dcState); DialogOptions.SkillHostEndpoint = new Uri(SkillHostEndpoint.GetValue(dcState)); DialogOptions.ConversationIdFactory = HostContext.Current.Get <SkillConversationIdFactoryBase>() ?? throw new NullReferenceException("Unable to locate SkillConversationIdFactoryBase in HostContext"); DialogOptions.SkillClient = HostContext.Current.Get <BotFrameworkClient>() ?? throw new NullReferenceException("Unable to locate BotFrameworkClient in HostContext"); DialogOptions.ConversationState = dc.Context.TurnState.Get <ConversationState>() ?? throw new NullReferenceException($"Unable to get an instance of {nameof(ConversationState)} from TurnState."); // Set the skill to call DialogOptions.Skill.Id = DialogOptions.Skill.AppId = SkillAppId.GetValue(dcState); DialogOptions.Skill.SkillEndpoint = new Uri(SkillEndpoint.GetValue(dcState)); // Get the activity to send to the skill. var activity = await Activity.BindToData(dc.Context, dcState).ConfigureAwait(false); // Call the base to invoke the skill return(await base.BeginDialogAsync(dc, new BeginSkillDialogOptions { Activity = activity }, cancellationToken).ConfigureAwait(false)); }