forked from amatsagu/tempest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient-api.go
107 lines (86 loc) · 3.18 KB
/
client-api.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
package tempest
import (
"encoding/json"
"errors"
"net/http"
"os"
"time"
)
// Pings Discord API and returns time it took to get response.
func (client *Client) Ping() time.Duration {
start := time.Now()
client.Rest.Request(http.MethodGet, "/gateway", nil)
return time.Since(start)
}
func (client *Client) SendMessage(channelID Snowflake, message Message, files []*os.File) (Message, error) {
raw, err := client.Rest.RequestWithFiles(http.MethodPost, "/channels/"+channelID.String()+"/messages", message, files)
if err != nil {
return Message{}, err
}
res := Message{}
err = json.Unmarshal(raw, &res)
if err != nil {
return Message{}, errors.New("failed to parse received data from discord")
}
return res, nil
}
func (client *Client) SendLinearMessage(channelID Snowflake, content string) (Message, error) {
return client.SendMessage(channelID, Message{Content: content}, nil)
}
// Creates (or fetches if already exists) user's private text channel (DM) and tries to send message into it.
// Warning! Discord's user channels endpoint has huge rate limits so please reuse Message#ChannelID whenever possible.
func (client *Client) SendPrivateMessage(userID Snowflake, content Message, files []*os.File) (Message, error) {
res := make(map[string]interface{}, 0)
res["recipient_id"] = userID
raw, err := client.Rest.Request(http.MethodPost, "/users/@me/channels", res)
if err != nil {
return Message{}, err
}
err = json.Unmarshal(raw, &res)
if err != nil {
return Message{}, errors.New("failed to parse received data from discord")
}
channelID, err := StringToSnowflake(res["id"].(string))
if err != nil {
return Message{}, err
}
msg, err := client.SendMessage(channelID, content, files)
msg.ChannelID = channelID // Just in case.
return msg, err
}
func (client *Client) EditMessage(channelID Snowflake, messageID Snowflake, content Message) error {
_, err := client.Rest.Request(http.MethodPatch, "/channels/"+channelID.String()+"/messages/"+messageID.String(), content)
return err
}
func (client *Client) DeleteMessage(channelID Snowflake, messageID Snowflake) error {
_, err := client.Rest.Request(http.MethodDelete, "/channels/"+channelID.String()+"/messages/"+messageID.String(), nil)
return err
}
func (client *Client) CrosspostMessage(channelID Snowflake, messageID Snowflake) error {
_, err := client.Rest.Request(http.MethodPost, "/channels/"+channelID.String()+"/messages/"+messageID.String()+"/crosspost", nil)
return err
}
func (client *Client) FetchUser(id Snowflake) (User, error) {
raw, err := client.Rest.Request(http.MethodGet, "/users/"+id.String(), nil)
if err != nil {
return User{}, err
}
res := User{}
err = json.Unmarshal(raw, &res)
if err != nil {
return User{}, errors.New("failed to parse received data from discord")
}
return res, nil
}
func (client *Client) FetchMember(guildID Snowflake, memberID Snowflake) (Member, error) {
raw, err := client.Rest.Request(http.MethodGet, "/guilds/"+guildID.String()+"/members/"+memberID.String(), nil)
if err != nil {
return Member{}, err
}
res := Member{}
err = json.Unmarshal(raw, &res)
if err != nil {
return Member{}, errors.New("failed to parse received data from discord")
}
return res, nil
}