예제 #1
0
        void ProcessDbUser(DbUser record)
        {
            var         eventCollector = new YamsterModelEventCollector();
            YamsterUser user           = this.FetchUserById(record.UserId, eventCollector);

            user.DbUser = record;
            eventCollector.NotifyAfterUpdate(user);
            eventCollector.FireEvents();
        }
예제 #2
0
        internal YamsterUser FetchUserById(long userId, YamsterModelEventCollector eventCollector)
        {
            YamsterUser user = this.GetUserById(userId, nullIfMissing: true);

            if (user == null)
            {
                user = new YamsterUser(userId, this);
                this.usersById.Add(userId, user);
                eventCollector.NotifyAfterAdd(user);
            }
            return(user);
        }
예제 #3
0
        internal void AddUser(YamsterUser user)
        {
            int foundIndex = users.BinarySearch(user, userComparer);

            if (foundIndex >= 0)
            {
                return; // already in list
            }
            users.Insert(~foundIndex, user);

            hashCode       = ((hashCode << 5) + hashCode) ^ user.UserId.GetHashCode();
            cachedToString = null;
        }
예제 #4
0
        public YamsterUser GetUserById(long userId, bool nullIfMissing = false)
        {
            YamsterUser user = null;

            if (!this.usersById.TryGetValue(userId, out user))
            {
                if (!nullIfMissing)
                {
                    throw new KeyNotFoundException("The user ID " + userId + " was not found");
                }
            }
            return(user);
        }
예제 #5
0
 public YamsterUserChangedEventArgs(YamsterUser user, YamsterModelChangeType changeType)
     : base(changeType)
 {
     this.User = user;
 }
예제 #6
0
 public static YamsterNewMessage CreatePrivateConversation(YamsterCache yamsterCache, YamsterUser user)
 {
     return(CreatePrivateConversation(yamsterCache, new YamsterUser[] { user }));
 }
예제 #7
0
        internal void SetDbMessage(DbMessage newValue, YamsterModelEventCollector eventCollector)
        {
            if (newValue == null)
            {
                throw new ArgumentNullException("DbMessage");
            }
            if (newValue.MessageId != messageId)
            {
                throw new ArgumentException("Cannot change ID");
            }

            var oldValue = this.dbMessage;

            this.dbMessage         = newValue;
            this.cachedPreviewText = null;

            this.group      = this.YamsterCache.FetchGroupById(this.dbMessage.GroupId, eventCollector);
            this.senderUser = this.YamsterCache.FetchUserById(this.dbMessage.SenderUserId, eventCollector);

            this.messageRepliedTo = null;
            if (this.dbMessage.MessageIdRepliedTo != 0
                // The Yammer UI doesn't show "in reply to" when messageRepliedTo is the threadstarter.
                // TODO: What does it do if the threadstarter's MessageId != ThreadId?
                && this.dbMessage.MessageIdRepliedTo != this.dbMessage.ThreadId)
            {
                this.YamsterCache.ListenForMessageById(
                    this.dbMessage.MessageIdRepliedTo,
                    this,
                    eventCollector,
                    delegate(YamsterMessage listenedMessage, YamsterModelEventCollector ec)
                {
                    if (listenedMessage.MessageId == this.dbMessage.MessageIdRepliedTo)
                    {
                        this.messageRepliedTo = listenedMessage;
                        ec.NotifyAfterUpdate(this);
                    }
                }
                    );
            }

            int oldlikingUsersCount = likingUsers.Count;

            likingUsers.Clear();
            foreach (long userId in this.dbMessage.LikingUserIds)
            {
                var user = this.YamsterCache.FetchUserById(userId, eventCollector);
                likingUsers.AddUser(user);
            }

            if (this.thread != null)
            {
                int totalLikesCountDelta = newValue.LikesCount - oldValue.LikesCount;
                if (totalLikesCountDelta != 0)
                {
                    this.thread.NotifyTotalLikesChanged(totalLikesCountDelta, eventCollector);
                }
            }

            notifiedUsers.Clear();
            foreach (long userId in this.dbMessage.NotifiedUserIds)
            {
                var user = this.YamsterCache.FetchUserById(userId, eventCollector);
                notifiedUsers.AddUser(user);
            }

            UpdateLoadedStatus();

            eventCollector.NotifyAfterUpdate(this);
        }