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); }
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)); }
private void notifyOnDiscussionEvent(DiscussionEvent e) { if (!_eventFilter.NeedSuppressEvent(e)) { BalloonText balloonText = getBalloonText(e); _trayIcon.ShowTooltipBalloon(balloonText); } }
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); } } } } } }
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()); } }
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); } }
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); } }