package notification import ( // External werr "git.gibonuddevalla.se/go/wrappederror" // Standard "bytes" "encoding/json" "fmt" "io" "net/http" ) type NTFY struct { URL string Prio int AcknowledgeURL string } func NewNTFY(config []byte, prio int, ackURL string) (instance NTFY, err error) { 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) GetPrio() int { return ntfy.Prio } func (ntfy NTFY) Send(uuid string, 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?uuid=%s", ntfy.AcknowledgeURL, uuid) req.Header.Add("X-Actions", ackURL) req.Header.Add("X-Priority", "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 }