discorb 0.16.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Discorb
3
4
  #
4
5
  # Represents an interaction of Discord.
@@ -8,6 +9,8 @@ module Discorb
8
9
  # A module for response with source.
9
10
  #
10
11
  module SourceResponder
12
+ # @type instance: Discorb::Interaction
13
+
11
14
  #
12
15
  # Response with `DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE`(`5`).
13
16
  #
@@ -19,12 +22,18 @@ module Discorb
19
22
  #
20
23
  def defer_source(ephemeral: false)
21
24
  Async do
22
- @client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
23
- type: 5,
24
- data: {
25
- flags: (ephemeral ? 1 << 6 : 0),
26
- },
27
- }).wait
25
+ @client.http.request(
26
+ Route.new(
27
+ "/interactions/#{@id}/#{@token}/callback",
28
+ "//interactions/:interaction_id/:token/callback",
29
+ :post
30
+ ), {
31
+ type: 5,
32
+ data: {
33
+ flags: (ephemeral ? 1 << 6 : 0),
34
+ },
35
+ }
36
+ ).wait
28
37
  @defered = true
29
38
  end
30
39
  end
@@ -39,30 +48,77 @@ module Discorb
39
48
  # @param [Discorb::Embed] embed The embed to send.
40
49
  # @param [Array<Discorb::Embed>] embeds The embeds to send. (max: 10)
41
50
  # @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions to send.
51
+ # @param [Discorb::Attachment] attachment The attachment to send.
52
+ # @param [Array<Discorb::Attachment>] attachments The attachments to send. (max: 10)
42
53
  # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
43
54
  # @param [Boolean] ephemeral Whether to make the response ephemeral.
44
55
  #
45
- # @return [Discorb::Interaction::SourceResponder::CallbackMessage, Discorb::Webhook::Message] The callback message.
56
+ # @return [Discorb::Interaction::SourceResponder::CallbackMessage, Discorb::Webhook::Message]
57
+ # The callback message.
46
58
  #
47
- def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil, components: nil, ephemeral: false)
59
+ def post(
60
+ content = nil,
61
+ tts: false,
62
+ embed: nil,
63
+ embeds: nil,
64
+ allowed_mentions: nil,
65
+ attachment: nil,
66
+ attachments: nil,
67
+ components: nil,
68
+ ephemeral: false
69
+ )
48
70
  Async do
49
71
  payload = {}
50
72
  payload[:content] = content if content
51
73
  payload[:tts] = tts
52
74
  payload[:embeds] = (embeds || [embed]).map { |e| e&.to_hash }.filter { _1 }
53
- payload[:allowed_mentions] = allowed_mentions&.to_hash(@client.allowed_mentions) || @client.allowed_mentions.to_hash
75
+ payload[:allowed_mentions] =
76
+ allowed_mentions&.to_hash(@client.allowed_mentions) || @client.allowed_mentions.to_hash
54
77
  payload[:components] = Component.to_payload(components) if components
55
78
  payload[:flags] = (ephemeral ? 1 << 6 : 0)
79
+ attachments ||= attachment ? [attachment] : []
80
+
81
+ payload[:attachments] = attachments.map.with_index do |a, i|
82
+ {
83
+ id: i,
84
+ filename: a.filename,
85
+ description: a.description,
86
+ }
87
+ end
56
88
 
57
89
  ret = if @responded
58
- _resp, data = @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}", "//webhooks/:webhook_id/:token", :post), payload).wait
90
+ _resp, data = @client.http.multipart_request(
91
+ Route.new(
92
+ "/webhooks/#{@application_id}/#{@token}",
93
+ "//webhooks/:webhook_id/:token",
94
+ :post
95
+ ),
96
+ payload,
97
+ attachments
98
+ ).wait
59
99
  webhook = Webhook::URLWebhook.new("/webhooks/#{@application_id}/#{@token}")
60
100
  Webhook::Message.new(webhook, data, @client)
61
101
  elsif @defered
62
- @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :patch), payload).wait
102
+ @client.http.multipart_request(
103
+ Route.new(
104
+ "/webhooks/#{@application_id}/#{@token}/messages/@original",
105
+ "//webhooks/:webhook_id/:token/messages/@original",
106
+ :patch
107
+ ),
108
+ payload,
109
+ attachments
110
+ ).wait
63
111
  CallbackMessage.new(@client, payload, @application_id, @token)
64
112
  else
