static void Main(string[] args) { string queueId = ""; // Create FreeClimbClient object FreeClimbClient client = new FreeClimbClient(getFreeClimbAccountId(), getFreeClimbAccountToken()); // Invoke getMembers method to retrieve initial list of queue member information QueueMemberList queueMemberList = client.getQueuesRequester.getMembers(queueId); // Check if list is empty by checking total size of the list if (queueMemberList.getTotalSize > 0) { // retrieve all queue member information from server while (queueMemberList.getLocalSize < queueMemberList.getTotalSize) { queueMemberList.loadNextPage(); } // Convert current pages queue information to a linked list LinkedList <IFreeClimbCommon> commonList = queueMemberList.export(); // Loop through linked list to process queue member information foreach (IFreeClimbCommon element in commonList) { // Cast each element to the QueueMember element for processing QueueMember queueMember = element as QueueMember; Console.WriteLine(queueMember.getCallId); } } else { Console.WriteLine("No Members in queue"); } }
public void QueueMemberListTest() { try { QueuesRequester queuesRequester = new QueuesRequester("AC736ca2078721a9a41fb47f07bf40d9e21cb304da", "8e3d1c1c519fc761856f8cc825bcfea94d8c58b5", "AC736ca2078721a9a41fb47f07bf40d9e21cb304da"); Type callsRequesterType = typeof(QueuesRequester); MethodInfo freeClimbUrlMethodInfo = callsRequesterType.GetMethod("SetFreeClimbUrl", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(System.String) }, null); freeClimbUrlMethodInfo.Invoke(queuesRequester, new Object[] { "http://QueueMemberList:3000" }); WebRequest.RegisterPrefix("http://QueueMemberList:3000", new TestWebRequestCreate()); TestWebRequestCreate.MockHttpWebRequestWithGivenResponseCode(HttpStatusCode.OK, "{\"page\": 0, \"numPages\": 2, \"pageSize\": 2, \"total\": 3, \"start\": 0, \"end\": 1, \"nextPageUri\": \"/Accounts/ACabe7063197551fe51671f9ac3a9708e9dad51c4d/Queues&cursor=492dc883a811bd0204204ea9047122f93a2788a2\", \"queueMembers\": [{\"callId\": \"CA386025c9bf5d6052a1d1ea42b4d16662\", \"dateEnqueued\": \"Mon, 11 Aug 2014 22:00:14 GMT\",\"waitTime\": 30,\"position\": 1, \"uri\": \"/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662\"},{\"callId\": \"CA386025c9bf5d6052a1d1ea42b4d16662\", \"dateEnqueued\": \"Mon, 11 Aug 2014 22:00:14 GMT\",\"waitTime\": 30,\"position\": 1, \"uri\": \"/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662\"}]}"); QueueMemberList queueMemberList = queuesRequester.getMembers("QU5ef8732a3c49700934481addd5ce1659"); Assert.IsNotNull(queueMemberList); Assert.AreEqual(queueMemberList.getLocalSize, 2); Assert.AreEqual((queueMemberList.export()).Count, 2); QueueMember queueMember = queueMemberList.get(0) as QueueMember; Assert.IsNotNull(queueMember); Assert.AreEqual(queueMember.getCallId, "CA386025c9bf5d6052a1d1ea42b4d16662"); Type type = typeof(APIRequester); FieldInfo fieldInfo = type.GetField("freeClimbUrl", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldInfo != null) { fieldInfo.SetValue(queueMemberList, "http://QueueMemberList:3000"); } TestWebRequestCreate.MockHttpWebRequestWithGivenResponseCode(HttpStatusCode.OK, "{\"page\": 1, \"numPages\": 2, \"pageSize\": 2, \"total\": 3, \"start\": 2, \"end\": 2, \"nextPageUri\": null, \"queueMembers\": [{\"callId\": \"CA386025c9bf5d6052a1d1ea42b4d16663\", \"dateEnqueued\": \"Mon, 11 Aug 2014 22:00:14 GMT\",\"waitTime\": 30,\"position\": 1, \"uri\": \"/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/ QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662\"}]}"); queueMemberList.loadNextPage(); Assert.IsNotNull(queueMemberList); Assert.AreEqual(queueMemberList.getLocalSize, 3); Assert.AreEqual((queueMemberList.export()).Count, 3); queueMember = queueMemberList.get(2) as QueueMember; Assert.IsNotNull(queueMember); Assert.AreEqual(queueMember.getCallId, "CA386025c9bf5d6052a1d1ea42b4d16663"); } catch (FreeClimbException pe) { Assert.Fail(pe.Message); } }
static void Dequeue(string queueId, string callId = "") { // Create FreeClimbClient object FreeClimbClient client = new FreeClimbClient(getFreeClimbAccountId(), getFreeClimbApiKeys()); // Invoke method to update the QueueMeber to dequeue it from the queue QueueMember queueMember = client.getQueuesRequester.updateQueueMember(queueId, callId); }
public void PatchQueuesQueueIdUsersMemberIdTest() { // TODO: add unit test for the method 'PatchQueuesQueueIdUsersMemberId' string queueId = null; // TODO: replace null with proper value string memberId = null; // TODO: replace null with proper value QueueMember body = null; // TODO: replace null with proper value var response = instance.PatchQueuesQueueIdUsersMemberId(queueId, memberId, body); Assert.IsInstanceOf <QueueMember> (response, "response is QueueMember"); }
public void MakeQueueMemberFromJsonTest() { string json = "{\"callId\": \"CA386025c9bf5d6052a1d1ea42b4d16662\", \"dateEnqueued\": \"Thu, 23 Jun 2016 17:30:06 GMT\",\"waitTime\": 30,\"position\": 1, \"uri\": \"/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662\"}"; QueueMember queueMember = QueueMember.fromJson(json); Assert.IsNotNull(queueMember); Assert.IsNotNull(queueMember.getUri); Assert.AreEqual(queueMember.getUri, "/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662"); Assert.IsNotNull(queueMember.getCallId); Assert.AreEqual(queueMember.getCallId, "CA386025c9bf5d6052a1d1ea42b4d16662"); }
static void Main(string[] args) { string queueId = ""; string callId = ""; // Create FreeClimbClient object FreeClimbClient client = new FreeClimbClient(getFreeClimbAccountId(), getFreeClimbApiKeys()); // Invoke get method to retrieve queued call metadata QueueMember queueMember = client.getQueuesRequester.getQueueMember(queueId, callId); }
public static List<QueueMember> SelectQueueMembers(int departmentId, int queueId) { DataTable dtQueueMembers = SelectQueueMembersTable(departmentId, queueId); List<QueueMember> queueMembers = new List<QueueMember>(); if (dtQueueMembers != null) foreach (DataRow drQueueMember in dtQueueMembers.Rows) { QueueMember queueMember = new QueueMember(drQueueMember.IsNull("Id") ? 0 : (int)drQueueMember["Id"], drQueueMember.IsNull("UserId") ? 0 : (int)drQueueMember["UserId"], drQueueMember.IsNull("UserName") ? string.Empty : (string)drQueueMember["UserName"], drQueueMember.IsNull("UserEmail") ? string.Empty : (string)drQueueMember["UserEmail"]); queueMembers.Add(queueMember); } return queueMembers; }
public static QueueMemberDTO AdaptToDTO(this QueueMember p5) { return(p5 == null ? null : new QueueMemberDTO() { Priority = p5.Priority, TimeInterval = p5.TimeInterval, IsAbsent = p5.IsAbsent, QueueId = p5.QueueId, Queue = p5.Queue.AdaptToDTO(), StudentId = p5.StudentId, Student = p5.Student.AdaptToDTO(), Id = p5.Id }); }
public static List <QueueMember> SelectQueueMembers(int departmentId, int queueId) { DataTable dtQueueMembers = SelectQueueMembersTable(departmentId, queueId); List <QueueMember> queueMembers = new List <QueueMember>(); if (dtQueueMembers != null) { foreach (DataRow drQueueMember in dtQueueMembers.Rows) { QueueMember queueMember = new QueueMember(drQueueMember.IsNull("Id") ? 0 : (int)drQueueMember["Id"], drQueueMember.IsNull("UserId") ? 0 : (int)drQueueMember["UserId"], drQueueMember.IsNull("UserName") ? string.Empty : (string)drQueueMember["UserName"], drQueueMember.IsNull("UserEmail") ? string.Empty : (string)drQueueMember["UserEmail"]); queueMembers.Add(queueMember); } } return(queueMembers); }
public static QueueMemberDTO AdaptTo(this QueueMember p6, QueueMemberDTO p7) { if (p6 == null) { return(null); } QueueMemberDTO result = p7 ?? new QueueMemberDTO(); result.Priority = p6.Priority; result.TimeInterval = p6.TimeInterval; result.IsAbsent = p6.IsAbsent; result.QueueId = p6.QueueId; result.Queue = p6.Queue.AdaptToDTO(); result.StudentId = p6.StudentId; result.Student = p6.Student.AdaptToDTO(); result.Id = p6.Id; return(result); }
public static QueueMember AdaptTo(this QueueMemberDTO p2, QueueMember p3) { if (p2 == null) { return(null); } QueueMember result = p3 ?? new QueueMember(); result.Priority = p2.Priority; result.TimeInterval = p2.TimeInterval; result.IsAbsent = p2.IsAbsent; result.QueueId = p2.QueueId; result.Queue = p2.Queue.AdaptToQueue(); result.StudentId = p2.StudentId; result.Student = p2.Student.AdaptToUser(); result.Id = p2.Id; return(result); }
public void QueueMemberTest() { QueuesRequester queuesRequester = new QueuesRequester("AC736ca2078721a9a41fb47f07bf40d9e21cb304da", "8e3d1c1c519fc761856f8cc825bcfea94d8c58b5", "AC736ca2078721a9a41fb47f07bf40d9e21cb304da"); Type type = typeof(APIRequester); FieldInfo fieldInfo = type.GetField("freeClimbUrl", BindingFlags.NonPublic | BindingFlags.Instance); if (fieldInfo != null) { fieldInfo.SetValue(queuesRequester, "http://QueueMember:3000"); } WebRequest.RegisterPrefix("http://QueueMember:3000", new TestWebRequestCreate()); TestWebRequestCreate.MockHttpWebRequestWithGivenResponseCode(HttpStatusCode.OK, "{\"callId\": \"CA386025c9bf5d6052a1d1ea42b4d16662\", \"dateEnqueued\": \"Thu, 23 Jun 2016 17:30:06 GMT\",\"waitTime\": 30,\"position\": 1, \"uri\": \"/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662\"}"); QueueMember queueMember = queuesRequester.getQueueMember("QU5ef8732a3c49700934481addd5ce1659", "CA386025c9bf5d6052a1d1ea42b4d16662"); Assert.IsNotNull(queueMember); Assert.IsNotNull(queueMember.getUri); Assert.AreEqual(queueMember.getUri, "/Accounts/AC142c48f2ee663e214c19ea459516068c/Queues/QU5ef8732a3c49700934481addd5ce1659/Members/CA386025c9bf5d6052a1d1ea42b4d16662"); Assert.IsNotNull(queueMember.getCallId); Assert.AreEqual(queueMember.getCallId, "CA386025c9bf5d6052a1d1ea42b4d16662"); }
public void Init() { instance = new QueueMember(); }
/// <summary> /// Esta clase va a manejar la relación colas <-> miembros /// Mantiene una lista de todos los miembros logeados (y los que no) y el estado de su dispositivo /// Interactua con el ActorQueueRouter /// </summary> public ActorCallDistributor(IActorRef actorDataAccess, IActorRef actorQueueLog) { callSenders = new Dictionary <long, IActorRef>(); this.actorDataAccess = actorDataAccess; //solicita todas las colas que estan persistidas (estaticas) tal vez desde el mysql? como hago para manejar la actualización de valores? this.actorDataAccess.Tell(new DAGetQueues()); queueSystem = new QueueSystemManager(); //Creo las colas que tengo persistidas Receive <DAQueues>(daq => { if (daq.Queues != null) { foreach (DTOQueue dtoq in daq.Queues) { Queue q = new Queue(dtoq.MemberStrategy, dtoq.CallOrderStrategy) { Id = dtoq.Id, Media = dtoq.Media, MediaType = dtoq.MediaType, Weight = dtoq.Weight, WrapupTime = dtoq.WrapupTime }; if (dtoq.QueueMembers != null) { //foreach(DTOQueueMember qm in dtoq.QueueMembers) //{ //TODO: revisar esto, me parece que esta demás, de la freepbx por ejemplo no puedo obtebner esta info //} } queueSystem.QueueCache.AddQueue(q); //si ya exite la cola, hago update? } } }); Receive <MessageMemberLogin>(mlin => { //Mensaje que proviene del ActorMemberLoginService, aca creo un nuevo member, cuando me llegan los QMemberAdd creo los //QueueMember en base a este objeto. El member quue creo aca tambien recibe mensajes del stateprovider Member member = new Member() { Id = mlin.MemberId, Name = mlin.Name, Contact = mlin.Contact, Password = mlin.Password, DeviceId = mlin.DeviceId }; queueSystem.MemberCache.Add(member); queueSystem.MemberCache.MemberLogin(member); actorQueueLog.Tell(new QLMemberLogin() { Source = mlin.From, Channel = mlin.RequestId, MemberId = mlin.MemberId, Name = mlin.Name, DeviceId = mlin.DeviceId }); }); Receive <MessageMemberLogoff>(mlof => { //Mensaje que proviene del ActorMemberLoginService queueSystem.MemberCache.MemberLogoff(mlof.MemberId); Member member = queueSystem.MemberCache.Remove(mlof.MemberId); actorQueueLog.Tell(new QLMemberLogoff() { Source = mlof.From, Channel = mlof.RequestId, MemberId = mlof.MemberId, LoggedInTime = member.LoginElapsedTime }); }); Receive <MessageQMemberPause>(mpau => { queueSystem.MemberCache.MemberPause(mpau.MemberId, mpau.PauseReason, mpau.PauseReason); actorQueueLog.Tell(new QLMemberPause() { Source = mpau.From, Channel = mpau.RequestId, MemberId = mpau.MemberId, Reason = mpau.PauseReason }); }); Receive <MessageQMemberUnpause>(munpau => { Member member = queueSystem.MemberCache.GetMemberById(munpau.MemberId); if (member.IsPaused) { member = queueSystem.MemberCache.MemberUnPause(munpau.MemberId); actorQueueLog.Tell(new QLMemberUnpause() { Source = munpau.From, Channel = munpau.RequestId, MemberId = munpau.MemberId, PausedTime = member.PauseElapsedTime }); } }); Receive <MessageQMemberAdd>(memberQueues => { //Mensaje que proviene del ActorMemberLoginService, posee una lista de los id de las colas de un miembro //me parece que esta logica deberia estar dentro del queue sistem, aca no. foreach (string queueId in memberQueues.QueuesId) { // mmmm... es correcto aca recuperar el member,crear un queue member y recien ahi agregarlo? Member member = queueSystem.MemberCache.GetMemberById(memberQueues.MemberId); if (member != null) { QueueMember qm = new QueueMember(member); queueSystem.QueueCache.GetQueue(queueId).AddQueueMember(qm); actorQueueLog.Tell(new QLMemberAdd() { Source = memberQueues.From, Channel = memberQueues.RequestId, QueueId = queueId, MemberId = member.Id }); } } }); Receive <MessageQMemberRemove>(memberQueues => { //Mensaje que proviene del ActorMemberLoginService, posee una lista de los id de las colas de un miembro //me parece que esta logica deberia estar dentro del queue sistem, aca no. foreach (string queueId in memberQueues.QueuesId) { // mmmm... es correcto aca recuperar el member,crear un queue member y recien ahi agregarlo? Member member = queueSystem.MemberCache.GetMemberById(memberQueues.MemberId); if (member != null) { QueueMember qm = new QueueMember(member); queueSystem.QueueCache.GetQueue(queueId).RemoveQueueMember(qm); actorQueueLog.Tell(new QLMemberRemove() { Source = memberQueues.From, Channel = memberQueues.RequestId, QueueId = queueId, MemberId = member.Id }); } } }); // Ejemplo de filtro de mensaje: Receive<String>(s => s.Equals("Start"), (s) => { proxyClient.Connect(); }); //ejemplito //Es estado del del sipositivo de Receive <MessageDeviceStateChanged>(dsc => { Member member = queueSystem.MemberCache.GetMemberById(dsc.MemberId); //verifico que sea del mismo dispositivo if (dsc.DeviceId == member.DeviceId) { if (!String.IsNullOrEmpty(dsc.Contact)) { member.Contact = dsc.Contact; } member.DeviceIsInUse = dsc.IsInUse; member.EndpointIsOfline = dsc.IsOffline; Log.Logger.Debug("CALL DIST: member STATE changed, Contact: " + member.Contact + ", IsInUse: " + member.DeviceIsInUse); } }); Receive <MessageNewCall>(nc => { Queue queue = queueSystem.QueueCache.GetQueue(nc.QueueId); Call call = new Call() { CallHandlerId = nc.CallHandlerId, ChannelId = nc.ChannelId }; QueueMember queueMember = null; if (queue != null) { queueMember = queue.AddCall(call); //agrega la llamada y si hay un qm para atenderla lo devuelve actorQueueLog.Tell(new QLEnterQueue() { Source = nc.From, QueueId = queue.Id, Channel = call.ChannelId }); } Sender.Tell(new MessageAnswerCall() { CallHandlerId = nc.CallHandlerId, MediaType = queue.MediaType, Media = queue.Media }); if (queueMember == null) { //guardo en el call el uid del sender call.SenderUid = Sender.Path.Uid; //guardo una referencia al sender si no la tengo if (!callSenders.ContainsKey(Sender.Path.Uid)) { callSenders.Add(Sender.Path.Uid, Sender); } //le aviso al sender que su llamada quedó encolada hasta que se libere un member Sender.Tell(new MessageCallQueued() { CallHandlerId = nc.CallHandlerId }); } else { call.IsDispatching = true; call.QueueMember = queueMember; Sender.Tell(new MessageCallTo() { CallHandlerId = nc.CallHandlerId, Destination = queueMember.Member.Contact }); } }); Receive <MessageCallerExitWithTimeOut>(cewto => { Queue queue = queueSystem.QueueCache.GetQueue(cewto.QueueId); if (queue != null) { Call call = queue.calls.GetCallById(cewto.CallHandlerId); if (call != null) { if (call.QueueMember != null) { call.IsDispatching = false; call.QueueMember.Member.IsAvailable = true; call.QueueMember = null; } queue.calls.RemoveCall(call); actorQueueLog.Tell(new QLCallExitWithTimeOut() { Source = cewto.From, QueueId = queue.Id, Channel = call.ChannelId, TimeOut = cewto.TimeOut }); } } }); Receive <MessageCallToFailed>(ctf => { //Busco otro member Log.Logger.Debug("CALL DIST: callto failed with code: " + ctf.Code.ToString() + " Reason: " + ctf.Reason); Queue queue = queueSystem.QueueCache.GetQueue(ctf.QueueId); if (queue != null) { Call call = queue.calls.GetCallById(ctf.CallHandlerId); if (call != null) { call.QueueMember.Member.IsAvailable = true; QueueMember queueMember = queue.members.NextAvailable(queue.WrapupTime); if (queueMember != null) { call.QueueMember = queueMember; Sender.Tell(new MessageCallTo() { CallHandlerId = ctf.CallHandlerId, Destination = queueMember.Member.Contact }); actorQueueLog.Tell(new QLRingNoAnswer() { Source = ctf.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, Code = ctf.Code, Reason = ctf.Reason, RingingTime = ctf.RingingTime }); } } } }); Receive <MessageCallToSuccess>(cts => { Log.Logger.Debug("CALL DIST: callto success"); Queue queue = queueSystem.QueueCache.GetQueue(cts.QueueId); Call call; if (queue != null) { call = queue.calls.GetCallById(cts.CallHandlerId); if (call != null) { call.IsDispatching = false; call.Connected = true; actorQueueLog.Tell(new QLConnect() { Source = cts.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, HoldTime = cts.HoldTime }); } } }); Receive <MessageCallerHangup>(chup => { //si caller hangup termino toda la llamada?, tal vez comportamiento configurable? Log.Logger.Debug("CALL DIST: Caller Hangup"); Queue queue = queueSystem.QueueCache.GetQueue(chup.QueueId); if (queue != null) { Call call = queue.calls.RemoveCall(chup.CallHandlerId); QueueMember queueMember = call.QueueMember; if (queueMember != null) { queueMember.MarkLastCallTime(); queueMember.Member.IsAvailable = true; } if (call.Connected == false) { actorQueueLog.Tell(new QLAbandon() { Source = chup.From, QueueId = queue.Id, Channel = call.ChannelId, WaitingTime = chup.WatingTime }); } else { actorQueueLog.Tell(new QLCallerHangUp() { Source = chup.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, WatingTime = chup.WatingTime, HoldingTime = chup.HoldingTime, TalkingTime = chup.TalkingTime }); } } }); Receive <MessageAgentHangup>(ahup => { //Si agent hangup hago que la llamada del caller siga en el dialplan? Log.Logger.Debug("CALL DIST: Agent Hangup"); Queue queue = queueSystem.QueueCache.GetQueue(ahup.QueueId); if (queue != null) { Call call = queue.calls.RemoveCall(ahup.CallHandlerId); QueueMember queueMember; if (call != null) { queueMember = call.QueueMember; if (queueMember != null) { queueMember.MarkLastCallTime(); queueMember.Member.IsAvailable = true; actorQueueLog.Tell(new QLAgentHangUp() { Source = ahup.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, WatingTime = ahup.WatingTime, HoldingTime = ahup.HoldingTime, TalkingTime = ahup.TalkingTime }); } } } }); Receive <MessageCallTransfer>(ctrans => { Log.Logger.Debug("CALL DIST: Call Trasnfer: dst: " + ctrans.TargetName); Queue queue = queueSystem.QueueCache.GetQueue(ctrans.QueueId); if (queue != null) { Call call = queue.calls.RemoveCall(ctrans.CallHandlerId); QueueMember queueMember = call.QueueMember; if (queueMember != null) { queueMember.MarkLastCallTime(); queueMember.Member.IsAvailable = true; actorQueueLog.Tell(new QLTransfer() { Source = ctrans.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, TargetChannelId = ctrans.TargetId, TargetChannelName = ctrans.TargetName, WatingTime = ctrans.WatingTime, HoldingTime = ctrans.HoldingTime, TalkingTime = ctrans.TalkingTime }); } } }); Receive <MessageCallHold>(cho => { Queue queue = queueSystem.QueueCache.GetQueue(cho.QueueId); if (queue != null) { Call call = queue.calls.GetCallById(cho.CallHandlerId); QueueMember queueMember = call.QueueMember; if (queueMember != null) { actorQueueLog.Tell(new QLCallHoldStart() { Source = cho.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id }); } } }); Receive <MessageCallUnHold>(cuho => { Queue queue = queueSystem.QueueCache.GetQueue(cuho.QueueId); if (queue != null) { Call call = queue.calls.GetCallById(cuho.CallHandlerId); QueueMember queueMember = call.QueueMember; if (queueMember != null) { actorQueueLog.Tell(new QLCallHoldStop() { Source = cuho.From, QueueId = queue.Id, Channel = call.ChannelId, MemberId = call.QueueMember.Id, HoldTime = cuho.HoldTime }); } } }); Receive <MessageCheckReadyMember>(rdymem => { //Log.Logger.Debug("CALL DIST: Check Ready Member: "); foreach (Queue queue in queueSystem.QueueCache.QueueList) { if (queue != null) { Call call = queue.CheckPendingCalls(); QueueMember queueMember = null; if (call != null) { queueMember = call.QueueMember; } if (queueMember != null) { //guardo una referencia al sender si no la tengo if (callSenders.ContainsKey(call.SenderUid)) { call.IsDispatching = true; callSenders[call.SenderUid].Tell(new MessageCallTo() { CallHandlerId = call.CallHandlerId, Destination = queueMember.Member.Contact }); } } } } }); #region "MANEJO DE CONSULTAS" /**************** MANEJO DE CONSULTAS *******************/ Receive <CMDListQueues>(cmdlq => { RESQueueList rql = new RESQueueList(); foreach (Queue queue in queueSystem.QueueCache.QueueList) { RESQueue rq = new RESQueue() { Id = queue.Id, MediaType = queue.MediaType }; foreach (Call call in queue.calls.Calls) { RESCall rc = new RESCall() { CallHandlerId = call.CallHandlerId, ChannelId = call.ChannelId, QueueMemberId = call.QueueMember != null ? call.QueueMember.Member.Id : null, QueueMemberName = call.QueueMember != null ? call.QueueMember.Member.Name : null, StartTime = call.StartTime, IsDispatching = call.IsDispatching, Connected = call.Connected }; rq.Calls.Add(rc); } foreach (QueueMember qMember in queue.members.Members) { RESMember rm = new RESMember() { Id = qMember.Member.Id, Contact = qMember.Member.Contact, DeviceId = qMember.Member.DeviceId, Name = qMember.Member.Name, IsPaused = qMember.Member.IsPaused, IsLogedIn = qMember.Member.IsLogedIn, PauseCode = qMember.Member.PauseCode, PauseReason = qMember.Member.PauseReason }; rq.Members.Add(rm); } rql.Queues.Add(rq); } Sender.Tell(rql, Self); }); #endregion }