Exemple #1
0
        /// <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;
            }
        }
Exemple #2
0
        /// <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;
            }
        }
Exemple #3
0
        /// <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;
            }
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        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();
        }
Exemple #6
0
        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("");
            }
        }
Exemple #7
0
        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
            }


        }
Exemple #8
0
        /// <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;
        }
Exemple #9
0
        /// <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;
            }
        }
Exemple #10
0
        /// <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;
            }
        }
Exemple #11
0
        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
            }
        }
Exemple #12
0
        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();
        }
Exemple #13
0
        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 "";
        }