/// <summary> /// Initializes a new instance of the <see cref="SkillDialog"/> class. /// SkillDialog constructor that accepts the manifest description of a Skill along with TelemetryClient for end to end telemetry. /// </summary> /// <param name="skillManifest">Skill manifest.</param> /// <param name="serviceClientCredentials">Service client credentials.</param> /// <param name="telemetryClient">Telemetry Client.</param> /// <param name="userState">User State.</param> /// <param name="authDialog">Auth Dialog.</param> /// <param name="skillIntentRecognizer">Skill Intent Recognizer.</param> /// <param name="skillTransport">Transport used for skill invocation.</param> public SkillDialog( SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, IBotTelemetryClient telemetryClient, UserState userState, MultiProviderAuthDialog authDialog = null, ISkillIntentRecognizer skillIntentRecognizer = null, ISkillTransport skillTransport = null) : base(skillManifest.Id) { _skillManifest = skillManifest ?? throw new ArgumentNullException(nameof(SkillManifest)); _serviceClientCredentials = serviceClientCredentials ?? throw new ArgumentNullException(nameof(serviceClientCredentials)); _userState = userState; _skillTransport = skillTransport ?? new SkillWebSocketTransport(telemetryClient); _skillIntentRecognizer = skillIntentRecognizer; var intentSwitching = new WaterfallStep[] { ConfirmIntentSwitch, FinishIntentSwitch, }; if (authDialog != null) { _authDialog = authDialog; AddDialog(authDialog); } AddDialog(new WaterfallDialog(DialogIds.ConfirmSkillSwitchFlow, intentSwitching)); AddDialog(new ConfirmPrompt(DialogIds.ConfirmSkillSwitchPrompt)); }
public SkillWebSocketTransport( SkillManifest skillManifest, IServiceClientCredentials serviceCLientCredentials, IStreamingTransportClient streamingTransportClient = null) { _skillManifest = skillManifest ?? throw new ArgumentNullException(nameof(skillManifest)); _serviceClientCredentials = serviceCLientCredentials ?? throw new ArgumentNullException(nameof(serviceCLientCredentials)); _streamingTransportClient = streamingTransportClient; }
public async Task CancelRemoteDialogsAsync(SkillManifest skillManifest, IServiceClientCredentials appCredentials, ITurnContext turnContext) { var cancelRemoteDialogEvent = turnContext.Activity.CreateReply(); cancelRemoteDialogEvent.Type = ActivityTypes.Event; cancelRemoteDialogEvent.Name = SkillEvents.CancelAllSkillDialogsEventName; await ForwardToSkillAsync(skillManifest, appCredentials, turnContext, cancelRemoteDialogEvent).ConfigureAwait(false); }
/// <summary> /// Initializes a new instance of the <see cref="SkillDialog"/> class. /// SkillDialog constructor that accepts the manifest description of a Skill along with TelemetryClient for end to end telemetry. /// </summary> /// <param name="skillManifest">Skill manifest.</param> /// <param name="serviceClientCredentials">Service client credentials.</param> /// <param name="telemetryClient">Telemetry Client.</param> /// <param name="userState">User State.</param> /// <param name="authDialog">Auth Dialog.</param> /// <param name="skillTransport">Transport used for skill invocation.</param> public SkillDialog( SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, IBotTelemetryClient telemetryClient, UserState userState, MultiProviderAuthDialog authDialog = null, ISkillTransport skillTransport = null) : base(skillManifest.Id) { _skillManifest = skillManifest ?? throw new ArgumentNullException(nameof(SkillManifest)); _serviceClientCredentials = serviceClientCredentials ?? throw new ArgumentNullException(nameof(serviceClientCredentials)); _telemetryClient = telemetryClient ?? throw new ArgumentNullException(nameof(telemetryClient)); _userState = userState; _skillTransport = skillTransport ?? new SkillWebSocketTransport(_skillManifest, _serviceClientCredentials); if (authDialog != null) { _authDialog = authDialog; AddDialog(authDialog); } }
public Task <Activity> ForwardToSkillAsync(SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, ITurnContext dialogContext, Activity activity, Action <Activity> tokenRequestHandler = null) { _activityForwarded = activity; return(Task.FromResult <Activity>(null)); }
public Task CancelRemoteDialogsAsync(SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, ITurnContext turnContext) { return(Task.CompletedTask); }
public SkillDialogTest(SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, IBotTelemetryClient telemetryClient, UserState userState, ISkillTransport skillTransport = null) : base(skillManifest, serviceClientCredentials, telemetryClient, userState, null, skillTransport) { }
public SkillHttpTransport(SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials) { _skillManifest = skillManifest ?? throw new ArgumentNullException(nameof(skillManifest)); _serviceClientCredentials = serviceClientCredentials ?? throw new ArgumentNullException(nameof(serviceClientCredentials)); }
public async Task <Activity> ForwardToSkillAsync(SkillManifest skillManifest, IServiceClientCredentials serviceClientCredentials, ITurnContext turnContext, Activity activity, Action <Activity> tokenRequestHandler = null) { if (_streamingTransportClient == null) { // establish websocket connection _streamingTransportClient = new WebSocketClient( EnsureWebSocketUrl(skillManifest.Endpoint.ToString()), new SkillCallingRequestHandler( turnContext, _botTelemetryClient, GetTokenCallback(turnContext, tokenRequestHandler), GetHandoffActivityCallback())); } // acquire AAD token MicrosoftAppCredentials.TrustServiceUrl(skillManifest.Endpoint.AbsoluteUri); var token = await serviceClientCredentials.GetTokenAsync().ConfigureAwait(false); // put AAD token in the header var headers = new Dictionary <string, string>(); headers.Add("Authorization", $"Bearer {token}"); await _streamingTransportClient.ConnectAsync(headers).ConfigureAwait(false); // set recipient to the skill var recipientId = activity.Recipient.Id; activity.Recipient.Id = skillManifest.MSAappId; // Serialize the activity and POST to the Skill endpoint var body = new StringContent(JsonConvert.SerializeObject(activity, SerializationSettings.BotSchemaSerializationSettings), Encoding.UTF8, SerializationSettings.ApplicationJson); var request = StreamingRequest.CreatePost(string.Empty, body); // set back recipient id to make things consistent activity.Recipient.Id = recipientId; var stopWatch = new System.Diagnostics.Stopwatch(); stopWatch.Start(); await _streamingTransportClient.SendAsync(request).ConfigureAwait(false); stopWatch.Stop(); _botTelemetryClient.TrackEvent( "SkillWebSocketTurnLatency", new Dictionary <string, string> { { "SkillName", skillManifest.Name }, { "SkillEndpoint", skillManifest.Endpoint.ToString() }, }, new Dictionary <string, double> { { "Latency", stopWatch.ElapsedMilliseconds }, }); return(_handoffActivity); }