discorb 0.16.0 → 0.18.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 (199) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/build_main.yml +2 -2
  4. data/.github/workflows/build_version.yml +1 -1
  5. data/.github/workflows/codeql-analysis.yml +1 -1
  6. data/.github/workflows/lint-push.yml +3 -5
  7. data/.github/workflows/lint.yml +2 -4
  8. data/.github/workflows/spec.yml +33 -0
  9. data/.github/workflows/validate.yml +21 -0
  10. data/.gitignore +2 -0
  11. data/.lefthook/commit-msg/validator.rb +5 -0
  12. data/.rspec +2 -0
  13. data/.rspec_parallel +2 -0
  14. data/.rubocop.yml +43 -6
  15. data/Changelog.md +30 -1
  16. data/Gemfile +20 -8
  17. data/Rakefile +226 -98
  18. data/Steepfile +28 -0
  19. data/bin/console +3 -3
  20. data/docs/Examples.md +1 -1
  21. data/docs/application_command.md +156 -47
  22. data/docs/cli/irb.md +2 -2
  23. data/docs/cli/new.md +14 -9
  24. data/docs/cli/run.md +7 -11
  25. data/docs/cli.md +17 -10
  26. data/docs/events.md +247 -213
  27. data/docs/extension.md +1 -2
  28. data/docs/faq.md +0 -1
  29. data/docs/tutorial.md +18 -18
  30. data/docs/voice_events.md +106 -106
  31. data/examples/commands/message.rb +68 -0
  32. data/examples/commands/permission.rb +19 -0
  33. data/examples/commands/slash.rb +48 -0
  34. data/examples/commands/user.rb +54 -0
  35. data/examples/components/authorization_button.rb +4 -3
  36. data/examples/components/select_menu.rb +6 -3
  37. data/examples/extension/main.rb +2 -1
  38. data/examples/extension/message_expander.rb +6 -2
  39. data/examples/sig/commands/message.rbs +5 -0
  40. data/examples/simple/eval.rb +3 -2
  41. data/examples/simple/ping_pong.rb +2 -1
  42. data/examples/simple/rolepanel.rb +17 -6
  43. data/examples/simple/shard.rb +3 -2
  44. data/examples/simple/wait_for_message.rb +4 -1
  45. data/exe/discorb +33 -18
  46. data/lefthook.yml +45 -0
  47. data/lib/discorb/allowed_mentions.rb +2 -1
  48. data/lib/discorb/app_command/command.rb +130 -72
  49. data/lib/discorb/app_command/common.rb +25 -0
  50. data/lib/discorb/app_command/handler.rb +130 -33
  51. data/lib/discorb/app_command.rb +2 -1
  52. data/lib/discorb/application.rb +1 -0
  53. data/lib/discorb/asset.rb +1 -2
  54. data/lib/discorb/attachment.rb +1 -1
  55. data/lib/discorb/audit_logs.rb +19 -10
  56. data/lib/discorb/automod.rb +269 -0
  57. data/lib/discorb/channel/base.rb +108 -0
  58. data/lib/discorb/channel/category.rb +32 -0
  59. data/lib/discorb/channel/container.rb +44 -0
  60. data/lib/discorb/channel/dm.rb +28 -0
  61. data/lib/discorb/channel/guild.rb +246 -0
  62. data/lib/discorb/channel/stage.rb +140 -0
  63. data/lib/discorb/channel/text.rb +336 -0
  64. data/lib/discorb/channel/thread.rb +325 -0
  65. data/lib/discorb/channel/voice.rb +79 -0
  66. data/lib/discorb/channel.rb +2 -1165
  67. data/lib/discorb/client.rb +50 -36
  68. data/lib/discorb/color.rb +37 -60
  69. data/lib/discorb/common.rb +2 -1
  70. data/lib/discorb/components/button.rb +2 -1
  71. data/lib/discorb/components/select_menu.rb +4 -2
  72. data/lib/discorb/components/text_input.rb +12 -2
  73. data/lib/discorb/components.rb +1 -1
  74. data/lib/discorb/dictionary.rb +1 -1
  75. data/lib/discorb/embed.rb +26 -10
  76. data/lib/discorb/emoji.rb +31 -4
  77. data/lib/discorb/emoji_table.rb +4969 -3
  78. data/lib/discorb/event.rb +29 -4
  79. data/lib/discorb/exe/about.rb +2 -1
  80. data/lib/discorb/exe/irb.rb +2 -4
  81. data/lib/discorb/exe/new.rb +89 -26
  82. data/lib/discorb/exe/run.rb +8 -22
  83. data/lib/discorb/exe/setup.rb +25 -12
  84. data/lib/discorb/exe/show.rb +4 -3
  85. data/lib/discorb/extend.rb +1 -0
  86. data/lib/discorb/extension.rb +6 -7
  87. data/lib/discorb/flag.rb +13 -2
  88. data/lib/discorb/gateway.rb +79 -589
  89. data/lib/discorb/gateway_events.rb +638 -0
  90. data/lib/discorb/guild.rb +318 -67
  91. data/lib/discorb/guild_template.rb +11 -5
  92. data/lib/discorb/http.rb +53 -24
  93. data/lib/discorb/integration.rb +4 -1
  94. data/lib/discorb/intents.rb +28 -19
  95. data/lib/discorb/interaction/autocomplete.rb +28 -16
  96. data/lib/discorb/interaction/command.rb +42 -14
  97. data/lib/discorb/interaction/components.rb +5 -2
  98. data/lib/discorb/interaction/modal.rb +0 -1
  99. data/lib/discorb/interaction/response.rb +125 -26
  100. data/lib/discorb/interaction/root.rb +13 -13
  101. data/lib/discorb/interaction.rb +1 -0
  102. data/lib/discorb/invite.rb +5 -2
  103. data/lib/discorb/member.rb +28 -8
  104. data/lib/discorb/message.rb +60 -25
  105. data/lib/discorb/message_meta.rb +3 -3
  106. data/lib/discorb/modules.rb +59 -16
  107. data/lib/discorb/presence.rb +2 -0
  108. data/lib/discorb/rate_limit.rb +7 -2
  109. data/lib/discorb/reaction.rb +2 -2
  110. data/lib/discorb/role.rb +20 -5
  111. data/lib/discorb/shard.rb +1 -1
  112. data/lib/discorb/sticker.rb +9 -8
  113. data/lib/discorb/user.rb +4 -3
  114. data/lib/discorb/utils/colored_puts.rb +1 -0
  115. data/lib/discorb/voice_state.rb +6 -2
  116. data/lib/discorb/webhook.rb +64 -31
  117. data/lib/discorb.rb +7 -5
  118. data/po/yard.pot +20 -20
  119. data/rbs_collection.lock.yaml +88 -0
  120. data/rbs_collection.yaml +21 -0
  121. data/sig/async.rbs +11 -0
  122. data/sig/discorb/activity.rbs +23 -0
  123. data/sig/discorb/allowed_mentions.rbs +44 -0
  124. data/sig/discorb/app_command/base.rbs +282 -0
  125. data/sig/discorb/app_command/handler.rbs +171 -0
  126. data/sig/discorb/application.rbs +142 -0
  127. data/sig/discorb/asset.rbs +32 -0
  128. data/sig/discorb/attachment.rbs +91 -0
  129. data/sig/discorb/audit_log.rbs +231 -0
  130. data/sig/discorb/automod.rbs +128 -0
  131. data/sig/discorb/avatar.rbs +26 -0
  132. data/sig/discorb/channel/base.rbs +179 -0
  133. data/sig/discorb/channel/category.rbs +56 -0
  134. data/sig/discorb/channel/container.rbs +29 -0
  135. data/sig/discorb/channel/dm.rbs +14 -0
  136. data/sig/discorb/channel/news.rbs +20 -0
  137. data/sig/discorb/channel/stage.rbs +77 -0
  138. data/sig/discorb/channel/text.rbs +158 -0
  139. data/sig/discorb/channel/thread.rbs +185 -0
  140. data/sig/discorb/channel/voice.rbs +41 -0
  141. data/sig/discorb/client.rbs +2495 -0
  142. data/sig/discorb/color.rbs +142 -0
  143. data/sig/discorb/component/base.rbs +28 -0
  144. data/sig/discorb/component/button.rbs +65 -0
  145. data/sig/discorb/component/select_menu.rbs +107 -0
  146. data/sig/discorb/component/text_input.rbs +69 -0
  147. data/sig/discorb/connectable.rbs +8 -0
  148. data/sig/discorb/custom_emoji.rbs +90 -0
  149. data/sig/discorb/dictionary.rbs +85 -0
  150. data/sig/discorb/discord_model.rbs +15 -0
  151. data/sig/discorb/embed.rbs +279 -0
  152. data/sig/discorb/emoji.rbs +13 -0
  153. data/sig/discorb/error.rbs +73 -0
  154. data/sig/discorb/event_handler.rbs +27 -0
  155. data/sig/discorb/extension.rbs +1734 -0
  156. data/sig/discorb/flag.rbs +72 -0
  157. data/sig/discorb/gateway.rbs +481 -0
  158. data/sig/discorb/guild.rbs +870 -0
  159. data/sig/discorb/guild_template.rbs +174 -0
  160. data/sig/discorb/http.rbs +147 -0
  161. data/sig/discorb/image.rbs +20 -0
  162. data/sig/discorb/integration.rbs +118 -0
  163. data/sig/discorb/intents.rbs +97 -0
  164. data/sig/discorb/interaction/autocomplete.rbs +9 -0
  165. data/sig/discorb/interaction/base.rbs +66 -0
  166. data/sig/discorb/interaction/command.rbs +66 -0
  167. data/sig/discorb/interaction/message_component.rbs +140 -0
  168. data/sig/discorb/interaction/modal.rbs +50 -0
  169. data/sig/discorb/interaction/responder.rbs +157 -0
  170. data/sig/discorb/invite.rbs +86 -0
  171. data/sig/discorb/member.rbs +187 -0
  172. data/sig/discorb/message.rbs +469 -0
  173. data/sig/discorb/messageable.rbs +153 -0
  174. data/sig/discorb/partial_emoji.rbs +35 -0
  175. data/sig/discorb/permissions.rbs +149 -0
  176. data/sig/discorb/presence.rbs +237 -0
  177. data/sig/discorb/reaction.rbs +33 -0
  178. data/sig/discorb/role.rbs +145 -0
  179. data/sig/discorb/scheduled_event.rbs +148 -0
  180. data/sig/discorb/shard.rbs +62 -0
  181. data/sig/discorb/snowflake.rbs +56 -0
  182. data/sig/discorb/stage_instance.rbs +63 -0
  183. data/sig/discorb/sticker.rbs +116 -0
  184. data/sig/discorb/system_channel_flag.rbs +17 -0
  185. data/sig/discorb/unicode_emoji.rbs +49 -0
  186. data/sig/discorb/user.rbs +93 -0
  187. data/sig/discorb/utils.rbs +8 -0
  188. data/sig/discorb/voice_region.rbs +30 -0
  189. data/sig/discorb/voice_state.rbs +71 -0
  190. data/sig/discorb/webhook.rbs +327 -0
  191. data/sig/discorb/welcome_screen.rbs +78 -0
  192. data/sig/discorb.rbs +6 -7230
  193. data/sig/manifest.yaml +3 -0
  194. data/sig/override.rbs +19 -0
  195. data/template-replace/files/css/common.css +4 -0
  196. metadata +102 -6
  197. data/examples/commands/bookmarker.rb +0 -42
  198. data/examples/commands/hello.rb +0 -10
  199. data/examples/commands/inspect.rb +0 -25
