Status Page for monitoring your websites and applications with beautiful graphs, analytics, and plugins. Run on any type of environment.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

98 lines
3.0 KiB

package notifiers
import (
"strings"
"time"
"github.com/statping/statping/types/null"
"github.com/statping/statping/types/failures"
"github.com/statping/statping/types/notifications"
"github.com/statping/statping/types/notifier"
"github.com/statping/statping/types/services"
"github.com/statping/statping/utils"
)
var _ notifier.Notifier = (*gotify)(nil)
type gotify struct {
*notifications.Notification
}
func (g *gotify) Select() *notifications.Notification {
return g.Notification
}
func (g *gotify) Valid(values notifications.Values) error {
return nil
}
var Gotify = &gotify{&notifications.Notification{
Method: "gotify",
Title: "Gotify",
Description: "Use Gotify to receive push notifications. Add your Gotify URL and App Token to receive notifications.",
Author: "Hugo van Rijswijk",
AuthorUrl: "https://github.com/hugo-vrijswijk",
Icon: "broadcast-tower",
Delay: time.Duration(5 * time.Second),
Limits: 60,
SuccessData: null.NewNullString(`{"title": "{{.Service.Name}}", "message": "Your service '{{.Service.Name}}' is currently online!", "priority": 2}`),
FailureData: null.NewNullString(`{"title": "{{.Service.Name}}", "message": "Your service '{{.Service.Name}}' is currently failing! Reason: {{.Failure.Issue}}", "priority": 5}`),
DataType: "json",
Form: []notifications.NotificationForm{{
Type: "text",
Title: "Gotify URL",
SmallText: "Gotify server URL, including http(s):// and port if needed",
DbField: "Host",
Placeholder: "https://gotify.domain.com",
Required: true,
}, {
Type: "text",
Title: "App Token",
SmallText: "The Application Token generated by Gotify",
DbField: "api_key",
Placeholder: "TB5gatYYyR.FCD2",
Required: true,
}}},
}
// Send will send a HTTP Post to the Gotify API. It accepts type: string
func (g *gotify) sendMessage(msg string) (string, error) {
var url string
if strings.HasSuffix(g.Host.String, "/") {
url = g.Host.String + "message"
} else {
url = g.Host.String + "/message"
}
headers := []string{"X-Gotify-Key=" + g.ApiKey.String}
content, _, err := utils.HttpRequest(url, "POST", "application/json", headers, strings.NewReader(msg), time.Duration(10*time.Second), true, nil)
return string(content), err
}
// OnFailure will trigger failing service
func (g *gotify) OnFailure(s services.Service, f failures.Failure) (string, error) {
out, err := g.sendMessage(ReplaceVars(g.FailureData.String, s, f))
return out, err
}
// OnSuccess will trigger successful service
func (g *gotify) OnSuccess(s services.Service) (string, error) {
out, err := g.sendMessage(ReplaceVars(g.SuccessData.String, s, failures.Failure{}))
return out, err
}
// OnTest will test the Gotify notifier
func (g *gotify) OnTest() (string, error) {
msg := `{"title:" "Test" "message": "Testing the Gotify Notifier", "priority": 0}`
content, err := g.sendMessage(msg)
return content, err
}
// OnSave will trigger when this notifier is saved
func (g *gotify) OnSave() (string, error) {
return "", nil
}