Пример #1
0
        internal VoiceResponse Inbound(VoipCall call, DaoFactory daoFactory)
        {
            var contactPhone = call.Status == VoipCallStatus.Incoming || call.Status == VoipCallStatus.Answered
                ? call.From
                : call.To;

            Contact contact;
            var     contacts = new VoipEngine(daoFactory).GetContacts(contactPhone, daoFactory);
            var     managers = contacts.SelectMany(CRMSecurity.GetAccessSubjectGuidsTo).ToList();
            var     agent    = GetSignalRHelper().GetAgent(managers);

            if (agent != null && agent.Item1 != null)
            {
                var agentId = agent.Item1.Id;
                SecurityContext.AuthenticateMe(agentId);
                call.AnsweredBy = agentId;

                contact = contacts.FirstOrDefault(CRMSecurity.CanAccessTo);

                daoFactory.VoipDao.SaveOrUpdateCall(call);
            }
            else
            {
                contact = contacts.FirstOrDefault();
            }

            if (contact == null)
            {
                contact        = new VoipEngine(daoFactory).CreateContact(call.From.TrimStart('+'));
                call.ContactId = contact.ID;
                daoFactory.VoipDao.SaveOrUpdateCall(call);
            }

            return(GetTwilioResponseHelper().Inbound(agent));
        }
