rubycord 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/rubycord/allowed_mentions.rb +34 -0
- data/lib/rubycord/api/application.rb +200 -0
- data/lib/rubycord/api/channel.rb +597 -0
- data/lib/rubycord/api/interaction.rb +52 -0
- data/lib/rubycord/api/invite.rb +42 -0
- data/lib/rubycord/api/server.rb +557 -0
- data/lib/rubycord/api/user.rb +153 -0
- data/lib/rubycord/api/webhook.rb +138 -0
- data/lib/rubycord/api.rb +356 -0
- data/lib/rubycord/await.rb +49 -0
- data/lib/rubycord/bot.rb +1757 -0
- data/lib/rubycord/cache.rb +259 -0
- data/lib/rubycord/colour_rgb.rb +41 -0
- data/lib/rubycord/commands/command_bot.rb +519 -0
- data/lib/rubycord/commands/container.rb +110 -0
- data/lib/rubycord/commands/events.rb +9 -0
- data/lib/rubycord/commands/parser.rb +325 -0
- data/lib/rubycord/commands/rate_limiter.rb +142 -0
- data/lib/rubycord/container.rb +753 -0
- data/lib/rubycord/data/activity.rb +269 -0
- data/lib/rubycord/data/application.rb +48 -0
- data/lib/rubycord/data/attachment.rb +109 -0
- data/lib/rubycord/data/audit_logs.rb +343 -0
- data/lib/rubycord/data/channel.rb +996 -0
- data/lib/rubycord/data/component.rb +227 -0
- data/lib/rubycord/data/embed.rb +249 -0
- data/lib/rubycord/data/emoji.rb +80 -0
- data/lib/rubycord/data/integration.rb +120 -0
- data/lib/rubycord/data/interaction.rb +798 -0
- data/lib/rubycord/data/invite.rb +135 -0
- data/lib/rubycord/data/member.rb +370 -0
- data/lib/rubycord/data/message.rb +412 -0
- data/lib/rubycord/data/overwrite.rb +106 -0
- data/lib/rubycord/data/profile.rb +89 -0
- data/lib/rubycord/data/reaction.rb +31 -0
- data/lib/rubycord/data/recipient.rb +32 -0
- data/lib/rubycord/data/role.rb +246 -0
- data/lib/rubycord/data/server.rb +1002 -0
- data/lib/rubycord/data/user.rb +261 -0
- data/lib/rubycord/data/voice_region.rb +43 -0
- data/lib/rubycord/data/voice_state.rb +39 -0
- data/lib/rubycord/data/webhook.rb +232 -0
- data/lib/rubycord/data.rb +40 -0
- data/lib/rubycord/errors.rb +737 -0
- data/lib/rubycord/events/await.rb +46 -0
- data/lib/rubycord/events/bans.rb +58 -0
- data/lib/rubycord/events/channels.rb +186 -0
- data/lib/rubycord/events/generic.rb +126 -0
- data/lib/rubycord/events/guilds.rb +191 -0
- data/lib/rubycord/events/interactions.rb +480 -0
- data/lib/rubycord/events/invites.rb +123 -0
- data/lib/rubycord/events/lifetime.rb +29 -0
- data/lib/rubycord/events/members.rb +91 -0
- data/lib/rubycord/events/message.rb +337 -0
- data/lib/rubycord/events/presence.rb +127 -0
- data/lib/rubycord/events/raw.rb +45 -0
- data/lib/rubycord/events/reactions.rb +156 -0
- data/lib/rubycord/events/roles.rb +86 -0
- data/lib/rubycord/events/threads.rb +94 -0
- data/lib/rubycord/events/typing.rb +70 -0
- data/lib/rubycord/events/voice_server_update.rb +45 -0
- data/lib/rubycord/events/voice_state_update.rb +103 -0
- data/lib/rubycord/events/webhooks.rb +62 -0
- data/lib/rubycord/gateway.rb +867 -0
- data/lib/rubycord/id_object.rb +37 -0
- data/lib/rubycord/light/data.rb +60 -0
- data/lib/rubycord/light/integrations.rb +71 -0
- data/lib/rubycord/light/light_bot.rb +56 -0
- data/lib/rubycord/light.rb +6 -0
- data/lib/rubycord/logger.rb +118 -0
- data/lib/rubycord/paginator.rb +55 -0
- data/lib/rubycord/permissions.rb +251 -0
- data/lib/rubycord/version.rb +5 -0
- data/lib/rubycord/voice/encoder.rb +113 -0
- data/lib/rubycord/voice/network.rb +366 -0
- data/lib/rubycord/voice/sodium.rb +96 -0
- data/lib/rubycord/voice/voice_bot.rb +408 -0
- data/lib/rubycord/webhooks/builder.rb +100 -0
- data/lib/rubycord/webhooks/client.rb +132 -0
- data/lib/rubycord/webhooks/embeds.rb +248 -0
- data/lib/rubycord/webhooks/modal.rb +78 -0
- data/lib/rubycord/webhooks/version.rb +7 -0
- data/lib/rubycord/webhooks/view.rb +192 -0
- data/lib/rubycord/webhooks.rb +12 -0
- data/lib/rubycord/websocket.rb +70 -0
- data/lib/rubycord.rb +140 -0
- metadata +231 -0
@@ -0,0 +1,246 @@
|
|
1
|
+
module Rubycord
|
2
|
+
# A Discord role that contains permissions and applies to certain users
|
3
|
+
class Role
|
4
|
+
include IDObject
|
5
|
+
|
6
|
+
# @return [Permissions] this role's permissions.
|
7
|
+
attr_reader :permissions
|
8
|
+
|
9
|
+
# @return [String] this role's name ("new role" if it hasn't been changed)
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
# @return [Server] the server this role belongs to
|
13
|
+
attr_reader :server
|
14
|
+
|
15
|
+
# @return [true, false] whether or not this role should be displayed separately from other users
|
16
|
+
attr_reader :hoist
|
17
|
+
|
18
|
+
# @return [true, false] whether or not this role is managed by an integration or a bot
|
19
|
+
attr_reader :managed
|
20
|
+
alias_method :managed?, :managed
|
21
|
+
|
22
|
+
# @return [true, false] whether this role can be mentioned using a role mention
|
23
|
+
attr_reader :mentionable
|
24
|
+
alias_method :mentionable?, :mentionable
|
25
|
+
|
26
|
+
# @return [ColourRGB] the role colour
|
27
|
+
attr_reader :colour
|
28
|
+
alias_method :color, :colour
|
29
|
+
|
30
|
+
# @return [Integer] the position of this role in the hierarchy
|
31
|
+
attr_reader :position
|
32
|
+
|
33
|
+
# @return [String, nil] The icon hash for this role.
|
34
|
+
attr_reader :icon
|
35
|
+
|
36
|
+
# @return [Tags, nil] The role tags
|
37
|
+
attr_reader :tags
|
38
|
+
|
39
|
+
# Wrapper for the role tags
|
40
|
+
class Tags
|
41
|
+
# @return [Integer, nil] The ID of the bot this role belongs to
|
42
|
+
attr_reader :bot_id
|
43
|
+
|
44
|
+
# @return [Integer, nil] The ID of the integration this role belongs to
|
45
|
+
attr_reader :integration_id
|
46
|
+
|
47
|
+
# @return [true, false] Whether this is the guild's Booster role
|
48
|
+
attr_reader :premium_subscriber
|
49
|
+
|
50
|
+
# @return [Integer, nil] The id of this role's subscription sku and listing
|
51
|
+
attr_reader :subscription_listing_id
|
52
|
+
|
53
|
+
# @return [true, false] Whether this role is available for purchase
|
54
|
+
attr_reader :available_for_purchase
|
55
|
+
|
56
|
+
# @return [true, false] Whether this role is a guild's linked role
|
57
|
+
attr_reader :guild_connections
|
58
|
+
|
59
|
+
def initialize(data)
|
60
|
+
@bot_id = data["bot_id"]&.resolve_id
|
61
|
+
@integration_id = data["integration_id"]&.resolve_id
|
62
|
+
@premium_subscriber = data.key?("premium_subscriber")
|
63
|
+
@subscription_listing_id = data["subscription_listing_id"]&.resolve_id
|
64
|
+
@available_for_purchase = data.key?("available_for_purchase")
|
65
|
+
@guild_connections = data.key?("guild_connections")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# This class is used internally as a wrapper to a Role object that allows easy writing of permission data.
|
70
|
+
class RoleWriter
|
71
|
+
# @!visibility private
|
72
|
+
def initialize(role, token)
|
73
|
+
@role = role
|
74
|
+
@token = token
|
75
|
+
end
|
76
|
+
|
77
|
+
# Write the specified permission data to the role, without updating the permission cache
|
78
|
+
# @param bits [Integer] The packed permissions to write.
|
79
|
+
def write(bits)
|
80
|
+
@role.send(:packed=, bits, false)
|
81
|
+
end
|
82
|
+
|
83
|
+
# The inspect method is overridden, in this case to prevent the token being leaked
|
84
|
+
def inspect
|
85
|
+
"<RoleWriter role=#{@role} token=...>"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# @!visibility private
|
90
|
+
def initialize(data, bot, server = nil)
|
91
|
+
@bot = bot
|
92
|
+
@server = server
|
93
|
+
@permissions = Permissions.new(data["permissions"], RoleWriter.new(self, @bot.token))
|
94
|
+
@name = data["name"]
|
95
|
+
@id = data["id"].to_i
|
96
|
+
|
97
|
+
@position = data["position"]
|
98
|
+
|
99
|
+
@hoist = data["hoist"]
|
100
|
+
@mentionable = data["mentionable"]
|
101
|
+
@managed = data["managed"]
|
102
|
+
|
103
|
+
@colour = ColourRGB.new(data["color"])
|
104
|
+
|
105
|
+
@icon = data["icon"]
|
106
|
+
|
107
|
+
@tags = Tags.new(data["tags"]) if data["tags"]
|
108
|
+
end
|
109
|
+
|
110
|
+
# @return [String] a string that will mention this role, if it is mentionable.
|
111
|
+
def mention
|
112
|
+
"<@&#{@id}>"
|
113
|
+
end
|
114
|
+
|
115
|
+
# @return [Array<Member>] an array of members who have this role.
|
116
|
+
# @note This requests a member chunk if it hasn't for the server before, which may be slow initially
|
117
|
+
def members
|
118
|
+
@server.members.select { |m| m.role? self }
|
119
|
+
end
|
120
|
+
|
121
|
+
alias_method :users, :members
|
122
|
+
|
123
|
+
# Updates the data cache from another Role object
|
124
|
+
# @note For internal use only
|
125
|
+
# @!visibility private
|
126
|
+
def update_from(other)
|
127
|
+
@permissions = other.permissions
|
128
|
+
@name = other.name
|
129
|
+
@hoist = other.hoist
|
130
|
+
@colour = other.colour
|
131
|
+
@position = other.position
|
132
|
+
@managed = other.managed
|
133
|
+
@icon = other.icon
|
134
|
+
end
|
135
|
+
|
136
|
+
# Updates the data cache from a hash containing data
|
137
|
+
# @note For internal use only
|
138
|
+
# @!visibility private
|
139
|
+
def update_data(new_data)
|
140
|
+
@name = new_data[:name] || new_data["name"] || @name
|
141
|
+
@hoist = new_data["hoist"] unless new_data["hoist"].nil?
|
142
|
+
@hoist = new_data[:hoist] unless new_data[:hoist].nil?
|
143
|
+
@colour = new_data[:colour] || (new_data["color"] ? ColourRGB.new(new_data["color"]) : @colour)
|
144
|
+
end
|
145
|
+
|
146
|
+
# Sets the role name to something new
|
147
|
+
# @param name [String] The name that should be set
|
148
|
+
def name=(name)
|
149
|
+
update_role_data(name: name)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Changes whether or not this role is displayed at the top of the user list
|
153
|
+
# @param hoist [true, false] The value it should be changed to
|
154
|
+
def hoist=(hoist)
|
155
|
+
update_role_data(hoist: hoist)
|
156
|
+
end
|
157
|
+
|
158
|
+
# Changes whether or not this role can be mentioned
|
159
|
+
# @param mentionable [true, false] The value it should be changed to
|
160
|
+
def mentionable=(mentionable)
|
161
|
+
update_role_data(mentionable: mentionable)
|
162
|
+
end
|
163
|
+
|
164
|
+
# Sets the role colour to something new
|
165
|
+
# @param colour [ColourRGB] The new colour
|
166
|
+
def colour=(colour)
|
167
|
+
update_role_data(colour: colour)
|
168
|
+
end
|
169
|
+
|
170
|
+
# Upload a role icon for servers with the ROLE_ICONS feature.
|
171
|
+
# @param file [File]
|
172
|
+
def icon=(file)
|
173
|
+
update_role_data(icon: file)
|
174
|
+
end
|
175
|
+
|
176
|
+
# @param format ['webp', 'png', 'jpeg']
|
177
|
+
# @return [String] URL to the icon on Discord's CDN.
|
178
|
+
def icon_url(format = "webp")
|
179
|
+
return nil unless @icon
|
180
|
+
|
181
|
+
Rubycord::API.role_icon_url(@id, @icon, format)
|
182
|
+
end
|
183
|
+
|
184
|
+
alias_method :color=, :colour=
|
185
|
+
|
186
|
+
# Changes this role's permissions to a fixed bitfield. This allows setting multiple permissions at once with just
|
187
|
+
# one API call.
|
188
|
+
#
|
189
|
+
# Information on how this bitfield is structured can be found at
|
190
|
+
# https://discord.com/developers/docs/topics/permissions.
|
191
|
+
# @example Remove all permissions from a role
|
192
|
+
# role.packed = 0
|
193
|
+
# @param packed [Integer] A bitfield with the desired permissions value.
|
194
|
+
# @param update_perms [true, false] Whether the internal data should also be updated. This should always be true
|
195
|
+
# when calling externally.
|
196
|
+
def packed=(packed, update_perms = true)
|
197
|
+
update_role_data(permissions: packed)
|
198
|
+
@permissions.bits = packed if update_perms
|
199
|
+
end
|
200
|
+
|
201
|
+
# Moves this role above another role in the list.
|
202
|
+
# @param other [Role, String, Integer, nil] The role, or its ID, above which this role should be moved. If it is `nil`,
|
203
|
+
# the role will be moved above the @everyone role.
|
204
|
+
# @return [Integer] the new position of this role
|
205
|
+
def sort_above(other = nil)
|
206
|
+
other = @server.role(other.resolve_id) if other
|
207
|
+
roles = @server.roles.sort_by(&:position)
|
208
|
+
roles.delete_at(@position)
|
209
|
+
|
210
|
+
index = other ? roles.index { |role| role.id == other.id } + 1 : 1
|
211
|
+
roles.insert(index, self)
|
212
|
+
|
213
|
+
updated_roles = roles.map.with_index { |role, position| {id: role.id, position: position} }
|
214
|
+
@server.update_role_positions(updated_roles)
|
215
|
+
index
|
216
|
+
end
|
217
|
+
|
218
|
+
alias_method :move_above, :sort_above
|
219
|
+
|
220
|
+
# Deletes this role. This cannot be undone without recreating the role!
|
221
|
+
# @param reason [String] the reason for this role's deletion
|
222
|
+
def delete(reason = nil)
|
223
|
+
API::Server.delete_role(@bot.token, @server.id, @id, reason)
|
224
|
+
@server.delete_role(@id)
|
225
|
+
end
|
226
|
+
|
227
|
+
# The inspect method is overwritten to give more useful output
|
228
|
+
def inspect
|
229
|
+
"<Role name=#{@name} permissions=#{@permissions.inspect} hoist=#{@hoist} colour=#{@colour.inspect} server=#{@server.inspect} position=#{@position} mentionable=#{@mentionable}>"
|
230
|
+
end
|
231
|
+
|
232
|
+
private
|
233
|
+
|
234
|
+
def update_role_data(new_data)
|
235
|
+
API::Server.update_role(@bot.token, @server.id, @id,
|
236
|
+
new_data[:name] || @name,
|
237
|
+
(new_data[:colour] || @colour).combined,
|
238
|
+
new_data[:hoist].nil? ? @hoist : new_data[:hoist],
|
239
|
+
new_data[:mentionable].nil? ? @mentionable : new_data[:mentionable],
|
240
|
+
new_data[:permissions] || @permissions.bits,
|
241
|
+
nil,
|
242
|
+
new_data.key?(:icon) ? new_data[:icon] : :undef)
|
243
|
+
update_data(new_data)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|