discorb 0.18.0 → 0.20.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 (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