//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); }
//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); }