data/lib/discorb/guild.rb CHANGED
@@ -21,7 +21,8 @@ module Discorb
21
21
  attr_reader :afk_timeout
22
22
  # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::Role}] A dictionary of roles in the guild.
23
23
  attr_reader :roles
24
- # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::CustomEmoji}] A dictionary of custom emojis in the guild.
24
+ # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::CustomEmoji}]
25
+ # A dictionary of custom emojis in the guild.
25
26
  attr_reader :emojis
26
27
  # @return [Array<Symbol>] features that are enabled in the guild.
27
28
  # @see https://discord.com/developers/docs/resources/guild#guild-object-guild-features Official Discord API docs
@@ -76,7 +77,8 @@ module Discorb
76
77
  attr_reader :welcome_screen
77
78
  # @return [:default, :explicit, :safe, :age_restricted] The nsfw level of the guild.
78
79
  attr_reader :nsfw_level
79
- # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::StageInstance}] A dictionary of stage instances in the guild.
80
+ # @return [Discorb::Dictionary{Discorb::Snowflake => Discorb::StageInstance}]
81
+ # A dictionary of stage instances in the guild.
80
82
  attr_reader :stage_instances
81
83
  # @return [:none, :low, :medium, :high, :very_high] The verification level of the guild.
82
84
  attr_reader :verification_level
