-
Notifications
You must be signed in to change notification settings - Fork 0
/
client.go
132 lines (115 loc) · 3.52 KB
/
client.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package discordwebhook
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"os"
)
var (
// ErrMissingWebhookURL is the error returned when the environment variable
// for the discord Client is missing or empty.
ErrMissingWebhookURL = fmt.Errorf("no discord URL environment variable")
// ErrInvalidURL is the error returned when the client URL cannot be parsed.
ErrInvalidURL = fmt.Errorf("invalid url")
// ErrMalformedMessage is the error returned when the message to be sent
// cannot be converted to json.
ErrMalformedMessage = fmt.Errorf("malformed message")
// ErrBadRequest is the error returned when discord rejects the message,
// possibly with an error message.
ErrBadRequest = fmt.Errorf("bad request")
// ErrUnexpectedResponse is the error returned when the response does not
// look like a discord success or error message.
ErrUnexpectedResponse = fmt.Errorf("unexpected response")
)
// Client is an object that enables sending messages to a discord webhook
// configured on the client. The webhook URL should be treated as a secret, so
// a constructor to initialize a client using an environment variable is
// provided.
type Client struct {
webhook *url.URL
}
// apiResponse is a combination of a Message and APIError struct so a single
// response body can be parsed into either format.
type apiResponse struct {
*Message
*APIError
}
// New creates a discord webhook Client using the provided webhook URL.
func New(raw string) (*Client, error) {
webhook, err := url.Parse(raw)
if err != nil || webhook.Scheme == "" || webhook.Fragment != "" {
return nil, fmt.Errorf("%w: %v: %q", ErrInvalidURL, err, raw)
}