Пример #1
0
        private void onDiscussionParserEvent(UserEvents.DiscussionEvent e,
                                             DateTime eventTimestamp, DiscussionUpdateType type)
        {
            switch (type)
            {
            case DiscussionUpdateType.InitialSnapshot:
                // Don't send out any notifications on initial snapshot, e.g. when just connected to host
                // because we don't want to notify about all old events
                return;

            case DiscussionUpdateType.NewMergeRequest:
                // Notify about whatever is found in a new merge request
                DiscussionEvent?.Invoke(e);
                return;

            case DiscussionUpdateType.PeriodicUpdate:
                // Notify about new events in merge requests that are cached already
                if (_cachedDiscussions.TryGetValue(e.MergeRequestKey, out CachedDiscussions cached) &&
                    cached.PrevTimeStamp.HasValue && eventTimestamp > cached.PrevTimeStamp.Value)
                {
                    DiscussionEvent?.Invoke(e);
                }
                return;
            }

            Debug.Assert(false);
        }
Пример #2
0
        internal bool NeedSuppressEvent(DiscussionEvent e)
        {
            if (_currentUser == null || _mergeRequestCache == null)
            {
                Debug.Assert(false);
                return(false);
            }

            MergeRequest mergeRequest = _mergeRequestCache.GetMergeRequest(e.MergeRequestKey);

            if (mergeRequest == null)
            {
                return(true);
            }

            if (e.EventType == DiscussionEvent.Type.MentionedCurrentUser)
            {
                // `on mention` is a special case which should work disregarding to the _mergeRequestFilter
                return
                    ((isCurrentUserActivity(_currentUser, e) && !_settings.Notifications_MyActivity) ||
                     (isServiceEvent(e) && !_settings.Notifications_Service) ||
                     !_settings.Notifications_OnMention);
            }

            return(!_mergeRequestFilter.DoesMatchFilter(mergeRequest) ||
                   (isServiceEvent(e) && !_settings.Notifications_Service) ||
                   (isCurrentUserActivity(_currentUser, e) && !_settings.Notifications_MyActivity) ||
                   (e.EventType == DiscussionEvent.Type.ResolvedAllThreads && !_settings.Notifications_AllThreadsResolved) ||
                   (e.EventType == DiscussionEvent.Type.Keyword && !_settings.Notifications_Keywords));
        }
Пример #3
0
 private void notifyOnDiscussionEvent(DiscussionEvent e)
 {
     if (!_eventFilter.NeedSuppressEvent(e))
     {
         BalloonText balloonText = getBalloonText(e);
         _trayIcon.ShowTooltipBalloon(balloonText);
     }
 }
