GoDoxy/internal/notif/ntfy.go
2025-05-02 05:51:15 +08:00

75 lines
1.6 KiB
Go

package notif
import (
"net/http"
"github.com/rs/zerolog"
"github.com/yusing/go-proxy/internal/gperr"
)
// See https://docs.ntfy.sh/publish
type Ntfy struct {
ProviderBase
Topic string `json:"topic"`
}
// Validate implements the utils.CustomValidator interface.
func (n *Ntfy) Validate() gperr.Error {
if err := n.ProviderBase.Validate(); err != nil {
return err
}
if n.URL == "" {
return gperr.New("url is required")
}
if n.Topic == "" {
return gperr.New("topic is required")
}
if n.Topic[0] == '/' {
return gperr.New("topic should not start with a slash")
}
return nil
}
// GetURL implements Provider.
func (n *Ntfy) GetURL() string {
if n.URL[len(n.URL)-1] == '/' {
return n.URL + n.Topic
}
return n.URL + "/" + n.Topic
}
// GetMIMEType implements Provider.
func (n *Ntfy) GetMIMEType() string {
return ""
}
// GetToken implements Provider.
func (n *Ntfy) GetToken() string {
return n.Token
}
// MarshalMessage implements Provider.
func (n *Ntfy) MarshalMessage(logMsg *LogMessage) ([]byte, error) {
return logMsg.Body.Format(n.Format)
}
// SetHeaders implements Provider.
func (n *Ntfy) SetHeaders(logMsg *LogMessage, headers http.Header) {
headers.Set("Title", logMsg.Title)
switch logMsg.Level {
// warning (or other unspecified) uses default priority
case zerolog.FatalLevel:
headers.Set("Priority", "urgent")
case zerolog.ErrorLevel:
headers.Set("Priority", "high")
case zerolog.InfoLevel:
headers.Set("Priority", "low")
case zerolog.DebugLevel:
headers.Set("Priority", "min")
}
if n.Format == LogFormatMarkdown {
headers.Set("Markdown", "yes")
}
}