Example #1
0
        protected string SendCallEndStatus(CallInstance ci, NameValueCollection nvc, string Reason)
        {
            ci.CallStatus = CallStatus.CallbackSent;
            var a = "";

            var v = new LogObj()
            {
                LogSymbol    = LogSymbol.TwilioToWeb,
                CallInstance = ci,
                Caption      = "Call End Status to " + ci.CallOptions.StatusCallback + " " + Reason
            };


            try
            {
                nvc.Add("CallDuration", (DateTime.Now.ToUniversalTime() - ci.CallForGet.StartTime.Value).TotalSeconds.ToString());
                v.AddNode("Request", nvc);
                a = ci.BrowserClient.DoRequest(ci.CallOptions.StatusCallback, nvc);
                v.AddNode("Response", a);
            }
            catch (Exception ex)
            {
                v.Caption = "<- Exception on Call Start Call Back to " + ci.CallOptions.StatusCallback + ex.Message;
                v.AddException(ex);
            }
            SystemController.Instance.Logger.LogObj(v);
            ci.CallStatus = CallStatus.Ended;
            return(a);
        }
Example #2
0
        private CallInstance CreateACall(CallOptions co, bool IsInbound)
        {
            // preassign some info to the call if it has not already been specified
            if (co.StatusCallback == null)
            {
                co.StatusCallback = Settings.Default.StatusCallBackUrl;
            }

            CallInstance c = new CallInstance()
            {
                CallForCreate = new Call()
                {
                    Sid         = CreateSid(),
                    Status      = TwilioCallStatuses.QUEUED,
                    Direction   = IsInbound?"inbound":"outbound-api",
                    DateCreated = DateTime.Now.ToUniversalTime(),
                    DateUpdated = DateTime.Now.ToUniversalTime(),

                    To   = co.To,
                    From = co.From,
                },
                CallDirection = IsInbound?CallDirection.In: CallDirection.Out,
                CallOptions   = co,
            };

            CallList.Add(c);
            return(c);
        }
Example #3
0
        private TreeNode CreateNewCallListEntry(CallInstance cInst)
        {
            var      cll = cInst.CallForGet;
            TreeNode tn  = new TreeNode(cInst.CallDirection + " " + cll.From + " -> " + cll.To);

            tn.BackColor = cInst.CallColor;
            tn.Name      = cll.Sid;
            trvCallView.Nodes.Add(tn);
            return(tn);
        }
Example #4
0
    /// <summary>
    ///     Here you get the value in cache, you get the connection, then StringGetAsync is in charge of getting the value
    /// </summary>
    /// <param name="name"></param>
    /// <param name="template"></param>
    public async Task <CallInstance> GetById(int id, bool isForCallback)
    {
        var cache        = cacheConnection.GetDatabase();
        var callInstance = new CallInstance
        {
            Id           = id,
            InstanceData = await cache.StringGetAsync(isForCallback?$"Call_{id}" : id.ToString())
        };

        return(callInstance);
    }
Example #5
0
        private void HangUpThePhoneConnectionFromTheserver(CallInstance ci, string Reason)
        {
            var v = new LogObj()
            {
                Caption      = "X Server hung up call " + Reason,
                LogSymbol    = Code.LogSymbol.TwilioToPhone,
                CallInstance = ci
            }.LogIt();


            SystemController.Instance.PhoneManager.CallHungUp(ci.CallOptions.To, Reason);
        }
Example #6
0
        public void ApplyImageToNode(CallInstance cInst, TreeNode tn)
        {
            var multip = 0;

            switch (cInst.CallForGet.Status)
            {
            case "queued":
            {
                multip = 0;
                break;
            }

            case "ringing":
            {
                multip = 1;
                break;
            }

            case "in-progress":
            {
                multip = 2;
                break;
            }

            case "completed":
            {
                multip = 3;
                break;
            }

            default:
            {
                multip = 4;
                break;
            }
            }
            ;



            multip                = multip + (cInst.CallDirection == CallDirection.Out ? 0 : 5);
            tn.ImageIndex         = multip;
            tn.SelectedImageIndex = multip;
            tn.StateImageIndex    = multip;
        }
Example #7
0
        void ProcessCallInstance(CallInstance ci)
        {
            if (ci.CallStatus == CallStatus.Queued && ci.CallDirection == CallDirection.Out)
            {
                // start the phone call
                ProcessCallPhone(ci);
            }

            if (ci.CallStatus == CallStatus.ReadyForProcessing ||
                (ci.CallStatus == CallStatus.Queued && ci.CallDirection == CallDirection.In))
            {
                // we are processing twiml
                ci.CallForSet.StartTime = DateTime.Now.ToUniversalTime();
                ci.CallStatus           = CallStatus.ReadyForProcessing;
                ci.CallForSet.Status    = TwilioCallStatuses.INPROGRESS;
                ci.FlowEngine.StartCallFlow();
            }
        }
