public void RemoveChannel(IChannel channel) { IMChannelUser user = IMChannelUser.Get(channel); if (user != null) { sessionManager.RemoveSession(user.UserId); onlineChannels.Remove(user.SessionId); } LogHelper.Info($"Online channel total: {onlineChannels.Count}"); }
public void SetChannelAndSession(ulong userid, string sessionid, IChannel channel) { if (userid <= 0 || string.IsNullOrEmpty(sessionid) || channel == null) { return; } onlineChannels.Add(sessionid, channel); sessionManager.SetSession(userid, sessionid); IMChannelUser.Set(channel, userid, sessionid); LogHelper.Info($"Online channel total: {onlineChannels.Count}"); }
private void ForceOffline() { IChannel onlineChannel = base.ChannelManager.GetChannel(base.MessageContent.UserId); if (onlineChannel != null) { IMChannelUser client = IMChannelUser.Get(onlineChannel); Push(onlineChannel, CreateResponseContext(ImStatus.ForceOffline)); LogHelper.Debug($"Remote client {onlineChannel.RemoteAddress.ToString()} force offline, session: {client.SessionId}"); base.ChannelManager.RemoveChannel(onlineChannel); onlineChannel.CloseAsync().Wait(); } }
private void CheckParameters() { if (this.CurrentChannel == null) { throw new ArgumentNullException("CurrentChannel"); } if (this.MessageHead == null) { throw new ArgumentNullException("MessageHead"); } if (this.IsCheckSession) { IMChannelUser user = IMChannelUser.Get(CurrentChannel); if (user == null || user.SessionId != this.MessageHead.Session) { throw new SessionInvalidException(); } } }
public override void UserEventTriggered(IChannelHandlerContext ctx, object evt) { if (!(evt is IdleStateEvent)) { return; } IdleStateEvent idleEvent = (IdleStateEvent)evt; if (idleEvent.State == IdleState.WriterIdle) { //Un auth client IMChannelUser user = IMChannelUser.Get(ctx.Channel); if (user == null) { ctx.Channel.CloseAsync(); LogHelper.Info($"Remote client {ctx.Channel.RemoteAddress.ToString()} closed."); } } }
public override void Execute(ImValidateMessage message) { if (!base.UserAction.ValidateUser(message.UserId, message.Token)) { Push(base.CurrentChannel, CreateResponseContext(ImStatus.Failure, "User token is invalid.")); return; } IMChannelUser client = IMChannelUser.Get(base.CurrentChannel); bool isOnline = ChannelManager.IsOnline(message.UserId); if (isOnline) { if (client == null) { this.ForceOffline(); this.GenerateNewSession(); } else { //already session online Push(base.CurrentChannel, CreateResponseContext(ImStatus.Success, client.SessionId)); PushOffline(message.UserId, base.CurrentChannel); } } else { if (client == null) { this.GenerateNewSession(); } else if (client.UserId != message.UserId) { Push(base.CurrentChannel, CreateResponseContext(ImStatus.Failure, $"User {client.UserId} is online, Please logout first.")); } } }