slack-bot/pkg/notify/slack.go

71 lines
1.5 KiB
Go

package notify
import (
"context"
"fmt"
"log"
"github.com/slack-go/slack"
)
type SlackContextKey string
const (
slackHookBaseURL = "hooks.slack.com/services"
DryRunContextKey SlackContextKey = "dryRun"
)
//Notifier interface represent mean to send notification
type Notifier interface {
Notify(message string)
}
//Message store and represent alerting message
type Message struct {
ShouldNotify bool
Content string
}
type SlackNotifier struct {
BotID string
DestChannelID string
WebhookID string
}
//NewSlackNotifier create slack notifier
func NewSlackNotifier(BotID, DestChannelID, WebhookID string) *SlackNotifier {
return &SlackNotifier{
BotID: BotID,
DestChannelID: DestChannelID,
WebhookID: WebhookID,
}
}
//Notify send notification to channel
func (sn *SlackNotifier) Notify(ctx context.Context, messages ...Message) {
shouldNotify := false
var content string
for _, message := range messages {
if message.ShouldNotify {
shouldNotify = true
content = fmt.Sprintf("%s\n%s", content, message.Content)
}
}
if shouldNotify {
msg := &slack.WebhookMessage{
Text: content,
}
url := fmt.Sprintf("https://%s/%s/%s/%s", slackHookBaseURL, sn.BotID, sn.DestChannelID, sn.WebhookID)
if v := ctx.Value(DryRunContextKey); v != nil && v == true {
log.Printf("dryrun mode : slack notify to %s\n", url)
log.Printf("dryrun mode : %+v\n", msg)
} else {
err := slack.PostWebhook(url, msg)
if err != nil {
log.Printf("Send message error %+v", err)
}
}
}
}