woodpecker/plugin/notify/notification.go

151 lines
3.2 KiB
Go
Raw Normal View History

2014-02-07 10:10:01 +00:00
package notify
import (
2014-10-02 14:04:32 +00:00
"bytes"
"fmt"
2014-08-03 21:45:50 +00:00
"log"
2014-10-02 14:04:32 +00:00
"net/http"
2014-08-03 21:45:50 +00:00
"github.com/drone/drone/plugin/notify/email"
2015-01-26 06:35:14 +00:00
"github.com/drone/drone/plugin/notify/flowdock"
"github.com/drone/drone/plugin/notify/github"
"github.com/drone/drone/plugin/notify/irc"
2014-12-12 11:30:52 +00:00
"github.com/drone/drone/plugin/notify/katoim"
"github.com/drone/drone/plugin/notify/webhook"
"github.com/drone/drone/shared/model"
2014-02-07 10:10:01 +00:00
)
type Sender interface {
Send(context *model.Request) error
2014-02-07 10:10:01 +00:00
}
// Notification stores the configuration details
// for notifying a user, or group of users,
// when their Build has completed.
type Notification struct {
2015-01-26 06:35:14 +00:00
Email *email.Email `yaml:"email,omitempty"`
Webhook *webhook.Webhook `yaml:"webhook,omitempty"`
Hipchat *Hipchat `yaml:"hipchat,omitempty"`
Irc *irc.IRC `yaml:"irc,omitempty"`
Slack *Slack `yaml:"slack,omitempty"`
Gitter *Gitter `yaml:"gitter,omitempty"`
Flowdock *flowdock.Flowdock `yaml:"flowdock,omitempty"`
KatoIM *katoim.KatoIM `yaml:"katoim,omitempty"`
Gitlab *Gitlab `yaml:"gitlab,omitempty"`
GitHub github.GitHub `yaml:"--"`
2014-02-07 10:10:01 +00:00
}
func (n *Notification) Send(context *model.Request) error {
2014-02-07 10:10:01 +00:00
// send email notifications
2014-08-03 21:45:50 +00:00
if n.Email != nil {
err := n.Email.Send(context)
if err != nil {
log.Println(err)
}
}
// send webhook notifications
2014-02-07 10:10:01 +00:00
if n.Webhook != nil {
2014-08-03 21:45:50 +00:00
err := n.Webhook.Send(context)
if err != nil {
log.Println(err)
}
2014-02-07 10:10:01 +00:00
}
2014-08-03 21:45:50 +00:00
// send hipchat notifications
2014-02-07 10:10:01 +00:00
if n.Hipchat != nil {
2014-08-03 21:45:50 +00:00
err := n.Hipchat.Send(context)
if err != nil {
log.Println(err)
}
2014-02-07 10:10:01 +00:00
}
2014-03-06 18:45:21 +00:00
// send irc notifications
if n.Irc != nil {
2014-08-03 21:45:50 +00:00
err := n.Irc.Send(context)
if err != nil {
log.Println(err)
}
2014-03-06 18:45:21 +00:00
}
2014-03-26 10:43:40 +00:00
// send slack notifications
if n.Slack != nil {
2014-08-03 21:45:50 +00:00
err := n.Slack.Send(context)
if err != nil {
log.Println(err)
}
2014-03-26 10:43:40 +00:00
}
2014-10-02 14:04:32 +00:00
// send gitter notifications
if n.Gitter != nil {
err := n.Gitter.Send(context)
if err != nil {
log.Println(err)
}
}
// send gitter notifications
if n.Flowdock != nil {
err := n.Flowdock.Send(context)
if err != nil {
log.Println(err)
}
}
2014-12-12 11:30:52 +00:00
// send kato-im notifications
if n.KatoIM != nil {
err := n.KatoIM.Send(context)
if err != nil {
log.Println(err)
}
}
// send Gitlab notifications
if n.Gitlab != nil {
err := n.Gitlab.Send(context)
if err != nil {
log.Println(err)
}
}
// send email notifications
// TODO (bradrydzewski) need to improve this code
githubStatus := new(github.GitHub)
if err := githubStatus.Send(context); err != nil {
log.Println(err)
}
2014-02-07 10:10:01 +00:00
return nil
}
2014-10-02 14:04:32 +00:00
func getBuildUrl(context *model.Request) string {
return fmt.Sprintf("%s/%s/%s/%s/%s/%s", context.Host, context.Repo.Host, context.Repo.Owner, context.Repo.Name, context.Commit.Branch, context.Commit.Sha)
}
// helper fuction to sent HTTP Post requests
// with JSON data as the payload.
func sendJson(url string, payload []byte, headers map[string]string) error {
2014-10-02 14:04:32 +00:00
client := &http.Client{}
buf := bytes.NewBuffer(payload)
req, err := http.NewRequest("POST", url, buf)
if err != nil {
return err
}
2014-10-02 14:04:32 +00:00
req.Header.Set("Content-Type", "application/json")
if headers != nil {
for k, v := range headers {
req.Header.Add(k, v)
}
}
resp, err := client.Do(req)
if err != nil {
return err
2014-10-02 14:04:32 +00:00
}
resp.Body.Close()
return nil
2014-10-02 14:04:32 +00:00
}