public void LoginRoutine(User user, string ipAddress) { user.LastLoginDate = DateTime.UtcNow; user.LastLoginIP = ipAddress; OnlineGuest guest = _onlineGuestRepository.First(item => item.IP.Equals(ipAddress)); if (guest != null) { _onlineGuestRepository.Delete(guest); } OnlineUser oUser = _onlineUserRepository.Get(user.UserID); if (oUser == null) { _onlineUserRepository.Add(new OnlineUser { Date = DateTime.UtcNow, UserID = user.UserID }); } else { oUser.Date = DateTime.UtcNow; _onlineUserRepository.Update(oUser); } IEnumerable <ThreadViewStamp> views = _threadViewStampRepository.Where(item => item.UserID.Equals(user.UserID)); _threadViewStampRepository.Delete(views); _unitOfWork.Commit(); }
/// <summary> /// 把一个用户加入新的版块。警告:本方法不是线程安全的,需自行加锁 /// </summary> /// <param name="forumID"></param> /// <param name="onlineGuest"></param> private void AddForumOnlineGuest(int forumID, OnlineGuest onlineGuest) { bool newForum = false; OnlineGuestCollection onlineGuestsInForum; //新板块还没有建立列表,那么立即创建一个 if (m_ForumOnlineGuests.TryGetValue(forumID, out onlineGuestsInForum) == false) { lock (m_ForumOnlineGuests_AllLocker) { if (m_ForumOnlineGuests.TryGetValue(forumID, out onlineGuestsInForum) == false) { onlineGuestsInForum = new OnlineGuestCollection(); onlineGuestsInForum.Add(onlineGuest); m_ForumOnlineGuests.Add(forumID, onlineGuestsInForum); newForum = true; } } } //就算是更新原来的值,也不对原列表进行改动,而是复制一份新列表出来,并增加新项,以免发生“集合已更改”的问题 if (newForum == false) { OnlineGuestCollection newOnlineGuestsInForum = new OnlineGuestCollection(onlineGuestsInForum); newOnlineGuestsInForum.Add(onlineGuest); m_ForumOnlineGuests[forumID] = newOnlineGuestsInForum; } }
/// <summary> /// 把一个用户从版块中移除。警告:本方法不是线程安全的,需自行加锁 /// </summary> /// <param name="forumID"></param> /// <param name="onlineGuest"></param> private void RemoveForumOnlineGuest(int forumID, OnlineGuest onlineGuest) { OnlineGuestCollection onlineGuestsInForum; //从原来的版块中移除 if (m_ForumOnlineGuests.TryGetValue(forumID, out onlineGuestsInForum)) { OnlineGuestCollection newOnlineGuestsInForum = new OnlineGuestCollection(onlineGuestsInForum); newOnlineGuestsInForum.Remove(onlineGuest); m_ForumOnlineGuests[forumID] = newOnlineGuestsInForum; } }
public void OnlineUserRoutine(User user, string ipAddress) { bool IsAuthenticated = user != null; if (IsAuthenticated) { OnlineUser onlineUser = _onlineUserRepository.Get(user.UserID); OnlineGuest onlineGuest = _onlineGuestRepository.First(item => item.IP.Equals(ipAddress)); if (onlineGuest != null) { _onlineGuestRepository.Delete(onlineGuest.OnlineGuestID); } if (onlineUser == null) { _onlineUserRepository.Add(new OnlineUser { UserID = user.UserID, Date = DateTime.UtcNow, } ); } else { onlineUser.Date = DateTime.UtcNow; _onlineUserRepository.Update(onlineUser); } } else { OnlineGuest onlineGuest = _onlineGuestRepository.First(item => item.IP.Equals(ipAddress)); if (onlineGuest == null) { _onlineGuestRepository.Add(new OnlineGuest { IP = ipAddress, Date = DateTime.UtcNow }); } else { onlineGuest.Date = DateTime.UtcNow; _onlineGuestRepository.Update(onlineGuest); } } _unitOfWork.Commit(); }
protected string GetGuestPosition(OnlineGuest guest) { return(GetPosition <string>(guest)); }
public void Update(AuthUser my, RequestVariable request, OnlineAction action, int forumID, int threadID, string subject) { subject = StringUtil.CutString(subject, 20); int userID = my.UserID; string ip = request.IpAddress; bool addnew = false; //已经登录的用户 if (userID > 0) { #region 已经登录的用户的处理 OnlineMember onlineMember; if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember) == false) { string location = IPUtil.GetIpArea(ip); RoleInOnline role = GetUserRoleInOnline(userID); lock (m_OnlineMembers_Locker) { if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember) == false) { #region 增加一个OnlineMember DateTime now = DateTimeUtil.Now; onlineMember = new OnlineMember(); onlineMember.UserID = userID; onlineMember.Action = action; onlineMember.Username = my.Username; onlineMember.IsInvisible = my.IsInvisible; onlineMember.IP = ip; onlineMember.Location = location; onlineMember.ForumID = forumID; onlineMember.ThreadID = threadID; onlineMember.ThreadSubject = subject; onlineMember.Platform = request.Platform; onlineMember.Browser = request.Browser; onlineMember.CreateDate = now; onlineMember.UpdateDate = now; onlineMember.RoleSortOrder = role.SortOrder; onlineMember.RoleIdentityIDString = my.RoleIdentityIDString; m_OnlineMemberTable.Add(userID, onlineMember); OnlineMemberCollection newOnlineMembers = new OnlineMemberCollection(m_OnlineMembers); newOnlineMembers.Add(onlineMember); m_OnlineMembers = newOnlineMembers; if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } #endregion addnew = true; } } } if (addnew == false) { lock (onlineMember) { //ForumID为-1意味着其实已经删除,无需再更新 if (onlineMember.ForumID != -1) { #region 更新原来OnlineMember的值 onlineMember.Action = action; onlineMember.Username = my.Username; onlineMember.IsInvisible = my.IsInvisible; if (my.RoleIdentityIDString != onlineMember.RoleIdentityIDString) { RoleInOnline role = GetUserRoleInOnline(userID); onlineMember.RoleSortOrder = role.SortOrder; onlineMember.RoleIdentityIDString = my.RoleIdentityIDString; } if (onlineMember.IP != ip) { onlineMember.IP = ip; onlineMember.Location = IPUtil.GetIpArea(ip); } //----------------- int oldForumID = onlineMember.ForumID; onlineMember.ThreadID = threadID; onlineMember.ThreadSubject = subject; if (oldForumID != forumID) { if (oldForumID != 0 && forumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { lock (GetForumOnlineMemberLocker(forumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } } else if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); } } else if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } onlineMember.ForumID = forumID; } onlineMember.Platform = request.Platform; onlineMember.Browser = request.Browser; onlineMember.UpdateDate = DateTimeUtil.Now; #endregion } else LogHelper.CreateDebugLog("OnlineMember线程同步监视1"); } } #endregion //如果是已登陆状态,但客户端仍然提交了GuestID,则把这个GuestID移除 //if (my.MachineIDIsNew == false) string guestID = my.GuestID; if (guestID != null) { RemoveOnlineGuest(guestID); } } else //尚未登录的用户 { //TODO : 暂不统计游客在线情况,因为可能存在溢出,下个版本改进 #region 尚未登录的用户的处理 bool isSpider = request.IsSpider; string guestID = my.BuildGuestID(); OnlineGuest onlineGuest; if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest) == false) { string location = IPUtil.GetIpArea(ip); lock (m_OnlineGuests_Locker) { //假如游客列表中还没有这个游客 if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest) == false) { bool success = UpdateOnlineGuestIP(guestID, null, ip, isSpider);// AddGuestToIP(guestID, ip, request.IsSpider); //bool success = true; if (success) { #region 增加一个OnlineGuest DateTime now = DateTimeUtil.Now; onlineGuest = new OnlineGuest(); onlineGuest.GuestID = my.GuestID; onlineGuest.IsSpider = isSpider; onlineGuest.Action = action; onlineGuest.IP = ip; onlineGuest.Location = location; onlineGuest.Platform = request.Platform; onlineGuest.Browser = request.Browser; onlineGuest.CreateDate = now; onlineGuest.UpdateDate = now; onlineGuest.ForumID = forumID; onlineGuest.ThreadID = threadID; onlineGuest.ThreadSubject = subject; m_OnlineGuestTable.Add(guestID, onlineGuest); OnlineGuestCollection newOnlineGuests = new OnlineGuestCollection(m_OnlineGuests); newOnlineGuests.Add(onlineGuest); m_OnlineGuests = newOnlineGuests; if (forumID != 0) { lock (GetForumOnlineGuestLocker(forumID)) { //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } #endregion addnew = true; } else return; } } } //如果只是更新原来的值,那么开始更新 if (addnew == false) { lock (onlineGuest) { //ForumID为-1表示其实这个对象已经从在线列表中移除了 if (onlineGuest.ForumID != -1) { #region 更新原来OnlineGuest的值 onlineGuest.Action = action; //如果这个游客仅仅发生了IP变化,那么要更新IP表 if (onlineGuest.IP != ip) { UpdateOnlineGuestIP(guestID, onlineGuest.IP, ip, isSpider); //RemoveGuestFromIP(guestID, onlineGuest.IP); onlineGuest.IsSpider = isSpider; onlineGuest.IP = ip; onlineGuest.Location = IPUtil.GetIpArea(ip); //AddGuestToIP(guestID, onlineGuest.IP, request.IsSpider); } //---------------------- int oldForumID = onlineGuest.ForumID; if (oldForumID != forumID) { if (oldForumID != 0 && forumID != 0) { lock (GetForumOnlineGuestLocker(oldForumID)) { lock (GetForumOnlineGuestLocker(forumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } } else if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); } } else if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } onlineGuest.ForumID = forumID; } onlineGuest.Platform = request.Platform; onlineGuest.Browser = request.Browser; onlineGuest.UpdateDate = DateTimeUtil.Now; onlineGuest.ThreadID = threadID; onlineGuest.ThreadSubject = subject; #endregion } else LogHelper.CreateDebugLog("OnlineGuest线程同步监视1"); } } #endregion } }
/// <summary> /// 将一个游客从在线列表中移除。本方法线程安全,无需自行加锁 /// </summary> /// <param name="guestID"></param> /// <param name="onlineGuest"></param> /// <returns></returns> private bool RemoveOnlineGuest(string guestID, out OnlineGuest onlineGuest) { bool result = false; onlineGuest = null; if (m_OnlineGuestTable.ContainsKey(guestID)) { lock (m_OnlineGuests_Locker) { if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest)) { result = true; lock (onlineGuest) { int oldForumID = onlineGuest.ForumID; //-1表示其实已经被移除了 if (oldForumID == -1) { LogHelper.CreateDebugLog("线程安全问题1"); return false; } if (oldForumID != 0) { lock (GetForumOnlineGuestLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); } } onlineGuest.ForumID = -1; //把这个游客的IP从游客IP表中去除 lock (m_OnlineGuestsInIps_Locker) { OnlineGuestsInIp onlineGuestIp; if (m_OnlineGuestsInIps.TryGetValue(onlineGuest.IP, out onlineGuestIp)) { onlineGuestIp.GuestIds.Remove(onlineGuest.GuestID); if (onlineGuestIp.GuestIds.Count == 0) m_OnlineGuestsInIps.Remove(onlineGuest.IP); } } m_OnlineGuestTable.Remove(guestID); OnlineGuestCollection newOnlineGuests = new OnlineGuestCollection(m_OnlineGuests); newOnlineGuests.Remove(onlineGuest); m_OnlineGuests = newOnlineGuests; } } } } return result; }
public void Update(AuthUser my, RequestVariable request, OnlineAction action, int forumID, int threadID, string subject) { subject = StringUtil.CutString(subject, 20); int userID = my.UserID; string ip = request.IpAddress; bool addnew = false; //已经登录的用户 if (userID > 0) { #region 已经登录的用户的处理 OnlineMember onlineMember; if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember) == false) { string location = IPUtil.GetIpArea(ip); RoleInOnline role = GetUserRoleInOnline(userID); lock (m_OnlineMembers_Locker) { if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember) == false) { #region 增加一个OnlineMember DateTime now = DateTimeUtil.Now; onlineMember = new OnlineMember(); onlineMember.UserID = userID; onlineMember.Action = action; onlineMember.Username = my.Username; onlineMember.IsInvisible = my.IsInvisible; onlineMember.IP = ip; onlineMember.Location = location; onlineMember.ForumID = forumID; onlineMember.ThreadID = threadID; onlineMember.ThreadSubject = subject; onlineMember.Platform = request.Platform; onlineMember.Browser = request.Browser; onlineMember.CreateDate = now; onlineMember.UpdateDate = now; onlineMember.RoleSortOrder = role.SortOrder; onlineMember.RoleIdentityIDString = my.RoleIdentityIDString; m_OnlineMemberTable.Add(userID, onlineMember); OnlineMemberCollection newOnlineMembers = new OnlineMemberCollection(m_OnlineMembers); newOnlineMembers.Add(onlineMember); m_OnlineMembers = newOnlineMembers; if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } #endregion addnew = true; } } } if (addnew == false) { lock (onlineMember) { //ForumID为-1意味着其实已经删除,无需再更新 if (onlineMember.ForumID != -1) { #region 更新原来OnlineMember的值 onlineMember.Action = action; onlineMember.Username = my.Username; onlineMember.IsInvisible = my.IsInvisible; if (my.RoleIdentityIDString != onlineMember.RoleIdentityIDString) { RoleInOnline role = GetUserRoleInOnline(userID); onlineMember.RoleSortOrder = role.SortOrder; onlineMember.RoleIdentityIDString = my.RoleIdentityIDString; } if (onlineMember.IP != ip) { onlineMember.IP = ip; onlineMember.Location = IPUtil.GetIpArea(ip); } //----------------- int oldForumID = onlineMember.ForumID; onlineMember.ThreadID = threadID; onlineMember.ThreadSubject = subject; if (oldForumID != forumID) { if (oldForumID != 0 && forumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { lock (GetForumOnlineMemberLocker(forumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } } else if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); } } else if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineMember(forumID, onlineMember); } } onlineMember.ForumID = forumID; } onlineMember.Platform = request.Platform; onlineMember.Browser = request.Browser; onlineMember.UpdateDate = DateTimeUtil.Now; #endregion } else { LogHelper.CreateDebugLog("OnlineMember线程同步监视1"); } } } #endregion //如果是已登陆状态,但客户端仍然提交了GuestID,则把这个GuestID移除 //if (my.MachineIDIsNew == false) string guestID = my.GuestID; if (guestID != null) { RemoveOnlineGuest(guestID); } } else //尚未登录的用户 { //TODO : 暂不统计游客在线情况,因为可能存在溢出,下个版本改进 #region 尚未登录的用户的处理 bool isSpider = request.IsSpider; string guestID = my.BuildGuestID(); OnlineGuest onlineGuest; if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest) == false) { string location = IPUtil.GetIpArea(ip); lock (m_OnlineGuests_Locker) { //假如游客列表中还没有这个游客 if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest) == false) { bool success = UpdateOnlineGuestIP(guestID, null, ip, isSpider);// AddGuestToIP(guestID, ip, request.IsSpider); //bool success = true; if (success) { #region 增加一个OnlineGuest DateTime now = DateTimeUtil.Now; onlineGuest = new OnlineGuest(); onlineGuest.GuestID = my.GuestID; onlineGuest.IsSpider = isSpider; onlineGuest.Action = action; onlineGuest.IP = ip; onlineGuest.Location = location; onlineGuest.Platform = request.Platform; onlineGuest.Browser = request.Browser; onlineGuest.CreateDate = now; onlineGuest.UpdateDate = now; onlineGuest.ForumID = forumID; onlineGuest.ThreadID = threadID; onlineGuest.ThreadSubject = subject; m_OnlineGuestTable.Add(guestID, onlineGuest); OnlineGuestCollection newOnlineGuests = new OnlineGuestCollection(m_OnlineGuests); newOnlineGuests.Add(onlineGuest); m_OnlineGuests = newOnlineGuests; if (forumID != 0) { lock (GetForumOnlineGuestLocker(forumID)) { //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } #endregion addnew = true; } else { return; } } } } //如果只是更新原来的值,那么开始更新 if (addnew == false) { lock (onlineGuest) { //ForumID为-1表示其实这个对象已经从在线列表中移除了 if (onlineGuest.ForumID != -1) { #region 更新原来OnlineGuest的值 onlineGuest.Action = action; //如果这个游客仅仅发生了IP变化,那么要更新IP表 if (onlineGuest.IP != ip) { UpdateOnlineGuestIP(guestID, onlineGuest.IP, ip, isSpider); //RemoveGuestFromIP(guestID, onlineGuest.IP); onlineGuest.IsSpider = isSpider; onlineGuest.IP = ip; onlineGuest.Location = IPUtil.GetIpArea(ip); //AddGuestToIP(guestID, onlineGuest.IP, request.IsSpider); } //---------------------- int oldForumID = onlineGuest.ForumID; if (oldForumID != forumID) { if (oldForumID != 0 && forumID != 0) { lock (GetForumOnlineGuestLocker(oldForumID)) { lock (GetForumOnlineGuestLocker(forumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } } else if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); } } else if (forumID != 0) { lock (GetForumOnlineMemberLocker(forumID)) { //加入新的版块 AddForumOnlineGuest(forumID, onlineGuest); } } onlineGuest.ForumID = forumID; } onlineGuest.Platform = request.Platform; onlineGuest.Browser = request.Browser; onlineGuest.UpdateDate = DateTimeUtil.Now; onlineGuest.ThreadID = threadID; onlineGuest.ThreadSubject = subject; #endregion } else { LogHelper.CreateDebugLog("OnlineGuest线程同步监视1"); } } } #endregion } }
/// <summary> /// 将一个游客从在线列表中移除。本方法线程安全,无需自行加锁 /// </summary> /// <param name="guestID"></param> /// <param name="onlineGuest"></param> /// <returns></returns> private bool RemoveOnlineGuest(string guestID, out OnlineGuest onlineGuest) { bool result = false; onlineGuest = null; if (m_OnlineGuestTable.ContainsKey(guestID)) { lock (m_OnlineGuests_Locker) { if (m_OnlineGuestTable.TryGetValue(guestID, out onlineGuest)) { result = true; lock (onlineGuest) { int oldForumID = onlineGuest.ForumID; //-1表示其实已经被移除了 if (oldForumID == -1) { LogHelper.CreateDebugLog("线程安全问题1"); return(false); } if (oldForumID != 0) { lock (GetForumOnlineGuestLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineGuest(oldForumID, onlineGuest); } } onlineGuest.ForumID = -1; //把这个游客的IP从游客IP表中去除 lock (m_OnlineGuestsInIps_Locker) { OnlineGuestsInIp onlineGuestIp; if (m_OnlineGuestsInIps.TryGetValue(onlineGuest.IP, out onlineGuestIp)) { onlineGuestIp.GuestIds.Remove(onlineGuest.GuestID); if (onlineGuestIp.GuestIds.Count == 0) { m_OnlineGuestsInIps.Remove(onlineGuest.IP); } } } m_OnlineGuestTable.Remove(guestID); OnlineGuestCollection newOnlineGuests = new OnlineGuestCollection(m_OnlineGuests); newOnlineGuests.Remove(onlineGuest); m_OnlineGuests = newOnlineGuests; } } } } return(result); }