discorb 0.18.0 → 0.20.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/build_version.yml +2 -2
  3. data/.rubocop.yml +12 -75
  4. data/Changelog.md +25 -0
  5. data/Gemfile +4 -4
  6. data/README.md +2 -1
  7. data/Rakefile +482 -459
  8. data/Steepfile +8 -6
  9. data/docs/application_command.md +1 -0
  10. data/docs/events.md +2 -2
  11. data/docs/voice_events.md +6 -6
  12. data/lib/discorb/allowed_mentions.rb +68 -72
  13. data/lib/discorb/app_command/command.rb +466 -394
  14. data/lib/discorb/app_command/common.rb +65 -25
  15. data/lib/discorb/app_command/handler.rb +304 -265
  16. data/lib/discorb/app_command.rb +5 -5
  17. data/lib/discorb/application.rb +198 -197
  18. data/lib/discorb/asset.rb +101 -101
  19. data/lib/discorb/attachment.rb +134 -119
  20. data/lib/discorb/audit_logs.rb +412 -385
  21. data/lib/discorb/automod.rb +279 -269
  22. data/lib/discorb/channel/base.rb +107 -108
  23. data/lib/discorb/channel/category.rb +32 -32
  24. data/lib/discorb/channel/container.rb +44 -44
  25. data/lib/discorb/channel/dm.rb +26 -28
  26. data/lib/discorb/channel/guild.rb +311 -246
  27. data/lib/discorb/channel/stage.rb +156 -140
  28. data/lib/discorb/channel/text.rb +430 -336
  29. data/lib/discorb/channel/thread.rb +374 -325
  30. data/lib/discorb/channel/voice.rb +85 -79
  31. data/lib/discorb/channel.rb +5 -5
  32. data/lib/discorb/client.rb +635 -623
  33. data/lib/discorb/color.rb +178 -182
  34. data/lib/discorb/common.rb +168 -164
  35. data/lib/discorb/components/button.rb +107 -106
  36. data/lib/discorb/components/select_menu.rb +157 -145
  37. data/lib/discorb/components/text_input.rb +103 -106
  38. data/lib/discorb/components.rb +68 -66
  39. data/lib/discorb/dictionary.rb +135 -135
  40. data/lib/discorb/embed.rb +404 -398
  41. data/lib/discorb/emoji.rb +309 -302
  42. data/lib/discorb/emoji_table.rb +16099 -8857
  43. data/lib/discorb/error.rb +131 -131
  44. data/lib/discorb/event.rb +360 -314
  45. data/lib/discorb/event_handler.rb +39 -39
  46. data/lib/discorb/exe/about.rb +17 -17
  47. data/lib/discorb/exe/irb.rb +72 -67
  48. data/lib/discorb/exe/new.rb +323 -315
  49. data/lib/discorb/exe/run.rb +69 -68
  50. data/lib/discorb/exe/setup.rb +57 -55
  51. data/lib/discorb/exe/show.rb +12 -12
  52. data/lib/discorb/extend.rb +25 -45
  53. data/lib/discorb/extension.rb +89 -83
  54. data/lib/discorb/flag.rb +126 -128
  55. data/lib/discorb/gateway.rb +984 -794
  56. data/lib/discorb/gateway_events.rb +670 -638
  57. data/lib/discorb/gateway_requests.rb +45 -48
  58. data/lib/discorb/guild.rb +2115 -1626
  59. data/lib/discorb/guild_template.rb +280 -241
  60. data/lib/discorb/http.rb +247 -232
  61. data/lib/discorb/image.rb +42 -42
  62. data/lib/discorb/integration.rb +169 -161
  63. data/lib/discorb/intents.rb +161 -163
  64. data/lib/discorb/interaction/autocomplete.rb +76 -62
  65. data/lib/discorb/interaction/command.rb +279 -224
  66. data/lib/discorb/interaction/components.rb +114 -104
  67. data/lib/discorb/interaction/modal.rb +36 -32
  68. data/lib/discorb/interaction/response.rb +379 -330
  69. data/lib/discorb/interaction/root.rb +271 -118
  70. data/lib/discorb/interaction.rb +5 -5
  71. data/lib/discorb/invite.rb +154 -153
  72. data/lib/discorb/member.rb +344 -311
  73. data/lib/discorb/message.rb +615 -544
  74. data/lib/discorb/message_meta.rb +197 -186
  75. data/lib/discorb/modules.rb +371 -290
  76. data/lib/discorb/permission.rb +305 -289
  77. data/lib/discorb/presence.rb +352 -346
  78. data/lib/discorb/rate_limit.rb +81 -76
  79. data/lib/discorb/reaction.rb +55 -54
  80. data/lib/discorb/role.rb +272 -240
  81. data/lib/discorb/shard.rb +76 -74
  82. data/lib/discorb/sticker.rb +193 -171
  83. data/lib/discorb/user.rb +205 -188
  84. data/lib/discorb/utils/colored_puts.rb +16 -16
  85. data/lib/discorb/utils.rb +12 -16
  86. data/lib/discorb/voice_state.rb +305 -281
  87. data/lib/discorb/webhook.rb +537 -507
  88. data/lib/discorb.rb +62 -56
  89. data/sig/discorb/activity.rbs +1 -0
  90. data/sig/discorb/allowed_mentions.rbs +1 -0
  91. data/sig/discorb/app_command/base.rbs +7 -1
  92. data/sig/discorb/application.rbs +6 -0
  93. data/sig/discorb/asset.rbs +2 -0
  94. data/sig/discorb/attachment.rbs +8 -0
  95. data/sig/discorb/audit_log.rbs +7 -0
  96. data/sig/discorb/automod.rbs +32 -6
  97. data/sig/discorb/avatar.rbs +1 -0
  98. data/sig/discorb/channel/base.rbs +8 -1
  99. data/sig/discorb/channel/category.rbs +1 -0
  100. data/sig/discorb/channel/container.rbs +4 -0
  101. data/sig/discorb/channel/stage.rbs +4 -0
  102. data/sig/discorb/channel/text.rbs +2 -2
  103. data/sig/discorb/channel/thread.rbs +11 -0
  104. data/sig/discorb/channel/voice.rbs +2 -0
  105. data/sig/discorb/client.rbs +21 -20
  106. data/sig/discorb/color.rbs +6 -0
  107. data/sig/discorb/component/base.rbs +1 -0
  108. data/sig/discorb/component/button.rbs +2 -0
  109. data/sig/discorb/component/select_menu.rbs +4 -0
  110. data/sig/discorb/component/text_input.rbs +1 -0
  111. data/sig/discorb/custom_emoji.rbs +5 -1
  112. data/sig/discorb/dictionary.rbs +2 -0
  113. data/sig/discorb/discord_model.rbs +2 -0
  114. data/sig/discorb/embed.rbs +7 -0
  115. data/sig/discorb/emoji.rbs +1 -0
  116. data/sig/discorb/event_handler.rbs +2 -1
  117. data/sig/discorb/extension.rbs +13 -12
  118. data/sig/discorb/flag.rbs +2 -0
  119. data/sig/discorb/gateway.rbs +5 -0
  120. data/sig/discorb/guild.rbs +8 -4
  121. data/sig/discorb/guild_template.rbs +1 -1
  122. data/sig/discorb/http.rbs +4 -1
  123. data/sig/discorb/image.rbs +2 -0
  124. data/sig/discorb/integration.rbs +1 -1
  125. data/sig/discorb/intents.rbs +4 -3
  126. data/sig/discorb/interaction/base.rbs +36 -0
  127. data/sig/discorb/interaction/message_component.rbs +1 -2
  128. data/sig/discorb/interaction/modal.rbs +1 -2
  129. data/sig/discorb/interaction/responder.rbs +49 -49
  130. data/sig/discorb/invite.rbs +1 -1
  131. data/sig/discorb/member.rbs +2 -0
  132. data/sig/discorb/message.rbs +8 -1
  133. data/sig/discorb/messageable.rbs +1 -4
  134. data/sig/discorb/partial_emoji.rbs +3 -0
  135. data/sig/discorb/permissions.rbs +7 -0
  136. data/sig/discorb/presence.rbs +2 -0
  137. data/sig/discorb/reaction.rbs +5 -1
  138. data/sig/discorb/role.rbs +7 -1
  139. data/sig/discorb/scheduled_event.rbs +2 -1
  140. data/sig/discorb/shard.rbs +2 -1
  141. data/sig/discorb/snowflake.rbs +2 -0
  142. data/sig/discorb/stage_instance.rbs +9 -3
  143. data/sig/discorb/sticker.rbs +1 -1
  144. data/sig/discorb/unicode_emoji.rbs +4 -0
  145. data/sig/discorb/user.rbs +24 -20
  146. data/sig/discorb/webhook.rbs +17 -6
  147. data/sig/discorb/welcome_screen.rbs +1 -0
  148. data/sig/override.rbs +2 -0
  149. metadata +3 -3
