diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioInboundController.cs b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioInboundController.cs index ff59e470f..e82908a0a 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioInboundController.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioInboundController.cs @@ -74,7 +74,7 @@ await HookEmitter.Emit(_services, } else { - if (agent.Profiles.Contains("realtime")) + if (agent.Labels.Contains("realtime")) { response = twilio.ReturnBidirectionalMediaStreamsInstructions(instruction, agent); } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioReconnectController.cs b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioReconnectController.cs index 0ecee0e2b..6daf19589 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioReconnectController.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioReconnectController.cs @@ -1,4 +1,5 @@ using BotSharp.Plugin.Twilio.Models; +using BotSharp.Plugin.Twilio.Services; using Microsoft.AspNetCore.Mvc; namespace BotSharp.Plugin.Twilio.Controllers; @@ -24,7 +25,17 @@ public async Task Reconnect(ConversationalVoiceRequest request) var connect = new Connect(); var host = _settings.CallbackHost.Split("://").Last(); connect.Stream(url: $"wss://{host}/twilio/stream/{request.AgentId}/{request.ConversationId}"); - response.Pause(1); + if (!string.IsNullOrEmpty(request.InitAudioFile)) + { + var twilio = _services.GetRequiredService(); + var audioUrl = twilio.GetSpeechPath(request.ConversationId, request.InitAudioFile); + response.Play(new Uri(audioUrl)); + } + else + { + // Leave a pause to allow disposing objects. + response.Pause(1); + } response.Append(connect); return TwiML(response); } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Hooks/TwilioConversationHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/Hooks/TwilioConversationHook.cs index ee2f2f094..0e0682f39 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Hooks/TwilioConversationHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Hooks/TwilioConversationHook.cs @@ -2,6 +2,7 @@ using Task = System.Threading.Tasks.Task; using Twilio.Rest.Api.V2010.Account; using BotSharp.Plugin.Twilio.Interfaces; +using BotSharp.Plugin.Twilio.Models; namespace BotSharp.Plugin.Twilio.Hooks; @@ -23,17 +24,31 @@ public TwilioConversationHook(IServiceProvider services, public override async Task OnFunctionExecuted(RoleDialogModel message) { var hooks = _services.GetServices(); + + var routing = _services.GetRequiredService(); + var conversationId = routing.Context.ConversationId; + + var states = _services.GetRequiredService(); + var sid = states.GetState("twilio_call_sid"); + + var request = new ConversationalVoiceRequest + { + AgentId = message.CurrentAgentId, + ConversationId = conversationId, + CallSid = sid, + }; + foreach (var hook in hooks) { - if (await hook.ShouldReconnect(message)) + if (await hook.ShouldReconnect(request, message)) { - var states = _services.GetRequiredService(); - var sid = states.GetState("twilio_call_sid"); - - var routing = _services.GetRequiredService(); - var conversationId = routing.Context.ConversationId; var processUrl = $"{_setting.CallbackHost}/twilio/stream/reconnect?agent-id={message.CurrentAgentId}&conversation-id={conversationId}"; + if (!string.IsNullOrEmpty(request.InitAudioFile)) + { + processUrl += $"&init-audio-file={request.InitAudioFile}"; + } + // Save all states before reconnect states.Save(); diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioSessionHook.cs b/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioSessionHook.cs index 418408ee8..405254754 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioSessionHook.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/Interfaces/ITwilioSessionHook.cs @@ -86,6 +86,6 @@ Task OnAgentTransferring(ConversationalVoiceRequest request, TwilioSetting setti /// /// /// - Task ShouldReconnect(RoleDialogModel message) + Task ShouldReconnect(ConversationalVoiceRequest request, RoleDialogModel message) => Task.FromResult(false); } diff --git a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs index b5ecf1014..88586ea8e 100644 --- a/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs +++ b/src/Plugins/BotSharp.Plugin.Twilio/OutboundPhoneCallHandler/Functions/OutboundPhoneCallFn.cs @@ -82,7 +82,7 @@ public async Task Execute(RoleDialogModel message) var agent = await agentService.GetAgent(message.CurrentAgentId); // Set up process URL streaming or synchronous - if (agent.Profiles.Contains("realtime")) + if (agent.Labels.Contains("realtime")) { processUrl += "/inbound"; }