-
Notifications
You must be signed in to change notification settings - Fork 0
/
message.go
150 lines (122 loc) · 3.39 KB
/
message.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
package revolt
import (
"encoding/json"
"time"
"github.com/oklog/ulid/v2"
)
// Message struct
type Message struct {
Client *Client
CreatedAt time.Time
Id string `json:"_id"`
Nonce string `json:"nonce"`
ChannelId string `json:"channel"`
AuthorId string `json:"author"`
Content interface{} `json:"content"`
Edited interface{} `json:"edited"`
Embeds []*MessageEmbed `json:"embeds"`
Attachments []*Attachment `json:"attachments"`
Mentions []string `json:"mentions"`
Replies []string `json:"replies"`
}
// Attachment struct.
type Attachment struct {
Id string `json:"_id"`
Tag string `json:"tag"`
Size int `json:"size"`
FileName string `json:"filename"`
Metadata *AttachmentMetadata
ContentType string `json:"content_type"`
}
// Attachment metadata struct.
type AttachmentMetadata struct {
Type string `json:"type"`
Width int `json:"width"`
Height int `json:"height"`
}
// Message edited struct.
type MessageEdited struct {
Date int `json:"$date"`
}
// Message embed struct.
type MessageEmbed struct {
Type string `json:"type"`
Url string `json:"url"`
Special *MessageSpecialEmbed
Title string `json:"title"`
Description string `json:"description"`
Image *MessageEmbeddedImage `json:"image"`
Video *MessageEmbeddedVideo `json:"video"`
IconUrl string `json:"icon_url"`
Color string `json:"color"`
}
// Message special embed struct.
type MessageSpecialEmbed struct {
Type string `json:"type"`
Id string `json:"id"`
ContentType string `json:"content_type"`
}
// Message embedded image struct
type MessageEmbeddedImage struct {
Size string `json:"size"`
Url string `json:"url"`
Width int `json:"width"`
Height int `json:"height"`
}
// Message embedded video struct
type MessageEmbeddedVideo struct {
Url string `json:"url"`
Width int `json:"width"`
Height int `json:"height"`
}
// Calculate creation date and edit the struct.
func (c *Message) CalculateCreationDate() error {
ulid, err := ulid.Parse(c.Id)
if err != nil {
return err
}
c.CreatedAt = time.UnixMilli(int64(ulid.Time()))
return nil
}
// Edit message content.
func (m *Message) Edit(content string) error {
_, err := m.Client.Request("PATCH", "/channels/"+m.ChannelId+"/messages/"+m.Id, []byte("{\"content\": \""+content+"\"}"))
if err != nil {
return err
}
m.Content = content
return nil
}
// Delete the message.
func (m Message) Delete() error {
_, err := m.Client.Request("DELETE", "/channels/"+m.ChannelId+"/messages/"+m.Id, []byte{})
return err
}
// Reply to the message.
func (m Message) Reply(mention bool, sm *SendMessage) (*Message, error) {
if sm.Nonce == "" {
sm.CreateNonce()
}
sm.AddReply(m.Id, mention)
respMessage := &Message{}
respMessage.Client = m.Client
msgData, err := json.Marshal(sm)
if err != nil {
return respMessage, err
}
resp, err := m.Client.Request("POST", "/channels/"+m.ChannelId+"/messages", msgData)
if err != nil {
return respMessage, err
}
err = json.Unmarshal(resp, respMessage)
if err != nil {
return respMessage, err
}
if sm.DeleteAfter != 0 {
go func() {
time.Sleep(time.Second * time.Duration(sm.DeleteAfter))
respMessage.Delete()
}()
}
return respMessage, nil
}