Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public TwilioVoiceController(TwilioSetting settings, IServiceProvider services,
/// <exception cref="ArgumentNullException"></exception>
[ValidateRequest]
[HttpPost("twilio/voice/welcome")]
public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string states)
public async Task<TwiMLResult> InitiateConversation(VoiceRequest request, [FromQuery] string states, [FromQuery] string intent)
{
if (request?.CallSid == null)
{
Expand All @@ -41,8 +41,29 @@ public TwiMLResult InitiateConversation(VoiceRequest request, [FromQuery] string

string conversationId = $"TwilioVoice_{request.CallSid}";
var twilio = _services.GetRequiredService<TwilioService>();
var url = $"twilio/voice/{conversationId}/receive/0?states={states}";
var response = twilio.ReturnNoninterruptedInstructions(new List<string> { "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<string> { "twilio/welcome.mp3" }, url, true, timeout: 2);
}
else
{
int seqNum = 0;
var messageQueue = _services.GetRequiredService<TwilioMessageQueue>();
var sessionManager = _services.GetRequiredService<ITwilioSessionManager>();
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);
}

Expand Down Expand Up @@ -72,19 +93,10 @@ public async Task<TwiMLResult> 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);
Expand Down Expand Up @@ -159,7 +171,7 @@ public async Task<TwiMLResult> 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}");
Expand Down Expand Up @@ -214,7 +226,7 @@ public async Task<TwiMLResult> ReplyCallerMessage([FromRoute] string conversatio
response = twilio.ReturnInstructions(new List<string>
{
$"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);
}
}

Expand All @@ -233,4 +245,23 @@ public async Task<FileContentResult> GetSpeechFile([FromRoute] string conversati
};
return result;
}

private Dictionary<string, string> ParseStates(string? states)
{
var result = new Dictionary<string, string>();
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;
}
}