|
|
|
package notifications
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
shoutrrrDisco "github.com/containrrr/shoutrrr/pkg/services/discord"
|
|
|
|
shoutrrrSlack "github.com/containrrr/shoutrrr/pkg/services/slack"
|
|
|
|
t "github.com/containrrr/watchtower/pkg/types"
|
|
|
|
"github.com/johntdyer/slackrus"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
slackType = "slack"
|
|
|
|
)
|
|
|
|
|
|
|
|
type slackTypeNotifier struct {
|
|
|
|
slackrus.SlackrusHook
|
|
|
|
}
|
|
|
|
|
|
|
|
func newSlackNotifier(c *cobra.Command, acceptedLogLevels []log.Level) t.ConvertibleNotifier {
|
|
|
|
flags := c.PersistentFlags()
|
|
|
|
|
|
|
|
hookURL, _ := flags.GetString("notification-slack-hook-url")
|
|
|
|
userName, _ := flags.GetString("notification-slack-identifier")
|
|
|
|
channel, _ := flags.GetString("notification-slack-channel")
|
|
|
|
emoji, _ := flags.GetString("notification-slack-icon-emoji")
|
|
|
|
iconURL, _ := flags.GetString("notification-slack-icon-url")
|
|
|
|
|
|
|
|
n := &slackTypeNotifier{
|
|
|
|
SlackrusHook: slackrus.SlackrusHook{
|
|
|
|
HookURL: hookURL,
|
|
|
|
Username: userName,
|
|
|
|
Channel: channel,
|
|
|
|
IconEmoji: emoji,
|
|
|
|
IconURL: iconURL,
|
|
|
|
AcceptedLevels: acceptedLogLevels,
|
|
|
|
},
|
|
|
|
}
|
|
|
|
return n
|
|
|
|
}
|
|
|
|
|
|
|
|
func (s *slackTypeNotifier) GetURL(c *cobra.Command, title string) (string, error) {
|
|
|
|
trimmedURL := strings.TrimRight(s.HookURL, "/")
|
|
|
|
trimmedURL = strings.TrimPrefix(trimmedURL, "https://")
|
|
|
|
parts := strings.Split(trimmedURL, "/")
|
|
|
|
|
|
|
|
if parts[0] == "discord.com" || parts[0] == "discordapp.com" {
|
|
|
|
log.Debug("Detected a discord slack wrapper URL, using shoutrrr discord service")
|
|
|
|
conf := &shoutrrrDisco.Config{
|
|
|
|
WebhookID: parts[len(parts)-3],
|
|
|
|
Token: parts[len(parts)-2],
|
|
|
|
Color: ColorInt,
|
|
|
|
Title: title,
|
|
|
|
SplitLines: true,
|
|
|
|
Username: s.Username,
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.IconURL != "" {
|
|
|
|
conf.Avatar = s.IconURL
|
|
|
|
}
|
|
|
|
|
|
|
|
return conf.GetURL().String(), nil
|
|
|
|
}
|
|
|
|
|
|
|
|
webhookToken := strings.Replace(s.HookURL, "https://hooks.slack.com/services/", "", 1)
|
|
|
|
|
|
|
|
conf := &shoutrrrSlack.Config{
|
|
|
|
BotName: s.Username,
|
|
|
|
Color: ColorHex,
|
|
|
|
Channel: "webhook",
|
|
|
|
Title: title,
|
|
|
|
}
|
|
|
|
|
|
|
|
if s.IconURL != "" {
|
|
|
|
conf.Icon = s.IconURL
|
|
|
|
} else if s.IconEmoji != "" {
|
|
|
|
conf.Icon = s.IconEmoji
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := conf.Token.SetFromProp(webhookToken); err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
return conf.GetURL().String(), nil
|
|
|
|
}
|