@@ -100,6 +102,8 @@ module Discorb
100
102
  attr_reader :scheduled_events
101
103
  alias events scheduled_events
102
104
 
105
+ include Discorb::ChannelContainer
106
+
103
107
  # @!attribute [r] afk_channel
104
108
  # @return [Discorb::VoiceChannel] The AFK channel for this guild.
105
109
  # @macro client_cache
@@ -193,7 +197,13 @@ module Discorb
193
197
  #
194
198
  def fetch_scheduled_events(with_user_count: true)
195
199
  Async do
196
- _resp, events = @client.http.request(Route.new("/guilds/#{@id}/scheduled-events?with_user_count=#{with_user_count}", "//guilds/:guild_id/scheduled-events", :get)).wait
200
+ _resp, events = @client.http.request(
201
+ Route.new(
202
+ "/guilds/#{@id}/scheduled-events?with_user_count=#{with_user_count}",
203
+ "//guilds/:guild_id/scheduled-events",
204
+ :get
205
+ )
206
+ ).wait
197
207
  @scheduled_events = events.map { |e| ScheduledEvent.new(@client, e) }
198
208
  end
199
209
  end
@@ -209,10 +219,13 @@ module Discorb
209
219
  #
210
220
  def fetch_scheduled_event(id)
211
221
  Async do
212
- _resp, event = @client.http.request(Route.new("/guilds/#{@id}/scheduled-events/#{id}", "//guilds/:guild_id/scheduled-events/:scheduled_event_id", :get)).wait
213
- rescue Discorb::NotFoundError
214
- return nil
215
- else
222
+ _resp, event = @client.http.request(
223
+ Route.new(
224
+ "/guilds/#{@id}/scheduled-events/#{id}",
225
+ "//guilds/:guild_id/scheduled-events/:scheduled_event_id",
226
+ :get
227
+ )
228
+ ).wait
216
229
  ScheduledEvent.new(@client, event)
217
230
  end
218
231
  end
@@ -246,6 +259,7 @@ module Discorb
246
259
  payload = case type
247
260
  when :stage_instance
248
261
  raise ArgumentError, "channel must be provided for stage_instance events" unless channel
262
+
249
263
  {
250
264
  name: name,
251
265
  description: description,
@@ -257,6 +271,7 @@ module Discorb
257
271
  }
258
272
  when :voice
259
273
  raise ArgumentError, "channel must be provided for voice events" unless channel
274
+
260
275
  {
261
276
  name: name,
262
277
  description: description,
@@ -269,6 +284,7 @@ module Discorb
269
284
  when :external
270
285
  raise ArgumentError, "location must be provided for external events" unless location
271
286
  raise ArgumentError, "end_time must be provided for external events" unless end_time
287
+
272
288
  {
273
289
  name: name,
274
290
  description: description,
@@ -283,7 +299,9 @@ module Discorb
283
299
  else
284
300
  raise ArgumentError, "Invalid scheduled event type: #{type}"
285
301
  end
286
- _resp, event = @client.http.request(Route.new("/guilds/#{@id}/scheduled-events", "//guilds/:guild_id/scheduled-events", :post), payload).wait
302
+ _resp, event = @client.http.request(
303
+ Route.new("/guilds/#{@id}/scheduled-events", "//guilds/:guild_id/scheduled-events", :post), payload
304
+ ).wait
287
305
  Discorb::ScheduledEvent.new(@client, event)
288
306
  end
289
307
  end
@@ -293,7 +311,8 @@ module Discorb
293
311
  # @async
294
312
  # @note This querys the API every time. We recommend using {#emojis} instead.
295
313
  #
296
- # @return [Async::Task<Discorb::Dictionary{Discorb::Snowflake => Discorb::CustomEmoji}>] A dictionary of emoji in the guild.
314
+ # @return [Async::Task<Discorb::Dictionary{Discorb::Snowflake => Discorb::CustomEmoji}>]
315
+ # A dictionary of emoji in the guild.
297
316
  #
298
317
  def fetch_emoji_list
299
318
  Async do
@@ -321,8 +340,16 @@ module Discorb
321
340
  # @return [Async::Task<Discorb::CustomEmoji>] The emoji with the given id.
322
341
  #
323
342
  def fetch_emoji(id)
324
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/emojis/#{id}", "//guilds/:guild_id/emojis/:emoji_id", :get)).wait
325
- @emojis[e[:id]] = CustomEmoji.new(@client, self, data)
343
+ Async do
344
+ _resp, data = @client.http.request(
345
+ Route.new(
346
+ "/guilds/#{@id}/emojis/#{id}",
347
+ "//guilds/:guild_id/emojis/:emoji_id",
348
+ :get
349
+ )
350
+ ).wait
351
+ @emojis[e[:id]] = CustomEmoji.new(@client, self, data)
352
+ end
326
353
  end
327
354
 
328
355
  #
@@ -336,13 +363,17 @@ module Discorb
336
363
  # @return [Async::Task<Discorb::CustomEmoji>] The created emoji.
337
364
  #
338
365
  def create_emoji(name, image, roles: [])
339
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/emojis", "//guilds/:guild_id/emojis", :post),
340
- {
341
- name: name,
342
- image: image.to_s,
343
- roles: roles.map { |r| Discorb::Utils.try(r, :id) },
344
- }).wait
345
- @emojis[data[:id]] = CustomEmoji.new(@client, self, data)
366
+ Async do
367
+ _resp, data = @client.http.request(
368
+ Route.new("/guilds/#{@id}/emojis", "//guilds/:guild_id/emojis", :post),
369
+ {
370
+ name: name,
371
+ image: image.to_s,
372
+ roles: roles.map { |r| Discorb::Utils.try(r, :id) },
373
+ }
374
+ ).wait
375
+ @emojis[data[:id]] = CustomEmoji.new(@client, self, data)
376
+ end
346
377
  end
347
378
 
348
379
  #
@@ -353,8 +384,9 @@ module Discorb
353
384
  #
354
385
  def fetch_webhooks
355
386
  Async do
356
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/webhooks", "//guilds/:guild_id/webhooks", :get)).wait
357
- data.map { |webhook| Webhook.new([@client, webhook]) }
387
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/webhooks", "//guilds/:guild_id/webhooks",
388
+ :get)).wait
389
+ data.map { |webhook| Webhook.from_data(@client, webhook) }
358
390
  end
