예제 #1
0
        public async Task <ActionResult> VoiceCall(string userId, int callId)
        {
            var response = new VoiceResponse();
            var call     = await _callsService.GetCallByIdAsync(callId);

            call = await _callsService.PopulateCallData(call, true, true, true, true, true, true, true);

            if (call == null)
            {
                response.Say("This call has been closed. Goodbye.").Hangup();
                //return Request.CreateResponse(HttpStatusCode.OK, response.Element, new XmlMediaTypeFormatter());
                return(Ok(new StringContent(response.ToString(), Encoding.UTF8, "application/xml")));
            }

            if (call.State == (int)CallStates.Cancelled || call.State == (int)CallStates.Closed || call.IsDeleted)
            {
                response.Say(string.Format("This call, Id {0} has been closed. Goodbye.", call.Number)).Hangup();
                //return Request.CreateResponse(HttpStatusCode.OK, response.Element, new XmlMediaTypeFormatter());
                return(Ok(new StringContent(response.ToString(), Encoding.UTF8, "application/xml")));
            }

            var stations = await _departmentGroupsService.GetAllStationGroupsForDepartmentAsync(call.DepartmentId);

            if (call.Attachments != null &&
                call.Attachments.Count(x => x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio) > 0)
            {
                var audio = call.Attachments.FirstOrDefault(x =>
                                                            x.CallAttachmentType == (int)CallAttachmentTypes.DispatchAudio);

                if (audio != null)
                {
                    var url = await _callsService.GetShortenedAudioUrlAsync(call.CallId, audio.CallAttachmentId);

                    Play playResponse = new Play();
                    playResponse.Url = new Uri(url);

                    Gather gatherResponse1 = new Gather();
                    gatherResponse1.NumDigits = 1;
                    gatherResponse1.Timeout   = 10;
                    gatherResponse1.Method    = "GET";
                    gatherResponse1.Action    = new Uri(string.Format("{0}/Twilio/VoiceCallAction/{1}/{2}", Config.SystemBehaviorConfig.ResgridApiBaseUrl, userId, callId));

                    StringBuilder sb1 = new StringBuilder();
                    sb1.Append("Press 0 to repeat, Press 1 to respond to the scene");

                    for (int i = 0; i < stations.Count; i++)
                    {
                        if (i >= 8)
                        {
                            break;
                        }

                        sb1.Append(string.Format(", press {0} to respond to {1}", i + 2, stations[i].Name));
                    }

                    response.Play(playResponse).Say(sb1.ToString()).Gather(gatherResponse1).Pause(10).Hangup();

                    return(new ContentResult
                    {
                        Content = response.ToString(),
                        ContentType = "application/xml",
                        StatusCode = 200
                    });
                }
            }

            string address = call.Address;

            if (String.IsNullOrWhiteSpace(address) && !string.IsNullOrWhiteSpace(call.GeoLocationData))
            {
                try
                {
                    string[] points = call.GeoLocationData.Split(char.Parse(","));

                    if (points != null && points.Length == 2)
                    {
                        address = await _geoLocationProvider.GetAproxAddressFromLatLong(double.Parse(points[0]), double.Parse(points[1]));
                    }
                }
                catch { }
            }

            if (String.IsNullOrWhiteSpace(address) && !String.IsNullOrWhiteSpace(call.Address))
            {
                address = call.Address;
            }

            StringBuilder sb = new StringBuilder();

            if (!String.IsNullOrWhiteSpace(address))
            {
                sb.Append(string.Format("{0}, Priority {1} Address {2} Nature {3}", call.Name, call.GetPriorityText(), call.Address, call.NatureOfCall));
            }
            else
            {
                sb.Append(string.Format("{0}, Priority {1} Nature {2}", call.Name, call.GetPriorityText(), call.NatureOfCall));
            }


            sb.Append(", Press 0 to repeat, Press 1 to respond to the scene");

            for (int i = 0; i < stations.Count; i++)
            {
                if (i >= 8)
                {
                    break;
                }

                sb.Append(string.Format(", press {0} to respond to {1}", i + 2, stations[i].Name));
            }

            Gather gatherResponse = new Gather();

            gatherResponse.NumDigits = 1;
            gatherResponse.Timeout   = 10;
            gatherResponse.Method    = "GET";
            gatherResponse.Action    = new Uri(string.Format("{0}/Twilio/VoiceCallAction/{1}/{2}", Config.SystemBehaviorConfig.ResgridApiBaseUrl, userId, callId));

            response.Gather(gatherResponse).Say(sb.ToString()).Pause(10).Hangup();

            return(new ContentResult
            {
                Content = response.ToString(),
                ContentType = "application/xml",
                StatusCode = 200
            });
        }