65
- @client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), { type: 4, data: payload }).wait
113
+ @client.http.multipart_request(
114
+ Route.new(
115
+ "/interactions/#{@id}/#{@token}/callback",
116
+ "//interactions/:interaction_id/:token/callback",
117
+ :post
118
+ ),
119
+ { type: 4, data: payload },
120
+ attachments
121
+ ).wait
66
122
  CallbackMessage.new(@client, payload, @application_id, @token)
67
123
  end
68
124
  @responded = true
@@ -99,8 +155,8 @@ module Discorb
99
155
  # @param [Discorb::Embed] embed The new embed of the message.
100
156
  # @param [Array<Discorb::Embed>] embeds The new embeds of the message.
101
157
  # @param [Array<Discorb::Attachment>] attachments The attachments to remain.
102
- # @param [Discorb::File] file The file to send.
103
- # @param [Array<Discorb::File>] files The files to send.
158
+ # @param [Discorb::Attachment] file The file to send.
159
+ # @param [Array<Discorb::Attachment>] files The files to send.
104
160
  #
105
161
  # @return [Async::Task<void>] The task.
106
162
  #
@@ -118,7 +174,15 @@ module Discorb
118
174
  payload[:attachments] = attachments.map(&:to_hash) if attachments != Discorb::Unset
119
175
  files = [file] if file != Discorb::Unset
120
176
  files = [] if files == Discorb::Unset
121
- @client.http.multipart_request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :patch), payload, files, headers: headers).wait
177
+ @client.http.multipart_request(
178
+ Route.new(
179
+ "/webhooks/#{@application_id}/#{@token}/messages/@original",
180
+ "//webhooks/:webhook_id/:token/messages/@original",
181
+ :patch
182
+ ),
183
+ payload,
184
+ files,
185
+ ).wait
122
186
  end
123
187
  end
124
188
 
@@ -133,7 +197,8 @@ module Discorb
133
197
  #
134
198
  def delete!
135
199
  Async do
136
- @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
200
+ @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original",
201
+ "//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
137
202
  end
138
203
  end
139
204
 
@@ -147,6 +212,8 @@ module Discorb
147
212
  # A module for response with update.
148
213
  #
149
214
  module UpdateResponder
215
+ # @type instance: Discorb::Interaction
216
+
150
217
  #
151
218
  # Response with `DEFERRED_UPDATE_MESSAGE`(`6`).
152
219
  # @async
@@ -157,12 +224,18 @@ module Discorb
157
224
  #
158
225
  def defer_update(ephemeral: false)
159
226
  Async do
160
- @client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
161
- type: 6,
162
- data: {
163
- flags: (ephemeral ? 1 << 6 : 0),
164
- },
165
- }).wait
227
+ @client.http.request(
228
+ Route.new(
229
+ "/interactions/#{@id}/#{@token}/callback",
230
+ "//interactions/:interaction_id/:token/callback",
231
+ :post
232
+ ), {
233
+ type: 6,
234
+ data: {
235
+ flags: (ephemeral ? 1 << 6 : 0),
236
+ },
237
+ }
238
+ ).wait
166
239
  end
167
240
  end
168
241
 
@@ -176,12 +249,24 @@ module Discorb
176
249
  # @param [Discorb::Embed] embed The embed to send.
177
250
  # @param [Array<Discorb::Embed>] embeds The embeds to send. (max: 10)
178
251
  # @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions to send.
252
+ # @param [Discorb::Attachment] attachment The attachment to send.
253
+ # @param [Array<Discorb::Attachment>] attachments The attachments to send. (max: 10)
179
254
  # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
180
255
  # @param [Boolean] ephemeral Whether to make the response ephemeral.
181
256
  #
182
257
  # @return [Async::Task<void>] The task.
183
258
  #
184
- def edit(content, tts: false, embed: nil, embeds: nil, allowed_mentions: nil, components: nil, ephemeral: false)
259
+ def edit(
260
+ content,
261
+ tts: false,
262
+ embed: nil,
263
+ embeds: nil,
264
+ allowed_mentions: nil,
265
+ attachment: nil,
266
+ attachments: nil,
267
+ components: nil,
268
+ ephemeral: false
269
+ )
185
270
  Async do
186
271
  payload = {}
187
272
  payload[:content] = content if content
@@ -192,10 +277,22 @@ module Discorb
192
277
  embeds
193
278
  end
194
279
  payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