359
391
  end
360
392
 
@@ -366,7 +398,8 @@ module Discorb
366
398
  #
367
399
  def fetch_audit_log
368
400
  Async do
369
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/audit-logs", "//guilds/:guild_id/audit-logs", :get)).wait
401
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/audit-logs", "//guilds/:guild_id/audit-logs",
402
+ :get)).wait
370
403
  AuditLog.new(@client, data, self)
371
404
  end
372
405
  end
@@ -379,7 +412,8 @@ module Discorb
379
412
  #
380
413
  def fetch_channels
381
414
  Async do
382
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :get)).wait
415
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels",
416
+ :get)).wait
383
417
  data.map { |c| Channel.make_channel(@client, c) }
384
418
  end
385
419
  end
@@ -394,14 +428,23 @@ module Discorb
394
428
  # @param [Integer] slowmode Alias for `rate_limit_per_user`.
395
429
  # @param [Integer] position The position of the channel.
396
430
  # @param [Boolean] nsfw Whether the channel is nsfw.
397
- # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites A list of permission overwrites.
431
+ # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites
432
+ # A list of permission overwrites.
398
433
  # @param [Discorb::CategoryChannel] parent The parent of the channel.
399
434
  # @param [String] reason The reason for creating the channel.
400
435
  #
401
436
  # @return [Async::Task<Discorb::TextChannel>] The created text channel.
402
437
  #
403
438
  def create_text_channel(
404
- name, topic: nil, rate_limit_per_user: nil, slowmode: nil, position: nil, nsfw: nil, permission_overwrites: nil, parent: nil, reason: nil
439
+ name,
440
+ topic: nil,
441
+ rate_limit_per_user: nil,
442
+ slowmode: nil,
443
+ position: nil,
444
+ nsfw: nil,
445
+ permission_overwrites: nil,
446
+ parent: nil,
447
+ reason: nil
405
448
  )
406
449
  Async do
407
450
  payload = { type: TextChannel.channel_type }
@@ -422,7 +465,8 @@ module Discorb
422
465
  end
423
466
  end
424
467
  payload[:parent_id] = parent.id if parent
425
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post), payload, audit_log_reason: reason).wait
468
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post),
469
+ payload, audit_log_reason: reason).wait
426
470
  payload[:parent_id] = parent&.id
427
471
  Channel.make_channel(@client, data)
428
472
  end
@@ -436,7 +480,8 @@ module Discorb
436
480
  # @param [Integer] bitrate The bitrate of the channel.
437
481
  # @param [Integer] user_limit The user limit of the channel.
438
482
  # @param [Integer] position The position of the channel.
439
- # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites A list of permission overwrites.
483
+ # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites
484
+ # A list of permission overwrites.
440
485
  # @param [Discorb::CategoryChannel] parent The parent of the channel.
441
486
  # @param [String] reason The reason for creating the channel.
442
487
  #
@@ -462,7 +507,8 @@ module Discorb
462
507
  end
463
508
  end
464
509
  payload[:parent_id] = parent.id if parent
465
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post), payload, audit_log_reason: reason).wait
510
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post),
511
+ payload, audit_log_reason: reason).wait
466
512
  payload[:parent_id] = parent&.id
467
513
  Channel.make_channel(@client, data)
468
514
  end
@@ -473,7 +519,8 @@ module Discorb
473
519
  #
474
520
  # @param [String] name The name of the channel.
475
521
  # @param [Integer] position The position of the channel.
476
- # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites A list of permission overwrites.
522
+ # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites
523
+ # A list of permission overwrites.
477
524
  # @param [Discorb::CategoryChannel] parent The parent of the channel.
478
525
  # @param [String] reason The reason for creating the channel.
479
526
  #
@@ -495,7 +542,8 @@ module Discorb
495
542
  end
496
543
  end
497
544
  payload[:parent_id] = parent&.id
498
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post), payload, audit_log_reason: reason).wait
545
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post),
546
+ payload, audit_log_reason: reason).wait
499
547
  Channel.make_channel(@client, data)
500
548
  end
501
549
  end
@@ -509,7 +557,8 @@ module Discorb
509
557
  # @param [String] name The name of the channel.
510
558
  # @param [Integer] bitrate The bitrate of the channel.
511
559
  # @param [Integer] position The position of the channel.
512
- # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites A list of permission overwrites.
560
+ # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites
561
+ # A list of permission overwrites.
513
562
  # @param [Discorb::CategoryChannel] parent The parent of the channel.
514
563
  # @param [String] reason The reason for creating the channel.
515
564
  #
@@ -532,7 +581,8 @@ module Discorb
532
581
  end
533
582
  end
534
583
  payload[:parent_id] = parent&.id
535
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post), payload, audit_log_reason: reason).wait
584
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post),
585
+ payload, audit_log_reason: reason).wait
536
586
  Channel.make_channel(@client, data)
537
587
  end
538
588
  end
@@ -547,14 +597,23 @@ module Discorb
547
597
  # @param [Integer] slowmode Alias for `rate_limit_per_user`.
548
598
  # @param [Integer] position The position of the channel.
549
599
  # @param [Boolean] nsfw Whether the channel is nsfw.
550
- # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites A list of permission overwrites.
600
+ # @param [Hash{Discorb::Role, Discorb::Member => Discorb::PermissionOverwrite}] permission_overwrites
601
+ # A list of permission overwrites.
551
602
  # @param [Discorb::CategoryChannel] parent The parent of the channel.
552
603
  # @param [String] reason The reason for creating the channel.
553
604
  #
