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,480 @@
1
+ require "rubycord/events/generic"
2
+ require "rubycord/data"
3
+
4
+ module Rubycord::Events
5
+ # Generic subclass for interaction events
6
+ class InteractionCreateEvent < Event
7
+ # @return [Interaction] The interaction for this event.
8
+ attr_reader :interaction
9
+
10
+ # @!attribute [r] type
11
+ # @return [Integer]
12
+ # @see Interaction#type
13
+ # @!attribute [r] server
14
+ # @return [Server, nil]
15
+ # @see Interaction#server
16
+ # @!attribute [r] server_id
17
+ # @return [Integer]
18
+ # @see Interaction#server_id
19
+ # @!attribute [r] channel
20
+ # @return [Channel]
21
+ # @see Interaction#channel
22
+ # @!attribute [r] channel_id
23
+ # @return [Integer]
24
+ # @see Interaction#channel_id
25
+ # @!attribute [r] user
26
+ # @return [User]
27
+ # @see Interaction#user
28
+ delegate :type, :server, :server_id, :channel, :channel_id, :user, to: :interaction
29
+
30
+ def initialize(data, bot)
31
+ @interaction = Rubycord::Interaction.new(data, bot)
32
+ @bot = bot
33
+ end
34
+
35
+ # (see Interaction#respond)
36
+ def respond(content: nil, tts: nil, embeds: nil, allowed_mentions: nil, flags: 0, ephemeral: nil, wait: false, components: nil, &)
37
+ @interaction.respond(
38
+ content: content, tts: tts, embeds: embeds, allowed_mentions: allowed_mentions,
39
+ flags: flags, ephemeral: ephemeral, wait: wait, components: components, &
40
+ )
41
+ end
42
+
43
+ # (see Interaction#defer)
44
+ def defer(flags: 0, ephemeral: true)
45
+ @interaction.defer(flags: flags, ephemeral: ephemeral)
46
+ end
47
+
48
+ # (see Interaction#update_message)
49
+ def update_message(content: nil, tts: nil, embeds: nil, allowed_mentions: nil, flags: 0, ephemeral: nil, wait: false, components: nil, &)
50
+ @interaction.update_message(
51
+ content: content, tts: tts, embeds: embeds, allowed_mentions: allowed_mentions,
52
+ flags: flags, ephemeral: ephemeral, wait: wait, components: components, &
53
+ )
54
+ end
55
+
56
+ # (see Interaction#show_modal)
57
+ def show_modal(title:, custom_id:, components: nil, &)
58
+ @interaction.show_modal(title: title, custom_id: custom_id, components: components, &)
59
+ end
60
+
61
+ # (see Interaction#edit_response)
62
+ def edit_response(content: nil, embeds: nil, allowed_mentions: nil, components: nil, &)
63
+ @interaction.edit_response(content: content, embeds: embeds, allowed_mentions: allowed_mentions, components: components, &)
64
+ end
65
+
66
+ # (see Interaction#delete_response)
67
+ def delete_response
68
+ @interaction.delete_response
69
+ end
70
+
71
+ # (see Interaction#send_message)
72
+ def send_message(content: nil, embeds: nil, tts: false, allowed_mentions: nil, flags: 0, ephemeral: nil, components: nil, &)
73
+ @interaction.send_message(content: content, embeds: embeds, tts: tts, allowed_mentions: allowed_mentions, flags: flags, ephemeral: ephemeral, components: components, &)
74
+ end
75
+
76
+ # (see Interaction#edit_message)
77
+ def edit_message(message, content: nil, embeds: nil, allowed_mentions: nil, &)
78
+ @interaction.edit_message(message, content: content, embeds: embeds, allowed_mentions: allowed_mentions, &)
79
+ end
80
+
81
+ # (see Interaction#delete_message)
82
+ def delete_message(message)
83
+ @interaction.delete_message(message)
84
+ end
85
+
86
+ # (see Interaction#defer_update)
87
+ def defer_update
88
+ @interaction.defer_update
89
+ end
90
+
91
+ # (see Interaction#get_component)
92
+ def get_component(custom_id)
93
+ @interaction.get_component(custom_id)
94
+ end
95
+ end
96
+
97
+ # Event handler for INTERACTION_CREATE events.
98
+ class InteractionCreateEventHandler < EventHandler
99
+ # @!visibility private
100
+ def matches?(event)
101
+ return false unless event.is_a? InteractionCreateEvent
102
+
103
+ [
104
+ matches_all(@attributes[:type], event.type) do |a, e|
105
+ a == case a
106
+ when String, Symbol
107
+ Rubycord::Interactions::TYPES[e.to_sym]
108
+ else
109
+ e
110
+ end
111
+ end,
112
+
113
+ matches_all(@attributes[:server], event.interaction) do |a, e|
114
+ a.resolve_id == e.server_id
115
+ end,
116
+
117
+ matches_all(@attributes[:channel], event.interaction) do |a, e|
118
+ a.resolve_id == e.channel_id
119
+ end,
120
+
121
+ matches_all(@attributes[:user], event.user) do |a, e|
122
+ a.resolve_id == e.id
123
+ end
124
+ ].reduce(true, &:&)
125
+ end
126
+ end
127
+
128
+ # Event for ApplicationCommand interactions.
129
+ class ApplicationCommandEvent < InteractionCreateEvent
130
+ # Struct to allow accessing data via [] or methods.
131
+ Resolved = Struct.new("Resolved", :channels, :members, :messages, :roles, :users, :attachments)
132
+
133
+ # @return [String] The name of the command.
134
+ attr_reader :command_name
135
+
136
+ # @return [Integer] The ID of the command.
137
+ attr_reader :command_id
138
+
139
+ # @return [String, nil] The name of the subcommand group relevant to this event.
140
+ attr_reader :subcommand_group
141
+
142
+ # @return [String, nil] The name of the subcommand relevant to this event.
143
+ attr_reader :subcommand
144
+
145
+ # @return [Resolved]
146
+ attr_reader :resolved
147
+
148
+ # @return [Hash<Symbol, Object>] Arguments provided to the command, mapped as `Name => Value`.
149
+ attr_reader :options
150
+
151
+ # @return [Integer, nil] The target of this command when it is a context command.
152
+ attr_reader :target_id
153
+
154
+ def initialize(data, bot)
155
+ super
156
+
157
+ command_data = data["data"]
158
+
159
+ @command_id = command_data["id"]
160
+ @command_name = command_data["name"].to_sym
161
+
162
+ @target_id = command_data["target_id"]&.to_i
163
+ @resolved = Resolved.new({}, {}, {}, {}, {}, {})
164
+ process_resolved(command_data["resolved"]) if command_data["resolved"]
165
+
166
+ options = command_data["options"] || []
167
+
168
+ if options.empty?
169
+ @options = {}
170
+ return
171
+ end
172
+
173
+ case options[0]["type"]
174
+ when 2
175
+ options = options[0]
176
+ @subcommand_group = options["name"].to_sym
177
+ @subcommand = options["options"][0]["name"].to_sym
178
+ options = options["options"][0]["options"]
179
+ when 1
180
+ options = options[0]
181
+ @subcommand = options["name"].to_sym
182
+ options = options["options"]
183
+ end
184
+
185
+ @options = transform_options_hash(options || {})
186
+ end
187
+
188
+ # @return [Message, User, nil] The target of this command, for context commands.
189
+ def target
190
+ return nil unless @target_id
191
+
192
+ @resolved.find { |data| data.key?(@target_id) }[@target_id]
193
+ end
194
+
195
+ private
196
+
197
+ def process_resolved(resolved_data)
198
+ resolved_data["users"]&.each do |id, data|
199
+ @resolved[:users][id.to_i] = @bot.ensure_user(data)
200
+ end
201
+
202
+ resolved_data["roles"]&.each do |id, data|
203
+ @resolved[:roles][id.to_i] = Rubycord::Role.new(data, @bot)
204
+ end
205
+
206
+ resolved_data["channels"]&.each do |id, data|
207
+ data["guild_id"] = @interaction.server_id
208
+ @resolved[:channels][id.to_i] = Rubycord::Channel.new(data, @bot)
209
+ end
210
+
211
+ resolved_data["members"]&.each do |id, data|
212
+ data["user"] = resolved_data["users"][id]
213
+ data["guild_id"] = @interaction.server_id
214
+ @resolved[:members][id.to_i] = Rubycord::Member.new(data, nil, @bot)
215
+ end
216
+
217
+ resolved_data["messages"]&.each do |id, data|
218
+ @resolved[:messages][id.to_i] = Rubycord::Message.new(data, @bot)
219
+ end
220
+
221
+ resolved_data["attachments"]&.each do |id, data|
222
+ @resolved[:attachments][id.to_i] = Rubycord::Attachment.new(data, nil, @bot)
223
+ end
224
+ end
225
+
226
+ def transform_options_hash(hash)
227
+ hash.to_h { |opt| [opt["name"], opt["options"] || opt["value"]] }
228
+ end
229
+ end
230
+
231
+ # Event handler for ApplicationCommandEvents.
232
+ class ApplicationCommandEventHandler < EventHandler
233
+ # @return [Hash]
234
+ attr_reader :subcommands
235
+
236
+ # @!visibility private
237
+ def initialize(attributes, block)
238
+ super
239
+
240
+ @subcommands = {}
241
+ end
242
+
243
+ # @param name [Symbol, String]
244
+ # @yieldparam [SubcommandBuilder]
245
+ # @return [ApplicationCommandEventHandler]
246
+ def group(name)
247
+ raise ArgumentError, "Unable to mix subcommands and groups" if @subcommands.any? { |_, v| v.is_a? Proc }
248
+
249
+ builder = SubcommandBuilder.new(name)
250
+ yield builder
251
+
252
+ @subcommands.merge!(builder.to_h)
253
+ self
254
+ end
255
+
256
+ # @param name [String, Symbol]
257
+ # @yieldparam [SubcommandBuilder]
258
+ # @return [ApplicationCommandEventHandler]
259
+ def subcommand(name, &block)
260
+ raise ArgumentError, "Unable to mix subcommands and groups" if @subcommands.any? { |_, v| v.is_a? Hash }
261
+
262
+ @subcommands[name.to_sym] = block
263
+
264
+ self
265
+ end
266
+
267
+ # @!visibility private
268
+ # @param event [Event]
269
+ def call(event)
270
+ return unless matches?(event)
271
+
272
+ if event.subcommand_group
273
+ unless (cmd = @subcommands.dig(event.subcommand_group, event.subcommand))
274
+ Rubycord::LOGGER.debug("Received an event for an unhandled subcommand `#{event.command_name} #{event.subcommand_group} #{event.subcommand}'")
275
+ return
276
+ end
277
+
278
+ cmd.call(event)
279
+ elsif event.subcommand
280
+ unless (cmd = @subcommands[event.subcommand])
281
+ Rubycord::LOGGER.debug("Received an event for an unhandled subcommand `#{event.command_name} #{event.subcommand}'")
282
+ return
283
+ end
284
+
285
+ cmd.call(event)
286
+ else
287
+ @block.call(event)
288
+ end
289
+ end
290
+
291
+ # @!visibility private
292
+ def matches?(event)
293
+ return false unless event.is_a? ApplicationCommandEvent
294
+
295
+ [
296
+ matches_all(@attributes[:name], event.command_name) do |a, e|
297
+ a.to_sym == e.to_sym
298
+ end
299
+ ].reduce(true, &:&)
300
+ end
301
+ end
302
+
303
+ # Builder for adding subcommands to an ApplicationCommandHandler
304
+ class SubcommandBuilder
305
+ # @!visibility private
306
+ # @param group [String, Symbol, nil]
307
+ def initialize(group = nil)
308
+ @group = group&.to_sym
309
+ @subcommands = {}
310
+ end
311
+
312
+ # @param name [Symbol, String]
313
+ # @yieldparam [ApplicationCommandEvent]
314
+ def subcommand(name, &block)
315
+ @subcommands[name.to_sym] = block
316
+ end
317
+
318
+ # @!visibility private
319
+ def to_h
320
+ @group ? {@group => @subcommands} : @subcommands
321
+ end
322
+ end
323
+
324
+ # An event for when a user interacts with a component.
325
+ class ComponentEvent < InteractionCreateEvent
326
+ # @return [String] User provided data for this button.
327
+ attr_reader :custom_id
328
+
329
+ # @return [Interactions::Message, nil] The message the button originates from.
330
+ attr_reader :message
331
+
332
+ # @!visibility private
333
+ def initialize(data, bot)
334
+ super
335
+
336
+ @message = Rubycord::Interactions::Message.new(data["message"], bot, @interaction) if data["message"]
337
+ @custom_id = data["data"]["custom_id"]
338
+ end
339
+ end
340
+
341
+ # Generic handler for component events.
342
+ class ComponentEventHandler < InteractionCreateEventHandler
343
+ def matches?(event)
344
+ return false unless super
345
+ return false unless event.is_a? ComponentEvent
346
+
347
+ [
348
+ matches_all(@attributes[:custom_id], event.custom_id) do |a, e|
349
+ # Match regexp and strings
350
+ case a
351
+ when Regexp
352
+ a.match?(e)
353
+ else
354
+ a == e
355
+ end
356
+ end,
357
+ matches_all(@attributes[:message], event.message) do |a, e|
358
+ case a
359
+ when String, Integer
360
+ a.resolve_id == e.id
361
+ else
362
+ a.id == e.id
363
+ end
364
+ end
365
+ ].reduce(&:&)
366
+ end
367
+ end
368
+
369
+ # An event for when a user interacts with a button component.
370
+ class ButtonEvent < ComponentEvent
371
+ end
372
+
373
+ # Event handler for a Button interaction event.
374
+ class ButtonEventHandler < ComponentEventHandler
375
+ end
376
+
377
+ # Event for when a user interacts with a select string component.
378
+ class StringSelectEvent < ComponentEvent
379
+ # @return [Array<String>] Selected values.
380
+ attr_reader :values
381
+
382
+ # @!visibility private
383
+ def initialize(data, bot)
384
+ super
385
+
386
+ @values = data["data"]["values"]
387
+ end
388
+ end
389
+
390
+ # Event handler for a select string component.
391
+ class StringSelectEventHandler < ComponentEventHandler
392
+ end
393
+
394
+ # An event for when a user submits a modal.
395
+ class ModalSubmitEvent < ComponentEvent
396
+ # @return [Array<TextInputComponent>]
397
+ attr_reader :components
398
+
399
+ # Get the value of an input passed to the modal.
400
+ # @param custom_id [String] The custom ID of the component to look for.
401
+ # @return [String, nil]
402
+ def value(custom_id)
403
+ get_component(custom_id)&.value
404
+ end
405
+ end
406
+
407
+ # Event handler for a modal submission.
408
+ class ModalSubmitEventHandler < ComponentEventHandler
409
+ end
410
+
411
+ # Event for when a user interacts with a select user component.
412
+ class UserSelectEvent < ComponentEvent
413
+ # @return [Array<User>] Selected values.
414
+ attr_reader :values
415
+
416
+ # @!visibility private
417
+ def initialize(data, bot)
418
+ super
419
+
420
+ @values = data["data"]["values"].map { |e| bot.user(e) }
421
+ end
422
+ end
423
+
424
+ # Event handler for a select user component.
425
+ class UserSelectEventHandler < ComponentEventHandler
426
+ end
427
+
428
+ # Event for when a user interacts with a select role component.
429
+ class RoleSelectEvent < ComponentEvent
430
+ # @return [Array<Role>] Selected values.
431
+ attr_reader :values
432
+
433
+ # @!visibility private
434
+ def initialize(data, bot)
435
+ super
436
+
437
+ @values = data["data"]["values"].map { |e| bot.server(data["guild_id"]).role(e) }
438
+ end
439
+ end
440
+
441
+ # Event handler for a select role component.
442
+ class RoleSelectEventHandler < ComponentEventHandler
443
+ end
444
+
445
+ # Event for when a user interacts with a select mentionable component.
446
+ class MentionableSelectEvent < ComponentEvent
447
+ # @return [Hash<Symbol => Array<User>, Symbol => Array<Role>>] Selected values.
448
+ attr_reader :values
449
+
450
+ # @!visibility private
451
+ def initialize(data, bot)
452
+ super
453
+
454
+ users = data["data"]["resolved"]["users"].keys.map { |e| bot.user(e) }
455
+ roles = data["data"]["resolved"]["roles"] ? data["data"]["resolved"]["roles"].keys.map { |e| bot.server(data["guild_id"]).role(e) } : []
456
+ @values = {users: users, roles: roles}
457
+ end
458
+ end
459
+
460
+ # Event handler for a select mentionable component.
461
+ class MentionableSelectEventHandler < ComponentEventHandler
462
+ end
463
+
464
+ # Event for when a user interacts with a select channel component.
465
+ class ChannelSelectEvent < ComponentEvent
466
+ # @return [Array<Channel>] Selected values.
467
+ attr_reader :values
468
+
469
+ # @!visibility private
470
+ def initialize(data, bot)
471
+ super
472
+
473
+ @values = data["data"]["values"].map { |e| bot.channel(e, bot.server(data["guild_id"])) }
474
+ end
475
+ end
476
+
477
+ # Event handler for a select channel component.
478
+ class ChannelSelectEventHandler < ComponentEventHandler
479
+ end
480
+ end
@@ -0,0 +1,123 @@
1
+ module Rubycord::Events
2
+ # Raised when an invite is created.
3
+ class InviteCreateEvent < Event
4
+ # @return [Invite] The invite that was created.
5
+ attr_reader :invite
6
+
7
+ # @return [Server, nil] The server the invite was created for.
8
+ attr_reader :server
9
+
10
+ # @return [Channel] The channel the invite was created for.
11
+ attr_reader :channel
12
+
13
+ # @!attribute [r] code
14
+ # @return [String] The code for the created invite.
15
+ # @see Invite#code
16
+ # @!attribute [r] created_at
17
+ # @return [Time] The time the invite was created at.
18
+ # @see Invite#created_at
19
+ # @!attribute [r] max_age
20
+ # @return [Integer] The maximum age of the created invite.
21
+ # @see Invite#max_age
22
+ # @!attribute [r] max_uses
23
+ # @return [Integer] The maximum number of uses before the invite expires.
24
+ # @see Invite#max_uses
25
+ # @!attribute [r] temporary
26
+ # @return [true, false] Whether or not this invite grants temporary membership.
27
+ # @see Invite#temporary
28
+ # @!attribute [r] inviter
29
+ # @return [User] The user that created the invite.
30
+ # @see Invite#inviter
31
+ delegate :code, :created_at, :max_age, :max_uses, :temporary, :inviter, to: :invite
32
+
33
+ alias_method :temporary?, :temporary
34
+
35
+ def initialize(data, invite, bot)
36
+ @bot = bot
37
+ @invite = invite
38
+ @channel = bot.channel(data["channel_id"])
39
+ @server = bot.server(data["guild_id"]) if data["guild_id"]
40
+ end
41
+ end
42
+
43
+ # Raised when an invite is deleted.
44
+ class InviteDeleteEvent < Event
45
+ # @return [Channel] The channel the deleted invite was for.
46
+ attr_reader :channel
47
+
48
+ # @return [Server, nil] The server the deleted invite was for.
49
+ attr_reader :server
50
+
51
+ # @return [String] The code of the deleted invite.
52
+ attr_reader :code
53
+
54
+ def initialize(data, bot)
55
+ @bot = bot
56
+ @channel = bot.channel(data["channel_id"])
57
+ @server = bot.server(data["guild_id"]) if data["guild_id"]
58
+ @code = data["code"]
59
+ end
60
+ end
61
+
62
+ # Event handler for InviteCreateEvent.
63
+ class InviteCreateEventHandler < EventHandler
64
+ def matches?(event)
65
+ return false unless event.is_a? InviteCreateEvent
66
+
67
+ [
68
+ matches_all(@attributes[:server], event.server) do |a, e|
69
+ a == case a
70
+ when String
71
+ e.name
72
+ when Integer
73
+ e.id
74
+ else
75
+ e
76
+ end
77
+ end,
78
+ matches_all(@attributes[:channel], event.channel) do |a, e|
79
+ a == case a
80
+ when String
81
+ e.name
82
+ when Integer
83
+ e.id
84
+ else
85
+ e
86
+ end
87
+ end,
88
+ matches_all(@attributes[:temporary], event.temporary?, &:==),
89
+ matches_all(@attributes[:inviter], event.inviter, &:==)
90
+ ].reduce(true, &:&)
91
+ end
92
+ end
93
+
94
+ # Event handler for InviteDeleteEvent
95
+ class InviteDeleteEventHandler < EventHandler
96
+ def matches?(event)
97
+ return false unless event.is_a? InviteDeleteEvent
98
+
99
+ [
100
+ matches_all(@attributes[:server], event.server) do |a, e|
101
+ a == case a
102
+ when String
103
+ e.name
104
+ when Integer
105
+ e.id
106
+ else
107
+ e
108
+ end
109
+ end,
110
+ matches_all(@attributes[:channel], event.channel) do |a, e|
111
+ a == case a
112
+ when String
113
+ e.name
114
+ when Integer
115
+ e.id
116
+ else
117
+ e
118
+ end
119
+ end
120
+ ].reduce(true, &:&)
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,29 @@
1
+ require "rubycord/events/generic"
2
+
3
+ module Rubycord::Events
4
+ # Common superclass for all lifetime events
5
+ class LifetimeEvent < Event
6
+ # @!visibility private
7
+ def initialize(bot)
8
+ @bot = bot
9
+ end
10
+ end
11
+
12
+ # @see Rubycord::EventContainer#ready
13
+ class ReadyEvent < LifetimeEvent; end
14
+
15
+ # Event handler for {ReadyEvent}
16
+ class ReadyEventHandler < TrueEventHandler; end
17
+
18
+ # @see Rubycord::EventContainer#disconnected
19
+ class DisconnectEvent < LifetimeEvent; end
20
+
21
+ # Event handler for {DisconnectEvent}
22
+ class DisconnectEventHandler < TrueEventHandler; end
23
+
24
+ # @see Rubycord::EventContainer#heartbeat
25
+ class HeartbeatEvent < LifetimeEvent; end
26
+
27
+ # Event handler for {HeartbeatEvent}
28
+ class HeartbeatEventHandler < TrueEventHandler; end
29
+ end