195
- payload[:allowed_mentions] = allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
280
+ payload[:allowed_mentions] =
281
+ allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
196
282
  payload[:components] = Component.to_payload(components) if components
197
283
  payload[:flags] = (ephemeral ? 1 << 6 : 0)
198
- @client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), { type: 7, data: payload }).wait
284
+ attachments ||= [attachment] if attachment
285
+ payload[:attachments] = attachments.map.with_index do |a, i|
286
+ {
287
+ id: i,
288
+ filename: a.filename,
289
+ description: a.description,
290
+ }
291
+ end
292
+ @client.http.multipart_request(
293
+ Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback",
294
+ :post), { type: 7, data: payload }, attachments
295
+ ).wait
199
296
  end
200
297
  end
201
298
  end
@@ -204,6 +301,8 @@ module Discorb
204
301
  # A module for response with modal.
205
302
  #
206
303
  module ModalResponder
304
+ # @type instance: Discorb::Interaction
305
+
207
306
  #
208
307
  # Response with `MODAL`(`9`).
209
308
  #
@@ -224,7 +323,7 @@ module Discorb
224
323
 
225
324
  private
226
325
 
227
- def _set_data(*)
326
+ def _set_data(_)
228
327
  nil
229
328
  end
230
329
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Discorb
3
4
  #
4
5
  # Represents a user interaction with the bot.
@@ -10,10 +11,9 @@ module Discorb
10
11
  attr_reader :application_id
11
12
  # @return [Symbol] The type of interaction.
12
13
  attr_reader :type
13
- # @return [Discorb::Member] The member that created the interaction.
14
- attr_reader :member
15
- # @return [Discorb::User] The user that created the interaction.
14
+ # @return [Discorb::User, Discorb::Member] The user or member that created the interaction.
16
15
  attr_reader :user
16
+ alias member user
17
17
  # @return [Integer] The type of interaction.
18
18
  # @note This is always `1` for now.
19
19
  attr_reader :version
@@ -53,8 +53,12 @@ module Discorb
53
53
  @type_id = self.class.interaction_type
54
54
  @guild_id = data[:guild_id] && Snowflake.new(data[:guild_id])
55
55
  @channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
56
- @member = guild.members[data[:member][:id]] || Member.new(@client, @guild_id, data[:member][:user], data[:member]) if data[:member]
57
- @user = @client.users[data[:user][:id]] || User.new(@client, data[:user]) if data[:user]
56
+ if data[:member]
57
+ @user = guild.members[data[:member][:id]] || Member.new(@client, @guild_id, data[:member][:user],
58
+ data[:member])
59
+ elsif data[:user]
60
+ @user = @client.users[data[:user][:id]] || User.new(@client, data[:user])
61
+ end
58
62
  @token = data[:token]
59
63
  @locale = data[:locale].to_s.gsub("-", "_").to_sym
60
64
  @guild_locale = data[:guild_locale].to_s.gsub("-", "_").to_sym
@@ -72,13 +76,6 @@ module Discorb
72
76
  @client.channels[@channel_id]
73
77
  end
74
78
 
75
- def target
76
- @member || @user
77
- end
78
-
79
- alias fired_by target
80
- alias from target
81
-
82
79
  def inspect
83
80
  "#<#{self.class} id=#{@id}>"
84
81
  end
@@ -97,7 +94,10 @@ module Discorb
97
94
  def make_interaction(client, data)
98
95
  interaction = nil
99
96
  descendants.each do |klass|
100
- interaction = klass.make_interaction(client, data) if !klass.interaction_type.nil? && klass.interaction_type == data[:type]
97
+ if !klass.interaction_type.nil? && klass.interaction_type == data[:type]
98
+ interaction = klass.make_interaction(client,
99
+ data)
100
+ end
101
101
  end
102
102
  if interaction.nil?
103
103
  client.logger.warn("Unknown interaction type #{data[:type]}, initialized Interaction")
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  %w[root response command components autocomplete modal].each do |file|
3
4
  require_relative "interaction/#{file}.rb"
4
5
  end
@@ -114,7 +114,7 @@ module Discorb
114
114
  #
115
115
  def delete!(reason: nil)
116
116
  Async do
117
- @client.http.request(Route.new("/invites/#{@code}", "//invites/:code", :delete), audit_log_reason: reason)
117
+ @client.http.request(Route.new("/invites/#{@code}", "//invites/:code", :delete), {}, audit_log_reason: reason)
118
118
  end
119
119
  end
120
120
 
