notification-controller/internal/notifier/lark.go

114 lines
2.1 KiB
Go

package notifier
import (
"context"
"fmt"
"net/url"
"strings"
eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1"
)
type Lark struct {
URL string
}
type LarkPayload struct {
MsgType string `json:"msg_type"`
Card LarkCard `json:"card"`
}
type LarkCard struct {
Config LarkConfig `json:"config"`
Header LarkHeader `json:"header"`
Elements []LarkElement `json:"elements"`
}
type LarkConfig struct {
WideScreenMode bool `json:"wide_screen_mode"`
}
type LarkHeader struct {
Title LarkTitle `json:"title"`
Template string `json:"template"`
}
type LarkTitle struct {
Tag string `json:"tag"`
Content string `json:"content"`
}
type LarkElement struct {
Tag string `json:"tag"`
Text LarkText `json:"text"`
}
type LarkText struct {
Tag string `json:"tag"`
Content string `json:"content"`
}
func NewLark(address string) (*Lark, error) {
_, err := url.ParseRequestURI(address)
if err != nil {
return nil, fmt.Errorf("invalid Slack hook URL %s", address)
}
return &Lark{
URL: address,
}, nil
}
func (l *Lark) Post(ctx context.Context, event eventv1.Event) error {
// Skip Git commit status update event.
if event.HasMetadata(eventv1.MetaCommitStatusKey, eventv1.MetaCommitStatusUpdateValue) {
return nil
}
emoji := "💫"
color := "turquoise"
if event.Severity == eventv1.EventSeverityError {
emoji = "🚨"
color = "red"
}
message := fmt.Sprintf("**%s**\n\n", event.Message)
for k, v := range event.Metadata {
message = message + fmt.Sprintf("%s: %s\n", k, v)
}
element := LarkElement{
Tag: "div",
Text: LarkText{
Tag: "lark_md",
Content: message,
},
}
card := LarkCard{
Config: LarkConfig{
WideScreenMode: true,
},
Header: LarkHeader{
Title: LarkTitle{
Tag: "plain_text",
Content: fmt.Sprintf("%s %s/%s.%s", emoji, strings.ToLower(event.InvolvedObject.Kind),
event.InvolvedObject.Name, event.InvolvedObject.Namespace),
},
Template: color,
},
Elements: []LarkElement{
element,
},
}
payload := LarkPayload{
MsgType: "interactive",
Card: card,
}
return postMessage(ctx, l.URL, "", nil, payload)
}