Skip to content

Commit a3aabe2

Browse files
authored
Merge pull request #1038 from Lessen-LLC/Development
Adding inbound call recording.
2 parents 575c148 + 2d42673 commit a3aabe2

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioInboundController.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ await HookEmitter.Emit<ITwilioCallStatusHook>(_services,
107107
response.Redirect(new Uri($"{_settings.CallbackHost}/twilio/voice/reply/{seqNum}?agent-id={request.AgentId}&conversation-id={request.ConversationId}&{twilio.GenerateStatesParameter(request.States)}"), HttpMethod.Post);
108108
}
109109
}
110+
111+
_ = Task.Run(async () =>
112+
{
113+
await Task.Delay(1500);
114+
await twilio.StartRecording(request.CallSid, request.AgentId, request.ConversationId);
115+
});
110116
}
111117

112118
await HookEmitter.Emit<ITwilioSessionHook>(_services, async hook =>

src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioRecordController.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ public async Task<ActionResult> PhoneRecordingStatus(ConversationalVoiceRequest
3838
// recording completed
3939
await HookEmitter.Emit<ITwilioCallStatusHook>(_services, x => x.OnRecordingCompleted(request));
4040
}
41+
else
42+
{
43+
_logger.LogError($"Unknown record status: {request.CallStatus}, {request.CallSid}");
44+
}
4145

4246
return Ok();
4347
}

src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public async Task<TwiMLResult> ReplyCallerMessage(ConversationalVoiceRequest req
214214

215215
var reply = await sessionManager.GetAssistantReplyAsync(request.ConversationId, request.SeqNum);
216216
VoiceResponse response;
217-
217+
218218
if (request.AIResponseWaitTime > 10)
219219
{
220220
// Wait AI Response Timeout
@@ -381,19 +381,23 @@ await HookEmitter.Emit<ITwilioCallStatusHook>(_services,
381381
else if (request.CallStatus == "canceled")
382382
{
383383
await HookEmitter.Emit<ITwilioCallStatusHook>(_services,
384-
async hook =>
385-
{
386-
if (hook.IsMatch(request)) await hook.OnCallCanceledStatus(request);
384+
async hook =>
385+
{
386+
if (hook.IsMatch(request)) await hook.OnCallCanceledStatus(request);
387387
});
388388
}
389389
else if (request.CallStatus == "failed")
390390
{
391391
await HookEmitter.Emit<ITwilioCallStatusHook>(_services,
392-
async hook =>
393-
{
394-
if (hook.IsMatch(request)) await hook.OnCallFailedStatus(request);
392+
async hook =>
393+
{
394+
if (hook.IsMatch(request)) await hook.OnCallFailedStatus(request);
395395
});
396396
}
397+
else
398+
{
399+
_logger.LogError($"Unknown call status: {request.CallStatus}, {request.CallSid}");
400+
}
397401

398402
return Ok();
399403
}

src/Plugins/BotSharp.Plugin.Twilio/Services/TwilioService.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using BotSharp.Plugin.Twilio.Interfaces;
77
using BotSharp.Plugin.Twilio.Models;
88
using Twilio.Jwt.AccessToken;
9+
using Twilio.Rest.Api.V2010.Account.Call;
10+
using Task = System.Threading.Tasks.Task;
911
using Token = Twilio.Jwt.AccessToken.Token;
1012

1113
namespace BotSharp.Plugin.Twilio.Services;
@@ -122,6 +124,22 @@ public VoiceResponse ReturnNoninterruptedInstructions(ConversationalVoiceRespons
122124
return response;
123125
}
124126

127+
public async Task StartRecording(string callSid, string agentId, string conversationId)
128+
{
129+
if (_settings.RecordingEnabled)
130+
{
131+
// https://help.twilio.com/articles/360010317333-Recording-Incoming-Twilio-Voice-Calls
132+
var recordStatusUrl = $"{_settings.CallbackHost}/twilio/record/status?agent-id={agentId}&conversation-id={conversationId}";
133+
var recording = await RecordingResource.CreateAsync(pathCallSid: callSid,
134+
recordingStatusCallback: new Uri(recordStatusUrl),
135+
trim: "trim-silence",
136+
recordingChannels: "dual",
137+
recordingTrack: "both");
138+
139+
_logger.LogInformation($"Recording started: {recording.CallSid} {recording.Sid}");
140+
}
141+
}
142+
125143
public VoiceResponse HangUp(string speechPath)
126144
{
127145
var response = new VoiceResponse();

0 commit comments

Comments
 (0)