@@ -134,7 +134,10 @@ module Discorb
134
134
  end
135
135
  @inviter_data = data[:inviter]
136
136
  @target_type = TARGET_TYPES[data[:target_type]]
137
- @target_user = @client.users[data[:target_user][:id]] || User.new(@client, data[:target_user]) if data[:target_user]
137
+ if data[:target_user]
138
+ @target_user = @client.users[data[:target_user][:id]] || User.new(@client,
139
+ data[:target_user])
140
+ end
138
141
  # @target_application = nil
139
142
 
140
143
  # @stage_instance = data[:stage_instance] && Invite::StageInstance.new(self, data[:stage_instance])
@@ -52,10 +52,10 @@ module Discorb
52
52
  # @return [Discorb::Presence] The presence of the member.
53
53
  # @!attribute [r] activity
54
54
  # @macro client_cache
55
- # @return [Discorb::Activity] The activity of the member. It's from the {#presence}.
55
+ # @return [Discorb::Presence::Activity] The activity of the member. It's from the {#presence}.
56
56
  # @!attribute [r] activities
57
57
  # @macro client_cache
58
- # @return [Array<Discorb::Activity>] The activities of the member. It's from the {#presence}.
58
+ # @return [Array<Discorb::Presence::Activity>] The activities of the member. It's from the {#presence}.
59
59
  # @!attribute [r] status
60
60
  # @macro client_cache
61
61
  # @return [Symbol] The status of the member. It's from the {#presence}.
@@ -114,6 +114,7 @@ module Discorb
114
114
 
115
115
  def permissions
116
116
  return Permission.new((1 << 38) - 1) if owner?
117
+
117
118
  roles.map(&:permissions).sum(Permission.new(0))
118
119
  end
119
120
 
@@ -158,7 +159,10 @@ module Discorb
158
159
  #
159
160
  def add_role(role, reason: nil)
160
161
  Async do
161
- @client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", "//guilds/:guild_id/members/:user_id/roles/:role_id", :put), nil, audit_log_reason: reason).wait
162
+ @client.http.request(
163
+ Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}",
164
+ "//guilds/:guild_id/members/:user_id/roles/:role_id", :put), nil, audit_log_reason: reason,
165
+ ).wait
162
166
  end
163
167
  end
164
168
 
@@ -173,7 +177,10 @@ module Discorb
173
177
  #
174
178
  def remove_role(role, reason: nil)
175
179
  Async do
176
- @client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", "//guilds/:guild_id/members/:user_id/roles/:role_id", :delete), audit_log_reason: reason).wait
180
+ @client.http.request(
181
+ Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}",
182
+ "//guilds/:guild_id/members/:user_id/roles/:role_id", :delete), {}, audit_log_reason: reason,
183
+ ).wait
177
184
  end
178
185
  end
179
186
 
@@ -194,7 +201,13 @@ module Discorb
194
201
  # @return [Async::Task<void>] The task.
195
202
  #
196
203
  def edit(
197
- nick: Discorb::Unset, role: Discorb::Unset, mute: Discorb::Unset, deaf: Discorb::Unset, channel: Discorb::Unset, communication_disabled_until: Discorb::Unset, timeout_until: Discorb::Unset,
204
+ nick: Discorb::Unset,
205
+ role: Discorb::Unset,
206
+ mute: Discorb::Unset,
207
+ deaf: Discorb::Unset,
208
+ channel: Discorb::Unset,
209
+ communication_disabled_until: Discorb::Unset,
210
+ timeout_until: Discorb::Unset,
198
211
  reason: nil
199
212
  )
200
213
  Async do
@@ -204,9 +217,15 @@ module Discorb
204
217
  payload[:mute] = mute if mute != Discorb::Unset
205
218
  payload[:deaf] = deaf if deaf != Discorb::Unset
206
219
  communication_disabled_until = timeout_until if timeout_until != Discorb::Unset
207
- payload[:communication_disabled_until] = communication_disabled_until&.iso8601 if communication_disabled_until != Discorb::Unset
220
+ if communication_disabled_until != Discorb::Unset
221
+ payload[:communication_disabled_until] =
222
+ communication_disabled_until&.iso8601
223
+ end
208
224
  payload[:channel_id] = channel&.id if channel != Discorb::Unset
209
- @client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}", "//guilds/:guild_id/members/:user_id", :patch), payload, audit_log_reason: reason).wait
225
+ @client.http.request(
226
+ Route.new("/guilds/#{@guild_id}/members/#{@id}", "//guilds/:guild_id/members/:user_id",
227
+ :patch), payload, audit_log_reason: reason,
228
+ ).wait
210
229
  end
