diff --git a/pr/webhook/pull_request.go b/pr/webhook/pull_request.go index e1775b0..1f80d17 100644 --- a/pr/webhook/pull_request.go +++ b/pr/webhook/pull_request.go @@ -163,6 +163,16 @@ func (receiver *Receiver) handlePullRequest(body []byte) { } newLabels = append(newLabels, typeLabels...) + receiver.membersLock.RLock() + members := receiver.members + receiver.membersLock.RUnlock() + if members != nil { + _, exist := (*members)[*event.Sender.Login] + if exist { + newLabels = appendIfUnique(newLabels, "by: member") + } + } + err = receiver.githubClient.ReplaceLabels(owner, repo, number, newLabels) if err != nil { log.Println(err) diff --git a/pr/webhook/server.go b/pr/webhook/server.go index a36dae8..1e637e8 100644 --- a/pr/webhook/server.go +++ b/pr/webhook/server.go @@ -7,6 +7,8 @@ import ( "io/ioutil" "net/http" "strings" + "sync" + "time" "github.com/macports/mpbot-github/pr/db" "github.com/macports/mpbot-github/pr/githubapi" @@ -19,6 +21,8 @@ type Receiver struct { testing bool githubClient githubapi.Client dbHelper db.DBHelper + members *map[string]bool + membersLock sync.RWMutex } func NewReceiver(listenAddr string, hookSecret []byte, botSecret string, production bool, dbHelper db.DBHelper) *Receiver { @@ -71,9 +75,36 @@ func (receiver *Receiver) Start() { w.WriteHeader(http.StatusNoContent) }) + go receiver.updateMembers() + http.ListenAndServe(receiver.listenAddr, mux) } +func (receiver *Receiver) updateMembers() { + for ; ; time.Sleep(24 * time.Hour) { + users, err := receiver.githubClient.ListOrgMembers("macports") + if err != nil { + continue + } + members := make(map[string]bool) + for _, user := range users { + if user.Login == nil { + continue + } + login := *user.Login + if login == "" { + continue + } + members[login] = true + } + if len(members) > 0 { + receiver.membersLock.Lock() + receiver.members = &members + receiver.membersLock.Unlock() + } + } +} + // checkMAC reports whether messageMAC is a valid HMAC tag for message. func (receiver *Receiver) checkMAC(message, messageMAC []byte) bool { mac := hmac.New(sha1.New, receiver.hookSecret)