package notification import ( // External werr "git.gibonuddevalla.se/go/wrappederror" // Standard "bytes" "encoding/json" "fmt" "io" "log/slog" "net/http" ) type NTFY struct { URL string Prio int AcknowledgeURL string logger *slog.Logger } func NewNTFY(config []byte, prio int, ackURL string) (instance *NTFY, err error) { instance = new(NTFY) err = json.Unmarshal(config, &instance) if err != nil { err = werr.Wrap(err).WithCode("002-0001").WithData(config) return } instance.Prio = prio instance.AcknowledgeURL = ackURL return instance, nil } func (ntfy *NTFY) SetLogger(l *slog.Logger) { ntfy.logger = l } func (ntfy *NTFY) GetType() string { return "NTFY" } func (ntfy *NTFY) GetPrio() int { return ntfy.Prio } func (ntfy NTFY) Send(problemID int, msg []byte) (err error) { var req *http.Request var res *http.Response req, err = http.NewRequest("POST", ntfy.URL, bytes.NewReader(msg)) if err != nil { err = werr.Wrap(err).WithCode("002-0002").WithData(ntfy.URL) return } ackURL := fmt.Sprintf("http, OK, %s/notification/ack?problemID=%d", ntfy.AcknowledgeURL, problemID) req.Header.Add("X-Actions", ackURL) req.Header.Add("X-Priority", "4") // XXX: should be 5 req.Header.Add("X-Tags", "calendar") res, err = http.DefaultClient.Do(req) if err != nil { err = werr.Wrap(err).WithCode("002-0003") return } body, _ := io.ReadAll(res.Body) if res.StatusCode != 200 { err = werr.New("Invalid NTFY response").WithCode("002-0004").WithData(body) return } ntfyResp := struct { ID string }{} err = json.Unmarshal(body, &ntfyResp) if err != nil { err = werr.Wrap(err).WithCode("002-0005").WithData(body) return } return }