211
230
  end
212
231
 
@@ -265,6 +284,7 @@ module Discorb
265
284
  #
266
285
  def can_manage?(role)
267
286
  return true if owner?
287
+
268
288
  top_role = roles.max_by(&:position)
269
289
  top_role.position > role.position
270
290
  end
@@ -283,7 +303,7 @@ module Discorb
283
303
  @deaf = member_data[:deaf]
284
304
  @custom_avatar = member_data[:avatar] && Asset.new(self, member_data[:avatar])
285
305
  super(user_data)
286
- @display_avatar = @avatar || @custom_avatar
306
+ @display_avatar = @custom_avatar || @avatar
287
307
  @client.guilds[@guild_id].members[@id] = self unless @guild_id.nil? || @client.guilds[@guild_id].nil?
288
308
  @_member_data.update(member_data)
289
309
  end
@@ -7,7 +7,7 @@ module Discorb
7
7
  class Message < DiscordModel
8
8
  # @return [Discorb::Snowflake] The ID of the message.
9
9
  attr_reader :id
10
- # @return [Discorb::User, Discorb::Member] The user that sent the message.
10
+ # @return [Discorb::User, Discorb::Member, Webhook::Message::Author] The user that sent the message.
11
11
  attr_reader :author
12
12
  # @return [String] The content of the message.
13
13
  attr_reader :content
@@ -85,7 +85,9 @@ module Discorb
85
85
  # @return [Boolean] Whether the message is pinned.
86
86
  attr_reader :pinned
87
87
  alias pinned? pinned
88
- @message_type = {
88
+ # @private
89
+ # @return [{Integer => Symbol}] The mapping of message type.
90
+ MESSAGE_TYPE = {
89
91
  0 => :default,
90
92
  1 => :recipient_add,
91
93
  2 => :recipient_remove,
@@ -215,8 +217,8 @@ module Discorb
215
217
  end
216
218
  if role
217
219
  ret.gsub!(/<@&(\d+)>/) do |_match|
218
- role = guild&.roles&.[]($1)
219
- role ? "@#{role.name}" : "@Unknown Role"
220
+ r = guild&.roles&.[]($1)
221
+ r ? "@#{r.name}" : "@Unknown Role"
220
222
  end
221
223
  end
222
224
  if emoji
@@ -257,8 +259,15 @@ module Discorb
257
259
  #
258
260
  # @return [Async::Task<void>] The task.
259
261
  #
260
- def edit(content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset,
261
- attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset)
262
+ def edit(
263
+ content = Discorb::Unset,
264
+ embed: Discorb::Unset,
265
+ embeds: Discorb::Unset,
266
+ allowed_mentions: Discorb::Unset,
267
+ attachments: Discorb::Unset,
268
+ components: Discorb::Unset,
269
+ supress: Discorb::Unset
270
+ )
262
271
  Async do
263
272
  channel.edit_message(@id, content, embed: embed, embeds: embeds, allowed_mentions: allowed_mentions,
264
273
  attachments: attachments, components: components, supress: supress).wait
@@ -284,15 +293,17 @@ module Discorb
284
293
  #
285
294
  # @param [Boolean] fail_if_not_exists Whether to raise an error if the message does not exist.
286
295
  #
287
- # @return [Hash] The reference object.
296
+ # @return [Discorb::Message::Reference] The reference object.
288
297
  #
289
298
  def to_reference(fail_if_not_exists: true)
290
- {
291
- message_id: @id,
292
- channel_id: @channel_id,
293
- guild_id: @guild_id,
294
- fail_if_not_exists: fail_if_not_exists,
295
- }
299
+ Reference.from_hash(
300
+ {
301
+ message_id: @id,
302
+ channel_id: @channel_id,
303
+ guild_id: @guild_id,
304
+ fail_if_not_exists: fail_if_not_exists,
305
+ }
306
+ )
296
307
  end
297
308
 
298
309
  def embed
@@ -331,7 +342,10 @@ module Discorb
331
342
  #
332
343
  def add_reaction(emoji)
333
344
  Async do
334
- @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me", "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me", :put), nil).wait
345
+ @client.http.request(
346
+ Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me",
347
+ "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me", :put), nil
348
+ ).wait
335
349
  end
336
350
  end
337
351
 
@@ -347,7 +361,11 @@ module Discorb
347
361
  #
348
362
  def remove_reaction(emoji)
349
363
  Async do
350
- @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me", "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me", :delete)).wait
364
+ @client.http.request(
365
+ Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me",
366
+ "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me",
367
+ :delete)
368
+ ).wait
351
369
  end
