diff --git a/packages/Microsoft.Bot.Components.Telephony/Actions/CallTransferDialog.cs b/packages/Microsoft.Bot.Components.Telephony/Actions/CallTransferDialog.cs new file mode 100644 index 0000000000..002df0e22f --- /dev/null +++ b/packages/Microsoft.Bot.Components.Telephony/Actions/CallTransferDialog.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using AdaptiveExpressions.Properties; +using Microsoft.Bot.Builder; +using Microsoft.Bot.Builder.Dialogs; +using Newtonsoft.Json; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Bot.Components.Telephony.Actions +{ + public class CallTransferDialog : Dialog + { + [JsonConstructor] + public CallTransferDialog([CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0) + : base() + { + // enable instances of this command as debug break point + this.RegisterSourceLocation(sourceFilePath, sourceLineNumber); + } + + [JsonProperty("$kind")] + public const string Kind = "CallTransferDialog"; + + [JsonProperty("targetPhoneNumber")] + public StringExpression TargetPhoneNumber { get; set; } + + public async override Task BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default(CancellationToken)) + { + var targetPhoneNumber = TargetPhoneNumber.GetValue(dc.State); + + await dc.Context.SendActivityAsync($"Transferring to \"{targetPhoneNumber}\"..."); + + // Create handoff event, passing the phone number to transfer to as context. + var poContext = new { TargetPhoneNumber = targetPhoneNumber }; + var poHandoffEvent = EventFactory.CreateHandoffInitiation(dc.Context, poContext); + + try + { + await dc.Context.SendActivityAsync(poHandoffEvent, cancellationToken); + await dc.Context.SendActivityAsync($"Call transfer initiation succeeded"); + } + catch + { + await dc.Context.SendActivityAsync($"Call transfer failed"); + } + + return await dc.EndDialogAsync(result: 0, cancellationToken: cancellationToken); + } + } +} \ No newline at end of file diff --git a/packages/Microsoft.Bot.Components.Telephony/Microsoft.Bot.Components.Telephony.csproj b/packages/Microsoft.Bot.Components.Telephony/Microsoft.Bot.Components.Telephony.csproj new file mode 100644 index 0000000000..2535dc32a3 --- /dev/null +++ b/packages/Microsoft.Bot.Components.Telephony/Microsoft.Bot.Components.Telephony.csproj @@ -0,0 +1,50 @@ + + + + $(LocalPackageVersion) + $(PreviewPackageVersion) + $(LocalPackageVersion) + $(PreviewPackageVersion) + Debug;Release + bin\$(Configuration)\netstandard2.0\Microsoft.Bot.Builder.Dialogs.Adaptive.xml + + + + netstandard2.0 + Microsoft.Bot.Components.Telephony + This library implements .NET support for adaptive dialogs with Telephony + This library implements .NET support for adaptive dialogs with Microsoft Telephony + content + msbot-action;msbot-trigger;msbot-component + + + + Full + true + + + + + $(NoWarn);CS1591 + 1.0.0-preview + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.schema b/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.schema new file mode 100644 index 0000000000..2475f68ddd --- /dev/null +++ b/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.schema @@ -0,0 +1,18 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/component/v1.0/component.schema", + "$role": "implements(Microsoft.IDialog)", + "title": "Call Transfer", + "description": "Phone number to transfer the call to (in E.164 format such as +1425123456)", + "type": "object", + "additionalProperties": false, + "properties": { + "targetPhoneNumber": { + "$ref": "schema:#/definitions/stringExpression", + "title": "Target Phone Number", + "description": "Phone number to transfer the call to", + "examples": [ + "in E.164 format such as +1425123456" + ] + } + } +} diff --git a/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.uischema b/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.uischema new file mode 100644 index 0000000000..1e65630305 --- /dev/null +++ b/packages/Microsoft.Bot.Components.Telephony/Schemas/CallTransferDialog.uischema @@ -0,0 +1,26 @@ +{ + "$schema": "https://schemas.botframework.com/schemas/ui/v1.0/ui.schema", + "form": { + "label": "Transfer a call", + "subtitle": "Call Transfer", + "order": [ + "targetPhoneNumber", + "*" + ], + "properties": { + "targetPhoneNumber": { + "intellisenseScopes": [ + "variable-scopes" + ] + } + } + }, + "menu": { + "label": "Transfer a call", + "submenu": [ "Channels", "Telephony" ] + }, + "flow": { + "widget": "ActionCard", + "body": "=action.targetPhoneNumber" + } +} \ No newline at end of file diff --git a/packages/Microsoft.Bot.Components.Telephony/TelephonyBotComponent.cs b/packages/Microsoft.Bot.Components.Telephony/TelephonyBotComponent.cs new file mode 100644 index 0000000000..18be688bf1 --- /dev/null +++ b/packages/Microsoft.Bot.Components.Telephony/TelephonyBotComponent.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using Microsoft.Bot.Components.Telephony.Actions; +using Microsoft.Bot.Builder.Dialogs.Declarative; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Bot.Builder; + +namespace Microsoft.Bot.Components.Telephony +{ + public class TeamsBotComponent : BotComponent + { + /// + public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) + { + // Conditionals + services.AddSingleton(sp => new DeclarativeType(CallTransferDialog.Kind)); + } + } +} \ No newline at end of file diff --git a/packages/Microsoft.Bot.Components.sln b/packages/Microsoft.Bot.Components.sln index a1352f774d..c1f3d8fcde 100644 --- a/packages/Microsoft.Bot.Components.sln +++ b/packages/Microsoft.Bot.Components.sln @@ -9,6 +9,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Ad EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Bot.Components.Teams", "Teams\Microsoft.Bot.Components.Teams.csproj", "{FD29CBA6-C18F-498B-9F00-A3C34C1BEC5F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Bot.Components.Telephony", "Microsoft.Bot.Components.Telephony\Microsoft.Bot.Components.Telephony.csproj", "{A854B5EC-3A34-4D1F-8080-F0846DEDF63F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {FD29CBA6-C18F-498B-9F00-A3C34C1BEC5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {FD29CBA6-C18F-498B-9F00-A3C34C1BEC5F}.Release|Any CPU.ActiveCfg = Release|Any CPU {FD29CBA6-C18F-498B-9F00-A3C34C1BEC5F}.Release|Any CPU.Build.0 = Release|Any CPU + {A854B5EC-3A34-4D1F-8080-F0846DEDF63F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A854B5EC-3A34-4D1F-8080-F0846DEDF63F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A854B5EC-3A34-4D1F-8080-F0846DEDF63F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A854B5EC-3A34-4D1F-8080-F0846DEDF63F}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE