rubycord 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,343 @@
|
|
1
|
+
module Rubycord
|
2
|
+
# A server's audit logs
|
3
|
+
class AuditLogs
|
4
|
+
# The numbers associated with the type of action.
|
5
|
+
ACTIONS = {
|
6
|
+
1 => :server_update,
|
7
|
+
10 => :channel_create,
|
8
|
+
11 => :channel_update,
|
9
|
+
12 => :channel_delete,
|
10
|
+
13 => :channel_overwrite_create,
|
11
|
+
14 => :channel_overwrite_update,
|
12
|
+
15 => :channel_overwrite_delete,
|
13
|
+
20 => :member_kick,
|
14
|
+
21 => :member_prune,
|
15
|
+
22 => :member_ban_add,
|
16
|
+
23 => :member_ban_remove,
|
17
|
+
24 => :member_update,
|
18
|
+
25 => :member_role_update,
|
19
|
+
26 => :member_move,
|
20
|
+
27 => :member_disconnect,
|
21
|
+
28 => :bot_add,
|
22
|
+
30 => :role_create,
|
23
|
+
31 => :role_update,
|
24
|
+
32 => :role_delete,
|
25
|
+
40 => :invite_create,
|
26
|
+
41 => :invite_update,
|
27
|
+
42 => :invite_delete,
|
28
|
+
50 => :webhook_create,
|
29
|
+
51 => :webhook_update,
|
30
|
+
52 => :webhook_delete,
|
31
|
+
60 => :emoji_create,
|
32
|
+
61 => :emoji_update,
|
33
|
+
62 => :emoji_delete,
|
34
|
+
# 70
|
35
|
+
# 71
|
36
|
+
72 => :message_delete,
|
37
|
+
73 => :message_bulk_delete,
|
38
|
+
74 => :message_pin,
|
39
|
+
75 => :message_unpin,
|
40
|
+
80 => :integration_create,
|
41
|
+
81 => :integration_update,
|
42
|
+
82 => :integration_delete
|
43
|
+
}.freeze
|
44
|
+
|
45
|
+
# @!visibility private
|
46
|
+
CREATE_ACTIONS = %i[
|
47
|
+
channel_create channel_overwrite_create member_ban_add role_create
|
48
|
+
invite_create webhook_create emoji_create integration_create
|
49
|
+
].freeze
|
50
|
+
|
51
|
+
# @!visibility private
|
52
|
+
DELETE_ACTIONS = %i[
|
53
|
+
channel_delete channel_overwrite_delete member_kick member_prune
|
54
|
+
member_ban_remove role_delete invite_delete webhook_delete
|
55
|
+
emoji_delete message_delete message_bulk_delete integration_delete
|
56
|
+
].freeze
|
57
|
+
|
58
|
+
# @!visibility private
|
59
|
+
UPDATE_ACTIONS = %i[
|
60
|
+
server_update channel_update channel_overwrite_update member_update
|
61
|
+
member_role_update role_update invite_update webhook_update
|
62
|
+
emoji_update integration_update
|
63
|
+
].freeze
|
64
|
+
|
65
|
+
# @return [Hash<String => User>] the users included in the audit logs.
|
66
|
+
attr_reader :users
|
67
|
+
|
68
|
+
# @return [Hash<String => Webhook>] the webhooks included in the audit logs.
|
69
|
+
attr_reader :webhooks
|
70
|
+
|
71
|
+
# @return [Array<Entry>] the entries listed in the audit logs.
|
72
|
+
attr_reader :entries
|
73
|
+
|
74
|
+
# @!visibility private
|
75
|
+
def initialize(server, bot, data)
|
76
|
+
@bot = bot
|
77
|
+
@server = server
|
78
|
+
@users = {}
|
79
|
+
@webhooks = {}
|
80
|
+
@entries = data["audit_log_entries"].map { |entry| Entry.new(self, @server, @bot, entry) }
|
81
|
+
|
82
|
+
process_users(data["users"])
|
83
|
+
process_webhooks(data["webhooks"])
|
84
|
+
end
|
85
|
+
|
86
|
+
# An entry in a server's audit logs.
|
87
|
+
class Entry
|
88
|
+
include IDObject
|
89
|
+
|
90
|
+
# @return [Symbol] the action that was performed.
|
91
|
+
attr_reader :action
|
92
|
+
|
93
|
+
# @return [Symbol] the type action that was performed. (:create, :delete, :update, :unknown)
|
94
|
+
attr_reader :action_type
|
95
|
+
|
96
|
+
# @return [Symbol] the type of target being performed on. (:server, :channel, :user, :role, :invite, :webhook, :emoji, :unknown)
|
97
|
+
attr_reader :target_type
|
98
|
+
|
99
|
+
# @return [Integer, nil] the amount of messages deleted. Only present if the action is `:message_delete`.
|
100
|
+
attr_reader :count
|
101
|
+
alias_method :amount, :count
|
102
|
+
|
103
|
+
# @return [Integer, nil] the amount of days the members were inactive for. Only present if the action is `:member_prune`.
|
104
|
+
attr_reader :days
|
105
|
+
|
106
|
+
# @return [Integer, nil] the amount of members removed. Only present if the action is `:member_prune`.
|
107
|
+
attr_reader :members_removed
|
108
|
+
|
109
|
+
# @return [String, nil] the reason for this action occurring.
|
110
|
+
attr_reader :reason
|
111
|
+
|
112
|
+
# @return [Hash<String => Change>, RoleChange, nil] the changes from this log, listing the key as the key changed. Will be a RoleChange object if the action is `:member_role_update`. Will be nil if the action is either `:message_delete` or `:member_prune`.
|
113
|
+
attr_reader :changes
|
114
|
+
|
115
|
+
# @!visibility private
|
116
|
+
def initialize(logs, server, bot, data)
|
117
|
+
@bot = bot
|
118
|
+
@id = data["id"].resolve_id
|
119
|
+
@logs = logs
|
120
|
+
@server = server
|
121
|
+
@data = data
|
122
|
+
@action = ACTIONS[data["action_type"]]
|
123
|
+
@reason = data["reason"]
|
124
|
+
@action_type = AuditLogs.action_type_for(data["action_type"])
|
125
|
+
@target_type = AuditLogs.target_type_for(data["action_type"])
|
126
|
+
|
127
|
+
# Sets the 'changes' variable to a empty hash if there are no special actions.
|
128
|
+
@changes = {} unless @action == :message_delete || @action == :member_prune || @action == :member_role_update
|
129
|
+
|
130
|
+
# Sets the 'changes' variable to a RoleChange class if there's a role update.
|
131
|
+
@changes = RoleChange.new(data["changes"][0], @server) if @action == :member_role_update
|
132
|
+
|
133
|
+
process_changes(data["changes"]) unless @action == :member_role_update
|
134
|
+
return unless data.include?("options")
|
135
|
+
|
136
|
+
# Checks and sets variables for special action options.
|
137
|
+
@count = data["options"]["count"].to_i unless data["options"]["count"].nil?
|
138
|
+
@channel_id = data["options"]["channel"].to_i unless data["options"]["channel"].nil?
|
139
|
+
@days = data["options"]["delete_member_days"].to_i unless data["options"]["delete_member_days"].nil?
|
140
|
+
@members_removed = data["options"]["members_removed"].to_i unless data["options"]["members_removed"].nil?
|
141
|
+
end
|
142
|
+
|
143
|
+
# @return [Server, Channel, Member, User, Role, Invite, Webhook, Emoji, nil] the target being performed on.
|
144
|
+
def target
|
145
|
+
@target ||= process_target(@data["target_id"], @target_type)
|
146
|
+
end
|
147
|
+
|
148
|
+
# @return [Member, User] the user that authored this action. Can be a User object if the user no longer exists in the server.
|
149
|
+
def user
|
150
|
+
@user ||= @server.member(@data["user_id"].to_i) || @bot.user(@data["user_id"].to_i) || @logs.user(@data["user_id"].to_i)
|
151
|
+
end
|
152
|
+
alias_method :author, :user
|
153
|
+
|
154
|
+
# @return [Channel, nil] the amount of messages deleted. Won't be nil if the action is `:message_delete`.
|
155
|
+
def channel
|
156
|
+
return nil unless @channel_id
|
157
|
+
|
158
|
+
@channel ||= @bot.channel(@channel_id, @server, bot, self)
|
159
|
+
end
|
160
|
+
|
161
|
+
# @!visibility private
|
162
|
+
def process_target(id, type)
|
163
|
+
id = id.resolve_id unless id.nil?
|
164
|
+
case type
|
165
|
+
when :server then @server # Since it won't be anything else
|
166
|
+
when :channel then @bot.channel(id, @server)
|
167
|
+
when :user, :message then @server.member(id) || @bot.user(id) || @logs.user(id)
|
168
|
+
when :role then @server.role(id)
|
169
|
+
when :invite then @bot.invite(@data["changes"].find { |change| change["key"] == "code" }.values.delete_if { |v| v == "code" }.first)
|
170
|
+
when :webhook then @server.webhooks.find { |webhook| webhook.id == id } || @logs.webhook(id)
|
171
|
+
when :emoji then @server.emoji[id]
|
172
|
+
when :integration then @server.integrations.find { |integration| integration.id == id }
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# The inspect method is overwritten to give more useful output
|
177
|
+
def inspect
|
178
|
+
"<AuditLogs::Entry id=#{@id} key=#{@key} action=#{@action} reason=#{@reason} action_type=#{@action_type} target_type=#{@target_type} count=#{@count} days=#{@days} members_removed=#{@members_removed}>"
|
179
|
+
end
|
180
|
+
|
181
|
+
# Process action changes
|
182
|
+
# @note For internal use only
|
183
|
+
# @!visibility private
|
184
|
+
def process_changes(changes)
|
185
|
+
return unless changes
|
186
|
+
|
187
|
+
changes.each do |element|
|
188
|
+
change = Change.new(element, @server, @bot, self)
|
189
|
+
@changes[change.key] = change
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
# A change in a audit log entry.
|
195
|
+
class Change
|
196
|
+
# @return [String] the key that was changed.
|
197
|
+
# @note You should check with the Discord API Documentation on what key gives out what value.
|
198
|
+
attr_reader :key
|
199
|
+
|
200
|
+
# @return [String, Integer, true, false, Permissions, Overwrite, nil] the value that was changed from.
|
201
|
+
attr_reader :old
|
202
|
+
alias_method :old_value, :old
|
203
|
+
|
204
|
+
# @return [String, Integer, true, false, Permissions, Overwrite, nil] the value that was changed to.
|
205
|
+
attr_reader :new
|
206
|
+
alias_method :new_value, :new
|
207
|
+
|
208
|
+
# @!visibility private
|
209
|
+
def initialize(data, server, bot, logs)
|
210
|
+
@key = data["key"]
|
211
|
+
@old = data["old_value"]
|
212
|
+
@new = data["new_value"]
|
213
|
+
@server = server
|
214
|
+
@bot = bot
|
215
|
+
@logs = logs
|
216
|
+
|
217
|
+
@old = Permissions.new(@old) if @old && @key == "permissions"
|
218
|
+
@new = Permissions.new(@new) if @new && @key == "permissions"
|
219
|
+
|
220
|
+
@old = @old.map { |o| Overwrite.new(o["id"], type: o["type"], allow: o["allow"], deny: o["deny"]) } if @old && @key == "permission_overwrites"
|
221
|
+
@new = @new.map { |o| Overwrite.new(o["id"], type: o["type"], allow: o["allow"], deny: o["deny"]) } if @new && @key == "permission_overwrites"
|
222
|
+
end
|
223
|
+
|
224
|
+
# @return [Channel, nil] the channel that was previously used in the server widget. Only present if the key for this change is `widget_channel_id`.
|
225
|
+
def old_widget_channel
|
226
|
+
@bot.channel(@old, @server) if @old && @key == "widget_channel_id"
|
227
|
+
end
|
228
|
+
|
229
|
+
# @return [Channel, nil] the channel that is used in the server widget prior to this change. Only present if the key for this change is `widget_channel_id`.
|
230
|
+
def new_widget_channel
|
231
|
+
@bot.channel(@new, @server) if @new && @key == "widget_channel_id"
|
232
|
+
end
|
233
|
+
|
234
|
+
# @return [Channel, nil] the channel that was previously used in the server as an AFK channel. Only present if the key for this change is `afk_channel_id`.
|
235
|
+
def old_afk_channel
|
236
|
+
@bot.channel(@old, @server) if @old && @key == "afk_channel_id"
|
237
|
+
end
|
238
|
+
|
239
|
+
# @return [Channel, nil] the channel that is used in the server as an AFK channel prior to this change. Only present if the key for this change is `afk_channel_id`.
|
240
|
+
def new_afk_channel
|
241
|
+
@bot.channel(@new, @server) if @new && @key == "afk_channel_id"
|
242
|
+
end
|
243
|
+
|
244
|
+
# @return [Member, User, nil] the member that used to be the owner of the server. Only present if the for key for this change is `owner_id`.
|
245
|
+
def old_owner
|
246
|
+
@server.member(@old) || @bot.user(@old) || @logs.user(@old) if @old && @key == "owner_id"
|
247
|
+
end
|
248
|
+
|
249
|
+
# @return [Member, User, nil] the member that is now the owner of the server prior to this change. Only present if the key for this change is `owner_id`.
|
250
|
+
def new_owner
|
251
|
+
@server.member(@new) || @bot.user(@new) || @logs.user(@new) if @new && @key == "owner_id"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
# A change that includes roles.
|
256
|
+
class RoleChange
|
257
|
+
# @return [Symbol] what type of change this is: (:add, :remove)
|
258
|
+
attr_reader :type
|
259
|
+
|
260
|
+
# @!visibility private
|
261
|
+
def initialize(data, server)
|
262
|
+
@type = data["key"].delete("$").to_sym
|
263
|
+
@role_id = data["new_value"][0]["id"].to_i
|
264
|
+
@server = server
|
265
|
+
end
|
266
|
+
|
267
|
+
# @return [Role] the role being used.
|
268
|
+
def role
|
269
|
+
@role ||= @server.role(@role_id)
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
# @return [Entry] the latest entry in the audit logs.
|
274
|
+
def latest
|
275
|
+
@entries.first
|
276
|
+
end
|
277
|
+
alias_method :first, :latest
|
278
|
+
|
279
|
+
# Gets a user in the audit logs data based on user ID
|
280
|
+
# @note This only uses data given by the audit logs request
|
281
|
+
# @param id [String, Integer] The user ID to look for
|
282
|
+
def user(id)
|
283
|
+
@users[id.resolve_id]
|
284
|
+
end
|
285
|
+
|
286
|
+
# Gets a webhook in the audit logs data based on webhook ID
|
287
|
+
# @note This only uses data given by the audit logs request
|
288
|
+
# @param id [String, Integer] The webhook ID to look for
|
289
|
+
def webhook(id)
|
290
|
+
@webhooks[id.resolve_id]
|
291
|
+
end
|
292
|
+
|
293
|
+
# Process user objects given by the request
|
294
|
+
# @note For internal use only
|
295
|
+
# @!visibility private
|
296
|
+
def process_users(users)
|
297
|
+
users.each do |element|
|
298
|
+
user = User.new(element, @bot)
|
299
|
+
@users[user.id] = user
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
# Process webhook objects given by the request
|
304
|
+
# @note For internal use only
|
305
|
+
# @!visibility private
|
306
|
+
def process_webhooks(webhooks)
|
307
|
+
webhooks.each do |element|
|
308
|
+
webhook = Webhook.new(element, @bot)
|
309
|
+
@webhooks[webhook.id] = webhook
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
# Find the type of target by it's action number
|
314
|
+
# @note For internal use only
|
315
|
+
# @!visibility private
|
316
|
+
def self.target_type_for(action)
|
317
|
+
case action
|
318
|
+
when 1..9 then :server
|
319
|
+
when 10..19 then :channel
|
320
|
+
when 20..29 then :user
|
321
|
+
when 30..39 then :role
|
322
|
+
when 40..49 then :invite
|
323
|
+
when 50..59 then :webhook
|
324
|
+
when 60..69 then :emoji
|
325
|
+
when 70..79 then :message
|
326
|
+
when 80..89 then :integration
|
327
|
+
else :unknown
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
# Find the type of action by its action number
|
332
|
+
# @note For internal use only
|
333
|
+
# @!visibility private
|
334
|
+
def self.action_type_for(action)
|
335
|
+
action = ACTIONS[action]
|
336
|
+
return :create if CREATE_ACTIONS.include?(action)
|
337
|
+
return :delete if DELETE_ACTIONS.include?(action)
|
338
|
+
return :update if UPDATE_ACTIONS.include?(action)
|
339
|
+
|
340
|
+
:unknown
|
341
|
+
end
|
342
|
+
end
|
343
|
+
end
|