339 lines
7.2 KiB
Go
339 lines
7.2 KiB
Go
package revoltgo
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/oklog/ulid/v2"
|
|
)
|
|
|
|
// Server struct.
|
|
type Server struct {
|
|
Client *Client
|
|
CreatedAt time.Time
|
|
|
|
Id string `json:"_id"`
|
|
Nonce string `json:"nonce"`
|
|
OwnerId string `json:"owner"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
ChannelIds []string `json:"channels"`
|
|
Categories []*ServerCategory `json:"categories"`
|
|
SystemMessages *SystemMessages `json:"system_messages"`
|
|
Roles map[string]interface{} `json:"roles"`
|
|
DefaultPermissions []interface{} `json:"default_permissions"`
|
|
Icon *Attachment `json:"icon"`
|
|
Banner *Attachment `json:"banner"`
|
|
}
|
|
|
|
// Server categories struct.
|
|
type ServerCategory struct {
|
|
Id string `json:"id"`
|
|
Title string `json:"title"`
|
|
ChannelIds []string `json:"channels"`
|
|
}
|
|
|
|
// System messages struct.
|
|
type SystemMessages struct {
|
|
UserJoined string `json:"user_joined,omitempty"`
|
|
UserLeft string `json:"user_left,omitempty"`
|
|
UserKicked string `json:"user_kicker,omitempty"`
|
|
UserBanned string `json:"user_banned,omitempty"`
|
|
}
|
|
|
|
// Server member struct.
|
|
type Member struct {
|
|
Informations struct {
|
|
ServerId string `json:"server"`
|
|
UserId string `json:"user"`
|
|
} `json:"_id"`
|
|
Nickname string `json:"nickname"`
|
|
Avatar *Attachment `json:"avatar"`
|
|
Roles []string `json:"roles"`
|
|
}
|
|
|
|
// Fetched members struct.
|
|
type FetchedMembers struct {
|
|
Members []*Member `json:"members"`
|
|
Users []*User `json:"users"`
|
|
}
|
|
|
|
// Fetched bans struct.
|
|
type FetchedBans struct {
|
|
Users []*User `json:"users"`
|
|
Bans []struct {
|
|
Ids struct {
|
|
UserId string `json:"user"`
|
|
ServerUd string `json:"server"`
|
|
} `json:"_id"`
|
|
Reason string `json:"reason"`
|
|
} `json:"bans"`
|
|
}
|
|
|
|
// Calculate creation date and edit the struct.
|
|
func (s *Server) CalculateCreationDate() error {
|
|
ulid, err := ulid.Parse(s.Id)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
s.CreatedAt = time.UnixMilli(int64(ulid.Time()))
|
|
return nil
|
|
}
|
|
|
|
// Edit server.
|
|
func (s Server) Edit(es *EditServer) error {
|
|
data, err := json.Marshal(es)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = s.Client.Request("PATCH", "/servers/"+s.Id, data)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Delete / leave server.
|
|
// If the server not created by client, it will leave.
|
|
// Otherwise it will be deleted.
|
|
func (s Server) Delete() error {
|
|
_, err := s.Client.Request("DELETE", "/servers/"+s.Id, []byte{})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Create a new text-channel.
|
|
func (s Server) CreateTextChannel(name, description string) (*Channel, error) {
|
|
channel := &Channel{}
|
|
channel.Client = s.Client
|
|
|
|
data, err := s.Client.Request("POST", "/servers/"+s.Id+"/channels", []byte("{\"type\":\"Text\",\"name\":\""+name+"\",\"description\":\""+description+"\",\"nonce\":\""+genULID()+"\"}"))
|
|
|
|
if err != nil {
|
|
return channel, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, channel)
|
|
|
|
if err != nil {
|
|
return channel, err
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
// Create a new voice-channel.
|
|
func (s Server) CreateVoiceChannel(name, description string) (*Channel, error) {
|
|
channel := &Channel{}
|
|
channel.Client = s.Client
|
|
|
|
data, err := s.Client.Request("POST", "/servers/"+s.Id+"/channels", []byte("{\"type\":\"Voice\",\"name\":\""+name+"\",\"description\":\""+description+"\",\"nonce\":\""+genULID()+"\"}"))
|
|
|
|
if err != nil {
|
|
return channel, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, channel)
|
|
|
|
if err != nil {
|
|
return channel, err
|
|
}
|
|
|
|
return channel, nil
|
|
}
|
|
|
|
// Fetch a member from Server.
|
|
func (s Server) FetchMember(id string) (*Member, error) {
|
|
member := &Member{}
|
|
|
|
data, err := s.Client.Request("GET", "/servers/"+s.Id+"/members/"+id, []byte{})
|
|
|
|
if err != nil {
|
|
return member, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, member)
|
|
|
|
if err != nil {
|
|
return member, err
|
|
}
|
|
|
|
return member, nil
|
|
}
|
|
|
|
// Fetch all of the members from Server.
|
|
func (s Server) FetchMembers() (*FetchedMembers, error) {
|
|
members := &FetchedMembers{}
|
|
|
|
data, err := s.Client.Request("GET", "/servers/"+s.Id+"/members", []byte{})
|
|
|
|
if err != nil {
|
|
return members, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, members)
|
|
|
|
if err != nil {
|
|
return members, err
|
|
}
|
|
|
|
// Add client to the user
|
|
for _, i := range members.Users {
|
|
i.Client = s.Client
|
|
}
|
|
|
|
return members, nil
|
|
}
|
|
|
|
// Edit a member.
|
|
func (s Server) EditMember(id string, em *EditMember) error {
|
|
data, err := json.Marshal(em)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = s.Client.Request("PATCH", "/servers/"+s.Id+"/members/"+id, data)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Kick a member from server.
|
|
func (s Server) KickMember(id string) error {
|
|
_, err := s.Client.Request("DELETE", "/servers/"+s.Id+"/members/"+id, []byte{})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Ban a member from server.
|
|
func (s Server) BanMember(id, reason string) error {
|
|
_, err := s.Client.Request("PUT", "/servers/"+s.Id+"/bans/"+id, []byte("{\"reason\":\""+reason+"\"}"))
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Unban a member from server.
|
|
func (s Server) UnbanMember(id string) error {
|
|
_, err := s.Client.Request("DELETE", "/servers/"+s.Id+"/bans/"+id, []byte{})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Fetch server bans.
|
|
func (s Server) FetchBans() (*FetchedBans, error) {
|
|
bans := &FetchedBans{}
|
|
|
|
data, err := s.Client.Request("GET", "/servers/"+s.Id+"/bans", []byte{})
|
|
|
|
if err != nil {
|
|
return bans, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, bans)
|
|
|
|
if err != nil {
|
|
return bans, err
|
|
}
|
|
|
|
// Add client to the user
|
|
for _, i := range bans.Users {
|
|
i.Client = s.Client
|
|
}
|
|
|
|
return bans, nil
|
|
}
|
|
|
|
// Set server permissions for a role.
|
|
// Leave role field empty if you want to edit default permissions
|
|
func (s Server) SetPermissions(role_id string, channel_permissions, server_permissions uint) error {
|
|
if role_id == "" {
|
|
role_id = "default"
|
|
}
|
|
|
|
_, err := s.Client.Request("PUT", "/servers/"+s.Id+"/permissions/"+role_id, []byte(fmt.Sprintf("{\"permissions\":{\"server\":%d,\"channel\":%d}}", channel_permissions, server_permissions)))
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Create a new role for server.
|
|
// Returns string (role id), uint (server perms), uint (channel perms) and error.
|
|
func (s Server) CreateRole(name string) (string, uint, uint, error) {
|
|
role := &struct {
|
|
Id string `json:"id"`
|
|
Permissions []uint `json:"permissions"`
|
|
}{}
|
|
|
|
data, err := s.Client.Request("POST", "/servers/"+s.Id+"/roles", []byte("{\"name\":\""+name+"\"}"))
|
|
|
|
if err != nil {
|
|
return role.Id, 0, 0, err
|
|
}
|
|
|
|
err = json.Unmarshal(data, role)
|
|
|
|
if err != nil {
|
|
return role.Id, 0, 0, err
|
|
}
|
|
|
|
return role.Id, role.Permissions[0], role.Permissions[1], nil
|
|
}
|
|
|
|
// Edit a server role.
|
|
func (s Server) EditRole(id string, er *EditRole) error {
|
|
data, err := json.Marshal(er)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = s.Client.Request("PATCH", "/servers/"+s.Id+"/roles/"+id, data)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Delete a server role.
|
|
func (s Server) DeleteRole(id string) error {
|
|
_, err := s.Client.Request("DELETE", "/servers/"+s.Id+"/roles/"+id, []byte{})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|