예제 #1
0
        void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry dbEntityEntry)
        {
            // Invalidates cache on entity changes
            var post = dbEntityEntry.Entity as ForumPost;

            if (dbEntityEntry.State != EntityState.Added && dbEntityEntry.State != EntityState.Modified)
            {
                return;
            }
            if (post != null)
            {
                MvcHtmlString dummy;
                cache.TryRemove(GetKey(post, true), out dummy);
                cache.TryRemove(GetKey(post, false), out dummy);
            }
            else
            {
                var news = dbEntityEntry.Entity as News;
                if (news != null)
                {
                    MvcHtmlString dummy;
                    cache.TryRemove(GetKey(news, true), out dummy);
                    cache.TryRemove(GetKey(news, false), out dummy);
                }
            }
        }
예제 #2
0
        void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry dbEntityEntry)
        {
            var post = dbEntityEntry.Entity as ForumPost;

            if (post != null && (dbEntityEntry.State == EntityState.Added || dbEntityEntry.State == EntityState.Modified))
            {
                IndexPost(post);
            }
        }
예제 #3
0
        private void ZkDataContextOnAfterEntityChange(object sender, ZkDataContext.EntityEntry entityEntry)
        {
            if (entityEntry.State == EntityState.Deleted || entityEntry.State == EntityState.Unchanged)
            {
                return;
            }

            var entity = entityEntry.Entity;

            if (entity is ForumPost && entityEntry.State == EntityState.Added)
            {
                // forum post got added, distribute to connected users
                var post            = (ForumPost)entity;
                var changedThreadID = post.ForumThreadID;

                using (var db = new ZkDataContext())
                {
                    var t = db.ForumThreads.Find(changedThreadID);
                    if (t != null)
                    {
                        var item = new ForumItem()
                        {
                            Time   = t.LastPost ?? t.Created,
                            Url    = $"{GlobalConst.BaseSiteUrl}/Forum/Thread/{t.ForumThreadID}",
                            Header = t.Title,
                            IsRead = false
                        };

                        foreach (var user in server.ConnectedUsers.Values.Where(x => x != null && x.IsLoggedIn))
                        {
                            var list     = GetCurrentForumList(user.User.AccountID);
                            var existing = list.ForumItems.FirstOrDefault(x => x.Url == item.Url);
                            if (existing != null)
                            {
                                existing.Header = item.Header;
                                existing.IsRead = post.AuthorAccountID == user.User.AccountID;
                                existing.Time   = item.Time;
                            }
                            else
                            {
                                list.ForumItems.Add(item);
                            }

                            list.ForumItems = list.ForumItems.OrderByDescending(x => x.Time).ToList();

                            user.SendCommand(list);
                        }
                    }
                }
            }
            else if (entity is ForumThreadLastRead)
            {
                // someone read some thread
                var changedAccountID = ((ForumThreadLastRead)entity).AccountID;
                var readThreadID     = ((ForumThreadLastRead)entity).ForumThreadID;


                var conus = server.ConnectedUsers.Values.FirstOrDefault(x => x != null && x.User.AccountID == changedAccountID && x.IsLoggedIn);
                if (conus != null)
                {
                    var list = GetCurrentForumList(changedAccountID);

                    if (list.ForumItems.Any(x => x.ThreadID == readThreadID)) // the thread is in top 10, update list
                    {
                        list = CachePrivateForumList(changedAccountID);
                        conus.SendCommand(list);
                    }
                }
            }
            else if (entity is ForumThread)
            {
                var thread = (ForumThread)entity;
                if (entityEntry.State == EntityState.Added) // thread added force refresh
                {
                    CachePublicForumList();
                }
                else
                {
                    var existing = cachedPublicForumList.ForumItems.FirstOrDefault(x => x.ThreadID == thread.ForumThreadID);
                    if (existing != null) // top 10 thread modified
                    {
                        if (existing.Time < thread.LastPost)
                        {
                            CachePublicForumList();                                  // it gotten a new post, update
                        }
                    }
                    else
                    {
                        if (thread.LastPost >= cachedPublicForumList.ForumItems.Min(x => (DateTime?)x.Time))
                        {
                            CachePublicForumList();                                                                                // its a modified post and its date belongs to top 10, update
                        }
                    }
                }
            }
        }