Esempio n. 1
0
        protected async Task <EventHandlerResult> processComment(ICommentPayload <T> webhookPayload)
        {
            var gradeCommand = new GradeCommentParser(webhookPayload.CommentBody);

            if (gradeCommand.IsMatch)
            {
                if (!await isAllowed(webhookPayload))
                {
                    return(await handleUserNotAllowed(webhookPayload));
                }

                var pr = await getPullRequest(webhookPayload);

                if (pr == null)
                {
                    return(await handleNotPr(webhookPayload));
                }

                await handleApprove(webhookPayload, pr);
                await handleStoreGrade(webhookPayload, gradeCommand, pr);

                await handleReaction(webhookPayload, ReactionType.Plus1);

                return(EventHandlerResult.ActionPerformed($"comment operation to grade done; grades: {string.Join(" ", gradeCommand.Grades)}"));
            }
            else
            {
                return(EventHandlerResult.NoActionNeeded("not recognized as command"));
            }
        }
Esempio n. 2
0
        private async Task handleStoreGrade(ICommentPayload <T> webhookPayload, GradeCommentParser gradeCommand, PullRequest pr)
        {
            var neptun = await getNeptun(webhookPayload.Repository.Id, pr.Head.Ref);

            Logger.LogInformation($"storing grades for {neptun}");
            if (gradeCommand.HasGrades)
            {
                await gradeStore.StoreGrade(
                    neptun : neptun,
                    repository : webhookPayload.Repository.FullName,
                    prNumber : pr.Number,
                    prUrl : pr.HtmlUrl,
                    actor : webhookPayload.CommentingUser,
                    origin : webhookPayload.CommentHtmlUrl,
                    results : gradeCommand.Grades);
            }
            else
            {
                await gradeStore.ConfirmAutoGrade(
                    neptun : neptun,
                    repository : webhookPayload.Repository.FullName,
                    prNumber : pr.Number,
                    prUrl : pr.HtmlUrl,
                    actor : webhookPayload.CommentingUser,
                    origin : webhookPayload.CommentHtmlUrl);
            }
        }
Esempio n. 3
0
        private async Task <EventHandlerResult> handleUserNotAllowed(ICommentPayload <T> webhookPayload)
        {
            await handleReaction(webhookPayload, ReactionType.Confused);

            var comment = WarningText.Replace("{}", webhookPayload.CommentingUser, StringComparison.OrdinalIgnoreCase);
            await GitHubClient.Issue.Comment.Create(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, comment);

            return(EventHandlerResult.ActionPerformed("comment operation to grade not allowed for user"));
        }
Esempio n. 4
0
 protected async Task <PullRequest> getPullRequest(ICommentPayload <T> webhookPayload)
 {
     try
     {
         return(await GitHubClient.PullRequest.Get(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber));
     }
     catch (NotFoundException)
     {
         return(null);
     }
 }
        protected override Task handleReaction(ICommentPayload <PullRequestReviewEventPayload> webhookPayload, ReactionType reactionType)
        {
            // The implementation below does not work, GitHub API returns an error indicating that the resource is not available for the GitHub App
            // According to documentation "pull request" read/write permission should be enough to add the reaction, but it seems insufficient.
            return(Task.CompletedTask);

            /*
             * // discrepancy in the Octokit library regarding long-int ids
             * if (webhookPayload.Payload.Review.Id > int.MaxValue)
             *  return Task.CompletedTask;
             *
             * return GitHubClient.Reaction.PullRequestReviewComment.Create(webhookPayload.Repository.Id, (int)webhookPayload.Payload.Review.Id, new NewReaction(reactionType));
             */
        }
Esempio n. 6
0
        private Task <bool> isAllowed(ICommentPayload <T> webhookPayload)
        {
            if (webhookPayload.Repository.Owner.Type != AccountType.Organization)
            {
                return(Task.FromResult(false));
            }

            return(isOrgMemberCache.GetOrCreateAsync(
                       key: $"githubisorgmember{webhookPayload.Repository.Owner.Login}{webhookPayload.CommentingUser}",
                       factory: async cacheEntry =>
            {
                var isMember = await getIsUserOrgMember(webhookPayload.Repository.Owner.Login, webhookPayload.CommentingUser);
                cacheEntry.SetValue(isMember);
                cacheEntry.SetAbsoluteExpiration(TimeSpan.FromHours(1));
                return isMember;
            }));
        }
Esempio n. 7
0
        private async Task handleApprove(ICommentPayload <T> webhookPayload, PullRequest pr)
        {
            bool shouldMergePr = pr.State.Value == ItemState.Open && pr.Mergeable == true;

            if (shouldMergePr)
            {
                Logger.LogInformation("PR is being merged");
                await GitHubClient.PullRequest.Review.Create(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, new PullRequestReviewCreate()
                {
                    Event = PullRequestReviewEvent.Approve
                });

                await GitHubClient.PullRequest.Merge(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, new MergePullRequest());
            }
            else
            {
                Logger.LogInformation("PR is not mergable");
            }
        }
Esempio n. 8
0
 protected abstract Task handleReaction(ICommentPayload <T> webhookPayload, ReactionType reactionType);
Esempio n. 9
0
        private async Task <EventHandlerResult> handleNotPr(ICommentPayload <T> webhookPayload)
        {
            await handleReaction(webhookPayload, ReactionType.Confused);

            return(EventHandlerResult.ActionPerformed("comment operation to grade not called for PR"));
        }
 protected override Task handleReaction(ICommentPayload <IssueCommentPayload> webhookPayload, ReactionType reactionType)
 => GitHubClient.Reaction.IssueComment.Create(webhookPayload.Repository.Id, webhookPayload.Payload.Comment.Id, new NewReaction(reactionType));