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,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
|