diff --git a/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/CallAutomationEventsController.cs b/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/CallAutomationEventsController.cs index 8dc26f2c..0e14a81c 100644 --- a/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/CallAutomationEventsController.cs +++ b/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/CallAutomationEventsController.cs @@ -93,10 +93,23 @@ public async Task HandleEvents([FromBody] EventGridEvent[] eventG var callbackUri = new Uri(new Uri(_config.CallbackUriHost), $"/api/callbacks"); _logger.LogInformation($"Incoming call - correlationId: {incomingCallEventData.CorrelationId}, Callback url: {callbackUri}"); + var websocketUri = _config.CallbackUriHost.Replace("https", "wss") + "/ws"; + + MediaStreamingOptions mediaOpts = new MediaStreamingOptions( + new Uri(websocketUri), + MediaStreamingContent.Audio, + MediaStreamingAudioChannel.Mixed, + MediaStreamingTransport.Websocket, + false) + { + EnableBidirectional = false, + AudioFormat = AudioFormat.Pcm24KMono + }; var options = new AnswerCallOptions(incomingCallEventData.IncomingCallContext, callbackUri) { // ACS GCCH Phase 2 // CallIntelligenceOptions = new CallIntelligenceOptions() { CognitiveServicesEndpoint = new Uri(cognitiveServicesEndpoint) } + MediaStreamingOptions = mediaOpts }; _logger.LogInformation($"Answering call with correlationId: {incomingCallEventData.CorrelationId}"); diff --git a/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/DTMFController.cs b/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/DTMFController.cs index a6a49770..e15c3068 100644 --- a/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/DTMFController.cs +++ b/Call_Automation_GCCH/Call_Automation_GCCH/Controllers/DTMFController.cs @@ -1,15 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Threading.Channels; -using System.Threading.Tasks; -using Azure; -using Azure.Communication; +using Azure.Communication; using Azure.Communication.CallAutomation; using Call_Automation_GCCH.Models; using Call_Automation_GCCH.Services; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; namespace Call_Automation_GCCH.Controllers @@ -36,17 +29,17 @@ public DTMFController( #region DTMF /// - /// Send DTMF Tones to a specific ACS target asynchronously. + /// Send DTMF Tones to a specific target asynchronously. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/sendDTMFTonesAsync")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public async Task SendDTMFTonesAcsTargetAsync(string callConnectionId, string acsTarget) + public async Task SendDTMFTonesTargetAsync(string callConnectionId, string targetUser, bool isPstn) { try { @@ -55,14 +48,22 @@ public async Task SendDTMFTonesAcsTargetAsync(string callConnecti return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Send DTMF Tones to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); + _logger.LogInformation($"Send DTMF Tones to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } List tones = new List { @@ -75,7 +76,7 @@ public async Task SendDTMFTonesAcsTargetAsync(string callConnecti var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"DTMF tones sent successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"DTMF tones sent successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -87,7 +88,7 @@ public async Task SendDTMFTonesAcsTargetAsync(string callConnecti } catch (Exception ex) { - string errorMessage = $"Error sending DTMF Tones to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error sending DTMF Tones to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to send DTMF Tones: {ex.Message}"); @@ -95,17 +96,17 @@ public async Task SendDTMFTonesAcsTargetAsync(string callConnecti } /// - /// Send DTMF Tones to a specific ACS target. + /// Send DTMF Tones to a specific target. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/sendDTMFTones")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public IActionResult SendDTMFTonesAcsTarget(string callConnectionId, string acsTarget) + public IActionResult SendDTMFTonesTarget(string callConnectionId, string targetUser, bool isPstn) { try { @@ -114,15 +115,22 @@ public IActionResult SendDTMFTonesAcsTarget(string callConnectionId, string acsT return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Send DTMF Tones to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); - - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + _logger.LogInformation($"Send DTMF Tones to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } List tones = new List { DtmfTone.Zero, @@ -134,7 +142,7 @@ public IActionResult SendDTMFTonesAcsTarget(string callConnectionId, string acsT var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"DTMF tones sent successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"DTMF tones sent successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -146,7 +154,7 @@ public IActionResult SendDTMFTonesAcsTarget(string callConnectionId, string acsT } catch (Exception ex) { - string errorMessage = $"Error sending DTMF Tones to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error sending DTMF Tones to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to send DTMF Tones: {ex.Message}"); @@ -154,17 +162,17 @@ public IActionResult SendDTMFTonesAcsTarget(string callConnectionId, string acsT } /// - /// Start continuous DTMF recognition to a specific ACS target asynchronously. + /// Start continuous DTMF recognition to a specific target asynchronously. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/startContinuousDTMFTonesAsync")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public async Task StartContinuousDTMFTonesAcsTargetAsync(string callConnectionId, string acsTarget) + public async Task StartContinuousDTMFTonesTargetAsync(string callConnectionId, string targetUser, bool isPstn) { try { @@ -173,21 +181,29 @@ public async Task StartContinuousDTMFTonesAcsTargetAsync(string c return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Start continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); + _logger.LogInformation($"Start continuous DTMF recognition to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } CallMedia callMedia = _service.GetCallMedia(callConnectionId); await callMedia.StartContinuousDtmfRecognitionAsync(target); var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"Continuous DTMF recognition started successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"Continuous DTMF recognition started successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -199,7 +215,7 @@ public async Task StartContinuousDTMFTonesAcsTargetAsync(string c } catch (Exception ex) { - string errorMessage = $"Error starting continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error starting continuous DTMF recognition to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to start continuous DTMF recognition: {ex.Message}"); @@ -207,17 +223,17 @@ public async Task StartContinuousDTMFTonesAcsTargetAsync(string c } /// - /// Start continuous DTMF recognition to a specific ACS target. + /// Start continuous DTMF recognition to a specific target. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/startContinuousDTMFTones")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public IActionResult StartContinuousDTMFTonesAcsTarget(string callConnectionId, string acsTarget) + public IActionResult StartContinuousDTMFTonesTarget(string callConnectionId, string targetUser, bool isPstn) { try { @@ -226,21 +242,29 @@ public IActionResult StartContinuousDTMFTonesAcsTarget(string callConnectionId, return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Start continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); + _logger.LogInformation($"Start continuous DTMF recognition to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } CallMedia callMedia = _service.GetCallMedia(callConnectionId); callMedia.StartContinuousDtmfRecognition(target); var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"Continuous DTMF recognition started successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"Continuous DTMF recognition started successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -252,7 +276,7 @@ public IActionResult StartContinuousDTMFTonesAcsTarget(string callConnectionId, } catch (Exception ex) { - string errorMessage = $"Error starting continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error starting continuous DTMF recognition to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to start continuous DTMF recognition: {ex.Message}"); @@ -260,17 +284,17 @@ public IActionResult StartContinuousDTMFTonesAcsTarget(string callConnectionId, } /// - /// Stop continuous DTMF recognition to a specific ACS target asynchronously. + /// Stop continuous DTMF recognition to a specific target asynchronously. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/stopContinuousDTMFTonesAsync")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public async Task StopContinuousDTMFTonesAcsTargetAsync(string callConnectionId, string acsTarget) + public async Task StopContinuousDTMFTonesTargetAsync(string callConnectionId, string targetUser, bool isPstn) { try { @@ -279,21 +303,29 @@ public async Task StopContinuousDTMFTonesAcsTargetAsync(string ca return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Stop continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); + _logger.LogInformation($"Stop continuous DTMF recognition to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } CallMedia callMedia = _service.GetCallMedia(callConnectionId); await callMedia.StopContinuousDtmfRecognitionAsync(target); var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"Continuous DTMF recognition stopped successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"Continuous DTMF recognition stopped successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -305,7 +337,7 @@ public async Task StopContinuousDTMFTonesAcsTargetAsync(string ca } catch (Exception ex) { - string errorMessage = $"Error stopping continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error stopping continuous DTMF recognition to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to stop continuous DTMF recognition: {ex.Message}"); @@ -313,17 +345,17 @@ public async Task StopContinuousDTMFTonesAcsTargetAsync(string ca } /// - /// Stop continuous DTMF recognition to a specific ACS target. + /// Stop continuous DTMF recognition to a specific target. /// /// The call connection ID - /// The ACS user identifier + /// The user identifier /// status result [HttpPost("/stopContinuousDTMFTones")] [ProducesResponseType(typeof(CallConnectionResponse), 200)] [ProducesResponseType(typeof(ProblemDetails), 400)] [ProducesResponseType(typeof(ProblemDetails), 500)] [Tags("Send or Start DTMF APIs")] - public IActionResult StopContinuousDTMFTonesAcsTarget(string callConnectionId, string acsTarget) + public IActionResult StopContinuousDTMFTonesTarget(string callConnectionId, string targetUser, bool isPstn) { try { @@ -332,21 +364,29 @@ public IActionResult StopContinuousDTMFTonesAcsTarget(string callConnectionId, s return BadRequest("Call Connection ID is required"); } - if (string.IsNullOrEmpty(acsTarget)) + if (string.IsNullOrEmpty(targetUser)) { - return BadRequest("ACS Target ID is required"); + return BadRequest("Target ID is required"); } - _logger.LogInformation($"Stop continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}, Target: {acsTarget}"); + _logger.LogInformation($"Stop continuous DTMF recognition to target. CallConnectionId: {callConnectionId}, Target: {targetUser}"); - CommunicationIdentifier target = new CommunicationUserIdentifier(acsTarget); + CommunicationIdentifier target; + if (isPstn) + { + target = new PhoneNumberIdentifier(targetUser); + } + else + { + target = new CommunicationUserIdentifier(targetUser); + } CallMedia callMedia = _service.GetCallMedia(callConnectionId); callMedia.StopContinuousDtmfRecognition(target); var correlationId = (_service.GetCallConnectionProperties(callConnectionId)).CorrelationId; var callStatus = (_service.GetCallConnectionProperties(callConnectionId)).CallConnectionState.ToString(); - string successMessage = $"Continuous DTMF recognition stopped successfully to ACS target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; + string successMessage = $"Continuous DTMF recognition stopped successfully to target. CallConnectionId: {callConnectionId}, CorrelationId: {correlationId}, CallStatus: {callStatus}"; _logger.LogInformation(successMessage); return Ok(new CallConnectionResponse @@ -358,7 +398,7 @@ public IActionResult StopContinuousDTMFTonesAcsTarget(string callConnectionId, s } catch (Exception ex) { - string errorMessage = $"Error stopping continuous DTMF recognition to ACS target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; + string errorMessage = $"Error stopping continuous DTMF recognition to target. CallConnectionId: {callConnectionId}. Error: {ex.Message}"; _logger.LogError(errorMessage); return Problem($"Failed to stop continuous DTMF recognition: {ex.Message}"); diff --git a/Call_Automation_GCCH/Call_Automation_GCCH/PublishFiles/Publish.zip b/Call_Automation_GCCH/Call_Automation_GCCH/PublishFiles/Publish.zip new file mode 100644 index 00000000..6a86a704 Binary files /dev/null and b/Call_Automation_GCCH/Call_Automation_GCCH/PublishFiles/Publish.zip differ