Пример #1
0
        public override async Task OnDisconnectedAsync(Exception exception)
        {
            var cid  = Context.ConnectionId;
            var user = _getLocalUser(cid);

            if (user == null)
            {
                await base.OnDisconnectedAsync(exception);

                return;
            }
            await _dbProvider.ContextActionAsync(async c =>
            {
                var userId   = user.UserId;
                var userList = _getLocalUserList(c, userId);
                if (userList == null || userList.Count == 0)
                {
                    throw new NullReferenceException(nameof(userList));
                }


                if (userList.Count == 1 && cid == userList[0].ConnectionId)
                {
                    await _cleanDisconnectedUserData(userList[0], exception);
                    _gameUserService.UpdateUserOnlineStatus(c, userId, false);
                    return(true);
                }
                var orderedUserList = userList.OrderBy(i => i.DateJoin).ToList();
                var last            = orderedUserList.Last();
                if (last.Connected && last.ConnectionId != cid)
                {
                    foreach (var u in orderedUserList.Take(orderedUserList.Count - 1))
                    {
                        await _cleanDisconnectedUserData(u, exception);
                    }
                    _gameUserService.UpdateUserOnlineStatus(c, userId, false);
                    return(true);
                }
                foreach (var u in orderedUserList)
                {
                    await _cleanDisconnectedUserData(u, exception);
                }
                _gameUserService.UpdateUserOnlineStatus(c, userId, false);
                return(true);
            });
        }