forked from andersfylling/disgord
/
role.go
145 lines (118 loc) · 3.6 KB
/
role.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
package disgord
import (
"context"
"fmt"
"sort"
"github.com/Vedza/disgord/internal/endpoint"
"github.com/Vedza/disgord/internal/httd"
)
type roles []*Role
var _ sort.Interface = (roles)(nil)
func (r roles) Len() int {
return len(r)
}
// Less is reversed due to the visual ordering in Discord.
func (r roles) Less(i, j int) bool {
a := r[i]
b := r[j]
if a.Position == b.Position {
return a.ID < b.ID
}
return a.Position > b.Position
}
func (r roles) Swap(i, j int) {
tmp := r[i]
r[i] = r[j]
r[j] = tmp
}
// Role https://discord.com/developers/docs/topics/permissions#role-object
type Role struct {
ID Snowflake `json:"id"`
Name string `json:"name"`
Color uint `json:"color"`
Hoist bool `json:"hoist"`
Position int `json:"position"` // can be -1
Permissions PermissionBit `json:"permissions"`
Managed bool `json:"managed"`
Mentionable bool `json:"mentionable"`
guildID Snowflake
}
var _ Mentioner = (*Role)(nil)
var _ Reseter = (*Role)(nil)
var _ DeepCopier = (*Role)(nil)
var _ Copier = (*Role)(nil)
var _ fmt.Stringer = (*Role)(nil)
func (r *Role) String() string {
return r.Name
}
// Mention gives a formatted version of the role such that it can be parsed by Discord clients
func (r *Role) Mention() string {
return "<@&" + r.ID.String() + ">"
}
// SetGuildID link role to a guild before running session.SaveToDiscord(*Role)
func (r *Role) SetGuildID(id Snowflake) {
r.guildID = id
}
//////////////////////////////////////////////////////
//
// REST Methods
//
//////////////////////////////////////////////////////
type GuildRoleQueryBuilder interface {
WithContext(ctx context.Context) GuildRoleQueryBuilder
UpdateBuilder(flags ...Flag) (builder UpdateGuildRoleBuilder)
Delete(flags ...Flag) error
// Deprecated: use UpdateBuilder
Update(flags ...Flag) UpdateGuildRoleBuilder
}
func (g guildQueryBuilder) Role(id Snowflake) GuildRoleQueryBuilder {
return &guildRoleQueryBuilder{client: g.client, gid: g.gid, roleID: id}
}
type guildRoleQueryBuilder struct {
ctx context.Context
client *Client
gid Snowflake
roleID Snowflake
}
func (g guildRoleQueryBuilder) WithContext(ctx context.Context) GuildRoleQueryBuilder {
g.ctx = ctx
return &g
}
// UpdateRole Modify a guild role. Requires the 'MANAGE_ROLES' permission.
// Returns the updated role on success. Fires a Guild Role Update Gateway event.
func (g guildRoleQueryBuilder) UpdateBuilder(flags ...Flag) UpdateGuildRoleBuilder {
builder := &updateGuildRoleBuilder{}
builder.r.itemFactory = func() interface{} {
return &Role{}
}
builder.r.flags = flags
builder.r.IgnoreCache().setup(g.client.req, &httd.Request{
Method: httd.MethodPatch,
Ctx: g.ctx,
Endpoint: endpoint.GuildRole(g.gid, g.roleID),
ContentType: httd.ContentTypeJSON,
}, nil)
return builder
}
// DeleteRole Delete a guild role. Requires the 'MANAGE_ROLES' permission.
// Returns a 204 empty response on success. Fires a Guild Role Delete Gateway event.
func (g guildRoleQueryBuilder) Delete(flags ...Flag) error {
r := g.client.newRESTRequest(&httd.Request{
Method: httd.MethodDelete,
Endpoint: endpoint.GuildRole(g.gid, g.roleID),
Ctx: g.ctx,
}, flags)
_, err := r.Execute()
return err
}
//////////////////////////////////////////////////////
//
// REST Builders
//
//////////////////////////////////////////////////////
// updateGuildRoleBuilder ...
//generate-rest-basic-execute: role:*Role,
//generate-rest-params: name:string, permissions:PermissionBit, color:uint, hoist:bool, mentionable:bool,
type updateGuildRoleBuilder struct {
r RESTBuilder
}