554
605
  # @return [Async::Task<Discorb::NewsChannel>] The created news channel.
555
606
  #
556
607
  def create_news_channel(
557
- name, topic: nil, rate_limit_per_user: nil, slowmode: nil, position: nil, nsfw: nil, permission_overwrites: nil, parent: nil, reason: nil
608
+ name,
609
+ topic: nil,
610
+ rate_limit_per_user: nil,
611
+ slowmode: nil,
612
+ position: nil,
613
+ nsfw: nil,
614
+ permission_overwrites: nil,
615
+ parent: nil,
616
+ reason: nil
558
617
  )
559
618
  Async do
560
619
  payload = { type: NewsChannel.channel_type }
@@ -575,7 +634,8 @@ module Discorb
575
634
  end
576
635
  payload[:nsfw] = nsfw unless nsfw.nil?
577
636
  payload[:parent_id] = parent&.id
578
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post), payload, audit_log_reason: reason).wait
637
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/channels", "//guilds/:guild_id/channels", :post),
638
+ payload, audit_log_reason: reason).wait
579
639
  Channel.make_channel(@client, data)
580
640
  end
581
641
  end
@@ -588,7 +648,8 @@ module Discorb
588
648
  #
589
649
  def fetch_active_threads
590
650
  Async do
591
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/threads/active", "//guilds/:guild_id/threads/active", :get)).wait
651
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/threads/active",
652
+ "//guilds/:guild_id/threads/active", :get)).wait
592
653
  data[:threads].map { |t| Channel.make_thread(@client, t) }
593
654
  end
594
655
  end
@@ -604,7 +665,8 @@ module Discorb
604
665
  #
605
666
  def fetch_member(id)
606
667
  Async do
607
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members/#{id}", "//guilds/:guild_id/members/:user_id", :get)).wait
668
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members/#{id}",
669
+ "//guilds/:guild_id/members/:user_id", :get)).wait
608
670
  rescue Discorb::NotFoundError
609
671
  nil
610
672
  else
@@ -624,17 +686,27 @@ module Discorb
624
686
  def fetch_members(limit: 0, after: nil)
625
687
  Async do
626
688
  unless limit.zero?
627
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members?#{URI.encode_www_form({ after: after, limit: limit })}", "//guilds/:guild_id/members", :get)).wait
689
+ _resp, data = @client.http.request(
690
+ Route.new(
691
+ "/guilds/#{@id}/members?#{URI.encode_www_form(
692
+ {
693
+ after: after,
694
+ limit: limit,
695
+ }
696
+ )}", "//guilds/:guild_id/members", :get
697
+ )
698
+ ).wait
628
699
  next data[:members].map { |m| Member.new(@client, @id, m[:user], m) }
629
700
  end
630
701
  ret = []
631
702
  after = 0
632
703
  loop do
633
704
  params = { after: after, limit: 100 }
634
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members?#{URI.encode_www_form(params)}", "//guilds/:guild_id/members", :get)).wait
705
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members?#{URI.encode_www_form(params)}",
706
+ "//guilds/:guild_id/members", :get)).wait
635
707
  ret += data.map { |m| Member.new(@client, @id, m[:user], m) }
636
708
  after = data.last[:user][:id]
637
- break if data.length != 1000
709
+ break if data.length != 100
638
710
  end
639
711
  ret
640
712
  end
@@ -653,7 +725,16 @@ module Discorb
653
725
  #
654
726
  def fetch_members_named(name, limit: 1)
655
727
  Async do
656
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/members/search?#{URI.encode_www_form({ query: name, limit: limit })}", "//guilds/:guild_id/members/search", :get)).wait
728
+ _resp, data = @client.http.request(
729
+ Route.new(
730
+ "/guilds/#{@id}/members/search?#{URI.encode_www_form(
731
+ {
732
+ query: name,
733
+ limit: limit,
734
+ }
735
+ )}", "//guilds/:guild_id/members/search", :get
736
+ )
737
+ ).wait
657
738
  data.map { |d| Member.new(@client, @id, d[:user], d) }
658
739
  end
659
740
  end
@@ -682,7 +763,10 @@ module Discorb
682
763
  #
683
764
  def edit_nickname(nickname, reason: nil)
684
765
  Async do
685
- @client.http.request(Route.new("/guilds/#{@id}/members/@me/nick", "//guilds/:guild_id/members/@me/nick", :patch), { nick: nickname }, audit_log_reason: reason).wait
766
+ @client.http.request(
767
+ Route.new("/guilds/#{@id}/members/@me/nick", "//guilds/:guild_id/members/@me/nick",
768
+ :patch), { nick: nickname }, audit_log_reason: reason,
769
+ ).wait
686
770
  end
687
771
  end
688
772
 
@@ -701,7 +785,10 @@ module Discorb
701
785
  #
702
786
  def kick_member(member, reason: nil)
703
787
  Async do
704
- @client.http.request(Route.new("/guilds/#{@id}/members/#{member.id}", "//guilds/:guild_id/members/:user_id", :delete), audit_log_reason: reason).wait
788
+ @client.http.request(
789
+ Route.new("/guilds/#{@id}/members/#{member.id}", "//guilds/:guild_id/members/:user_id",
790
+ :delete), {}, audit_log_reason: reason,
791
+ ).wait
705
792
  end
706
793
  end
707
794
 
@@ -709,12 +796,24 @@ module Discorb
709
796
  # Fetch a list of bans in the guild.
710
797
  # @async
711
798
  #
799
+ # @param [Integer] limit The number of bans to fetch.
800
+ # @param [Discorb::Snowflake] before The ID of the ban to fetch before.
801
+ # @param [Discorb::Snowflake] after The ID of the ban to fetch after.
802
+ # @param [Discorb::Snowflake] around The ID of the ban to fetch around.
803
+ #
712
804
  # @return [Async::Task<Array<Discorb::Guild::Ban>>] The list of bans.
713
805
  #
714
- def fetch_bans
806
+ def fetch_bans(limit = 50, before: nil, after: nil, around: nil)
715
807
  Async do
