Blame


1 e20d6baf 2021-06-15 o package pushover
2 e20d6baf 2021-06-15 o
3 e20d6baf 2021-06-15 o import (
4 e20d6baf 2021-06-15 o "encoding/json"
5 e20d6baf 2021-06-15 o "fmt"
6 e20d6baf 2021-06-15 o "net/http"
7 e20d6baf 2021-06-15 o "net/url"
8 e20d6baf 2021-06-15 o "strings"
9 e20d6baf 2021-06-15 o )
10 e20d6baf 2021-06-15 o
11 e20d6baf 2021-06-15 o const apiurl = "https://api.pushover.net/1/messages.json"
12 e20d6baf 2021-06-15 o const MaxMsgLength = 1024
13 e20d6baf 2021-06-15 o const MaxTitleLength = 250
14 e20d6baf 2021-06-15 o
15 e20d6baf 2021-06-15 o // Message represents a message in the Pushover Message API.
16 e20d6baf 2021-06-15 o type Message struct {
17 e20d6baf 2021-06-15 o User string
18 e20d6baf 2021-06-15 o Token string
19 e20d6baf 2021-06-15 o Title string
20 e20d6baf 2021-06-15 o Message string
21 e20d6baf 2021-06-15 o Priority int
22 e20d6baf 2021-06-15 o }
23 e20d6baf 2021-06-15 o
24 e20d6baf 2021-06-15 o type response struct {
25 e20d6baf 2021-06-15 o Status int
26 e20d6baf 2021-06-15 o Request string
27 e20d6baf 2021-06-15 o Errors errors
28 e20d6baf 2021-06-15 o }
29 e20d6baf 2021-06-15 o
30 e20d6baf 2021-06-15 o type errors []string
31 e20d6baf 2021-06-15 o
32 e20d6baf 2021-06-15 o func (e errors) Error() string {
33 e20d6baf 2021-06-15 o return strings.Join(e, ", ")
34 e20d6baf 2021-06-15 o }
35 e20d6baf 2021-06-15 o
36 e20d6baf 2021-06-15 o func (m *Message) validate() error {
37 e20d6baf 2021-06-15 o nchar := strings.Count(m.Message, "")
38 e20d6baf 2021-06-15 o if nchar > MaxMsgLength {
39 e20d6baf 2021-06-15 o return fmt.Errorf("%d character message too long, allowed %d characters", nchar, MaxMsgLength)
40 e20d6baf 2021-06-15 o }
41 e20d6baf 2021-06-15 o nchar = strings.Count(m.Title, "")
42 e20d6baf 2021-06-15 o if nchar > MaxTitleLength {
43 e20d6baf 2021-06-15 o return fmt.Errorf("%d-character title too long, allowed %d characters", nchar, MaxTitleLength)
44 e20d6baf 2021-06-15 o }
45 e20d6baf 2021-06-15 o return nil
46 e20d6baf 2021-06-15 o }
47 e20d6baf 2021-06-15 o
48 e20d6baf 2021-06-15 o // Push sends the Message m to Pushover.
49 e20d6baf 2021-06-15 o func Push(m Message) error {
50 e20d6baf 2021-06-15 o if err := m.validate(); err != nil {
51 e20d6baf 2021-06-15 o return err
52 e20d6baf 2021-06-15 o }
53 e20d6baf 2021-06-15 o req := url.Values{}
54 e20d6baf 2021-06-15 o req.Add("token", m.Token)
55 e20d6baf 2021-06-15 o req.Add("user", m.User)
56 e20d6baf 2021-06-15 o req.Add("title", m.Title)
57 e20d6baf 2021-06-15 o req.Add("message", m.Message)
58 e20d6baf 2021-06-15 o resp, err := http.PostForm(apiurl, req)
59 e20d6baf 2021-06-15 o if err != nil {
60 e20d6baf 2021-06-15 o return err
61 e20d6baf 2021-06-15 o }
62 e20d6baf 2021-06-15 o defer resp.Body.Close()
63 e20d6baf 2021-06-15 o if resp.StatusCode == http.StatusOK {
64 e20d6baf 2021-06-15 o return nil
65 e20d6baf 2021-06-15 o }
66 e20d6baf 2021-06-15 o
67 e20d6baf 2021-06-15 o var presp response
68 e20d6baf 2021-06-15 o if err := json.NewDecoder(resp.Body).Decode(&presp); err != nil {
69 e20d6baf 2021-06-15 o return fmt.Errorf("decode error response: %v", err)
70 e20d6baf 2021-06-15 o }
71 e20d6baf 2021-06-15 o return presp.Errors
72 e20d6baf 2021-06-15 o }