Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

github.go 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. // This usually happens because we've received an event we don't need to handle.
  31. log.Warningf("Error parsing github webhook: %s", err)
  32. return
  33. }
  34. msgs := []string{}
  35. repo := ""
  36. send := false
  37. switch payload.(type) {
  38. case github.ReleasePayload:
  39. pl := payload.(github.ReleasePayload)
  40. if pl.Action == "published" {
  41. send = true
  42. msgs, err = hl.renderTemplate("github.release", payload)
  43. repo = pl.Repository.Name
  44. }
  45. case github.PushPayload:
  46. pl := payload.(github.PushPayload)
  47. send = true
  48. msgs, err = hl.renderTemplate("github.push", payload)
  49. repo = pl.Repository.Name
  50. case github.IssuesPayload:
  51. pl := payload.(github.IssuesPayload)
  52. if interestingIssueAction(pl.Action) {
  53. send = true
  54. msgs, err = hl.renderTemplate("github.issue", payload)
  55. repo = pl.Repository.Name
  56. }
  57. case github.IssueCommentPayload:
  58. pl := payload.(github.IssueCommentPayload)
  59. if pl.Action == "created" {
  60. send = true
  61. msgs, err = hl.renderTemplate("github.issuecomment", payload)
  62. repo = pl.Repository.Name
  63. }
  64. case github.PullRequestPayload:
  65. pl := payload.(github.PullRequestPayload)
  66. if interestingIssueAction(pl.Action) {
  67. send = true
  68. msgs, err = hl.renderTemplate("github.pullrequest", payload)
  69. repo = pl.Repository.Name
  70. }
  71. }
  72. if err != nil {
  73. log.Errorf("Error rendering GitHub event template: %s", err)
  74. return
  75. }
  76. if send {
  77. repo = strings.ToLower(repo)
  78. channel := viper.GetString("http.listeners.github.default_channel")
  79. if channel == "" {
  80. channel = viper.GetString(fmt.Sprintf("http.listeners.github.repositories.%s", repo))
  81. }
  82. if channel == "" {
  83. log.Infof("%s GitHub event for unrecognised repository %s", request.RemoteAddr, repo)
  84. return
  85. }
  86. log.Infof("%s [%s -> %s] GitHub event received", request.RemoteAddr, repo, channel)
  87. for _, msg := range msgs {
  88. hl.irc.Privmsgf(channel, msg)
  89. }
  90. }
  91. }