716
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/bans", "//guilds/:guild_id/bans", :get)).wait
717
- data.map { |d| Ban.new(@client, self, d) }
808
+ params = {
809
+ limit: limit,
810
+ before: Discorb::Utils.try(after, :id),
811
+ after: Discorb::Utils.try(around, :id),
812
+ around: Discorb::Utils.try(before, :id),
813
+ }.filter { |_k, v| !v.nil? }.to_h
814
+ _resp, bans = @client.http.request(Route.new("/guilds/#{@id}/bans?#{URI.encode_www_form(params)}",
815
+ "//guilds/:guild_id/bans", :get)).wait
816
+ bans.map { |d| Ban.new(@client, self, d) }
718
817
  end
719
818
  end
720
819
 
@@ -729,7 +828,8 @@ module Discorb
729
828
  #
730
829
  def fetch_ban(user)
731
830
  Async do
732
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/bans/#{user.id}", "//guilds/:guild_id/bans/:user_id", :get)).wait
831
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/bans/#{user.id}",
832
+ "//guilds/:guild_id/bans/:user_id", :get)).wait
733
833
  rescue Discorb::NotFoundError
734
834
  nil
735
835
  else
@@ -763,7 +863,15 @@ module Discorb
763
863
  #
764
864
  def ban_member(member, delete_message_days: 0, reason: nil)
765
865
  Async do
766
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/bans", "//guilds/:guild_id/bans", :post), { user: member.id, delete_message_days: delete_message_days }, audit_log_reason: reason).wait
866
+ _resp, data = @client.http.request(
867
+ Route.new("/guilds/#{@id}/bans",
868
+ "//guilds/:guild_id/bans",
869
+ :post),
870
+ {
871
+ user: member.id,
872
+ delete_message_days: delete_message_days,
873
+ }, audit_log_reason: reason,
874
+ ).wait
767
875
  Ban.new(@client, self, data)
768
876
  end
769
877
  end
@@ -779,7 +887,8 @@ module Discorb
779
887
  #
780
888
  def unban_user(user, reason: nil)
781
889
  Async do
782
- @client.http.request(Route.new("/guilds/#{@id}/bans/#{user.id}", "//guilds/:guild_id/bans/:user_id", :delete), audit_log_reason: reason).wait
890
+ @client.http.request(Route.new("/guilds/#{@id}/bans/#{user.id}", "//guilds/:guild_id/bans/:user_id", :delete),
891
+ {}, audit_log_reason: reason).wait
783
892
  end
784
893
  end
785
894
 
@@ -815,7 +924,8 @@ module Discorb
815
924
  payload[:color] = color.to_i if color
816
925
  payload[:hoist] = hoist if hoist
817
926
  payload[:mentionable] = mentionable if mentionable
818
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/roles", "//guilds/:guild_id/roles", :post), payload, audit_log_reason: reason).wait
927
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/roles", "//guilds/:guild_id/roles", :post),
928
+ payload, audit_log_reason: reason).wait
819
929
  Role.new(@client, self, data)
820
930
  end
821
931
  end
@@ -836,7 +946,8 @@ module Discorb
836
946
  include_roles: @id.to_s,
837
947
  }
838
948
  param[:include_roles] = roles.map(&:id).map(&:to_s).join(";") if roles.any?
839
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/prune?#{URI.encode_www_form(params)}", "//guilds/:guild_id/prune", :get)).wait
949
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/prune?#{URI.encode_www_form(params)}",
950
+ "//guilds/:guild_id/prune", :get)).wait
840
951
  data[:pruned]
841
952
  end
842
953
  end
@@ -853,7 +964,8 @@ module Discorb
853
964
  #
854
965
  def prune(days = 7, roles: [], reason: nil)
855
966
  Async do
856
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/prune", "//guilds/:guild_id/prune", :post), { days: days, roles: roles.map(&:id) }, audit_log_reason: reason).wait
967
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/prune", "//guilds/:guild_id/prune", :post),
968
+ { days: days, roles: roles.map(&:id) }, audit_log_reason: reason).wait
857
969
  data[:pruned]
858
970
  end
859
971
  end
@@ -892,7 +1004,8 @@ module Discorb
892
1004
  #
893
1005
  def fetch_integrations
894
1006
  Async do
895
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/integrations", "//guilds/:guild_id/integrations", :get)).wait
1007
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/integrations", "//guilds/:guild_id/integrations",
1008
+ :get)).wait
896
1009
  data.map { |d| Integration.new(@client, d, @id) }
897
1010
  end
898
1011
  end
@@ -918,7 +1031,8 @@ module Discorb
918
1031
  #
919
1032
  def fetch_vanity_invite
920
1033
  Async do
921
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/vanity-url", "//guilds/:guild_id/vanity-url", :get)).wait
1034
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/vanity-url", "//guilds/:guild_id/vanity-url",
1035
+ :get)).wait
922
1036
  VanityInvite.new(@client, self, data)
923
1037
  end
924
1038
  end
@@ -931,7 +1045,8 @@ module Discorb
931
1045
  #
932
1046
  def fetch_welcome_screen
933
1047
  Async do
934
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/welcome-screen", "//guilds/:guild_id/welcome-screen", :get)).wait
1048
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/welcome-screen",
1049
+ "//guilds/:guild_id/welcome-screen", :get)).wait
935
1050
  WelcomeScreen.new(@client, self, data)
936
1051
  end
937
1052
  end
@@ -944,7 +1059,8 @@ module Discorb
944
1059
  #
945
1060
  def fetch_stickers
946
1061
  Async do
947
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/stickers", "//guilds/:guild_id/stickers", :get)).wait
1062
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/stickers", "//guilds/:guild_id/stickers",
1063
+ :get)).wait
948
1064
  data.map { |d| Sticker::GuildSticker.new(@client, d) }
949
1065
  end
950
1066
  end
@@ -960,7 +1076,8 @@ module Discorb
960
1076
  #
961
1077
  def fetch_sticker(id)
962
1078
  Async do
963
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/stickers/#{id}", "//guilds/:guild_id/stickers/:sticker_id", :get)).wait
1079
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/stickers/#{id}",
1080
+ "//guilds/:guild_id/stickers/:sticker_id", :get)).wait
964
1081
  rescue Discorb::NotFoundError
965
1082
  nil
966
1083
  else
@@ -976,7 +1093,8 @@ module Discorb
976
1093
  #
977
1094
  def fetch_templates
978
1095
  Async do