Example #8
0
        /// <summary>
        /// Click to call
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        public static async Task <LG.Data.Models.Doctors.ConsultWizard.CallInstance> StartClickToCall(LG.Data.Models.Doctors.ConsultWizard.StartClickToCall entity)
        {
            var client = ClientConnection.GetOMS_Connection();
            var result = new CallInstance()
            {
                ConsultationID = entity.ConsultationID
            };

            try
            {
                client.Open();
                var response = await client.StartClickToCallPhoneConsultationAsync(new StartClickToCallPhoneConsultationRequest()
                {
                    PropBag                        = PropBag,
                    MessageGuid                    = Guid.NewGuid(),
                    ConsultationID                 = entity.ConsultationID,
                    MedicalPractitionerRID         = entity.MedicalPractionerRID,
                    MedicalPractitionerPhoneNumber = entity.MedicalPractionerPhoneNumber,
                });

                result.PinCode = response.PinCode;
                result.CallSid = response.CallSid;
                entity.IsError = response.ReturnStatus.IsError;
                entity.Message = response.ReturnStatus.ErrorMessage;
            }
            catch (Exception ex)
            {
                client.Abort();
                entity.IsError = true;
                entity.Message = ex.ToString();
            }
            finally
            {
                if (client.State != CommunicationState.Closed)
                {
                    client.Close();
                }
            }
            return(result);
        }
Example #9
0
        public static NameValueCollection GenerateCallBackValue(this CallInstance c)
        {
            var call = c.CallForGet;
            var v    = new NameValueCollection()
            {
                { "AccountSid", call.AccountSid },
                { "CallSid", call.Sid },
                { "CallStatus", call.Status },
                { "From", call.From },
                { "To", call.To },
                { "Direction", call.Direction }
            };

            if (c.Digits != "")
            {
                v.Add("Digits", c.Digits);
            }
            if (call.AnsweredBy != "")
            {
                v.Add("AnsweredBy", call.AnsweredBy);
            }
            return(v);
        }
Example #10
0
        public void MarkCallEnded(CallInstance ci, string reason, bool FromTheServer)
        {
            // run this in its own thread to ensure it runs

            Task.Factory.StartNew(() =>
            {
                var a = ci.CallForSet;
                if (a.Status == TwilioCallStatuses.INPROGRESS || a.Status == TwilioCallStatuses.QUEUED)
                {
                    a.EndTime  = DateTime.Now.ToUniversalTime();
                    a.Duration = Convert.ToInt32((a.EndTime.Value - a.DateCreated).TotalSeconds);
                    a.Status   = TwilioCallStatuses.COMPLETED;
                    // set the price on the call
                    var nummins = Convert.ToInt32(Math.Floor((a.EndTime.Value - ci.CallForGet.StartTime).Value.TotalMinutes)) + 1;
                    var price   = 2.0;   //default to outbound
                    if (a.Direction == "inbound")
                    {
                        price = Regex.IsMatch(a.To, @"1(\s?|-?)800(\s?|-?)\d{3}(\s?|-?)\d{4}")?4:1;
                    }
                    a.Price = (decimal)price * (decimal)nummins;
                }

                ci.AbortCallFlow();


                ci.CallStatus = CallStatus.Ended;



                if (FromTheServer)
                {
                    HangUpThePhoneConnectionFromTheserver(ci, reason);
                }
                SendCallEndStatus(ci, ci.GenerateCallBackValue(), reason);
            });
        }
Example #11
0
 get => this.GetOptional(CallInstance, Expression.Parse);
Example #12
0
 private void HangupCallRequest(CallInstance d, string stat)
 {
     HangUpThePhoneConnectionFromTheserver(d, stat);
 }
Example #13
0
 public void SayToPhone(CallInstance ci, string Word)
 {
     SystemController.Instance.PhoneManager.SayReceived(ci.CallOptions.To, Word);
 }
Example #14
0
        private void ProcessCallPhone(CallInstance ci)
        {
            // when we go to multi phones we will look up by phone number etc... - but for now
            // we will look at the first phone
            // if there is no first phone then fire the need phone eventhandler

            Boolean Callok = false;


            var c = ci.CallForGet;

            c.StartTime = DateTime.Now.ToUniversalTime();
            var v = SystemController.Instance.PhoneManager.AttemptDial(ci.CallForGet.To);

            switch (v)
            {
            case PhoneStatus.Busy:
            {
                ci.CallForSet.Status = TwilioCallStatuses.BUSY;

                break;
            }

            case PhoneStatus.Ringing:
            {
                Callok = true;
                ci.CallForSet.Status = TwilioCallStatuses.RINGING;
                break;
            }

            case PhoneStatus.NotInService:
            {
                ci.CallForSet.Status = TwilioCallStatuses.FAILED;
                break;
            }

            case PhoneStatus.NoAnswer:
            {
                ci.CallForSet.Status = TwilioCallStatuses.NOANSWER;
                break;
            }

            default:
                break;
            }



            // if it is not a good call send back a error call status and mark the call done
            // else mark it as waiting for the phone
            if (!Callok)
            {
                MarkCallEnded(ci, "Phone in status " + c.Status.ToString(), false);
            }
            else
            {
                ci.CallStatus        = CallStatus.WaitingRinging;
                ci.CallForGet.Status = TwilioCallStatuses.RINGING;
            }


            SystemController.Instance.Logger.LogObj(new LogObj()
            {
                Caption      = "Dial to Phone",
                LogSymbol    = LogSymbol.TwilioToPhone,
                CallInstance = ci
            }.AddNode("Incoming Number", ci.CallOptions.To).AddNode("Phone Status", v.ToString()));
        }