352
370
  end
353
371
 
@@ -364,7 +382,17 @@ module Discorb
364
382
  #
365
383
  def remove_reaction_of(emoji, member)
366
384
  Async do
367
- @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/#{member.is_a?(Member) ? member.id : member}", "//channels/:channel_id/messages/:message_id/reactions/:emoji/:user_id", :delete)).wait
385
+ @client.http.request(
386
+ Route.new(
387
+ "/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/#{if member.is_a?(Member)
388
+ member.id
389
+ else
390
+ member
391
+ end}",
392
+ "//channels/:channel_id/messages/:message_id/reactions/:emoji/:user_id",
393
+ :delete
394
+ )
395
+ ).wait
368
396
  end
369
397
  end
370
398
 
@@ -374,7 +402,7 @@ module Discorb
374
402
  # Fetch reacted users of reaction.
375
403
  # @async
376
404
  #
377
- # @param [Discorb::Emoji] emoji The emoji to fetch.
405
+ # @param [Discorb::Emoji, Discorb::PartialEmoji] emoji The emoji to fetch.
378
406
  # @param [Integer, nil] limit The maximum number of users to fetch. `nil` for no limit.
379
407
  # @param [Discorb::Snowflake, nil] after The ID of the user to start fetching from.
380
408
  #
@@ -386,7 +414,13 @@ module Discorb
386
414
  after = 0
387
415
  users = []
388
416
  loop do
389
- _resp, data = @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=100&after=#{after}", "//channels/:channel_id/messages/:message_id/reactions/:emoji", :get)).wait
417
+ _resp, data = @client.http.request(
418
+ Route.new(
419
+ "/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=100&after=#{after}",
420
+ "//channels/:channel_id/messages/:message_id/reactions/:emoji",
421
+ :get
422
+ )
423
+ ).wait
390
424
  break if data.empty?
391
425
 
392
426
  users += data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
@@ -397,7 +431,13 @@ module Discorb
397
431
  end
398
432
  next users
399
433
  else
400
- _resp, data = @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=#{limit}&after=#{after}", "//channels/:channel_id/messages/:message_id/reactions/:emoji", :get)).wait
434
+ _resp, data = @client.http.request(
435
+ Route.new(
436
+ "/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=#{limit}&after=#{after}",
437
+ "//channels/:channel_id/messages/:message_id/reactions/:emoji",
438
+ :get
439
+ )
440
+ ).wait
401
441
  next data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
402
442
  end
403
443
  end
@@ -487,7 +527,7 @@ module Discorb
487
527
  @embeds = data[:embeds] ? data[:embeds].map { |e| Embed.from_hash(e) } : []
488
528
  @reactions = data[:reactions] ? data[:reactions].map { |r| Reaction.new(self, r) } : []
489
529
  @pinned = data[:pinned]
490
- @type = self.class.message_type[data[:type]]
530
+ @type = MESSAGE_TYPE[data[:type]]
491
531
  @activity = data[:activity] && Activity.new(data[:activity])
492
532
  @application_id = data[:application_id]
493
533
  @message_reference = data[:message_reference] && Reference.from_hash(data[:message_reference])
@@ -500,10 +540,5 @@ module Discorb
500
540
  @data.update(data)
501
541
  @deleted = false
502
542
  end
503
-
504
- class << self
505
- # @private
506
- attr_reader :message_type
507
- end
508
543
  end
509
544
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Discorb
3
4
  #
4
5
  # Represents a message in Discord.
@@ -75,8 +76,6 @@ module Discorb
75
76
  }
76
77
  end
77
78
 
78
- alias to_reference to_hash
79
-
80
79
  #
81
80
  # Initialize a new reference from a hash.
82
81
  #
@@ -140,7 +139,8 @@ module Discorb
140
139
  def initialize(client, data)
141
140
  @id = Snowflake.new(data[:id])
142
141
  @name = data[:name]
143
- @type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
142
+ @type = (Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] } or
143
+ raise "Unknown interaction type: #{data[:type]}")
144
144
  @user = client.users[data[:user][:id]] || User.new(client, data[:user])
145
145
  end
146
146