979
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/templates", "//guilds/:guild_id/templates", :get)).wait
1096
+ _resp, data = @client.http.request(Route.new("/guilds/#{@id}/templates", "//guilds/:guild_id/templates",
1097
+ :get)).wait
980
1098
  data.map { |d| GuildTemplate.new(@client, d) }
981
1099
  end
982
1100
  end
@@ -1004,11 +1122,108 @@ module Discorb
1004
1122
  #
1005
1123
  def create_template(name, description = nil, reason: nil)
1006
1124
  Async do
1007
- _resp, data = @client.http.request(Route.new("/guilds/#{@id}/templates", "//guilds/:guild_id/templates", :post), { name: name, description: description }, audit_log_reason: reason).wait
1125
+ _resp, data = @client.http.request(
1126
+ Route.new("/guilds/#{@id}/templates", "//guilds/:guild_id/templates",
1127
+ :post), { name: name, description: description }, audit_log_reason: reason,
1128
+ ).wait
1008
1129
  GuildTemplate.new(@client, data)
1009
1130
  end
1010
1131
  end
1011
1132
 
1133
+ #
1134
+ # Fetch the automod rules in the guild.
1135
+ # @async
1136
+ #
1137
+ # @return [Async::Task<Array<Discorb::AutoModRule>>] The automod rules.
1138
+ #
1139
+ def fetch_automod_rules
1140
+ Async do
1141
+ _resp, data = @client.http.request(
1142
+ Route.new("/guilds/#{@id}/auto-moderation/rules", "//guilds/:guild_id/auto-moderation/rules", :get)
1143
+ )
1144
+ data.map { |d| AutoModRule.new(@client, d) }
1145
+ end
1146
+ end
1147
+
1148
+ alias fetch_automod_rule_list fetch_automod_rules
1149
+
1150
+ #
1151
+ # Fetch the automod rule by ID.
1152
+ #
1153
+ # @param [#to_s] id The ID of the automod rule.
1154
+ #
1155
+ # @return [Async::Task<Array<Discord::AutoModRule>>] The automod rule.
1156
+ #
1157
+ def fetch_automod_rule(id)
1158
+ Async do
1159
+ _resp, data = @client.http.request(
1160
+ Route.new(
1161
+ "/guilds/#{@id}/auto-moderation/rules/#{id}",
1162
+ "//guilds/:guild_id/auto-moderation/rules/:rule_id",
1163
+ :get
1164
+ )
1165
+ ).wait
1166
+ AutoModRule.new(@client, data)
1167
+ end
1168
+ end
1169
+
1170
+ #
1171
+ # Create a new automod rule in the guild.
1172
+ # @async
1173
+ #
1174
+ # @param [String] name The name of the rule.
1175
+ # @param [Symbol] trigger_type The trigger type of the rule. See {Discorb::AutoModRule::TRIGGER_TYPES}.
1176
+ # @param [Array<Discorb::AutoModRule::Action>] actions The actions of the rule.
1177
+ # @param [Symbol] event_type The event type of the rule. See {Discorb::AutoModRule::EVENT_TYPES}.
1178
+ # @param [Boolean] enabled Whether the rule is enabled or not.
1179
+ # @param [Array<Discorb::Role>] exempt_roles The roles that are exempt from the rule.
1180
+ # @param [Array<Discorb::Channel>] exempt_channels The channels that are exempt from the rule.
1181
+ # @param [Array<String>] keyword_filter The keywords to filter.
1182
+ # @param [Symbol] presets The preset of the rule. See {Discorb::AutoModRule::PRESET_TYPES}.
1183
+ # @param [String] reason The reason for creating the rule.
1184
+ #
1185
+ # @return [Async::Task<Discorb::AutoModRule>] The automod rule.
1186
+ #
1187
+ def create_automod_rule(
1188
+ name,
1189
+ trigger_type,
1190
+ actions,
1191
+ event_type = :send_message,
1192
+ enabled: false,
1193
+ exempt_roles: [],
1194
+ exempt_channels: [],
1195
+ keyword_filter: nil,
1196
+ presets: nil,
1197
+ reason: nil
1198
+ )
1199
+ Async do
1200
+ payload = {
1201
+ name: name,
1202
+ event_type: Discorb::AutoModRule::EVENT_TYPES.key(event_type),
1203
+ trigger_type: Discorb::AutoModRule::TRIGGER_TYPES.key(trigger_type),
1204
+ metadata: {
1205
+ keyword_filter: keyword_filter,
1206
+ presets: Discorb::AutoModRule::PRESET_TYPES.key(presets),
1207
+ },
1208
+ actions: actions.map(&:to_hash),
1209
+ enabled: enabled,
1210
+ exempt_roles: exempt_roles.map(&:id),
1211
+ exempt_channels: exempt_channels.map(&:id),
1212
+ }
1213
+
1214
+ _resp, data = @client.http.request(
1215
+ Route.new(
1216
+ "/guilds/#{@id}/auto-moderation/rules",
1217
+ "//guilds/:guild_id/auto-moderation/rules",
1218
+ :post
1219
+ ),
1220
+ payload,
1221
+ audit_log_reason: reason
1222
+ )
1223
+ Discorb::AutoModRule.new(@client, data)
1224
+ end
1225
+ end
1226
+
1012
1227
  #
1013
1228
  # Represents a vanity invite.
1014
1229
  #
@@ -1098,7 +1313,8 @@ module Discorb
1098
1313
  payload = {}
1099
1314
  payload[:enabled] = enabled unless enabled.nil?
1100
1315
  payload[:channel_id] = channel.id if channel_id
1101
- @client.http.request(Route.new("/guilds/#{@guild_id}/widget", "//guilds/:guild_id/widget", :patch), payload, audit_log_reason: reason).wait
1316
+ @client.http.request(Route.new("/guilds/#{@guild_id}/widget", "//guilds/:guild_id/widget", :patch), payload,
1317
+ audit_log_reason: reason).wait
1102
1318
  end
1103
1319
  end
1104
1320
 
@@ -1118,10 +1334,12 @@ module Discorb
1118
1334
  # @return [String] The iframe HTML.
1119
1335
  #
1120
1336
  def iframe(theme: "dark", width: 350, height: 500)
