Exemplo n.º 1
0
        //por lo que pude relevar el evento channelHangup solo llega si el canal no atendido
        //hay que ver bien cause que valores toma en los casos de una llamada terminada por falla
        //basado en lo que dije en las lineas anteriores, aca debería llegar por un canal de caller que corta, ya que al entrar en stasis
        //debería haber sido atendido. o bien por un agente que corta
        public ProtocolMessages.Message ChannelHangupEvent(string channelId, int cause, string causeText)
        {
            ProtocolMessages.Message msg = null;
            //Hay que pulir la lógica del hangup, también hay que tener en cuenta los transfer
            if (channelId == caller.Id && callState != CallState.TERMINATED && callState != CallState.TRANSFERRED)
            {
                int x = chronometer.CallEnd();
                msg = new MessageCallerHangup()
                {
                    From          = source,
                    CallHandlerId = this.id,
                    QueueId       = currentQueue,
                    HangUpCode    = cause.ToString(),
                    HangUpReason  = causeText,
                    WatingTime    = chronometer.WaitingTime,
                    HoldingTime   = chronometer.HoldingTime,
                    //ConnectedTime = chronometer.ConnectedTime,
                    TalkingTime = chronometer.TalkingTime
                };
                TerminateAgent();
                callState = CallState.TERMINATED;
            }
            else if (channelId == agent.Id)
            {
                //prevengo que si la llamada fue transferida le corte al que llamó
                if (callState != CallState.TRANSFERRED && callState != CallState.TERMINATED)
                {
                    int x = chronometer.CallEnd();
                    msg = new MessageAgentHangup()
                    {
                        From          = source,
                        CallHandlerId = this.id,
                        QueueId       = currentQueue,
                        HangUpCode    = cause.ToString(),
                        HangUpReason  = causeText,
                        WatingTime    = chronometer.WaitingTime,
                        HoldingTime   = chronometer.HoldingTime,
                        //ConnectedTime = chronometer.ConnectedTime,
                        TalkingTime = chronometer.TalkingTime
                    };
                    TerminateCaller();
                    callState = CallState.TERMINATED;
                }
                //else
                //{
                //    msg = new MessageCallTransfer() { CallHandlerId = this.id, TargetId = transferTarget.Id, TargetName = transferTarget.Name };
                //}
            }
            else
            {
                Log.Logger.Debug("Callhandler: El canal " + caller.Id + " no está en la llamada: " + this.id);
            }

            return(msg);
        }
Exemplo n.º 2
0
        //por lo que pude relevar el evento channelDestry solo llega si el canal no fué atendido
        //hay que ver bien cause que valores toma en los casos de una llamada terminada por timeout, o por falla
        //basado en lo que dije en las lineas anteriores, no debería llegar aca por un canal de caller, ya que al entrar en stasis
        //debería haber sido atendido. Si pasa con las llamadas que inicio hacia los agentes
        public ProtocolMessages.Message ChannelDestroyEvent(string channelId, int cause, string causeText)
        {
            ProtocolMessages.Message msg = null;
            //Hay que pulir la lógica del hangup, también hay que tener en cuenta los transfer
            if (channelId == caller.Id && callState != CallState.TERMINATED)
            {
                int x = chronometer.CallEnd();
                msg = new MessageCallerHangup()
                {
                    From          = source,
                    CallHandlerId = this.id,
                    QueueId       = currentQueue,
                    HangUpCode    = cause.ToString(),
                    HangUpReason  = causeText,
                    WatingTime    = chronometer.WaitingTime,
                    HoldingTime   = chronometer.HoldingTime,
                    //ConnectedTime = chronometer.ConnectedTime,
                    TalkingTime = chronometer.TalkingTime
                };
                callState = CallState.TERMINATED;
            }
            else if (channelId == agent.Id)
            {
                int ringingTime = chronometer.CallToEndFailed();
                msg = new MessageCallToFailed()
                {
                    From = source, CallHandlerId = this.id, QueueId = currentQueue, Code = cause, Reason = causeText, RingingTime = ringingTime
                };
                callState = CallState.CONNECT_FAILDED;
            }
            else
            {
                Log.Logger.Debug("Callhandler: El canal " + caller.Id + " no está en la llamada: " + this.id);
            }

            return(msg);
        }