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