1337
+ # rubocop:disable Layout/LineLength
1121
1338
  [
1122
1339
  %(<iframe src="https://canary.discord.com/widget?id=#{@guild_id}&theme=#{theme}" width="#{width}" height="#{height}"),
1123
1340
  %(allowtransparency="true" frameborder="0" sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts"></iframe>),
1124
1341
  ].join
1342
+ # rubocop:enable Layout/LineLength
1125
1343
  end
1126
1344
  end
1127
1345
 
@@ -1148,6 +1366,10 @@ module Discorb
1148
1366
  @reason = data[:reason]
1149
1367
  @user = @client.users[data[:user][:id]] || User.new(@client, data[:user])
1150
1368
  end
1369
+
1370
+ def inspect
1371
+ "<#{self.class.name} #{@user}>"
1372
+ end
1151
1373
  end
1152
1374
 
1153
1375
  class << self
@@ -1181,7 +1403,8 @@ module Discorb
1181
1403
  Member.new(@client, @id, m[:user], m)
1182
1404
  end
1183
1405
  @splash = data[:splash] && Asset.new(self, data[:splash], path: "splashes/#{@id}")
1184
- @discovery_splash = data[:discovery_splash] && Asset.new(self, data[:discovery_splash], path: "discovery-splashes/#{@id}")
1406
+ @discovery_splash = data[:discovery_splash] && Asset.new(self, data[:discovery_splash],
1407
+ path: "discovery-splashes/#{@id}")
1185
1408
  @owner_id = data[:owner_id]
1186
1409
  @permissions = Permission.new(data[:permissions].to_i)
1187
1410
  @afk_channel_id = data[:afk_channel_id]
@@ -1218,7 +1441,7 @@ module Discorb
1218
1441
  @nsfw_level = NSFW_LEVELS[data[:nsfw_level]]
1219
1442
  return unless is_create_event
1220
1443
 
1221
- @stickers = data[:stickers].nil? ? [] : data[:stickers].map { |s| Sticker::GuildSticker.new(self, s) }
1444
+ @stickers = data[:stickers].nil? ? [] : data[:stickers].map { |s| Sticker::GuildSticker.new(@client, s) }
1222
1445
  @joined_at = Time.iso8601(data[:joined_at])
1223
1446
  @large = data[:large]
1224
1447
  @member_count = data[:member_count]
@@ -1226,12 +1449,20 @@ module Discorb
1226
1449
  Channel.make_channel(@client, c.merge({ guild_id: @id }))
1227
1450
  end
1228
1451
  @channels = Dictionary.new(tmp_channels.to_h { |c| [c.id, c] }, sort: ->(c) { c[1].position })
1229
- @voice_states = Dictionary.new(data[:voice_states].to_h { |v| [Snowflake.new(v[:user_id]), VoiceState.new(@client, v.merge({ guild_id: @id }))] })
1452
+ @voice_states = Dictionary.new(data[:voice_states].to_h do |v|
1453
+ [Snowflake.new(v[:user_id]), VoiceState.new(@client, v.merge({ guild_id: @id }))]
1454
+ end)
1230
1455
  @threads = data[:threads] ? data[:threads].map { |t| Channel.make_channel(@client, t) } : []
1231
- @presences = Dictionary.new(data[:presences].to_h { |pr| [Snowflake.new(pr[:user][:id]), Presence.new(@client, pr)] })
1456
+ @presences = Dictionary.new(data[:presences].to_h do |pr|
1457
+ [Snowflake.new(pr[:user][:id]), Presence.new(@client, pr)]
1458
+ end)
1232
1459
  @max_presences = data[:max_presences]
1233
- @stage_instances = Dictionary.new(data[:stage_instances].to_h { |s| [Snowflake.new(s[:id]), StageInstance.new(@client, s)] })
1234
- @scheduled_events = Dictionary.new(data[:guild_scheduled_events].to_h { |s| [Snowflake.new(s[:id]), ScheduledEvent.new(@client, s)] })
1460
+ @stage_instances = Dictionary.new(data[:stage_instances].to_h do |s|
1461
+ [Snowflake.new(s[:id]), StageInstance.new(@client, s)]
1462
+ end)
1463
+ @scheduled_events = Dictionary.new(data[:guild_scheduled_events].to_h do |s|
1464
+ [Snowflake.new(s[:id]), ScheduledEvent.new(@client, s)]
1465
+ end)
1235
1466
  @data.update(data)
1236
1467
  end
1237
1468
  end
@@ -1278,7 +1509,24 @@ module Discorb
1278
1509
  @client = client
1279
1510
  @description = data[:description]
1280
1511
  @guild = guild
1281
- @channels = data[:channels].map { |c| WelcomeScreen::Channel.new(client, c, nil) }
1512
+ @channels = data[:channels].map do |c|
1513
+ WelcomeScreen::Channel.new(
1514
+ client.channels[c[:channel_id]],
1515
+ c,
1516
+ c[:emoji_name] &&
1517
+ if c[:emoji_id]
1518
+ (client.emojis[c[:emoji_id]] ||
1519
+ Discorb::PartialEmoji.new(
1520
+ {
1521
+ name: c[:emoji_name],
1522
+ id: c[:emoji_id],
1523
+ }
1524
+ ))
1525
+ else
1526
+ Discorb::UnicodeEmoji.new(c[:emoji_name])
1527
+ end
1528
+ )
1529
+ end
1282
1530
  end
1283
1531
 
1284
1532
  #
@@ -1367,7 +1615,10 @@ module Discorb
1367
1615
  payload[:enabled] = enabled unless enabled == Discorb::Unset
1368
1616
  payload[:welcome_channels] = channels.map(&:to_hash) unless channels == Discorb::Unset
1369
1617
  payload[:description] = description unless description == Discorb::Unset
1370
- @client.http.request(Route.new("/guilds/#{@guild.id}/welcome-screen", "//guilds/:guild_id/welcome-screen", :patch), payload, audit_log_reason: reason).wait
1618
+ @client.http.request(
1619
+ Route.new("/guilds/#{@guild.id}/welcome-screen", "//guilds/:guild_id/welcome-screen",
1620
+ :patch), payload, audit_log_reason: reason,
1621
+ ).wait
1371
1622
  end
1372
1623
  end
1373
1624
  end