From 505e047ee7cd693bb00c9443cc8a09c60acb33b2 Mon Sep 17 00:00:00 2001
From: Bo Yin <103488@smsassist.com>
Date: Tue, 29 Oct 2024 13:55:55 -0500
Subject: [PATCH] support intent in welcome webhook
---
.../Controllers/TwilioVoiceController.cs | 65 ++++++++++++++-----
1 file changed, 48 insertions(+), 17 deletions(-)
diff --git a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs
index cf318e35b..1d1007125 100644
--- a/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs
+++ b/src/Plugins/BotSharp.Plugin.Twilio/Controllers/TwilioVoiceController.cs
@@ -32,7 +32,7 @@ public TwilioVoiceController(TwilioSetting settings, IServiceProvider services,
///
[ValidateRequest]
[HttpPost("twilio/voice/welcome")]
- public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string states)
+ public async Task InitiateConversation(VoiceRequest request, [FromQuery] string states, [FromQuery] string intent)
{
if (request?.CallSid == null)
{
@@ -41,8 +41,29 @@ public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string
string conversationId = $"TwilioVoice_{request.CallSid}";
var twilio = _services.GetRequiredService();
- var url = $"twilio/voice/{conversationId}/receive/0?states={states}";
- var response = twilio.ReturnNoninterruptedInstructions(new List { "twilio/welcome.mp3" }, url, true, timeout: 2);
+ VoiceResponse response;
+ if (string.IsNullOrWhiteSpace(intent))
+ {
+ var url = $"twilio/voice/{conversationId}/receive/0?states={states}";
+ response = twilio.ReturnNoninterruptedInstructions(new List { "twilio/welcome.mp3" }, url, true, timeout: 2);
+ }
+ else
+ {
+ int seqNum = 0;
+ var messageQueue = _services.GetRequiredService();
+ var sessionManager = _services.GetRequiredService();
+ await sessionManager.StageCallerMessageAsync(conversationId, seqNum, intent);
+ var callerMessage = new CallerMessage()
+ {
+ ConversationId = conversationId,
+ SeqNumber = seqNum,
+ Content = intent,
+ From = request.From,
+ States = ParseStates(states)
+ };
+ await messageQueue.EnqueueAsync(callerMessage);
+ response = new VoiceResponse().Redirect(new Uri($"{_settings.CallbackHost}/twilio/voice/{conversationId}/reply/{seqNum}?states={states}"), HttpMethod.Post);
+ }
return TwiML(response);
}
@@ -72,19 +93,10 @@ public async Task ReceiveCallerMessage([FromRoute] string conversat
ConversationId = conversationId,
SeqNumber = seqNum,
Content = messageContent,
- Digits = request.Digits,
- From = request.From
+ Digits = request.Digits,
+ From = request.From,
+ States = ParseStates(states)
};
-
- if (!string.IsNullOrEmpty(states))
- {
- var kvp = states.Split(':');
- if (kvp.Length == 2)
- {
- callerMessage.States.Add(kvp[0], kvp[1]);
- }
- }
-
await messageQueue.EnqueueAsync(callerMessage);
response = new VoiceResponse().Redirect(new Uri($"{_settings.CallbackHost}/twilio/voice/{conversationId}/reply/{seqNum}?states={states}"), HttpMethod.Post);
@@ -159,7 +171,7 @@ public async Task ReplyCallerMessage([FromRoute] string conversatio
{
speechPaths.Add($"twilio/hold-on-short-{holdOnIndex}.mp3");
}
-
+
var fileName = $"indication_{seqNum}_{segIndex}.mp3";
fileStorage.SaveSpeechFile(conversationId, fileName, data);
speechPaths.Add($"twilio/voice/speeches/{conversationId}/{fileName}");
@@ -214,7 +226,7 @@ public async Task ReplyCallerMessage([FromRoute] string conversatio
response = twilio.ReturnInstructions(new List
{
$"twilio/voice/speeches/{conversationId}/{reply.SpeechFileName}"
- }, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true, hints:reply.Hints);
+ }, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true, hints: reply.Hints);
}
}
@@ -233,4 +245,23 @@ public async Task GetSpeechFile([FromRoute] string conversati
};
return result;
}
+
+ private Dictionary ParseStates(string? states)
+ {
+ var result = new Dictionary();
+ if (string.IsNullOrWhiteSpace(states))
+ {
+ return result;
+ }
+ var kvps = states.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
+ foreach (var kvp in kvps)
+ {
+ var parts = kvp.Split(':');
+ if (parts.Length == 2)
+ {
+ result.Add(parts[0], parts[1]);
+ }
+ }
+ return result;
+ }
}