rubycord 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/lib/rubycord/allowed_mentions.rb +34 -0
  3. data/lib/rubycord/api/application.rb +200 -0
  4. data/lib/rubycord/api/channel.rb +597 -0
  5. data/lib/rubycord/api/interaction.rb +52 -0
  6. data/lib/rubycord/api/invite.rb +42 -0
  7. data/lib/rubycord/api/server.rb +557 -0
  8. data/lib/rubycord/api/user.rb +153 -0
  9. data/lib/rubycord/api/webhook.rb +138 -0
  10. data/lib/rubycord/api.rb +356 -0
  11. data/lib/rubycord/await.rb +49 -0
  12. data/lib/rubycord/bot.rb +1757 -0
  13. data/lib/rubycord/cache.rb +259 -0
  14. data/lib/rubycord/colour_rgb.rb +41 -0
  15. data/lib/rubycord/commands/command_bot.rb +519 -0
  16. data/lib/rubycord/commands/container.rb +110 -0
  17. data/lib/rubycord/commands/events.rb +9 -0
  18. data/lib/rubycord/commands/parser.rb +325 -0
  19. data/lib/rubycord/commands/rate_limiter.rb +142 -0
  20. data/lib/rubycord/container.rb +753 -0
  21. data/lib/rubycord/data/activity.rb +269 -0
  22. data/lib/rubycord/data/application.rb +48 -0
  23. data/lib/rubycord/data/attachment.rb +109 -0
  24. data/lib/rubycord/data/audit_logs.rb +343 -0
  25. data/lib/rubycord/data/channel.rb +996 -0
  26. data/lib/rubycord/data/component.rb +227 -0
  27. data/lib/rubycord/data/embed.rb +249 -0
  28. data/lib/rubycord/data/emoji.rb +80 -0
  29. data/lib/rubycord/data/integration.rb +120 -0
  30. data/lib/rubycord/data/interaction.rb +798 -0
  31. data/lib/rubycord/data/invite.rb +135 -0
  32. data/lib/rubycord/data/member.rb +370 -0
  33. data/lib/rubycord/data/message.rb +412 -0
  34. data/lib/rubycord/data/overwrite.rb +106 -0
  35. data/lib/rubycord/data/profile.rb +89 -0
  36. data/lib/rubycord/data/reaction.rb +31 -0
  37. data/lib/rubycord/data/recipient.rb +32 -0
  38. data/lib/rubycord/data/role.rb +246 -0
  39. data/lib/rubycord/data/server.rb +1002 -0
  40. data/lib/rubycord/data/user.rb +261 -0
  41. data/lib/rubycord/data/voice_region.rb +43 -0
  42. data/lib/rubycord/data/voice_state.rb +39 -0
  43. data/lib/rubycord/data/webhook.rb +232 -0
  44. data/lib/rubycord/data.rb +40 -0
  45. data/lib/rubycord/errors.rb +737 -0
  46. data/lib/rubycord/events/await.rb +46 -0
  47. data/lib/rubycord/events/bans.rb +58 -0
  48. data/lib/rubycord/events/channels.rb +186 -0
  49. data/lib/rubycord/events/generic.rb +126 -0
  50. data/lib/rubycord/events/guilds.rb +191 -0
  51. data/lib/rubycord/events/interactions.rb +480 -0
  52. data/lib/rubycord/events/invites.rb +123 -0
  53. data/lib/rubycord/events/lifetime.rb +29 -0
  54. data/lib/rubycord/events/members.rb +91 -0
  55. data/lib/rubycord/events/message.rb +337 -0
  56. data/lib/rubycord/events/presence.rb +127 -0
  57. data/lib/rubycord/events/raw.rb +45 -0
  58. data/lib/rubycord/events/reactions.rb +156 -0
  59. data/lib/rubycord/events/roles.rb +86 -0
  60. data/lib/rubycord/events/threads.rb +94 -0
  61. data/lib/rubycord/events/typing.rb +70 -0
  62. data/lib/rubycord/events/voice_server_update.rb +45 -0
  63. data/lib/rubycord/events/voice_state_update.rb +103 -0
  64. data/lib/rubycord/events/webhooks.rb +62 -0
  65. data/lib/rubycord/gateway.rb +867 -0
  66. data/lib/rubycord/id_object.rb +37 -0
  67. data/lib/rubycord/light/data.rb +60 -0
  68. data/lib/rubycord/light/integrations.rb +71 -0
  69. data/lib/rubycord/light/light_bot.rb +56 -0
  70. data/lib/rubycord/light.rb +6 -0
  71. data/lib/rubycord/logger.rb +118 -0
  72. data/lib/rubycord/paginator.rb +55 -0
  73. data/lib/rubycord/permissions.rb +251 -0
  74. data/lib/rubycord/version.rb +5 -0
  75. data/lib/rubycord/voice/encoder.rb +113 -0
  76. data/lib/rubycord/voice/network.rb +366 -0
  77. data/lib/rubycord/voice/sodium.rb +96 -0
  78. data/lib/rubycord/voice/voice_bot.rb +408 -0
  79. data/lib/rubycord/webhooks/builder.rb +100 -0
  80. data/lib/rubycord/webhooks/client.rb +132 -0
  81. data/lib/rubycord/webhooks/embeds.rb +248 -0
  82. data/lib/rubycord/webhooks/modal.rb +78 -0
  83. data/lib/rubycord/webhooks/version.rb +7 -0
  84. data/lib/rubycord/webhooks/view.rb +192 -0
  85. data/lib/rubycord/webhooks.rb +12 -0
  86. data/lib/rubycord/websocket.rb +70 -0
  87. data/lib/rubycord.rb +140 -0
  88. 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