discorb 0.17.1 → 0.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/lint.yml +1 -3
  3. data/.github/workflows/validate.yml +21 -0
  4. data/Changelog.md +25 -0
  5. data/Gemfile +6 -0
  6. data/README.md +2 -1
  7. data/Rakefile +205 -98
  8. data/Steepfile +30 -0
  9. data/docs/application_command.md +1 -0
  10. data/docs/events.md +44 -8
  11. data/docs/tutorial.md +7 -7
  12. data/docs/voice_events.md +8 -8
  13. data/examples/commands/message.rb +12 -7
  14. data/examples/commands/permission.rb +2 -1
  15. data/examples/commands/slash.rb +23 -19
  16. data/examples/commands/user.rb +15 -12
  17. data/examples/components/authorization_button.rb +2 -1
  18. data/examples/components/select_menu.rb +4 -1
  19. data/examples/extension/main.rb +1 -0
  20. data/examples/extension/message_expander.rb +1 -0
  21. data/examples/sig/commands/message.rbs +5 -0
  22. data/examples/simple/eval.rb +1 -0
  23. data/examples/simple/ping_pong.rb +1 -0
  24. data/examples/simple/rolepanel.rb +16 -5
  25. data/examples/simple/shard.rb +2 -1
  26. data/examples/simple/wait_for_message.rb +3 -0
  27. data/exe/discorb +3 -3
  28. data/lib/discorb/allowed_mentions.rb +1 -1
  29. data/lib/discorb/app_command/command.rb +16 -13
  30. data/lib/discorb/app_command/handler.rb +21 -6
  31. data/lib/discorb/audit_logs.rb +6 -2
  32. data/lib/discorb/automod.rb +269 -0
  33. data/lib/discorb/channel/guild.rb +5 -4
  34. data/lib/discorb/channel/stage.rb +1 -1
  35. data/lib/discorb/channel/text.rb +14 -23
  36. data/lib/discorb/channel/thread.rb +15 -11
  37. data/lib/discorb/client.rb +15 -15
  38. data/lib/discorb/color.rb +37 -60
  39. data/lib/discorb/common.rb +1 -1
  40. data/lib/discorb/dictionary.rb +1 -1
  41. data/lib/discorb/embed.rb +5 -4
  42. data/lib/discorb/emoji.rb +4 -4
  43. data/lib/discorb/event.rb +2 -2
  44. data/lib/discorb/exe/about.rb +1 -1
  45. data/lib/discorb/exe/new.rb +1 -5
  46. data/lib/discorb/extension.rb +0 -4
  47. data/lib/discorb/flag.rb +2 -2
  48. data/lib/discorb/gateway.rb +38 -589
  49. data/lib/discorb/gateway_events.rb +638 -0
  50. data/lib/discorb/guild.rb +138 -19
  51. data/lib/discorb/guild_template.rb +3 -3
  52. data/lib/discorb/http.rb +47 -25
  53. data/lib/discorb/integration.rb +2 -2
  54. data/lib/discorb/intents.rb +27 -18
  55. data/lib/discorb/interaction/command.rb +14 -10
  56. data/lib/discorb/interaction/response.rb +150 -84
  57. data/lib/discorb/interaction/root.rb +139 -0
  58. data/lib/discorb/invite.rb +1 -1
  59. data/lib/discorb/member.rb +3 -3
  60. data/lib/discorb/message.rb +17 -15
  61. data/lib/discorb/message_meta.rb +2 -3
  62. data/lib/discorb/modules.rb +5 -4
  63. data/lib/discorb/permission.rb +3 -1
  64. data/lib/discorb/presence.rb +4 -2
  65. data/lib/discorb/reaction.rb +2 -2
  66. data/lib/discorb/role.rb +3 -3
  67. data/lib/discorb/shard.rb +1 -1
  68. data/lib/discorb/sticker.rb +5 -5
  69. data/lib/discorb/user.rb +2 -2
  70. data/lib/discorb/voice_state.rb +8 -8
  71. data/lib/discorb/webhook.rb +20 -11
  72. data/lib/discorb.rb +2 -2
  73. data/rbs_collection.lock.yaml +88 -96
  74. data/rbs_collection.yaml +21 -17
  75. data/sig/async.rbs +11 -5
  76. data/sig/discorb/activity.rbs +24 -0
  77. data/sig/discorb/allowed_mentions.rbs +45 -0
  78. data/sig/discorb/app_command/base.rbs +288 -0
  79. data/sig/discorb/app_command/handler.rbs +171 -0
  80. data/sig/discorb/application.rbs +146 -0
  81. data/sig/discorb/asset.rbs +34 -0
  82. data/sig/discorb/attachment.rbs +99 -0
  83. data/sig/discorb/audit_log.rbs +238 -0
  84. data/sig/discorb/automod.rbs +145 -0
  85. data/sig/discorb/avatar.rbs +27 -0
  86. data/sig/discorb/channel/base.rbs +186 -0
  87. data/sig/discorb/channel/category.rbs +57 -0
  88. data/sig/discorb/channel/container.rbs +33 -0
  89. data/sig/discorb/channel/dm.rbs +14 -0
  90. data/sig/discorb/channel/news.rbs +20 -0
  91. data/sig/discorb/channel/stage.rbs +81 -0
  92. data/sig/discorb/channel/text.rbs +158 -0
  93. data/sig/discorb/channel/thread.rbs +196 -0
  94. data/sig/discorb/channel/voice.rbs +43 -0
  95. data/sig/discorb/client.rbs +2496 -0
  96. data/sig/discorb/color.rbs +148 -0
  97. data/sig/discorb/component/base.rbs +29 -0
  98. data/sig/discorb/component/button.rbs +67 -0
  99. data/sig/discorb/component/select_menu.rbs +111 -0
  100. data/sig/discorb/component/text_input.rbs +70 -0
  101. data/sig/discorb/connectable.rbs +8 -0
  102. data/sig/discorb/custom_emoji.rbs +94 -0
  103. data/sig/discorb/dictionary.rbs +87 -0
  104. data/sig/discorb/discord_model.rbs +17 -0
  105. data/sig/discorb/embed.rbs +286 -0
  106. data/sig/discorb/emoji.rbs +14 -0
  107. data/sig/discorb/error.rbs +73 -0
  108. data/sig/discorb/event_handler.rbs +28 -0
  109. data/sig/discorb/extension.rbs +1735 -0
  110. data/sig/discorb/flag.rbs +74 -0
  111. data/sig/discorb/gateway.rbs +486 -0
  112. data/sig/discorb/guild.rbs +872 -0
  113. data/sig/discorb/guild_template.rbs +174 -0
  114. data/sig/discorb/http.rbs +150 -0
  115. data/sig/discorb/image.rbs +22 -0
  116. data/sig/discorb/integration.rbs +118 -0
  117. data/sig/discorb/intents.rbs +98 -0
  118. data/sig/discorb/interaction/autocomplete.rbs +9 -0
  119. data/sig/discorb/interaction/base.rbs +102 -0
  120. data/sig/discorb/interaction/command.rbs +66 -0
  121. data/sig/discorb/interaction/message_component.rbs +139 -0
  122. data/sig/discorb/interaction/modal.rbs +49 -0
  123. data/sig/discorb/interaction/responder.rbs +157 -0
  124. data/sig/discorb/invite.rbs +86 -0
  125. data/sig/discorb/member.rbs +189 -0
  126. data/sig/discorb/message.rbs +474 -0
  127. data/sig/discorb/messageable.rbs +150 -0
  128. data/sig/discorb/partial_emoji.rbs +38 -0
  129. data/sig/discorb/permissions.rbs +156 -0
  130. data/sig/discorb/presence.rbs +239 -0
  131. data/sig/discorb/reaction.rbs +37 -0
  132. data/sig/discorb/role.rbs +151 -0
  133. data/sig/discorb/scheduled_event.rbs +149 -0
  134. data/sig/discorb/shard.rbs +63 -0
  135. data/sig/discorb/snowflake.rbs +58 -0
  136. data/sig/discorb/stage_instance.rbs +69 -0
  137. data/sig/discorb/sticker.rbs +116 -0
  138. data/sig/discorb/system_channel_flag.rbs +17 -0
  139. data/sig/discorb/unicode_emoji.rbs +53 -0
  140. data/sig/discorb/user.rbs +95 -0
  141. data/sig/discorb/utils.rbs +8 -0
  142. data/sig/discorb/voice_region.rbs +30 -0
  143. data/sig/discorb/voice_state.rbs +71 -0
  144. data/sig/discorb/webhook.rbs +338 -0
  145. data/sig/discorb/welcome_screen.rbs +79 -0
  146. data/sig/discorb.rbs +5 -8661
  147. data/sig/manifest.yaml +3 -0
  148. data/sig/override.rbs +21 -0
  149. metadata +80 -3
