Skip to content

Commit 34fa323

Browse files
authored
Merge pull request #711 from wcao-lessen/update/intent
support intent in welcome webhook
2 parents e3da73b + 505e047 commit 34fa323

File tree

1 file changed

+48
-17
lines changed

1 file changed

+48
-17
lines changed

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

Lines changed: 48 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public TwilioVoiceController(TwilioSetting settings, IServiceProvider services,
3232
/// <exception cref="ArgumentNullException"></exception>
3333
[ValidateRequest]
3434
[HttpPost("twilio/voice/welcome")]
35-
public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string states)
35+
public async Task<TwiMLResult> InitiateConversation(VoiceRequest request, [FromQuery] string states, [FromQuery] string intent)
3636
{
3737
if (request?.CallSid == null)
3838
{
@@ -41,8 +41,29 @@ public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string
4141

4242
string conversationId = $"TwilioVoice_{request.CallSid}";
4343
var twilio = _services.GetRequiredService<TwilioService>();
44-
var url = $"twilio/voice/{conversationId}/receive/0?states={states}";
45-
var response = twilio.ReturnNoninterruptedInstructions(new List<string> { "twilio/welcome.mp3" }, url, true, timeout: 2);
44+
VoiceResponse response;
45+
if (string.IsNullOrWhiteSpace(intent))
46+
{
47+
var url = $"twilio/voice/{conversationId}/receive/0?states={states}";
48+
response = twilio.ReturnNoninterruptedInstructions(new List<string> { "twilio/welcome.mp3" }, url, true, timeout: 2);
49+
}
50+
else
51+
{
52+
int seqNum = 0;
53+
var messageQueue = _services.GetRequiredService<TwilioMessageQueue>();
54+
var sessionManager = _services.GetRequiredService<ITwilioSessionManager>();
55+
await sessionManager.StageCallerMessageAsync(conversationId, seqNum, intent);
56+
var callerMessage = new CallerMessage()
57+
{
58+
ConversationId = conversationId,
59+
SeqNumber = seqNum,
60+
Content = intent,
61+
From = request.From,
62+
States = ParseStates(states)
63+
};
64+
await messageQueue.EnqueueAsync(callerMessage);
65+
response = new VoiceResponse().Redirect(new Uri($"{_settings.CallbackHost}/twilio/voice/{conversationId}/reply/{seqNum}?states={states}"), HttpMethod.Post);
66+
}
4667
return TwiML(response);
4768
}
4869

@@ -72,19 +93,10 @@ public async Task<TwiMLResult> ReceiveCallerMessage([FromRoute] string conversat
7293
ConversationId = conversationId,
7394
SeqNumber = seqNum,
7495
Content = messageContent,
75-
Digits = request.Digits,
76-
From = request.From
96+
Digits = request.Digits,
97+
From = request.From,
98+
States = ParseStates(states)
7799
};
78-
79-
if (!string.IsNullOrEmpty(states))
80-
{
81-
var kvp = states.Split(':');
82-
if (kvp.Length == 2)
83-
{
84-
callerMessage.States.Add(kvp[0], kvp[1]);
85-
}
86-
}
87-
88100
await messageQueue.EnqueueAsync(callerMessage);
89101

90102
response = new VoiceResponse().Redirect(new Uri($"{_settings.CallbackHost}/twilio/voice/{conversationId}/reply/{seqNum}?states={states}"), HttpMethod.Post);
@@ -159,7 +171,7 @@ public async Task<TwiMLResult> ReplyCallerMessage([FromRoute] string conversatio
159171
{
160172
speechPaths.Add($"twilio/hold-on-short-{holdOnIndex}.mp3");
161173
}
162-
174+
163175
var fileName = $"indication_{seqNum}_{segIndex}.mp3";
164176
fileStorage.SaveSpeechFile(conversationId, fileName, data);
165177
speechPaths.Add($"twilio/voice/speeches/{conversationId}/{fileName}");
@@ -214,7 +226,7 @@ public async Task<TwiMLResult> ReplyCallerMessage([FromRoute] string conversatio
214226
response = twilio.ReturnInstructions(new List<string>
215227
{
216228
$"twilio/voice/speeches/{conversationId}/{reply.SpeechFileName}"
217-
}, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true, hints:reply.Hints);
229+
}, $"twilio/voice/{conversationId}/receive/{nextSeqNum}?states={states}", true, hints: reply.Hints);
218230
}
219231
}
220232

@@ -233,4 +245,23 @@ public async Task<FileContentResult> GetSpeechFile([FromRoute] string conversati
233245
};
234246
return result;
235247
}
248+
249+
private Dictionary<string, string> ParseStates(string? states)
250+
{
251+
var result = new Dictionary<string, string>();
252+
if (string.IsNullOrWhiteSpace(states))
253+
{
254+
return result;
255+
}
256+
var kvps = states.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
257+
foreach (var kvp in kvps)
258+
{
259+
var parts = kvp.Split(':');
260+
if (parts.Length == 2)
261+
{
262+
result.Add(parts[0], parts[1]);
263+
}
264+
}
265+
return result;
266+
}
236267
}

0 commit comments

Comments
 (0)