package notifications import ( "errors" "net/http" "strconv" "strings" "time" "velvettear/godyn/config" "velvettear/godyn/log" ) const PRIORITY_MAX = 5 const PRIORITY_HIGH = 4 const PRIORITY_DEFAULT = 3 const PRIORITY_LOW = 2 const PRIORITY_MIN = 1 // exported function(s) func Send(notification Notification) { if !config.NotificationEnabled() { return } timestamp := time.Now().UnixMilli() url, error := getNotificationUrl() if error != nil { log.Warning("encountered an error sending a notification", error.Error()) return } request, error := http.NewRequest("POST", url, strings.NewReader(notification.Message)) if error != nil { log.Error("encountered an error creating a notification http request", error.Error()) return } request.Header.Set("Title", notification.Title) request.Header.Set("Priority", strconv.Itoa(notification.getPriority())) if notification.hasEmoji() { request.Header.Set("Tags", notification.Emoji) } authorize(request) response, error := http.DefaultClient.Do(request) if error != nil { log.ErrorTimed("encountered an error sending a notification", timestamp, error.Error()) return } if response.StatusCode != 200 { log.ErrorTimed("probably encountered an error sending a notification", timestamp, "status code: "+strconv.Itoa(response.StatusCode)) return } log.DebugTimed("successfully sent a notification", timestamp) } // unexported function(s) func getNotificationUrl() (string, error) { url := config.NotificationUrl() if len(url) == 0 { return "", errors.New("notification url is not configured") } topic := config.NotificationTopic() if len(topic) == 0 { return "", errors.New("notification topic is not configured") } if !strings.HasSuffix(url, "/") { url += "/" } return url + topic, nil } func authorize(request *http.Request) { username := config.NotificationUsername() password := config.NotificationPassword() if len(username) == 0 || len(password) == 0 { return } request.SetBasicAuth(username, password) } func (notification *Notification) hasEmoji() bool { return len(notification.Emoji) > 0 } func (notification *Notification) getPriority() int { if notification.Priority < PRIORITY_MIN || notification.Priority > PRIORITY_MAX { notification.Priority = PRIORITY_DEFAULT } return notification.Priority } // struct(s) type Notification struct { Title string Message string Emoji string Priority int }