public void SendPresenceToSignalR(Presence presence, XmppSessionManager sessionManager)
 {
     try
     {
         var state = SignalRHelper.GetState(presence.Show, presence.Type);
         if (state == SignalRHelper.USER_OFFLINE && sessionManager != null)
         {
             var jidSessions = sessionManager.GetBareJidSessions(presence.From).
                               Where(s => !s.IsSignalRFake && s.Presence.Type != PresenceType.unavailable);
             if (jidSessions.Count() > 0)
             {
                 int priority    = jidSessions.First().Priority;
                 var bestSession = jidSessions.First();
                 foreach (var session in jidSessions)
                 {
                     if (session.Priority > priority)
                     {
                         priority    = session.Priority;
                         bestSession = session;
                     }
                 }
                 _reverseJabberServiceClient.SendState(bestSession.Presence.From.User.ToLowerInvariant(),
                                                       SignalRHelper.GetState(bestSession.Presence.Show, bestSession.Presence.Type), -1, bestSession.Presence.From.Server);
                 return;
             }
         }
         _reverseJabberServiceClient.SendState(presence.From.User.ToLowerInvariant(), state, -1, presence.From.Server);
     }
     catch (Exception e)
     {
         _log.ErrorFormat("Can not send to {0} to SignalR: {1} {2}", presence, e.Message, e.StackTrace);
     }
 }
Exemple #2
0
        public bool RemoveXmppConnection(string connectionId, string userName, int tenantId)
        {
            bool result = false;

            try
            {
                _log.DebugFormat("Remove Xmpp Connection: connectionId={0}, userName={1}, tenantId={2}", connectionId, userName, tenantId);

                var jid      = GetJid(userName, tenantId, SignalRHelper.SIGNALR_RESOURCE);
                var listener = (SignalRXmppListener)((XmppGateway)_xmppServer.GetService(typeof(IXmppReceiver))).GetXmppListener("SignalR Listener");
                _xmppServer.SessionManager.CloseSession(jid);
                _xmppServer.StreamManager.RemoveStream(connectionId);
                listener.CloseXmppConnection(connectionId);
                var sender = (IXmppSender)_xmppServer.GetService(typeof(IXmppSender));
                Task.Run(() =>
                {
                    sender.Broadcast(_xmppServer.SessionManager.GetSessions(),
                                     new Presence {
                        Priority = SignalRHelper.PRIORITY, From = jid, Type = PresenceType.unavailable
                    });
                });
                var jidSessions = _xmppServer.SessionManager.GetBareJidSessions(jid).Where(s => s.Presence.Type != PresenceType.unavailable).ToArray();
                if (jidSessions.Length == 0)
                {
                    result = true;
                }
                else
                {
                    Task.Run(() =>
                    {
                        var bestSessions = jidSessions.Where(s => !s.IsSignalRFake &&
                                                             s.Presence.Type != PresenceType.unavailable).OrderByDescending(s => s.Presence.Priority).ToArray();
                        if (bestSessions.Length > 0 && bestSessions[0].Presence != null)
                        {
                            var bestSession = bestSessions[0];
                            _reverseJabberServiceClient.SendState(bestSession.Jid.User.ToLowerInvariant(),
                                                                  SignalRHelper.GetState(bestSession.Presence.Show, bestSession.Presence.Type), tenantId, string.Empty);
                        }
                        else
                        {
                            _log.ErrorFormat("XMPP session Presence is null, userName = {0}", userName);
                        }
                    });
                    result = false;
                }
            }
            catch (Exception e)
            {
                _log.ErrorFormat("Unexpected error, userName = {0}, {1}, {2}, {3}", userName,
                                 e, e.StackTrace, e.InnerException != null ? e.InnerException.Message : string.Empty);
            }
            return(result);
        }
 public void SendPresenceToSignalR(Presence presence, XmppSessionManager sessionManager)
 {
     try
     {
         var state = SignalRHelper.GetState(presence.Show, presence.Type);
         if (state == SignalRHelper.USER_OFFLINE && sessionManager != null)
         {
             var session = sessionManager.GetAvailableSession(presence.From.BareJid);
             if (session != null && session.Presence != null)
             {
                 _reverseJabberServiceClient.SendState(session.Presence.From.User.ToLowerInvariant(),
                                                       SignalRHelper.GetState(session.Presence.Show, session.Presence.Type), -1, session.Presence.From.Server);
                 return;
             }
         }
         _reverseJabberServiceClient.SendState(presence.From.User.ToLowerInvariant(), state, -1, presence.From.Server);
     }
     catch (Exception e)
     {
         _log.ErrorFormat("Can not send to {0} to SignalR: {1} {2}", presence, e.Message, e.StackTrace);
     }
 }
        private void IdleTimeout(object sndr, TimeoutEventArgs e)
        {
            try
            {
                if (!Id.Equals(e.IdleObject))
                {
                    return;
                }

                _log.DebugFormat("Close jabber-signalr connection {0} by inactivity timeout.", Id);

                var xmppStream = _xmppServer.StreamManager.GetStream(Id);
                if (xmppStream == null)
                {
                    _log.DebugFormat("Stream already was closed", Id);
                    return;
                }
                var jid = new Jid(xmppStream.User, xmppStream.Domain, SignalRHelper.SIGNALR_RESOURCE);
                _xmppServer.SessionManager.CloseSession(jid);
                _xmppServer.StreamManager.RemoveStream(Id);
                Close();
                var jidSessions = _xmppServer.SessionManager.GetBareJidSessions(jid);
                var sender      = (IXmppSender)_xmppServer.GetService(typeof(IXmppSender));
                var presence    = new Presence
                {
                    Priority = SignalRHelper.PRIORITY,
                    From     = jid,
                    Type     = PresenceType.unavailable
                };
                sender.Broadcast(_xmppServer.SessionManager.GetSessions(), presence);
                if (jidSessions.Count > 0)
                {
                    var bestSessions = jidSessions.Where(s => !s.IsSignalRFake).OrderByDescending(s => s.Presence.Priority).ToArray();
                    if (bestSessions.Length > 0 && bestSessions[0].Presence != null)
                    {
                        var bestSession = bestSessions[0];
                        try
                        {
                            _reverseJabberServiceClient.SendState(bestSession.Jid.User.ToLowerInvariant(),
                                                                  SignalRHelper.GetState(bestSession.Presence.Show, bestSession.Presence.Type), -1, bestSession.Jid.Server);
                        }
                        catch (Exception ex)
                        {
                            _log.ErrorFormat("Unexpected error, connectionId = {0}, {1}, {2}, {3}", Id,
                                             ex.Message, ex.StackTrace, ex.InnerException != null ? ex.InnerException.Message : string.Empty);
                        }
                    }
                    else
                    {
                        _log.ErrorFormat("XMPP session Presence is null. Connection {0}", Id);
                    }
                }
                else
                {
                    try
                    {
                        _reverseJabberServiceClient.SendState(jid.User.ToLowerInvariant(), SignalRHelper.USER_OFFLINE, -1, jid.Server);
                    }
                    catch (Exception ex)
                    {
                        _log.ErrorFormat("Unexpected error, connectionId = {0}, {1}, {2}, {3}", Id,
                                         ex.Message, ex.StackTrace, ex.InnerException != null ? ex.InnerException.Message : string.Empty);
                    }
                }
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Unexpected error: {0}", ex);
            }
        }