You've already forked mpbot-github
mirror of
https://github.com/macports/mpbot-github.git
synced 2026-03-31 14:46:03 -07:00
100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
package webhook
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"regexp"
|
|
"strconv"
|
|
|
|
"github.com/google/go-github/v28/github"
|
|
)
|
|
|
|
func (receiver *Receiver) handleOtherPullRequestEvents(eventType string, body []byte) {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
log.Println(r)
|
|
}
|
|
|
|
if !receiver.testing {
|
|
receiver.wg.Done()
|
|
}
|
|
}()
|
|
|
|
var number int
|
|
var sender string
|
|
|
|
switch eventType {
|
|
case "pull_request_review":
|
|
event := &github.PullRequestReviewEvent{}
|
|
err := json.Unmarshal(body, event)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
number = *event.PullRequest.Number
|
|
sender = *event.Sender.Login
|
|
case "issue_comment":
|
|
event := &github.IssueCommentEvent{}
|
|
err := json.Unmarshal(body, event)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
receiver.membersLock.RLock()
|
|
members := receiver.members
|
|
receiver.membersLock.RUnlock()
|
|
if members != nil {
|
|
_, isMember := (*members)[*event.Sender.Login]
|
|
if isMember {
|
|
body := *event.Comment.Body
|
|
if botMentioned, _ := regexp.MatchString(`@macportsbot\s`, body); botMentioned { // TODO: read bot user from ENV
|
|
if doRetry, _ := regexp.MatchString(`@macportsbot\s+retry`, body); doRetry { // TODO: test compile patterns
|
|
pr, err := receiver.githubClient.GetPullRequest(*event.Repo.Owner.Login, *event.Repo.Name, *event.Issue.Number)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
fakeEvent := &github.PullRequestEvent{
|
|
Action: ptrOfStr("opened"),
|
|
Number: event.Issue.Number,
|
|
Repo: event.Repo,
|
|
Sender: event.Issue.User,
|
|
PullRequest: pr,
|
|
}
|
|
receiver.processPullRequest(fakeEvent)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
number = *event.Issue.Number
|
|
sender = *event.Sender.Login
|
|
default:
|
|
return
|
|
}
|
|
|
|
pr, err := receiver.dbHelper.GetPR(number)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
if !pr.Processed {
|
|
return
|
|
}
|
|
if !pr.PendingReview {
|
|
return
|
|
}
|
|
isOneMaintainer := false
|
|
for _, maintainer := range pr.Maintainers {
|
|
if maintainer == sender {
|
|
isOneMaintainer = true
|
|
}
|
|
}
|
|
if isOneMaintainer {
|
|
log.Println("Maintainer responded in PR #" + strconv.Itoa(pr.Number))
|
|
receiver.dbHelper.SetPRPendingReview(number, false)
|
|
}
|
|
}
|