Пример #4
0
        private void onDiscussionsLoaded(MergeRequestKey mrk, IEnumerable <Discussion> discussions,
                                         DiscussionUpdateType type)
        {
            if (discussions.Count() == 0)
            {
                return;
            }

            foreach (Discussion discussion in discussions)
            {
                foreach (DiscussionNote note in discussion.Notes)
                {
                    if (note.System && note.Body == "resolved all threads")
                    {
                        DiscussionEvent?.Invoke(new UserEvents.DiscussionEvent(
                                                    mrk, UserEvents.DiscussionEvent.Type.ResolvedAllThreads,
                                                    note.Author),
                                                note.Updated_At, type);
                    }
                    else if (note.System && note.Body == "approved this merge request")
                    {
                        DiscussionEvent?.Invoke(new UserEvents.DiscussionEvent(
                                                    mrk, UserEvents.DiscussionEvent.Type.ApprovalStatusChange,
                                                    new UserEvents.DiscussionEvent.ApprovalStatusChangeDescription(true, note.Author)),
                                                note.Updated_At, type);
                    }
                    else if (note.System && note.Body == "unapproved this merge request")
                    {
                        DiscussionEvent?.Invoke(new UserEvents.DiscussionEvent(
                                                    mrk, UserEvents.DiscussionEvent.Type.ApprovalStatusChange,
                                                    new UserEvents.DiscussionEvent.ApprovalStatusChangeDescription(false, note.Author)),
                                                note.Updated_At, type);
                    }
                    else if (Helpers.IsUserMentioned(note.Body, _currentUser))
                    {
                        DiscussionEvent?.Invoke(new UserEvents.DiscussionEvent(
                                                    mrk, UserEvents.DiscussionEvent.Type.MentionedCurrentUser,
                                                    note.Author),
                                                note.Updated_At, type);
                    }
                    else if (_keywords != null)
                    {
                        foreach (string keyword in _keywords)
                        {
                            if (note.Body.Trim().StartsWith(keyword, StringComparison.CurrentCultureIgnoreCase))
                            {
                                DiscussionEvent?.Invoke(new UserEvents.DiscussionEvent(
                                                            mrk, UserEvents.DiscussionEvent.Type.Keyword,
                                                            new UserEvents.DiscussionEvent.KeywordDescription(keyword, note.Author)),
                                                        note.Updated_At, type);
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
        private BalloonText getBalloonText(DiscussionEvent e)
        {
            MergeRequest mergeRequest = _dataCache?.MergeRequestCache?.GetMergeRequest(e.MergeRequestKey);
            string       projectName  = getProjectName(e.MergeRequestKey.ProjectKey);
            string       title        = String.Format("{0}: Discussion Event", projectName);

            switch (e.EventType)
            {
            case DiscussionEvent.Type.ResolvedAllThreads:
                return(new BalloonText
                       (
                           title,
                           String.Format("All discussions resolved in merge request \"{0}\"{1}",
                                         mergeRequest != null ? mergeRequest.Title : e.MergeRequestKey.IId.ToString(),
                                         mergeRequest != null ? " from " + mergeRequest.Author.Name : String.Empty)
                       ));

            case DiscussionEvent.Type.MentionedCurrentUser:
                User author = (User)e.Details;
                return(new BalloonText
                       (
                           title,
                           String.Format("{0} mentioned you in a discussion of merge request \"{1}\"",
                                         author.Name,
                                         mergeRequest != null ? mergeRequest.Title : e.MergeRequestKey.IId.ToString())
                       ));

            case DiscussionEvent.Type.Keyword:
                DiscussionEvent.KeywordDescription kd = (DiscussionEvent.KeywordDescription)e.Details;
                return(new BalloonText
                       (
                           title,
                           String.Format("{0} said \"{1}\" in merge request \"{2}\"",
                                         kd.Author.Name, kd.Keyword,
                                         mergeRequest != null ? mergeRequest.Title : e.MergeRequestKey.IId.ToString())
                       ));

            case DiscussionEvent.Type.ApprovalStatusChange:
                DiscussionEvent.ApprovalStatusChangeDescription asd =
                    (DiscussionEvent.ApprovalStatusChangeDescription)e.Details;
                return(new BalloonText
                       (
                           title,
                           String.Format("{0} {1} merge request \"{2}\"",
                                         asd.Author.Name, asd.IsApproved ? "approved" : "unapproved",
                                         mergeRequest != null ? mergeRequest.Title : e.MergeRequestKey.IId.ToString())
                       ));

            default:
                Debug.Assert(false);
                return(new BalloonText());
            }
        }
Пример #6
0
        private static bool isCurrentUserActivity(User currentUser, DiscussionEvent e)
        {
            switch (e.EventType)
            {
            case DiscussionEvent.Type.ResolvedAllThreads:
                return(((User)e.Details).Id == currentUser.Id);

            case DiscussionEvent.Type.MentionedCurrentUser:
                return(((User)e.Details).Id == currentUser.Id);

            case DiscussionEvent.Type.Keyword:
                return(((DiscussionEvent.KeywordDescription)e.Details).Author.Id == currentUser.Id);

            default:
                Debug.Assert(false);
                return(false);
            }
        }
Пример #7
0
        private static bool isServiceEvent(DiscussionEvent e)
        {
            switch (e.EventType)
            {
            case DiscussionEvent.Type.ResolvedAllThreads:
                return(((User)e.Details).Username == Program.ServiceManager.GetServiceMessageUsername());

            case DiscussionEvent.Type.MentionedCurrentUser:
                return(((User)e.Details).Username == Program.ServiceManager.GetServiceMessageUsername());

            case DiscussionEvent.Type.Keyword:
                return(((DiscussionEvent.KeywordDescription)e.Details).Author.Username ==
                       Program.ServiceManager.GetServiceMessageUsername());

            default:
                Debug.Assert(false);
                return(false);
            }
        }