98 lines
2.2 KiB
Go
98 lines
2.2 KiB
Go
package notifiers
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
type AppriseNotifier struct {
|
|
URL string
|
|
Title string
|
|
Type string
|
|
Format string
|
|
URLs []string
|
|
}
|
|
|
|
func (apprise *AppriseNotifier) Open(configPath string) bool {
|
|
urlPath := fmt.Sprintf("%s.url", configPath)
|
|
if !viper.IsSet(urlPath) {
|
|
log.Println("Need 'url' for Apprise")
|
|
return false
|
|
}
|
|
apprise.URL = viper.GetString(urlPath)
|
|
|
|
urlsPath := fmt.Sprintf("%s.urls", configPath)
|
|
if !viper.IsSet(urlsPath) {
|
|
log.Println("Need 'urls' for Apprise")
|
|
return false
|
|
}
|
|
|
|
apprise.Title = "GoWatch Notification"
|
|
titlePath := fmt.Sprintf("%s.title", configPath)
|
|
if viper.IsSet(titlePath) {
|
|
apprise.Title = viper.GetString(titlePath)
|
|
}
|
|
apprise.Type = "info"
|
|
typePath := fmt.Sprintf("%s.mtype", configPath)
|
|
if viper.IsSet(typePath) {
|
|
apprise.Type = viper.GetString(typePath)
|
|
}
|
|
apprise.Format = "text"
|
|
formatPath := fmt.Sprintf("%s.format", configPath)
|
|
if viper.IsSet(formatPath) {
|
|
apprise.Format = viper.GetString(formatPath)
|
|
}
|
|
apprise.URLs = viper.GetStringSlice(urlsPath)
|
|
log.Println("Apprise notifier:", apprise.URL, apprise.Type, apprise.Format)
|
|
return true
|
|
}
|
|
|
|
type ApprisePostData struct {
|
|
Title string `json:"title"`
|
|
Type string `json:"type"`
|
|
Format string `json:"format"`
|
|
URLs []string `json:"urls"`
|
|
Body string `json:"body"`
|
|
}
|
|
|
|
func (apprise *AppriseNotifier) Message(message string) bool {
|
|
data := ApprisePostData{
|
|
URLs: apprise.URLs,
|
|
Title: apprise.Title,
|
|
Type: apprise.Type,
|
|
Format: apprise.Format,
|
|
Body: message,
|
|
}
|
|
jsn, err := json.Marshal(data)
|
|
if err != nil {
|
|
log.Println("Could not create JSON post data:", err)
|
|
return false
|
|
}
|
|
|
|
resp, err := http.Post(apprise.URL, "application/json", bytes.NewBuffer(jsn))
|
|
if err != nil {
|
|
log.Println("Could not send Apprise notification:", err)
|
|
return false
|
|
}
|
|
body, err := ioutil.ReadAll(resp.Body)
|
|
if err != nil {
|
|
log.Println("Could not parse Apprise response:", err)
|
|
return false
|
|
}
|
|
bdy := string(body)
|
|
if !strings.Contains(bdy, "Notification(s) sent.") {
|
|
log.Println("Sending notifications failed:", bdy)
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (apprise *AppriseNotifier) Close() bool {
|
|
return true
|
|
}
|