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