private static CiEvent ConvertToCiEvent2019(Microsoft.TeamFoundation.Build2.Server.BuildData build)
        {
            TfsBuildInfo buildInfo = new TfsBuildInfo(build.Id.ToString(), build.BuildNumber, build.ProjectId.ToString(), build.Definition.Id.ToString());

            bool isManualCause = Microsoft.TeamFoundation.Build2.Server.BuildReason.Manual.Equals(build.Reason);
            var  ciEvent       = createEvent(buildInfo, build.Definition.Name, isManualCause, build.StartTime, build.FinishTime);

            if (build.Result.HasValue)
            {
                switch (build.Result)
                {
                case Microsoft.TeamFoundation.Build2.Server.BuildResult.Succeeded:
                    ciEvent.BuildResult = CiBuildResult.Success;
                    break;

                case Microsoft.TeamFoundation.Build2.Server.BuildResult.Failed:
                    ciEvent.BuildResult = CiBuildResult.Failure;
                    break;

                case Microsoft.TeamFoundation.Build2.Server.BuildResult.Canceled:
                    ciEvent.BuildResult = CiBuildResult.Aborted;
                    break;

                case Microsoft.TeamFoundation.Build2.Server.BuildResult.PartiallySucceeded:
                    ciEvent.BuildResult = CiBuildResult.Unstable;
                    break;

                default:
                    ciEvent.BuildResult = CiBuildResult.Unavailable;
                    break;
                }
            }

            return(ciEvent);
        }
        public EventNotificationStatus ProcessEvent(IVssRequestContext requestContext, NotificationType notificationType,
                                                    object notificationEventArgs, out int statusCode, out string statusMessage,
                                                    out Microsoft.TeamFoundation.Common.ExceptionPropertyCollection properties)
        {
            //Log.Info($"ProcessEvent {notificationEventArgs.GetType().Name} - {notificationEventArgs.ToString()}");
            //Log.Info(JsonHelper.SerializeObject(notificationEventArgs, true));
            statusCode    = 0;
            properties    = null;
            statusMessage = String.Empty;
            try
            {
#if Package2019
                if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildEventBase)
                {
                    Microsoft.TeamFoundation.Build2.Server.BuildData build = (Microsoft.TeamFoundation.Build2.Server.BuildData)((Microsoft.TeamFoundation.Build2.Server.BuildEventBase)notificationEventArgs).Build;
                    Log.Info($"ProcessEvent {notificationEventArgs.GetType().Name} for project {build.ProjectId}, status: {build.Status}, BuildNumber: {build.BuildNumber}, DefinitionName: {build.Definition.Name}, DefinitionId: {build.Definition.Id}");
                    CiEvent ciEvent = ConvertToCiEvent2019(build);
                    if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildStartedEvent)
                    {
                        ciEvent.EventType = CiEventType.Started;
                        _pluginManager.GeneralEventsQueue.Add(ciEvent);
                    }
                    else if (notificationEventArgs is Microsoft.TeamFoundation.Build2.Server.BuildCompletedEvent)
                    {
                        ciEvent.EventType = CiEventType.Finished;
                        _pluginManager.HandleFinishEvent(ciEvent);
                    }
                }
#endif
            }
            catch (Exception e)
            {
                var msg = $"ProcessEvent {notificationEventArgs.GetType().Name} failed {e.Message}";
                Log.Error(msg, e);
            }
            return(EventNotificationStatus.ActionPermitted);
        }