You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

github.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package httplistener
  2. import (
  3. "fmt"
  4. "github.com/spf13/viper"
  5. "gopkg.in/go-playground/webhooks.v5/github"
  6. "net/http"
  7. "strings"
  8. )
  9. func interestingIssueAction(action string) bool {
  10. switch action {
  11. case "opened", "closed", "reopened":
  12. return true
  13. }
  14. return false
  15. }
  16. func (hl *HTTPListener) githubHandler(w http.ResponseWriter, request *http.Request) {
  17. if request.Method != "POST" {
  18. http.NotFound(w, request)
  19. return
  20. }
  21. hook, err := github.New(github.Options.Secret(viper.GetString("http.listeners.github.secret")))
  22. if err != nil {
  23. return
  24. }
  25. // All valid events we want to receive need to be listed here.
  26. payload, err := hook.Parse(request,
  27. github.ReleaseEvent, github.PushEvent, github.IssuesEvent, github.IssueCommentEvent,
  28. github.PullRequestEvent)
  29. if err != nil {
  30. log.Errorf("Error parsing github webhook: %s", err)
  31. return
  32. }
  33. msgs := []string{}
  34. repo := ""
  35. send := false
  36. switch payload.(type) {
  37. case github.ReleasePayload:
  38. pl := payload.(github.ReleasePayload)
  39. if pl.Action == "published" {
  40. send = true
  41. msgs, err = hl.renderTemplate("github.release", payload)
  42. repo = pl.Repository.Name
  43. }
  44. case github.PushPayload:
  45. pl := payload.(github.PushPayload)
  46. send = true
  47. msgs, err = hl.renderTemplate("github.push", payload)
  48. repo = pl.Repository.Name
  49. case github.IssuesPayload:
  50. pl := payload.(github.IssuesPayload)
  51. if interestingIssueAction(pl.Action) {
  52. send = true
  53. msgs, err = hl.renderTemplate("github.issue", payload)
  54. repo = pl.Repository.Name
  55. }
  56. case github.IssueCommentPayload:
  57. pl := payload.(github.IssueCommentPayload)
  58. if pl.Action == "created" {
  59. send = true
  60. msgs, err = hl.renderTemplate("github.issuecomment", payload)
  61. repo = pl.Repository.Name
  62. }
  63. case github.PullRequestPayload:
  64. pl := payload.(github.PullRequestPayload)
  65. if interestingIssueAction(pl.Action) {
  66. send = true
  67. msgs, err = hl.renderTemplate("github.pullrequest", payload)
  68. repo = pl.Repository.Name
  69. }
  70. }
  71. if err != nil {
  72. log.Errorf("Error rendering GitHub event template: %s", err)
  73. return
  74. }
  75. if send {
  76. repo = strings.ToLower(repo)
  77. channel := viper.GetString(fmt.Sprintf("http.listeners.github.repositories.%s", repo))
  78. if channel == "" {
  79. channel = viper.GetString("http.listeners.github.default_channel")
  80. }
  81. if channel == "" {
  82. log.Infof("%s GitHub event for unrecognised repository %s", request.RemoteAddr, repo)
  83. return
  84. }
  85. log.Infof("%s [%s -> %s] GitHub event received", request.RemoteAddr, repo, channel)
  86. for _, msg := range msgs {
  87. hl.irc.Privmsgf(channel, msg)
  88. }
  89. }
  90. }