223 lines
5.2 KiB
Go
223 lines
5.2 KiB
Go
package revoltgo
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"reflect"
|
|
"time"
|
|
|
|
"github.com/oklog/ulid/v2"
|
|
)
|
|
|
|
// Channel struct.
|
|
type Channel struct {
|
|
Client *Client
|
|
CreatedAt time.Time
|
|
|
|
Id string `json:"_id"`
|
|
ChannelType string `json:"channel_type"`
|
|
UserId string `json:"user"`
|
|
Nonce string `json:"nonce"`
|
|
Active bool `json:"active"`
|
|
Recipients []string `json:"recipients"`
|
|
LastMessage interface{} `json:"last_message"`
|
|
Name string `json:"name"`
|
|
OwnerId string `json:"owner"`
|
|
Description string `json:"description"`
|
|
Icon *Attachment `json:"icon"`
|
|
DefaultPermissions uint `json:"default_permissions"`
|
|
RolePermissions interface{} `json:"role_permissions"`
|
|
Permissions uint `json:"permissions"`
|
|
}
|
|
|
|
// Fetched messages struct.
|
|
type FetchedMessages struct {
|
|
Messages []*Message `json:"messages"`
|
|
Users []*User `json:"users"`
|
|
}
|
|
|
|
// Calculate creation date and edit the struct.
|
|
func (c *Channel) CalculateCreationDate() error {
|
|
ulid, err := ulid.Parse(c.Id)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
c.CreatedAt = time.UnixMilli(int64(ulid.Time()))
|
|
return nil
|
|
}
|
|
|
|
// Send a message to the channel.
|
|
func (c Channel) SendMessage(message *SendMessage) (*Message, error) {
|
|
if message.Nonce == "" {
|
|
message.CreateNonce()
|
|
}
|
|
|
|
respMessage := &Message{}
|
|
respMessage.Client = c.Client
|
|
msgData, err := json.Marshal(message)
|
|
|
|
if err != nil {
|
|
return respMessage, err
|
|
}
|
|
|
|
resp, err := c.Client.Request("POST", "/channels/"+c.Id+"/messages", msgData)
|
|
|
|
if err != nil {
|
|
return respMessage, err
|
|
}
|
|
|
|
err = json.Unmarshal(resp, respMessage)
|
|
|
|
if err != nil {
|
|
return respMessage, err
|
|
}
|
|
|
|
if message.DeleteAfter != 0 {
|
|
go func() {
|
|
time.Sleep(time.Second * time.Duration(message.DeleteAfter))
|
|
respMessage.Delete()
|
|
}()
|
|
}
|
|
|
|
return respMessage, nil
|
|
}
|
|
|
|
// Fetch messages from channel.
|
|
// Check: https://developers.revolt.chat/api/#tag/Messaging/paths/~1channels~1:channel~1messages/get for map parameters.
|
|
func (c Channel) FetchMessages(options map[string]interface{}) (*FetchedMessages, error) {
|
|
// Format url
|
|
url := "/channels/" + c.Id + "/messages?"
|
|
|
|
for key, value := range options {
|
|
if !reflect.ValueOf(value).IsZero() {
|
|
url += fmt.Sprintf("%s=%v&", key, value)
|
|
}
|
|
}
|
|
|
|
url = url[:len(url)-1]
|
|
|
|
fetchedMsgs := &FetchedMessages{}
|
|
|
|
// Send request
|
|
resp, err := c.Client.Request("GET", url, []byte{})
|
|
|
|
if err != nil {
|
|
return fetchedMsgs, err
|
|
}
|
|
|
|
err = json.Unmarshal(resp, &fetchedMsgs)
|
|
|
|
if err != nil {
|
|
err = json.Unmarshal([]byte(fmt.Sprintf("{\"messages\": %s}", resp)), &fetchedMsgs)
|
|
|
|
if err != nil {
|
|
return fetchedMsgs, err
|
|
}
|
|
}
|
|
|
|
// Add client to users & messages
|
|
for _, msg := range fetchedMsgs.Messages {
|
|
msg.Client = c.Client
|
|
}
|
|
|
|
if fetchedMsgs.Users != nil {
|
|
for _, msg := range fetchedMsgs.Users {
|
|
msg.Client = c.Client
|
|
}
|
|
}
|
|
|
|
return fetchedMsgs, nil
|
|
}
|
|
|
|
// Fetch a message from channel by Id.
|
|
func (c Channel) FetchMessage(id string) (*Message, error) {
|
|
msg := &Message{}
|
|
msg.Client = c.Client
|
|
|
|
resp, err := c.Client.Request("GET", "/channels/"+c.Id+"/messages/"+id, []byte{})
|
|
|
|
if err != nil {
|
|
return msg, err
|
|
}
|
|
|
|
err = json.Unmarshal(resp, msg)
|
|
return msg, err
|
|
}
|
|
|
|
// Edit channel.
|
|
func (c Channel) Edit(ec *EditChannel) error {
|
|
data, err := json.Marshal(ec)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = c.Client.Request("PATCH", "/channels/"+c.Id, data)
|
|
return err
|
|
}
|
|
|
|
// Delete channel.
|
|
func (c Channel) Delete() error {
|
|
_, err := c.Client.Request("DELETE", "/channels/"+c.Id, []byte{})
|
|
return err
|
|
}
|
|
|
|
// Create a new invite.
|
|
// Returns a string (invite code) and error (nil if not exists).
|
|
func (c Channel) CreateInvite() (string, error) {
|
|
data, err := c.Client.Request("POST", "/channels/"+c.Id+"/invites", []byte{})
|
|
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
dataStruct := &struct {
|
|
InviteCode string `json:"code"`
|
|
}{}
|
|
|
|
err = json.Unmarshal(data, dataStruct)
|
|
return dataStruct.InviteCode, err
|
|
}
|
|
|
|
// Set channel permissions for a role.
|
|
// Leave role field empty if you want to edit default permissions
|
|
func (c Channel) SetPermissions(role_id string, permissions uint) error {
|
|
if role_id == "" {
|
|
role_id = "default"
|
|
}
|
|
|
|
_, err := c.Client.Request("PUT", "/channels/"+c.Id+"/permissions/"+role_id, []byte(fmt.Sprintf("{\"permissions\":%d}", permissions)))
|
|
return err
|
|
}
|
|
|
|
// Fetch all of the members from group.
|
|
// This function is only for GroupChannel.
|
|
func (c Channel) FetchGroupMembers() ([]*User, error) {
|
|
var groupMembers []*User
|
|
|
|
resp, err := c.Client.Request("GET", "/channels/"+c.Id+"/members", []byte{})
|
|
|
|
if err != nil {
|
|
return groupMembers, err
|
|
}
|
|
|
|
err = json.Unmarshal(resp, &groupMembers)
|
|
return groupMembers, err
|
|
}
|
|
|
|
// Add a new group recipient.
|
|
// This function is only for GroupChannel.
|
|
func (c Channel) AddGroupRecipient(user_id string) error {
|
|
_, err := c.Client.Request("PUT", "/channels/"+c.Id+"/recipients/"+user_id, []byte{})
|
|
return err
|
|
}
|
|
|
|
// Delete a group recipient.
|
|
// This function is only for GroupChannel.
|
|
func (c Channel) DeleteGroupRecipient(user_id string) error {
|
|
_, err := c.Client.Request("DELETE", "/channels/"+c.Id+"/recipients/"+user_id, []byte{})
|
|
return err
|
|
}
|