@@ -0,0 +1,638 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ module Gateway
5
+ #
6
+ # Represents an event.
7
+ # @abstract
8
+ #
9
+ class GatewayEvent
10
+ #
11
+ # Initializes a new instance of the GatewayEvent class.
12
+ # @private
13
+ #
14
+ # @param [Hash] data The data of the event.
15
+ #
16
+ def initialize(data)
17
+ @data = data
18
+ end
19
+
20
+ def inspect
21
+ "#<#{self.class}>"
22
+ end
23
+ end
24
+
25
+ #
26
+ # Represents a reaction event.
27
+ #
28
+ class ReactionEvent < GatewayEvent
29
+ # @return [Hash] The raw data of the event.
30
+ attr_reader :data
31
+ # @return [Discorb::Snowflake] The ID of the user who reacted.
32
+ attr_reader :user_id
33
+ alias member_id user_id
34
+ # @return [Discorb::Snowflake] The ID of the channel the message was sent in.
35
+ attr_reader :channel_id
36
+ # @return [Discorb::Snowflake] The ID of the message.
37
+ attr_reader :message_id
38
+ # @return [Discorb::Snowflake] The ID of the guild the message was sent in.
39
+ attr_reader :guild_id
40
+ # @macro client_cache
41
+ # @return [Discorb::User, Discorb::Member] The user who reacted.
42
+ attr_reader :user
43
+ alias member user
44
+ # @macro client_cache
45
+ # @return [Discorb::Channel] The channel the message was sent in.
46
+ attr_reader :channel
47
+ # @macro client_cache
48
+ # @return [Discorb::Guild] The guild the message was sent in.
49
+ attr_reader :guild
50
+ # @macro client_cache
51
+ # @return [Discorb::Message] The message the reaction was sent in.
52
+ attr_reader :message
53
+ # @return [Discorb::UnicodeEmoji, Discorb::PartialEmoji] The emoji that was reacted with.
54
+ attr_reader :emoji
55
+
56
+ #
57
+ # Initializes a new instance of the ReactionEvent class.
58
+ # @private
59
+ #
60
+ # @param [Discorb::Client] client The client that instantiated the object.
61
+ # @param [Hash] data The data of the event.
62
+ #
63
+ def initialize(client, data)
64
+ @client = client
65
+ @data = data
66
+ if data.key?(:user_id)
67
+ @user_id = Snowflake.new(data[:user_id])
68
+ else
69
+ @member_data = data[:member]
70
+ end
71
+ @channel_id = Snowflake.new(data[:channel_id])
72
+ @message_id = Snowflake.new(data[:message_id])
73
+ @guild_id = Snowflake.new(data[:guild_id])
74
+ @guild = client.guilds[data[:guild_id]]
75
+ @channel = client.channels[data[:channel_id]] unless @guild.nil?
76
+
77
+ @user = client.users[data[:user_id]]
78
+
79
+ unless @guild.nil?
80
+ @user = if data.key?(:member)
81
+ @guild.members[data[:member][:user][:id]] ||
82
+ Member.new(
83
+ @client,
84
+ @guild_id,
85
+ data[:member][:user],
86
+ data[:member]
87
+ )
88
+ else
89
+ @guild.members[data[:user_id]]
90
+ end || @user
91
+ end
92
+
93
+ @message = client.messages[data[:message_id]]
94
+ @emoji = data[:emoji][:id].nil? ? UnicodeEmoji.new(data[:emoji][:name]) : PartialEmoji.new(data[:emoji])
95
+ end
96
+
97
+ # Fetch the message.
98
+ # If message is cached, it will be returned.
99
+ # @async
100
+ #
101
+ # @param [Boolean] force Whether to force fetching the message.
102
+ #
103
+ # @return [Async::Task<Discorb::Message>] The message.
104
+ def fetch_message(force: false)
105
+ Async do
106
+ next @message if !force && @message
107
+
108
+ @message = @channel.fetch_message(@message_id).wait
109
+ end
110
+ end
111
+ end
112
+
113
+ #
114
+ # Represents a `INTEGRATION_DELETE` event.
115
+ #
116
+ class IntegrationDeleteEvent < GatewayEvent
117
+ # @return [Discorb::Snowflake] The ID of the integration.
118
+ attr_reader :id
119
+
120
+ # @!attribute [r] guild
121
+ # @macro client_cache
122
+ # @return [Discorb::Guild] The guild of the integration.
123
+ # @!attribute [r] user
124
+ # @macro client_cache
125
+ # @return [Discorb::User] The user associated with the integration.
126
+
127
+ #
128
+ # Initialize a new instance of the IntegrationDeleteEvent class.
129
+ # @private
130
+ #
131
+ #
132
+ # @param [Hash] data The data of the event.
133
+ #
134
+ #
135
+ def initialize(_client, data)
136
+ @id = Snowflake.new(data[:id])
137
+ @guild_id = data[:guild_id]
138
+ @user_id = data[:application_id]
139
+ end
140
+
141
+ def guild
142
+ @client.guilds[@guild_id]
143
+ end
144
+
145
+ def user
146
+ @client.users[@user_id]
147
+ end
148
+ end
149
+
150
+ #
151
+ # Represents a `MESSAGE_REACTION_REMOVE_ALL` event.
152
+ #
153
+ class ReactionRemoveAllEvent < GatewayEvent
154
+ # @return [Discorb::Snowflake] The ID of the channel the message was sent in.
155
+ attr_reader :channel_id
156
+ # @return [Discorb::Snowflake] The ID of the message.
157
+ attr_reader :message_id
158
+ # @return [Discorb::Snowflake] The ID of the guild the message was sent in.
159
+ attr_reader :guild_id
160
+ # @macro client_cache
161
+ # @return [Discorb::Channel] The channel the message was sent in.
162
+ attr_reader :channel
163
+ # @macro client_cache
164
+ # @return [Discorb::Guild] The guild the message was sent in.
165
+ attr_reader :guild
166
+ # @macro client_cache
167
+ # @return [Discorb::Message] The message the reaction was sent in.
168
+ attr_reader :message
169
+
170
+ #
171
+ # Initialize a new instance of the ReactionRemoveAllEvent class.
172
+ # @private
173
+ #
174
+ # @param [Discorb::Client] client The client that instantiated the object.
175
+ # @param [Hash] data The data of the event.
176
+ #
177
+ def initialize(client, data)
178
+ @client = client
179
+ @data = data
180
+ @guild_id = Snowflake.new(data[:guild_id])
181
+ @channel_id = Snowflake.new(data[:channel_id])
182
+ @message_id = Snowflake.new(data[:message_id])
183
+ @guild = client.guilds[data[:guild_id]]
184
+ @channel = client.channels[data[:channel_id]]
185
+ @message = client.messages[data[:message_id]]
186
+ end
187
+
188
+ # Fetch the message.
189
+ # If message is cached, it will be returned.
190
+ # @async
191
+ #
192
+ # @param [Boolean] force Whether to force fetching the message.
193
+ #
194
+ # @return [Async::Task<Discorb::Message>] The message.
195
+ def fetch_message(force: false)
196
+ Async do
197
+ next @message if !force && @message
198
+
199
+ @message = @channel.fetch_message(@message_id).wait
200
+ end
201
+ end
202
+ end
203
+
204
+ #
205
+ # Represents a `MESSAGE_REACTION_REMOVE_EMOJI` event.
206
+ #
207
+ class ReactionRemoveEmojiEvent < GatewayEvent
208
+ # @return [Discorb::Snowflake] The ID of the channel the message was sent in.
209
+ attr_reader :channel_id
210
+ # @return [Discorb::Snowflake] The ID of the message.
211
+ attr_reader :message_id
212
+ # @return [Discorb::Snowflake] The ID of the guild the message was sent in.
213
+ attr_reader :guild_id
214
+ # @macro client_cache
215
+ # @return [Discorb::Channel] The channel the message was sent in.
216
+ attr_reader :channel
217
+ # @macro client_cache
218
+ # @return [Discorb::Guild] The guild the message was sent in.
219
+ attr_reader :guild
220
+ # @macro client_cache
221
+ # @return [Discorb::Message] The message the reaction was sent in.
222
+ attr_reader :message
223
+ # @return [Discorb::UnicodeEmoji, Discorb::PartialEmoji] The emoji that was reacted with.
224
+ attr_reader :emoji
225
+
226
+ #
227
+ # Initialize a new instance of the ReactionRemoveEmojiEvent class.
228
+ # @private
229
+ #
230
+ # @param [Discorb::Client] client The client that instantiated the object.
231
+ # @param [Hash] data The data of the event.
232
+ #
233
+ def initialize(client, data)
234
+ @client = client
235
+ @data = data
236
+ @guild_id = Snowflake.new(data[:guild_id])
237
+ @channel_id = Snowflake.new(data[:channel_id])
238
+ @message_id = Snowflake.new(data[:message_id])
239
+ @guild = client.guilds[data[:guild_id]]
240
+ @channel = client.channels[data[:channel_id]]
241
+ @message = client.messages[data[:message_id]]
242
+ @emoji = data[:emoji][:id].nil? ? DiscordEmoji.new(data[:emoji][:name]) : PartialEmoji.new(data[:emoji])
243
+ end
244
+
245
+ # Fetch the message.
246
+ # If message is cached, it will be returned.
247
+ # @async
248
+ #
249
+ # @param [Boolean] force Whether to force fetching the message.
250
+ #
251
+ # @return [Async::Task<Discorb::Message>] The message.
252
+ def fetch_message(force: false)
253
+ Async do
254
+ next @message if !force && @message
255
+
256
+ @message = @channel.fetch_message(@message_id).wait
257
+ end
258
+ end
259
+ end
260
+
261
+ #
262
+ # Represents a `GUILD_SCHEDULED_EVENT_USER_ADD` and `GUILD_SCHEDULED_EVENT_USER_REMOVE` event.
263
+ #
264
+ class ScheduledEventUserEvent < GatewayEvent
265
+ # @return [Discorb::User] The user that triggered the event.
266
+ attr_reader :user
267
+ # @return [Discorb::Guild] The guild the event was triggered in.
268
+ attr_reader :guild
269
+ # @return [Discorb::ScheduledEvent] The scheduled event.
270
+ attr_reader :scheduled_event
271
+
272
+ #
273
+ # Initialize a new instance of the ScheduledEventUserEvent class.
274
+ # @private
275
+ #
276
+ # @param [Discorb::Client] client The client that instantiated the object.
277
+ # @param [Hash] data The data of the event.
278
+ #
279
+ def initialize(client, data)
280
+ @client = client
281
+ @scheduled_event_id = Snowflake.new(data[:scheduled_event_id])
282
+ @user_id = Snowflake.new(data[:user_id])
283
+ @guild_id = Snowflake.new(data[:guild_id])
284
+ @guild = client.guilds[data[:guild_id]]
285
+ @scheduled_event = @guild.scheduled_events[@scheduled_event_id]
286
+ @user = client.users[data[:user_id]]
287
+ end
288
+ end
289
+
290
+ #
291
+ # Represents a `MESSAGE_UPDATE` event.
292
+ #
293
+ class MessageUpdateEvent < GatewayEvent
294
+ # @return [Discorb::Message] The message before update.
295
+ attr_reader :before
296
+ # @return [Discorb::Message] The message after update.
297
+ attr_reader :after
298
+ # @return [Discorb::Snowflake] The ID of the message.
299
+ attr_reader :id
300
+ # @return [Discorb::Snowflake] The ID of the channel the message was sent in.
301
+ attr_reader :channel_id
302
+ # @return [Discorb::Snowflake] The ID of the guild the message was sent in.
303
+ attr_reader :guild_id
304
+ # @return [String] The new content of the message.
305
+ attr_reader :content
306
+ # @return [Time] The time the message was edited.
307
+ attr_reader :timestamp
308
+ # @return [Boolean] Whether the message pings @everyone.
309
+ attr_reader :mention_everyone
310
+ # @macro client_cache
311
+ # @return [Array<Discorb::Role>] The roles mentioned in the message.
312
+ attr_reader :mention_roles
313
+ # @return [Array<Discorb::Attachment>] The attachments in the message.
314
+ attr_reader :attachments
315
+ # @return [Array<Discorb::Embed>] The embeds in the message.
316
+ attr_reader :embeds
317
+
318
+ # @!attribute [r] channel
319
+ # @macro client_cache
320
+ # @return [Discorb::Channel] The channel the message was sent in.
321
+ # @!attribute [r] guild
322
+ # @macro client_cache
323
+ # @return [Discorb::Guild] The guild the message was sent in.
324
+
325
+ def initialize(client, data, before, after)
326
+ @client = client
327
+ @data = data
328
+ @before = before
329
+ @after = after
330
+ @id = Snowflake.new(data[:id])
331
+ @channel_id = Snowflake.new(data[:channel_id])
332
+ @guild_id = Snowflake.new(data[:guild_id]) if data.key?(:guild_id)
333
+ @content = data[:content]
334
+ @timestamp = Time.iso8601(data[:edited_timestamp])
335
+ @mention_everyone = data[:mention_everyone]
336
+ @mention_roles = data[:mention_roles].map { |r| guild.roles[r] } if data.key?(:mention_roles)
337
+ @attachments = data[:attachments].map { |a| Attachment.from_hash(a) } if data.key?(:attachments)
338
+ @embeds = data[:embeds] ? data[:embeds].map { |e| Embed.from_hash(e) } : [] if data.key?(:embeds)
339
+ end
340
+
341
+ def channel
342
+ @client.channels[@channel_id]
343
+ end
344
+
345
+ def guild
346
+ @client.guilds[@guild_id]
347
+ end
348
+
349
+ # Fetch the message.
350
+ # @async
351
+ #
352
+ # @return [Async::Task<Discorb::Message>] The message.
353
+ def fetch_message
354
+ Async do
355
+ channel.fetch_message(@id).wait
356
+ end
357
+ end
358
+ end
359
+
360
+ #
361
+ # Represents a message but it has only ID.
362
+ #
363
+ class UnknownDeleteBulkMessage < GatewayEvent
364
+ # @return [Discorb::Snowflake] The ID of the message.
365
+ attr_reader :id
366
+
367
+ # @!attribute [r] channel
368
+ # @macro client_cache
369
+ # @return [Discorb::Channel] The channel the message was sent in.
370
+ # @!attribute [r] guild
371
+ # @macro client_cache
372
+ # @return [Discorb::Guild] The guild the message was sent in.
373
+
374
+ #
375
+ # Initialize a new instance of the UnknownDeleteBulkMessage class.
376
+ # @private
377
+ #
378
+ # @param [Discorb::Client] client The client that instantiated the object.
379
+ # @param [Hash] data The data of the event.
380
+ #
381
+ def initialize(client, id, data)
382
+ @client = client
383
+ @id = Snowflake.new(id)
384
+ @data = data
385
+ @channel_id = Snowflake.new(data[:channel_id])
386
+ @guild_id = Snowflake.new(data[:guild_id]) if data.key?(:guild_id)
387
+ end
388
+
389
+ def channel
390
+ @client.channels[@channel_id]
391
+ end
392
+
393
+ def guild
394
+ @client.guilds[@guild_id]
395
+ end
396
+ end
397
+
398
+ #
399
+ # Represents a `INVITE_DELETE` event.
400
+ #
401
+ class InviteDeleteEvent < GatewayEvent
402
+ # @return [String] The invite code.
403
+ attr_reader :code
404
+
405
+ # @!attribute [r] channel
406
+ # @macro client_cache
407
+ # @return [Discorb::Channel] The channel the message was sent in.
408
+ # @!attribute [r] guild
409
+ # @macro client_cache
410
+ # @return [Discorb::Guild] The guild the message was sent in.
411
+
412
+ #
413
+ # Initialize a new instance of the InviteDeleteEvent class.
414
+ # @private
415
+ #
416
+ # @param [Discorb::Client] client The client that instantiated the object.
417
+ # @param [Hash] data The data of the event.
418
+ #
419
+ def initialize(client, data)
420
+ @client = client
421
+ @data = data
422
+ @channel_id = Snowflake.new(data[:channel])
423
+ @guild_id = Snowflake.new(data[:guild_id])
424
+ @code = data[:code]
425
+ end
426
+
427
+ def channel
428
+ @client.channels[@channel_id]
429
+ end
430
+
431
+ def guild
432
+ @client.guilds[@guild_id]
433
+ end
434
+ end
435
+
436
+ #
437
+ # Represents a `TYPING_START` event.
438
+ #
439
+ class TypingStartEvent < GatewayEvent
440
+ # @return [Discorb::Snowflake] The ID of the channel the user is typing in.
441
+ attr_reader :user_id
442
+
443
+ # @!attribute [r] channel
444
+ # @macro client_cache
445
+ # @return [Discorb::Channel] The channel the user is typing in.
446
+ # @!attribute [r] guild
447
+ # @macro client_cache
448
+ # @return [Discorb::Guild] The guild the user is typing in.
449
+ # @!attribute [r] user
450
+ # @macro client_cache
451
+ # @return [Discorb::User, Discorb::Member] The user that is typing.
452
+
453
+ #
454
+ # Initialize a new instance of the TypingStartEvent class.
455
+ # @private
456
+ #
457
+ # @param [Discorb::Client] client The client that instantiated the object.
458
+ # @param [Hash] data The data of the event.
459
+ #
460
+ def initialize(client, data)
461
+ @client = client
462
+ @data = data
463
+ @channel_id = Snowflake.new(data[:channel_id])
464
+ @guild_id = Snowflake.new(data[:guild_id]) if data.key?(:guild_id)
465
+ @user_id = Snowflake.new(data[:user_id])
466
+ @timestamp = Time.at(data[:timestamp])
467
+ if guild
468
+ @member = guild.members[@user_id] || Member.new(
469
+ @client,
470
+ @guild_id,
471
+ @client.users[@user_id].instance_variable_get(:@data),
472
+ data[:member]
473
+ )
474
+ end
475
+ end
476
+
477
+ def user
478
+ @member || guild&.members&.[](@user_id) || @client.users[@user_id]
479
+ end
480
+
481
+ alias member user
482
+
483
+ def channel
484
+ @client.channels[@channel_id]
485
+ end
486
+
487
+ def guild
488
+ @client.guilds[@guild_id]
489
+ end
490
+ end
491
+
492
+ #
493
+ # Represents a message pin event.
494
+ #
495
+ class MessagePinEvent < GatewayEvent
496
+ # @return [Discorb::Message] The message that was pinned.
497
+ attr_reader :message
498
+ # @return [:pinned, :unpinned] The type of event.
499
+ attr_reader :type
500
+
501
+ # @!attribute [r] pinned?
502
+ # @return [Boolean] Whether the message was pinned.
503
+ # @!attribute [r] unpinned?
504
+ # @return [Boolean] Whether the message was unpinned.
505
+
506
+ def initialize(client, data, message)
507
+ @client = client
508
+ @data = data
509
+ @message = message
510
+ @type = if message.nil?
511
+ :unknown
512
+ elsif @message.pinned?
513
+ :pinned
514
+ else
515
+ :unpinned
516
+ end
517
+ end
518
+
519
+ def pinned?
520
+ @type == :pinned
521
+ end
522
+
523
+ def unpinned?
524
+ @type == :unpinned
525
+ end
526
+ end
527
+
528
+ #
529
+ # Represents a `WEBHOOKS_UPDATE` event.
530
+ #
531
+ class WebhooksUpdateEvent < GatewayEvent
532
+ # @!attribute [r] channel
533
+ # @macro client_cache
534
+ # @return [Discorb::Channel] The channel where the webhook was updated.
535
+ # @!attribute [r] guild
536
+ # @macro client_cache
537
+ # @return [Discorb::Guild] The guild where the webhook was updated.
538
+
539
+ #
540
+ # Initialize a new instance of the WebhooksUpdateEvent class.
541
+ # @private
542
+ #
543
+ # @param [Discorb::Client] client The client that instantiated the object.
544
+ # @param [Hash] data The data of the event.
545
+ #
546
+ def initialize(client, data)
547
+ @client = client
548
+ @data = data
549
+ @guild_id = Snowflake.new(data[:guild_id])
550
+ @channel_id = Snowflake.new(data[:channel_id])
551
+ end
552
+
553
+ def guild
554
+ @client.guilds[@guild_id]
555
+ end
556
+
557
+ def channel
558
+ @client.channels[@channel_id]
559
+ end
560
+ end
561
+
562
+ #
563
+ # Represents a `AUTO_MODERATION_ACTION_EXECUTION` event.
564
+ #
565
+ class AutoModerationActionExecutionEvent < GatewayEvent
566
+ # @return [Discorb::Snowflake] The id of the rule.
567
+ attr_reader :rule_id
568
+
569
+ # @return [Symbol] The type of action that was executed.
570
+ attr_reader :rule_trigger_type
571
+
572
+ # @return [Discorb::Snowflake] The id of the message that triggered the action.
573
+ # @return [nil] If the message was deleted.
574
+ attr_reader :message_id
575
+
576
+ # @return [Discorb::Snowflake] The id of the system message that was sent.
577
+ # @return [nil] If the system message channel was not set.
578
+ attr_reader :alert_system_message_id
579
+
580
+ # @return [String] The content of the message that was sent.
581
+ attr_reader :content
582
+
583
+ # @return [String] The keyword that triggered the action.
584
+ # @return [nil] If the action was not triggered by a keyword.
585
+ attr_reader :matched_keyword
586
+
587
+ # @return [String] The content that triggered the action.
588
+ # @return [nil] If the action was not triggered by a keyword.
589
+ attr_reader :matched_content
590
+
591
+ # @return [Discorb::AutoModRule::Action] The action that was executed.
592
+ attr_reader :action
593
+
594
+ #
595
+ # Initialize a new instance of the AutoModerationActionExecutionEvent class.
596
+ # @private
597
+ #
598
+ # @param [Discorb::Client] client The client that instantiated the object.
599
+ # @param [Hash] data The data of the event.
600
+ #
601
+ def initialize(client, data)
602
+ @client = client
603
+ @data = data
604
+ @rule_id = Snowflake.new(data[:rule_id])
605
+ @rule_trigger_type = Discorb::AutoModRule::TRIGGER_TYPES[data[:rule_trigger_type]]
606
+ @action = Discorb::AutoModRule::Action.new(data[:action])
607
+ @user_id = Snowflake.new(data[:user_id])
608
+ @guild_id = Snowflake.new(data[:guild_id])
609
+ @channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
610
+ @message_id = data[:message_id] && Snowflake.new(data[:message_id])
611
+ @alert_system_message_id = data[:alert_system_message_id] && Snowflake.new(data[:alert_system_message_id])
612
+ @content = data[:content]
613
+ @matched_keyword = data[:matched_keyword]
614
+ @matched_content = data[:matched_content]
615
+ end
616
+
617
+ # @!attribute [r] guild
618
+ # @return [Discorb::Guild] The guild where the rule was executed.
619
+ def guild
620
+ @client.guilds[@guild_id]
621
+ end
622
+
623
+ # @!attribute [r] channel
624
+ # @return [Discorb::Channel] The channel where the rule was executed.
625
+ def channel
626
+ @client.channels[@channel_id]
627
+ end
628
+
629
+ # @!attribute [r] member
630
+ # @return [Discorb::Member] The member that triggered the action.
631
+ def member
632
+ guild.members[@user_id]
633
+ end
634
+
635
+ alias user member
636
+ end
637
+ end
638
+ end