@@ -1,118 +1,271 @@
1
- # frozen_string_literal: true
2
-
3
- module Discorb
4
- #
5
- # Represents a user interaction with the bot.
6
- #
7
- class Interaction < DiscordModel
8
- # @return [Discorb::Snowflake] The ID of the interaction.
9
- attr_reader :id
10
- # @return [Discorb::Snowflake] The ID of the application that created the interaction.
11
- attr_reader :application_id
12
- # @return [Symbol] The type of interaction.
13
- attr_reader :type
14
- # @return [Discorb::User, Discorb::Member] The user or member that created the interaction.
15
- attr_reader :user
16
- alias member user
17
- # @return [Integer] The type of interaction.
18
- # @note This is always `1` for now.
19
- attr_reader :version
20
- # @return [String] The token for the interaction.
21
- attr_reader :token
22
- # @return [Symbol] The locale of the user that created the interaction.
23
- # @note This modifies the language code, `-` will be replaced with `_`.
24
- attr_reader :locale
25
- # @return [Symbol] The locale of the guild that created the interaction.
26
- # @note This modifies the language code, `-` will be replaced with `_`.
27
- attr_reader :guild_locale
28
-
29
- # @!attribute [r] guild
30
- # @macro client_cache
31
- # @return [Discorb::Guild] The guild the interaction took place in.
32
- # @!attribute [r] channel
33
- # @macro client_cache
34
- # @return [Discorb::Channel] The channel the interaction took place in.
35
- # @!attribute [r] target
36
- # @return [Discorb::User, Discorb::Member] The user or member the interaction took place with.
37
-
38
- @interaction_type = nil
39
- @interaction_name = nil
40
-
41
- #
42
- # Initialize a new interaction.
43
- # @private
44
- #
45
- # @param [Discorb::Client] client The client this interaction belongs to.
46
- # @param [Hash] data The data of the interaction.
47
- #
48
- def initialize(client, data)
49
- @client = client
50
- @id = Snowflake.new(data[:id])
51
- @application_id = Snowflake.new(data[:application_id])
52
- @type = self.class.interaction_name
53
- @type_id = self.class.interaction_type
54
- @guild_id = data[:guild_id] && Snowflake.new(data[:guild_id])
55
- @channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
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
62
- @token = data[:token]
63
- @locale = data[:locale].to_s.gsub("-", "_").to_sym
64
- @guild_locale = data[:guild_locale].to_s.gsub("-", "_").to_sym
65
- @version = data[:version]
66
- @defered = false
67
- @responded = false
68
- _set_data(data[:data])
69
- end
70
-
71
- def guild
72
- @client.guilds[@guild_id]
73
- end
74
-
75
- def channel
76
- @client.channels[@channel_id]
77
- end
78
-
79
- def inspect
80
- "#<#{self.class} id=#{@id}>"
81
- end
82
-
83
- class << self
84
- # @private
85
- attr_reader :interaction_type, :interaction_name, :event_name
86
-
87
- #
88
- # Create a new Interaction instance from the data.
89
- # @private
90
- #
91
- # @param [Discorb::Client] client The client this interaction belongs to.
92
- # @param [Hash] data The data of the interaction.
93
- #
94
- def make_interaction(client, data)
95
- interaction = nil
96
- descendants.each do |klass|
97
- if !klass.interaction_type.nil? && klass.interaction_type == data[:type]
98
- interaction = klass.make_interaction(client,
99
- data)
100
- end
101
- end
102
- if interaction.nil?
103
- client.logger.warn("Unknown interaction type #{data[:type]}, initialized Interaction")
104
- interaction = Interaction.new(client, data)
105
- end
106
- interaction
107
- end
108
-
109
- #
110
- # Returns the descendants of the class.
111
- # @private
112
- #
113
- def descendants
114
- ObjectSpace.each_object(Class).select { |klass| klass < self }
115
- end
116
- end
117
- end
118
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Discorb
4
+ #
5
+ # Represents a user interaction with the bot.
6
+ #
7
+ class Interaction < DiscordModel
8
+ # @return [Discorb::Snowflake] The ID of the interaction.
9
+ attr_reader :id
10
+ # @return [Discorb::Snowflake] The ID of the application that created the interaction.
11
+ attr_reader :application_id
12
+ # @return [Symbol] The type of interaction.
13
+ attr_reader :type
14
+ # @return [Discorb::User, Discorb::Member] The user or member that created the interaction.
15
+ attr_reader :user
16
+ alias member user
17
+ # @return [Integer] The type of interaction.
18
+ # @note This is always `1` for now.
19
+ attr_reader :version
20
+ # @return [String] The token for the interaction.
21
+ attr_reader :token
22
+ # @return [Symbol] The locale of the user that created the interaction.
23
+ # @note This modifies the language code, `-` will be replaced with `_`.
24
+ attr_reader :locale
25
+ # @return [Symbol] The locale of the guild that created the interaction.
26
+ # @note This modifies the language code, `-` will be replaced with `_`.
27
+ attr_reader :guild_locale
28
+ # @return [Discorb::Permission] The permissions of the bot.
29
+ attr_reader :app_permissions
30
+
31
+ # @!attribute [r] guild
32
+ # @macro client_cache
33
+ # @return [Discorb::Guild] The guild the interaction took place in.
34
+ # @!attribute [r] channel
35
+ # @macro client_cache
36
+ # @return [Discorb::Channel] The channel the interaction took place in.
37
+ # @!attribute [r] target
38
+ # @return [Discorb::User, Discorb::Member] The user or member the interaction took place with.
39
+
40
+ @interaction_type = nil
41
+ @interaction_name = nil
42
+
43
+ #
44
+ # Initialize a new interaction.
45
+ # @private
46
+ #
47
+ # @param [Discorb::Client] client The client this interaction belongs to.
48
+ # @param [Hash] data The data of the interaction.
49
+ #
50
+ def initialize(client, data)
51
+ @client = client
52
+ @id = Snowflake.new(data[:id])
53
+ @application_id = Snowflake.new(data[:application_id])
54
+ @type = self.class.interaction_name
55
+ @type_id = self.class.interaction_type
56
+ @guild_id = data[:guild_id] && Snowflake.new(data[:guild_id])
57
+ @channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
58
+ if data[:member]
59
+ @user =
60
+ guild.members[data[:member][:id]] ||
61
+ Member.new(@client, @guild_id, data[:member][:user], data[:member])
62
+ elsif data[:user]
63
+ @user =
64
+ @client.users[data[:user][:id]] || User.new(@client, data[:user])
65
+ end
66
+ @token = data[:token]
67
+ @locale = data[:locale].to_s.gsub("-", "_").to_sym
68
+ @guild_locale = data[:guild_locale].to_s.gsub("-", "_").to_sym
69
+ @app_permissions =
70
+ data[:app_permissions] && Permission.new(data[:app_permissions].to_i)
71
+ @version = data[:version]
72
+ @defered = false
73
+ @responded = false
74
+ _set_data(data[:data])
75
+ end
76
+
77
+ def guild
78
+ @client.guilds[@guild_id]
79
+ end
80
+
81
+ def channel
82
+ @client.channels[@channel_id]
83
+ end
84
+
85
+ def inspect
86
+ "#<#{self.class} id=#{@id}>"
87
+ end
88
+
89
+ #
90
+ # Send followup message.
91
+ #
92
+ # @async
93
+ #
94
+ # @param [String] content The content of the response.
95
+ # @param [Boolean] tts Whether to send the message as text-to-speech.
96
+ # @param [Discorb::Embed] embed The embed to send.
97
+ # @param [Array<Discorb::Embed>] embeds The embeds to send. (max: 10)
98
+ # @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions to send.
99
+ # @param [Discorb::Attachment] attachment The attachment to send.
100
+ # @param [Array<Discorb::Attachment>] attachments The attachments to send. (max: 10)
101
+ # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
102
+ # @param [Boolean] ephemeral Whether to make the response ephemeral.
103
+ #
104
+ # @return [Discorb::Webhook::Message] The message.
105
+ #
106
+ def post(
107
+ content = nil,
108
+ tts: false,
109
+ embed: nil,
110
+ embeds: nil,
111
+ allowed_mentions: nil,
112
+ attachment: nil,
113
+ attachments: nil,
114
+ components: nil,
115
+ ephemeral: false
116
+ )
117
+ Async do
118
+ payload = {}
119
+ payload[:content] = content if content
120
+ payload[:tts] = tts
121
+ payload[:embeds] = (embeds || [embed])
122
+ .map { |e| e&.to_hash }
123
+ .filter { _1 }
124
+ payload[:allowed_mentions] = allowed_mentions&.to_hash(
125
+ @client.allowed_mentions
126
+ ) || @client.allowed_mentions.to_hash
127
+ payload[:components] = Component.to_payload(components) if components
128
+ payload[:flags] = (ephemeral ? 1 << 6 : 0)
129
+ attachments ||= attachment ? [attachment] : []
130
+
131
+ payload[:attachments] = attachments.map.with_index do |a, i|
132
+ { id: i, filename: a.filename, description: a.description }
133
+ end
134
+
135
+ _resp, data =
136
+ @client
137
+ .http
138
+ .multipart_request(
139
+ Route.new(
140
+ "/webhooks/#{@application_id}/#{@token}",
141
+ "//webhooks/:webhook_id/:token",
142
+ :post
143
+ ),
144
+ payload,
145
+ attachments
146
+ )
147
+ .wait
148
+ webhook =
149
+ Webhook::URLWebhook.new("/webhooks/#{@application_id}/#{@token}")
150
+ Webhook::Message.new(webhook, data, @client)
151
+ ret
152
+ end
153
+ end
154
+
155
+ #
156
+ # Edit the original response message.
157
+ # This method is low-level.
158
+ #
159
+ # @async
160
+ #
161
+ # @param [String] content The content of the response.
162
+ # @param [Discorb::Embed] embed The embed to send.
163
+ # @param [Array<Discorb::Embed>] embeds The embeds to send. (max: 10)
164
+ # @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions to send.
165
+ # @param [Discorb::Attachment] attachment The attachment to send.
166
+ # @param [Array<Discorb::Attachment>] attachments The attachments to send. (max: 10)
167
+ # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
168
+ #
169
+ # @return [Async::Task<void>] The task.
170
+ #
171
+ # @see CallbackMessage#edit
172
+ #
173
+ def edit_original_message(
174
+ content = nil,
175
+ embed: nil,
176
+ embeds: nil,
177
+ attachment: nil,
178
+ attachments: nil,
179
+ components: nil
180
+ )
181
+ Async do
182
+ payload = {}
183
+ payload[:content] = content if content
184
+ payload[:embeds] = (embeds || [embed])
185
+ .map { |e| e&.to_hash }
186
+ .filter { _1 }
187
+ .then { _1.empty? ? nil : _1 }
188
+ payload[:components] = Component.to_payload(components) if components
189
+ attachments ||= attachment && [attachment]
190
+
191
+ payload[:attachments] = attachments&.map&.with_index do |a, i|
192
+ { id: i, filename: a.filename, description: a.description }
193
+ end
194
+ payload.compact!
195
+
196
+ @client
197
+ .http
198
+ .multipart_request(
199
+ Route.new(
200
+ "/webhooks/#{@application_id}/#{@token}/messages/@original",
201
+ "//webhooks/:webhook_id/:token/messages/@original",
202
+ :patch
203
+ ),
204
+ payload,
205
+ attachments
206
+ )
207
+ .wait
208
+ end
209
+ end
210
+
211
+ #
212
+ # Delete the original response message.
213
+ # This method is low-level.
214
+ #
215
+ # @async
216
+ #
217
+ # @return [Async::Task<void>] The task.
218
+ #
219
+ def delete_original_message
220
+ Async do
221
+ @client
222
+ .http
223
+ .request(
224
+ Route.new(
225
+ "/webhooks/#{@application_id}/#{@token}/messages/@original",
226
+ "//webhooks/:webhook_id/:token/messages/@original",
227
+ :delete
228
+ )
229
+ )
230
+ .wait
231
+ end
232
+ end
233
+
234
+ class << self
235
+ # @private
236
+ attr_reader :interaction_type, :interaction_name, :event_name
237
+
238
+ #
239
+ # Create a new Interaction instance from the data.
240
+ # @private
241
+ #
242
+ # @param [Discorb::Client] client The client this interaction belongs to.
243
+ # @param [Hash] data The data of the interaction.
244
+ #
245
+ def make_interaction(client, data)
246
+ interaction = nil
247
+ descendants.each do |klass|
248
+ if !klass.interaction_type.nil? &&
249
+ klass.interaction_type == data[:type]
250
+ interaction = klass.make_interaction(client, data)
251
+ end
252
+ end
253
+ if interaction.nil?
254
+ client.logger.warn(
255
+ "Unknown interaction type #{data[:type]}, initialized Interaction"
256
+ )
257
+ interaction = Interaction.new(client, data)
258
+ end
259
+ interaction
260
+ end
261
+
262
+ #
263
+ # Returns the descendants of the class.
264
+ # @private
265
+ #
266
+ def descendants
267
+ ObjectSpace.each_object(Class).select { |klass| klass < self }
268
+ end
269
+ end
270
+ end
271
+ end
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- %w[root response command components autocomplete modal].each do |file|
4
- require_relative "interaction/#{file}.rb"
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ %w[root response command components autocomplete modal].each do |file|
4
+ require_relative "interaction/#{file}.rb"
5
+ end