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) { signalrServiceClient.SendState(session.Presence.From.User.ToLowerInvariant(), SignalRHelper.GetState(session.Presence.Show, session.Presence.Type), -1, session.Presence.From.Server); return; } } signalrServiceClient.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.Id)) { 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 { signalrServiceClient.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 { signalrServiceClient.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); } }