/// <summary> /// 把一个用户加入新的版块。警告:本方法不是线程安全的,需自行加锁 /// </summary> /// <param name="forumID"></param> /// <param name="onlineMember"></param> private void AddForumOnlineMember(int forumID, OnlineMember onlineMember) { bool newForum = false; OnlineMemberCollection onlineMembersInForum; //新板块还没有建立列表,那么立即创建一个 if (m_ForumOnlineMembers.TryGetValue(forumID, out onlineMembersInForum) == false) { lock (m_ForumOnlineMembers_AllLocker) { if (m_ForumOnlineMembers.TryGetValue(forumID, out onlineMembersInForum) == false) { onlineMembersInForum = new OnlineMemberCollection(); onlineMembersInForum.Add(onlineMember); m_ForumOnlineMembers.Add(forumID, onlineMembersInForum); newForum = true; } } } //就算是更新原来的值,也不对原列表进行改动,而是复制一份新列表出来,并增加新项,以免发生“集合已更改”的问题 if (newForum == false) { OnlineMemberCollection newOnlineMembersInForum = new OnlineMemberCollection(onlineMembersInForum); newOnlineMembersInForum.Add(onlineMember); m_ForumOnlineMembers[forumID] = newOnlineMembersInForum; } }
/// <summary> /// 把一个用户从版块中移除。警告:本方法不是线程安全的,需自行加锁 /// </summary> /// <param name="forumID"></param> /// <param name="onlineMember"></param> private void RemoveForumOnlineMember(int forumID, OnlineMember onlineMember) { OnlineMemberCollection onlineMembersInForum; //从原来的版块中移除 if (m_ForumOnlineMembers.TryGetValue(forumID, out onlineMembersInForum)) { OnlineMemberCollection newOnlineMembersInForum = new OnlineMemberCollection(onlineMembersInForum); newOnlineMembersInForum.Remove(onlineMember); m_ForumOnlineMembers[forumID] = newOnlineMembersInForum; } }
/// <summary> /// 当更新在线角色图标设置时 要调用此方法 /// </summary> public void UpdateUsersOnlineRole() { OnlineMemberCollection members = GetAllOnlineMembers(); UserCollection users = UserBO.Instance.GetUsers(members.GetKeys()); foreach (User user in users) { RoleInOnline roleInOnline = GetUserRoleInOnline(user.UserID); OnlineMember member = GetOnlineMember(user.UserID); member.RoleSortOrder = roleInOnline.SortOrder; } }
/// <summary> /// 将一个用户从在线列表中移除。本方法线程安全,无需自行加锁 /// </summary> /// <param name="userID"></param> /// <param name="onlineMember"></param> /// <returns></returns> private bool RemoveOnlineMember(int userID, out OnlineMember onlineMember) { bool result = false; onlineMember = null; if (m_OnlineMemberTable.ContainsKey(userID)) { lock (m_OnlineMembers_Locker) { //OnlineMember onlineMember; if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember)) { result = true; lock (onlineMember) { int oldForumID = onlineMember.ForumID; //-1表示其实已经被移除了 if (oldForumID == -1) { LogHelper.CreateDebugLog("线程安全问题1"); return(false); } if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); } } onlineMember.ForumID = -1; m_OnlineMemberTable.Remove(userID); OnlineMemberCollection newOnlineMembers = new OnlineMemberCollection(m_OnlineMembers); newOnlineMembers.Remove(onlineMember); m_OnlineMembers = newOnlineMembers; } } } } return(result); }
public void ProcessRequest(System.Web.HttpContext context) { AuthUser my = User.Current; OnlineGuestCollection m_OnlineGuestList; OnlineMemberCollection m_onlineMembers; bool getGuest, getMember; getGuest = StringUtil.TryParse <bool>(context.Request.QueryString["guest"], false); getMember = StringUtil.TryParse <bool>(context.Request.QueryString["member"], false); int forumId = StringUtil.TryParse(context.Request.QueryString["forumid"], 0); if (ShowGuest && getGuest) { if (forumId == 0) { m_OnlineGuestList = OnlineUserPool.Instance.GetAllOnlineGuests(); } else { m_OnlineGuestList = OnlineUserPool.Instance.GetOnlineGuests(forumId); } } else { m_OnlineGuestList = new OnlineGuestCollection(); } if (ShowMember && getMember) { if (forumId == 0) { m_onlineMembers = OnlineUserPool.Instance.GetAllOnlineMembers(); } else { m_onlineMembers = OnlineUserPool.Instance.GetOnlineMembers(forumId); } } else { m_onlineMembers = new OnlineMemberCollection(); } int showCount = AllSettings.Current.OnlineSettings.ShowOnlineCount; int i = 0; StringBuilder JsResault = new StringBuilder("{"); int ipPart; if (AllSettings.Current.BackendPermissions.Can(my, BackendPermissions.Action.Setting_AccessLimit)) { ipPart = int.MaxValue; } else { ipPart = AllSettings.Current.SiteSettings.ViewIPFields.GetValue(my); } //if (my.IsManager&& my.CanLoginConsole) ipPart = 4; foreach (OnlineMember member in m_onlineMembers) { if (i >= showCount) { break; } i++; if (member.IsInvisible) { if (!AllSettings.Current.ManageUserPermissionSet.Can(my, ManageUserPermissionSet.ActionWithTarget.SeeInvisibleUserInfo, member.UserID)) { continue; } } JsResault.Append("\"").Append(member.ID).Append("\":{"); JsResault.Append("action:'").Append(StringUtil.ToJavaScriptString(OnlineUserPool.Instance.ActionName(member.Action))).Append("',"); if (member.ForumID > 0) { JsResault.Append("forunID:").Append(member.ForumID).Append(","); JsResault.Append("forum:'").Append(member.ForumName).Append("',"); if (member.ThreadID > 0) { JsResault.Append("threadID:").Append(member.ThreadID).Append(","); JsResault.Append("thread:'").Append(StringUtil.ToJavaScriptString(member.ThreadSubject)).Append("',"); } } string ip = IPUtil.OutputIP(my, member.IP, ipPart); JsResault.Append("ip:'").Append(ip).Append("',"); JsResault.Append("area:'").Append(ipPart >= 4 ? member.Location : string.Empty).Append("',"); JsResault.Append("browser:'").Append(member.Browser).Append("',"); JsResault.Append("os:'").Append(member.Platform).Append("',"); JsResault.Append("createtime:'").Append(DateTimeUtil.FormatDateTime(my, member.CreateDate, false)).Append("',"); JsResault.Append("updatetime:'").Append(DateTimeUtil.FormatDateTime(my, member.UpdateDate, false)).Append("',"); JsResault.Append("hidden:").Append(member.IsInvisible ? "1" : "0"); JsResault.Append("},"); } foreach (OnlineGuest guest in m_OnlineGuestList) { if (i >= showCount) { break; } i++; JsResault.Append("\"" + guest.ID + "\":{"); JsResault.Append("action:'").Append(StringUtil.ToJavaScriptString(OnlineUserPool.Instance.ActionName(guest.Action))).Append("',"); if (guest.ForumID > 0) { JsResault.Append("forunID:").Append(guest.ForumID).Append(","); JsResault.Append("forum:'").Append(guest.ForumName).Append("',"); if (guest.ThreadID > 0) { JsResault.Append("threadID:").Append(guest.ThreadID).Append(","); JsResault.Append("thread:'").Append(StringUtil.ToJavaScriptString(guest.ThreadSubject)).Append("',"); } } string ip = IPUtil.OutputIP(my, guest.IP, ipPart); JsResault.Append("ip:'").Append(ip).Append("',"); JsResault.Append("area:'").Append(ipPart >= 4 ? guest.Location : string.Empty).Append("',"); JsResault.Append("browser:'").Append(guest.Browser).Append("',"); JsResault.Append("os:'").Append(guest.Platform).Append("',"); JsResault.Append("createtime:'").Append(DateTimeUtil.FormatDateTime(my, guest.CreateDate, false)).Append("',"); JsResault.Append("isSpider:").Append(guest.IsSpider ? "1," : "0,"); JsResault.Append("updatetime:'").Append(DateTimeUtil.FormatDateTime(my, guest.UpdateDate, false)).Append("'"); JsResault.Append("},"); } if (JsResault.Length > 1) { JsResault.Remove(JsResault.Length - 1, 1); //删除最后的逗号 } JsResault.Append("}"); context.Response.Clear(); context.Response.Write(JsResault.ToString()); context.Response.End(); }
protected string GetOnlineMemberScriptData(OnlineMemberCollection onlineMembers) { if (onlineMembers != null && onlineMembers.Count > 0) { StringBuilder sb = new StringBuilder(); string formatString = "m({0},'{1}',{2},{3});"; sb.Append(RoleScript); sb.Append(@" function m(userID,nickName,roleSortOrder,IsInvisible) { var logoUrl = roles[roleSortOrder][0]; var roleName = roles[roleSortOrder][1]; var tempHtml; if(IsInvisible) tempHtml=memberHTML2; else tempHtml=memberHTML; document.write(tempHtml.replace(/\[userID\]/g,userID).replace('{logoUrl}',logoUrl).replace('{roleName}',roleName).replace('{nickName}',nickName)); } function i() { document.write(invisibleHTML); } "); int maxCount = (OnlineSetting.ShowOnlineCount == 0 ? int.MaxValue : OnlineSetting.ShowOnlineCount); int count = 0; foreach (OnlineMember member in onlineMembers) { bool showDetial = false; if (member.IsInvisible) { if (AllSettings.Current.ManageUserPermissionSet.Can(My, ManageUserPermissionSet.ActionWithTarget.SeeInvisibleUserInfo, member.UserID)) { showDetial = true; } } else { showDetial = true; } if (showDetial) { sb.Append(string.Format(formatString, member.UserID, member.Username.Replace("\\", "\\\\").Replace("'", "\\'"), member.RoleSortOrder, member.IsInvisible.ToString().ToLower())); } else { sb.Append("i();"); } count++; if (count >= maxCount) { break; } } return(sb.ToString()); } else { return(""); } }
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="userID"></param> /// <param name="onlineMember"></param> /// <returns></returns> private bool RemoveOnlineMember(int userID, out OnlineMember onlineMember) { bool result = false; onlineMember = null; if (m_OnlineMemberTable.ContainsKey(userID)) { lock (m_OnlineMembers_Locker) { //OnlineMember onlineMember; if (m_OnlineMemberTable.TryGetValue(userID, out onlineMember)) { result = true; lock (onlineMember) { int oldForumID = onlineMember.ForumID; //-1表示其实已经被移除了 if (oldForumID == -1) { LogHelper.CreateDebugLog("线程安全问题1"); return false; } if (oldForumID != 0) { lock (GetForumOnlineMemberLocker(oldForumID)) { //从原来的版块移除 RemoveForumOnlineMember(oldForumID, onlineMember); } } onlineMember.ForumID = -1; m_OnlineMemberTable.Remove(userID); OnlineMemberCollection newOnlineMembers = new OnlineMemberCollection(m_OnlineMembers); newOnlineMembers.Remove(onlineMember); m_OnlineMembers = newOnlineMembers; } } } } 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 } }
public void ProcessRequest(System.Web.HttpContext context) { AuthUser my = User.Current; OnlineGuestCollection m_OnlineGuestList; OnlineMemberCollection m_onlineMembers; bool getGuest, getMember; getGuest = StringUtil.TryParse<bool>(context.Request.QueryString["guest"], false); getMember = StringUtil.TryParse<bool>(context.Request.QueryString["member"], false); int forumId = StringUtil.TryParse(context.Request.QueryString["forumid"], 0); if (ShowGuest && getGuest) { if (forumId == 0) { m_OnlineGuestList = OnlineUserPool.Instance.GetAllOnlineGuests(); } else { m_OnlineGuestList = OnlineUserPool.Instance.GetOnlineGuests(forumId); } } else { m_OnlineGuestList = new OnlineGuestCollection(); } if (ShowMember && getMember) { if (forumId == 0) { m_onlineMembers = OnlineUserPool.Instance.GetAllOnlineMembers(); } else { m_onlineMembers = OnlineUserPool.Instance.GetOnlineMembers(forumId); } } else { m_onlineMembers = new OnlineMemberCollection(); } int showCount = AllSettings.Current.OnlineSettings.ShowOnlineCount; int i = 0; StringBuilder JsResault = new StringBuilder("{"); int ipPart; if (AllSettings.Current.BackendPermissions.Can(my, BackendPermissions.Action.Setting_AccessLimit)) ipPart = int.MaxValue; else ipPart = AllSettings.Current.SiteSettings.ViewIPFields.GetValue(my); //if (my.IsManager&& my.CanLoginConsole) ipPart = 4; foreach (OnlineMember member in m_onlineMembers) { if (i >= showCount) break; i++; if (member.IsInvisible) { if (!AllSettings.Current.ManageUserPermissionSet.Can(my , ManageUserPermissionSet.ActionWithTarget.SeeInvisibleUserInfo, member.UserID)) { continue; } } JsResault.Append("\"").Append(member.ID) .Append("\":{"); JsResault.Append("action:'").Append(StringUtil.ToJavaScriptString(OnlineUserPool.Instance.ActionName(member.Action))).Append("',"); if (member.ForumID > 0) { JsResault.Append("forunID:").Append(member.ForumID).Append(","); JsResault.Append("forum:'").Append(member.ForumName).Append("',"); if (member.ThreadID > 0) { JsResault.Append("threadID:").Append(member.ThreadID).Append(","); JsResault.Append("thread:'").Append(StringUtil.ToJavaScriptString(member.ThreadSubject)).Append("',"); } } string ip = IPUtil.OutputIP(my, member.IP, ipPart); JsResault.Append("ip:'").Append(ip).Append("',"); JsResault.Append("area:'").Append(ipPart >= 4 ? member.Location : string.Empty).Append("',"); JsResault.Append("browser:'").Append(member.Browser).Append("',"); JsResault.Append("os:'").Append(member.Platform).Append("',"); JsResault.Append("createtime:'").Append(DateTimeUtil.FormatDateTime(my, member.CreateDate,false)).Append("',"); JsResault.Append("updatetime:'").Append(DateTimeUtil.FormatDateTime(my, member.UpdateDate,false)).Append("',"); JsResault.Append("hidden:").Append(member.IsInvisible ? "1" : "0"); JsResault.Append("},"); } foreach (OnlineGuest guest in m_OnlineGuestList) { if (i >= showCount) break; i++; JsResault.Append("\"" + guest.ID + "\":{"); JsResault.Append("action:'").Append(StringUtil.ToJavaScriptString(OnlineUserPool.Instance.ActionName(guest.Action))).Append("',"); if (guest.ForumID > 0) { JsResault.Append("forunID:").Append(guest.ForumID).Append(","); JsResault.Append("forum:'").Append(guest.ForumName).Append("',"); if (guest.ThreadID > 0) { JsResault.Append("threadID:").Append(guest.ThreadID).Append(","); JsResault.Append("thread:'").Append(StringUtil.ToJavaScriptString(guest.ThreadSubject)).Append("',"); } } string ip = IPUtil.OutputIP(my, guest.IP,ipPart); JsResault.Append("ip:'").Append(ip).Append("',"); JsResault.Append("area:'").Append(ipPart >= 4 ? guest.Location : string.Empty).Append("',"); JsResault.Append("browser:'").Append(guest.Browser).Append("',"); JsResault.Append("os:'").Append(guest.Platform).Append("',"); JsResault.Append("createtime:'").Append(DateTimeUtil.FormatDateTime(my, guest.CreateDate,false)).Append("',"); JsResault.Append("isSpider:").Append(guest.IsSpider ? "1," : "0,"); JsResault.Append("updatetime:'").Append(DateTimeUtil.FormatDateTime(my, guest.UpdateDate,false)).Append("'"); JsResault.Append("},"); } if (JsResault.Length > 1) JsResault.Remove(JsResault.Length - 1, 1); //删除最后的逗号 JsResault.Append("}"); context.Response.Clear(); context.Response.Write(JsResault.ToString()); context.Response.End(); }
protected string GetOnlineMemberScriptData(OnlineMemberCollection onlineMembers) { if (onlineMembers != null && onlineMembers.Count > 0) { StringBuilder sb = new StringBuilder(); string formatString = "m({0},'{1}',{2},{3});"; sb.Append(RoleScript); sb.Append(@" function m(userID,nickName,roleSortOrder,IsInvisible) { var logoUrl = roles[roleSortOrder][0]; var roleName = roles[roleSortOrder][1]; var tempHtml; if(IsInvisible) tempHtml=memberHTML2; else tempHtml=memberHTML; document.write(tempHtml.replace(/\[userID\]/g,userID).replace('{logoUrl}',logoUrl).replace('{roleName}',roleName).replace('{nickName}',nickName)); } function i() { document.write(invisibleHTML); } "); int maxCount = (OnlineSetting.ShowOnlineCount == 0 ? int.MaxValue : OnlineSetting.ShowOnlineCount); int count = 0; foreach (OnlineMember member in onlineMembers) { bool showDetial = false; if (member.IsInvisible) { if (AllSettings.Current.ManageUserPermissionSet.Can(My, ManageUserPermissionSet.ActionWithTarget.SeeInvisibleUserInfo, member.UserID)) { showDetial = true; } } else showDetial = true; if (showDetial) { sb.Append(string.Format(formatString, member.UserID, member.Username.Replace("\\", "\\\\").Replace("'", "\\'"), member.RoleSortOrder, member.IsInvisible.ToString().ToLower())); } else sb.Append("i();"); count++; if (count >= maxCount) break; } return sb.ToString(); } else return ""; }