aboutsummaryrefslogtreecommitdiff
path: root/web/revolt/message.go
diff options
context:
space:
mode:
Diffstat (limited to 'web/revolt/message.go')
-rw-r--r--web/revolt/message.go150
1 files changed, 150 insertions, 0 deletions
diff --git a/web/revolt/message.go b/web/revolt/message.go
new file mode 100644
index 0000000..6b0b7e9
--- /dev/null
+++ b/web/revolt/message.go
@@ -0,0 +1,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
+}