Пример #2
0
        public HttpResponseMessage Dequeue(TwilioVoiceRequest request, [FromUri] Guid?callerId = null, [FromUri] int contactId = 0, [FromUri] string reject = "")
        {
            try
            {
                using (var scope = DIHelper.Resolve())
                {
                    var voipEngine = new VoipEngine(scope.Resolve <DaoFactory>());
                    request.AddAdditionalFields(callerId, contactId, reject);

                    if (Convert.ToBoolean(request.Reject))
                    {
                        MissCall(request, voipEngine);
                        return(GetHttpResponse(request.Leave()));
                    }


                    voipEngine.AnswerCall(CallFromTwilioRequest(request));

                    return(GetHttpResponse(request.Dequeue()));
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }
Пример #3
0
        private void SaveAdditionalInfoAction(QueueItem queueItem)
        {
            try
            {
                _tenantManager.SetCurrentTenant(queueItem.TenantID);

                var voipEngine = new VoipEngine(_daoFactory,
                                                _crmSecurity,
                                                _tenantUtil,
                                                null,
                                                _securityContext,
                                                null,
                                                _tenantManager,
                                                _voipDao);

                var dao = _daoFactory.GetVoipDao();

                var call = dao.GetCall(queueItem.CallID);

                GetPriceAndDuration(call);

                if (call.ChildCalls.Any())
                {
                    call.ChildCalls.ForEach(r =>
                    {
                        GetPriceAndDuration(r);
                        voipEngine.SaveOrUpdateCall(r);
                    });
                }

                call = voipEngine.SaveOrUpdateCall(call);

                if (!string.IsNullOrEmpty(call.VoipRecord.Id))
                {
                    call.VoipRecord = _voipDao.GetProvider().GetRecord((string)call.Id, (string)call.VoipRecord.Id);
                    voipEngine.SaveOrUpdateCall(call);
                }

                _securityContext.AuthenticateMeWithoutCookie(call.AnsweredBy);
                AddHistoryToCallContact(call, _daoFactory);
            }
            catch (Exception ex)
            {
                _logger.ErrorFormat("SaveAdditionalInfo {0}, {1}", ex, ex.StackTrace);
            }
        }
Пример #4
0
        private void MissCall(TwilioVoiceRequest request, VoipEngine voipEngine)
        {
            var voipCall = CallFromTwilioRequest(request);

            voipCall.Status = VoipCallStatus.Missed;

            if (!string.IsNullOrEmpty(request.RecordingSid))
            {
                if (voipCall.VoipRecord == null || string.IsNullOrEmpty(voipCall.VoipRecord.Id))
                {
                    voipCall.VoipRecord = new VoipRecord {
                        Id = request.RecordingSid
                    };
                }
            }

            voipCall = voipEngine.SaveOrUpdateCall(voipCall);
            request.GetSignalRHelper().MissCall(request.CallSid, voipCall.AnsweredBy.ToString());
            voipEngine.SaveAdditionalInfo(voipCall.Id);
        }
Пример #5
0
        private static void SaveAdditionalInfoAction(QueueItem queueItem)
        {
            try
            {
                CoreContext.TenantManager.SetCurrentTenant(queueItem.TenantID);
                using (var scope = DIHelper.Resolve())
                {
                    var daoFactory = scope.Resolve <DaoFactory>();
                    var voipEngine = new VoipEngine(daoFactory);
                    var dao        = daoFactory.VoipDao;

                    var call = dao.GetCall(queueItem.CallID);

                    GetPriceAndDuration(call);

                    if (call.ChildCalls.Any())
                    {
                        call.ChildCalls.ForEach(r =>
                        {
                            GetPriceAndDuration(r);
                            voipEngine.SaveOrUpdateCall(r);
                        });
                    }

                    call = voipEngine.SaveOrUpdateCall(call);

                    if (!string.IsNullOrEmpty(call.VoipRecord.Id))
                    {
                        call.VoipRecord = VoipDao.GetProvider().GetRecord(call.Id, call.VoipRecord.Id);
                        voipEngine.SaveOrUpdateCall(call);
                    }

                    SecurityContext.AuthenticateMe(call.AnsweredBy);
                    AddHistoryToCallContact(call, daoFactory);
                }
            }
            catch (Exception ex)
            {
                LogManager.GetLogger("ASC").ErrorFormat("SaveAdditionalInfo {0}, {1}", ex, ex.StackTrace);
            }
        }
Пример #6
0
        public HttpResponseMessage VoiceMail(TwilioVoiceRequest request, [FromUri] Guid?callerId = null, [FromUri] int contactId = 0)
        {
            try
            {
                using (var scope = DIHelper.Resolve())
                {
                    var daoFactory = scope.Resolve <DaoFactory>();
                    var voipEngine = new VoipEngine(daoFactory);
                    request.AddAdditionalFields(callerId, contactId);

                    MissCall(request, voipEngine);

                    return(GetHttpResponse(request.VoiceMail()));
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }
Пример #7
0
        public HttpResponseMessage Dial(TwilioVoiceRequest request, [FromUri] Guid callerId, [FromUri] int contactId = 0, [FromUri] string reject = null)
        {
            try
            {
                using (var scope = DIHelper.Resolve())
                {
                    var daoFactory = scope.Resolve <DaoFactory>();
                    var voipEngine = new VoipEngine(daoFactory);

                    request.AddAdditionalFields(callerId, contactId, reject);

                    var call = CallFromTwilioRequest(request);
                    call = voipEngine.SaveOrUpdateCall(call);

                    var parentCall = daoFactory.VoipDao.GetCall(call.ParentID);

                    if (!string.IsNullOrEmpty(request.RecordingSid))
                    {
                        if (parentCall.VoipRecord == null || string.IsNullOrEmpty(parentCall.VoipRecord.Id))
                        {
                            parentCall.VoipRecord = new VoipRecord {
                                Id = request.RecordingSid
                            };
                        }

                        daoFactory.VoipDao.SaveOrUpdateCall(parentCall);
                    }

                    voipEngine.SaveAdditionalInfo(parentCall.Id);

                    return(GetHttpResponse(request.Dial()));
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }
Пример #8
0
        public HttpResponseMessage Wait(TwilioVoiceRequest request, [FromUri] Guid?callerId = null, [FromUri] int contactId = 0, [FromUri] string redirectTo = null)
        {
            try
            {
                using (var scope = DIHelper.Resolve())
                {
                    var daoFactory = scope.Resolve <DaoFactory>();
                    var voipEngine = new VoipEngine(daoFactory);

                    request.AddAdditionalFields(callerId, contactId, redirectTo: redirectTo);
                    if (Convert.ToInt32(request.QueueTime) == 0)
                    {
                        var history = CallFromTwilioRequest(request);
                        history.ParentID = history.Id;
                        voipEngine.SaveOrUpdateCall(history);

                        var to = request.RedirectTo;
                        if (string.IsNullOrEmpty(to))
                        {
                            request.GetSignalRHelper()
                            .Enqueue(request.CallSid, callerId.HasValue ? callerId.Value.ToString() : "");
                        }
                        else
                        {
                            request.GetSignalRHelper().Incoming(request.CallSid, to);
                        }
                    }

                    return(GetHttpResponse(request.Wait()));
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }
Пример #9
0
        public HttpResponseMessage Enqueue(TwilioVoiceRequest request, [FromUri] Guid?callerId = null, [FromUri] int contactId = 0)
        {
            try
            {
                using (var scope = DIHelper.Resolve())
                {
                    var daoFactory = scope.Resolve <DaoFactory>();
                    var voipEngine = new VoipEngine(daoFactory);

                    request.AddAdditionalFields(callerId, contactId);
                    if (request.QueueResult != "bridged" && request.QueueResult != "redirected")
                    {
                        MissCall(request, voipEngine);
                    }

                    return(GetHttpResponse(request.Enqueue(request.QueueResult)));
                }
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }