discorb 0.14.0 → 0.16.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.
- checksums.yaml +4 -4
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/lint-push.yml +4 -2
- data/.rubocop.yml +6 -2
- data/Changelog.md +27 -0
- data/Rakefile +6 -0
- data/docs/events.md +71 -5
- data/docs/faq.md +8 -8
- data/examples/simple/rolepanel.rb +1 -1
- data/examples/simple/shard.rb +17 -0
- data/lib/discorb/allowed_mentions.rb +7 -0
- data/lib/discorb/app_command/command.rb +64 -2
- data/lib/discorb/app_command/handler.rb +1 -1
- data/lib/discorb/application.rb +16 -7
- data/lib/discorb/asset.rb +9 -0
- data/lib/discorb/{file.rb → attachment.rb} +55 -33
- data/lib/discorb/audit_logs.rb +42 -4
- data/lib/discorb/channel.rb +47 -12
- data/lib/discorb/client.rb +135 -51
- data/lib/discorb/common.rb +18 -4
- data/lib/discorb/components/button.rb +5 -6
- data/lib/discorb/components/select_menu.rb +2 -16
- data/lib/discorb/dictionary.rb +2 -0
- data/lib/discorb/embed.rb +71 -38
- data/lib/discorb/emoji.rb +29 -2
- data/lib/discorb/emoji_table.rb +1 -1
- data/lib/discorb/error.rb +7 -1
- data/lib/discorb/event.rb +27 -17
- data/lib/discorb/exe/new.rb +5 -5
- data/lib/discorb/exe/run.rb +1 -15
- data/lib/discorb/gateway.rb +262 -161
- data/lib/discorb/gateway_requests.rb +4 -7
- data/lib/discorb/guild.rb +67 -33
- data/lib/discorb/guild_template.rb +24 -3
- data/lib/discorb/http.rb +25 -3
- data/lib/discorb/integration.rb +23 -8
- data/lib/discorb/intents.rb +15 -10
- data/lib/discorb/interaction/autocomplete.rb +4 -4
- data/lib/discorb/interaction/command.rb +34 -5
- data/lib/discorb/interaction/components.rb +15 -2
- data/lib/discorb/interaction/response.rb +12 -0
- data/lib/discorb/interaction/root.rb +16 -1
- data/lib/discorb/invite.rb +11 -7
- data/lib/discorb/member.rb +21 -0
- data/lib/discorb/message.rb +59 -3
- data/lib/discorb/message_meta.rb +36 -55
- data/lib/discorb/modules.rb +38 -14
- data/lib/discorb/permission.rb +14 -5
- data/lib/discorb/presence.rb +41 -8
- data/lib/discorb/rate_limit.rb +7 -2
- data/lib/discorb/reaction.rb +6 -0
- data/lib/discorb/role.rb +12 -0
- data/lib/discorb/shard.rb +74 -0
- data/lib/discorb/sticker.rb +22 -14
- data/lib/discorb/user.rb +11 -0
- data/lib/discorb/voice_state.rb +20 -2
- data/lib/discorb/webhook.rb +53 -2
- data/lib/discorb.rb +5 -3
- data/sig/discorb.rbs +7234 -6714
- metadata +5 -4
- data/lib/discorb/log.rb +0 -81
data/lib/discorb/rate_limit.rb
CHANGED
@@ -6,7 +6,12 @@ module Discorb
|
|
6
6
|
# @private
|
7
7
|
#
|
8
8
|
class RatelimitHandler
|
9
|
+
#
|
10
|
+
# Initialize a rate limit handler.
|
9
11
|
# @private
|
12
|
+
#
|
13
|
+
# @param [Discorb::Client] client The client.
|
14
|
+
#
|
10
15
|
def initialize(client)
|
11
16
|
@client = client
|
12
17
|
@path_ratelimit_bucket = {}
|
@@ -27,7 +32,7 @@ module Discorb
|
|
27
32
|
# return if path.url.start_with?("https://")
|
28
33
|
if @global && @global > Time.now.to_f
|
29
34
|
time = @global - Time.now.to_f
|
30
|
-
@client.
|
35
|
+
@client.logger.info("global rate limit reached, waiting #{time} seconds")
|
31
36
|
sleep(time)
|
32
37
|
@global = false
|
33
38
|
end
|
@@ -43,7 +48,7 @@ module Discorb
|
|
43
48
|
return if (bucket[:remaining]).positive?
|
44
49
|
|
45
50
|
time = bucket[:reset_at] - Time.now.to_f
|
46
|
-
@client.
|
51
|
+
@client.logger.info("rate limit for #{path.identifier} with #{path.major_param} reached, waiting #{time.round(4)} seconds")
|
47
52
|
sleep(time)
|
48
53
|
end
|
49
54
|
|
data/lib/discorb/reaction.rb
CHANGED
@@ -16,7 +16,13 @@ module Discorb
|
|
16
16
|
alias me? me
|
17
17
|
alias reacted? me
|
18
18
|
|
19
|
+
#
|
20
|
+
# Initialize a new reaction.
|
19
21
|
# @private
|
22
|
+
#
|
23
|
+
# @param [Discorb::Message] message The message that this reaction is on.
|
24
|
+
# @param [Hash] data The data of the reaction.
|
25
|
+
#
|
20
26
|
def initialize(message, data)
|
21
27
|
@message = message
|
22
28
|
_set_data(data)
|
data/lib/discorb/role.rb
CHANGED
@@ -42,7 +42,14 @@ module Discorb
|
|
42
42
|
|
43
43
|
include Comparable
|
44
44
|
|
45
|
+
#
|
46
|
+
# Initializes a new role.
|
45
47
|
# @private
|
48
|
+
#
|
49
|
+
# @param [Discorb::Client] client The client.
|
50
|
+
# @param [Discorb::Guild] guild The guild the role belongs to.
|
51
|
+
# @param [Hash] data The data of the role.
|
52
|
+
#
|
46
53
|
def initialize(client, guild, data)
|
47
54
|
@client = client
|
48
55
|
@guild = guild
|
@@ -176,7 +183,12 @@ module Discorb
|
|
176
183
|
# @!attribute [r] integration?
|
177
184
|
# @return [Boolean] Whether the role is an integration role.
|
178
185
|
|
186
|
+
#
|
187
|
+
# Initializes a new tag.
|
179
188
|
# @private
|
189
|
+
#
|
190
|
+
# @param [Hash] data The data of the tag.
|
191
|
+
#
|
180
192
|
def initialize(data)
|
181
193
|
@bot_id = Snowflake.new(data[:bot_id])
|
182
194
|
@integration_id = Snowflake.new(data[:integration_id])
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Discorb
|
4
|
+
#
|
5
|
+
# Represents a shard.
|
6
|
+
#
|
7
|
+
class Shard
|
8
|
+
# @return [Integer] The ID of the shard.
|
9
|
+
attr_reader :id
|
10
|
+
# @return [Thread] The thread of the shard.
|
11
|
+
attr_reader :thread
|
12
|
+
# @return [Logger] The logger of the shard.
|
13
|
+
attr_reader :logger
|
14
|
+
# @private
|
15
|
+
# @return [Integer] The internal index of the shard.
|
16
|
+
attr_reader :index
|
17
|
+
# @private
|
18
|
+
attr_accessor :status, :connection, :session_id, :next_shard, :main_task
|
19
|
+
|
20
|
+
#
|
21
|
+
# Initializes a new shard.
|
22
|
+
# @private
|
23
|
+
#
|
24
|
+
# @param [Discorb::Client] client The client.
|
25
|
+
# @param [Integer] id The ID of the shard.
|
26
|
+
# @param [Integer] count The number of shards.
|
27
|
+
# @param [Integer] index The index of the shard.
|
28
|
+
#
|
29
|
+
def initialize(client, id, count, index)
|
30
|
+
@client = client
|
31
|
+
@id = id
|
32
|
+
@shard_count = count
|
33
|
+
@status = :idle
|
34
|
+
@index = index
|
35
|
+
@session_id = nil
|
36
|
+
@next_shard = nil
|
37
|
+
@main_task = nil
|
38
|
+
@logger = client.logger.dup.tap { |l| l.progname = "discorb: shard #{id}" }
|
39
|
+
@thread = Thread.new do
|
40
|
+
Thread.current.thread_variable_set("shard_id", id)
|
41
|
+
Thread.current.thread_variable_set("shard", self)
|
42
|
+
if @index.positive?
|
43
|
+
Thread.stop
|
44
|
+
sleep 5 # Somehow discord disconnects the shard without a little sleep.
|
45
|
+
end
|
46
|
+
client.send(:main_loop, id)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Starts the shard.
|
52
|
+
#
|
53
|
+
# @return [void]
|
54
|
+
#
|
55
|
+
def start
|
56
|
+
@thread.wakeup
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Stops the shard.
|
61
|
+
#
|
62
|
+
# @return [void]
|
63
|
+
#
|
64
|
+
def close!
|
65
|
+
@status = :closed
|
66
|
+
@main_task&.stop
|
67
|
+
@thread.kill
|
68
|
+
end
|
69
|
+
|
70
|
+
def inspect
|
71
|
+
"#<#{self.class} #{id}/#{@shard_count} #{@status}>"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/discorb/sticker.rb
CHANGED
@@ -29,16 +29,27 @@ module Discorb
|
|
29
29
|
attr_reader :available
|
30
30
|
alias available? available
|
31
31
|
|
32
|
-
@
|
32
|
+
# @private
|
33
|
+
# @return [{Integer => Symbol}] The mapping of sticker types.
|
34
|
+
STICKER_TYPE = {
|
33
35
|
1 => :official,
|
34
36
|
2 => :guild,
|
35
37
|
}.freeze
|
36
|
-
|
38
|
+
|
39
|
+
# @private
|
40
|
+
# @return [{Integer => Symbol}] The mapping of sticker format.
|
41
|
+
STICKER_FORMAT = {
|
37
42
|
1 => :png,
|
38
43
|
2 => :apng,
|
39
44
|
3 => :lottie,
|
40
|
-
}
|
45
|
+
}.freeze
|
46
|
+
#
|
47
|
+
# Initialize a new sticker.
|
41
48
|
# @private
|
49
|
+
#
|
50
|
+
# @param [Discorb::Client] client The client.
|
51
|
+
# @param [Hash] data The sticker data.
|
52
|
+
#
|
42
53
|
def initialize(client, data)
|
43
54
|
@client = client
|
44
55
|
_set_data(data)
|
@@ -51,15 +62,6 @@ module Discorb
|
|
51
62
|
# @!attribute [r] guild
|
52
63
|
# @macro client_cache
|
53
64
|
# @return [Discorb::Guild] The guild the sticker is in.
|
54
|
-
@sticker_type = {
|
55
|
-
1 => :official,
|
56
|
-
2 => :guild,
|
57
|
-
}.freeze
|
58
|
-
@sticker_format = {
|
59
|
-
1 => :png,
|
60
|
-
2 => :apng,
|
61
|
-
3 => :lottie,
|
62
|
-
}
|
63
65
|
|
64
66
|
def guild
|
65
67
|
@client.guilds[@guild_id]
|
@@ -121,7 +123,13 @@ module Discorb
|
|
121
123
|
# @return [Discorb::Asset] The banner of the pack.
|
122
124
|
attr_reader :banner
|
123
125
|
|
126
|
+
#
|
127
|
+
# Initialize a new sticker pack.
|
124
128
|
# @private
|
129
|
+
#
|
130
|
+
# @param [Discorb::Client] client The client.
|
131
|
+
# @param [Hash] data The sticker pack data.
|
132
|
+
#
|
125
133
|
def initialize(client, data)
|
126
134
|
@client = client
|
127
135
|
@id = Snowflake.new(data[:id])
|
@@ -141,8 +149,8 @@ module Discorb
|
|
141
149
|
@id = Snowflake.new(data[:id])
|
142
150
|
@name = data[:name]
|
143
151
|
@tags = data[:tags].split(",")
|
144
|
-
@type =
|
145
|
-
@format =
|
152
|
+
@type = STICKER_TYPE[data[:type]]
|
153
|
+
@format = STICKER_FORMAT[data[:format]]
|
146
154
|
@description = data[:description]
|
147
155
|
@available = data[:available]
|
148
156
|
if @type == :official
|
data/lib/discorb/user.rb
CHANGED
@@ -29,7 +29,13 @@ module Discorb
|
|
29
29
|
# @!attribute [r] mention
|
30
30
|
# @return [String] The user's mention.
|
31
31
|
|
32
|
+
#
|
33
|
+
# Initializes a new user.
|
32
34
|
# @private
|
35
|
+
#
|
36
|
+
# @param [Discorb::Client] client The client.
|
37
|
+
# @param [Hash] data The user data.
|
38
|
+
#
|
33
39
|
def initialize(client, data)
|
34
40
|
@client = client
|
35
41
|
@data = {}
|
@@ -79,7 +85,12 @@ module Discorb
|
|
79
85
|
|
80
86
|
alias app_owner? bot_owner?
|
81
87
|
|
88
|
+
#
|
89
|
+
# Returns the dm channel id of the user.
|
82
90
|
# @private
|
91
|
+
#
|
92
|
+
# @return [Async::Task<Discorb::Snowflake>] A task that resolves to the channel id.
|
93
|
+
#
|
83
94
|
def channel_id
|
84
95
|
Async do
|
85
96
|
next @dm_channel_id if @dm_channel_id
|
data/lib/discorb/voice_state.rb
CHANGED
@@ -46,7 +46,13 @@ module Discorb
|
|
46
46
|
# @macro client_cache
|
47
47
|
# @return [Discorb::User] The user this voice state is for.
|
48
48
|
|
49
|
+
#
|
50
|
+
# Initialize a new voice state.
|
49
51
|
# @private
|
52
|
+
#
|
53
|
+
# @param [Discorb::Client] client The client this voice state belongs to.
|
54
|
+
# @param [Hash] data The data of the voice state.
|
55
|
+
#
|
50
56
|
def initialize(client, data)
|
51
57
|
@client = client
|
52
58
|
_set_data(data)
|
@@ -135,7 +141,14 @@ module Discorb
|
|
135
141
|
2 => :guild_only,
|
136
142
|
}
|
137
143
|
|
144
|
+
#
|
145
|
+
# Initialize a new instance of the StageInstance class.
|
138
146
|
# @private
|
147
|
+
#
|
148
|
+
# @param [Discorb::Client] client The client.
|
149
|
+
# @param [Hash] data The data of the stage instance.
|
150
|
+
# @param [Boolean] no_cache Whether to disable caching.
|
151
|
+
#
|
139
152
|
def initialize(client, data, no_cache: false)
|
140
153
|
@client = client
|
141
154
|
@data = data
|
@@ -182,7 +195,7 @@ module Discorb
|
|
182
195
|
Async do
|
183
196
|
payload = {}
|
184
197
|
payload[:topic] = topic if topic != Discorb::Unset
|
185
|
-
payload[:privacy_level] =
|
198
|
+
payload[:privacy_level] = PRIVACY_LEVEL.key(privacy_level) if privacy_level != Discorb::Unset
|
186
199
|
@client.http.request(
|
187
200
|
Route.new("/stage-instances/#{@channel_id}", "//stage-instances/:channel_id", :patch), payload, audit_log_reason: reason,
|
188
201
|
).wait
|
@@ -216,7 +229,7 @@ module Discorb
|
|
216
229
|
@guild_id = Snowflake.new(data[:guild_id])
|
217
230
|
@channel_id = Snowflake.new(data[:channel_id])
|
218
231
|
@topic = data[:topic]
|
219
|
-
@privacy_level =
|
232
|
+
@privacy_level = PRIVACY_LEVEL[data[:privacy_level]]
|
220
233
|
@discoverable_disabled = data[:discoverable_disabled]
|
221
234
|
end
|
222
235
|
|
@@ -246,7 +259,12 @@ module Discorb
|
|
246
259
|
attr_reader :custom
|
247
260
|
alias custom? custom
|
248
261
|
|
262
|
+
#
|
263
|
+
# Initialize a new instance of the VoiceRegion class.
|
249
264
|
# @private
|
265
|
+
#
|
266
|
+
# @param [Hash] data The data of the voice region.
|
267
|
+
#
|
250
268
|
def initialize(data)
|
251
269
|
@id = data[:id]
|
252
270
|
@name = data[:name]
|
data/lib/discorb/webhook.rb
CHANGED
@@ -22,7 +22,13 @@ module Discorb
|
|
22
22
|
# @return [String] The URL of the webhook.
|
23
23
|
attr_reader :token
|
24
24
|
|
25
|
+
#
|
26
|
+
# Initializes a webhook.
|
25
27
|
# @private
|
28
|
+
#
|
29
|
+
# @param [Discorb::Client] client The client.
|
30
|
+
# @param [Hash] data The data of the webhook.
|
31
|
+
#
|
26
32
|
def initialize(client, data)
|
27
33
|
@name = data[:name]
|
28
34
|
@guild_id = data[:guild_id] && Snowflake.new(data[:guild_id])
|
@@ -200,7 +206,13 @@ module Discorb
|
|
200
206
|
# @!attribute [r] url
|
201
207
|
# @return [String] The URL of the webhook.
|
202
208
|
|
209
|
+
#
|
210
|
+
# Initializes the incoming webhook.
|
203
211
|
# @private
|
212
|
+
#
|
213
|
+
# @param [Discorb::Client] client The client.
|
214
|
+
# @param [String] url The URL of the webhook.
|
215
|
+
#
|
204
216
|
def initialize(client, data)
|
205
217
|
super
|
206
218
|
@token = data[:token]
|
@@ -222,7 +234,13 @@ module Discorb
|
|
222
234
|
# Represents a source channel of follower webhook.
|
223
235
|
# @return [Discorb::Channel, Discorb::Webhook::FollowerWebhook::Channel] The source channel of follower webhook.
|
224
236
|
|
237
|
+
#
|
238
|
+
# Initializes the follower webhook.
|
225
239
|
# @private
|
240
|
+
#
|
241
|
+
# @param [Discorb::Client] client The client.
|
242
|
+
# @param [Hash] data The data of the follower webhook.
|
243
|
+
#
|
226
244
|
def initialize(client, data)
|
227
245
|
super
|
228
246
|
@source_guild = FollowerWebhook::Guild.new(data[:source_guild])
|
@@ -248,12 +266,21 @@ module Discorb
|
|
248
266
|
# @return [Discorb::Asset] The icon of the guild.
|
249
267
|
attr_reader :icon
|
250
268
|
|
269
|
+
#
|
270
|
+
# Initialize a new guild.
|
251
271
|
# @private
|
272
|
+
#
|
273
|
+
# @param [Hash] data The data of the guild.
|
274
|
+
#
|
252
275
|
def initialize(data)
|
253
276
|
@id = Snowflake.new(data[:id])
|
254
277
|
@name = data[:name]
|
255
278
|
@icon = Asset.new(self, data[:icon])
|
256
279
|
end
|
280
|
+
|
281
|
+
def inspect
|
282
|
+
"#<#{self.class.name} #{@id}: #{@name}>"
|
283
|
+
end
|
257
284
|
end
|
258
285
|
|
259
286
|
#
|
@@ -265,11 +292,20 @@ module Discorb
|
|
265
292
|
# @return [String] The name of the channel.
|
266
293
|
attr_reader :name
|
267
294
|
|
295
|
+
#
|
296
|
+
# Initialize a new channel.
|
268
297
|
# @private
|
298
|
+
#
|
299
|
+
# @param [Hash] data The data of the channel.
|
300
|
+
#
|
269
301
|
def initialize(data)
|
270
302
|
@id = Snowflake.new(data[:id])
|
271
303
|
@name = data[:name]
|
272
304
|
end
|
305
|
+
|
306
|
+
def inspect
|
307
|
+
"#<#{self.class.name} #{@id}: #{@name}>"
|
308
|
+
end
|
273
309
|
end
|
274
310
|
end
|
275
311
|
|
@@ -290,7 +326,13 @@ module Discorb
|
|
290
326
|
# @return [Discorb::Snowflake] The ID of the guild.
|
291
327
|
attr_reader :guild_id
|
292
328
|
|
329
|
+
#
|
330
|
+
# Initializes the message.
|
293
331
|
# @private
|
332
|
+
#
|
333
|
+
# @param [Discorb::Webhook] webhook The webhook.
|
334
|
+
# @param [Hash] data The data of the message.
|
335
|
+
# @param [Discorb::Client] client The client. This will be nil if it's created from {URLWebhook}.
|
294
336
|
def initialize(webhook, data, client = nil)
|
295
337
|
@client = client
|
296
338
|
@webhook = webhook
|
@@ -329,12 +371,12 @@ module Discorb
|
|
329
371
|
|
330
372
|
def _set_data(data)
|
331
373
|
@id = Snowflake.new(data[:id])
|
332
|
-
@type = Discorb::Message
|
374
|
+
@type = Discorb::Message::MESSAGE_TYPE[data[:type]]
|
333
375
|
@content = data[:content]
|
334
376
|
@channel_id = Snowflake.new(data[:channel_id])
|
335
377
|
@author = Author.new(data[:author])
|
336
378
|
@attachments = data[:attachments].map { |a| Attachment.new(a) }
|
337
|
-
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.
|
379
|
+
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.from_hash(e) } : []
|
338
380
|
@mentions = data[:mentions].map { |m| Mention.new(m) }
|
339
381
|
@mention_roles = data[:mention_roles].map { |m| Snowflake.new(m) }
|
340
382
|
@mention_everyone = data[:mention_everyone]
|
@@ -364,7 +406,12 @@ module Discorb
|
|
364
406
|
# @return [String] The discriminator of the author.
|
365
407
|
attr_reader :discriminator
|
366
408
|
|
409
|
+
#
|
410
|
+
# Initializes the author.
|
367
411
|
# @private
|
412
|
+
#
|
413
|
+
# @param [Hash] data The data of the author.
|
414
|
+
#
|
368
415
|
def initialize(data)
|
369
416
|
@data = data
|
370
417
|
@bot = data[:bot]
|
@@ -384,6 +431,10 @@ module Discorb
|
|
384
431
|
end
|
385
432
|
|
386
433
|
alias to_s_user to_s
|
434
|
+
|
435
|
+
def inspect
|
436
|
+
"#<#{self.class.name} #{self}>"
|
437
|
+
end
|
387
438
|
end
|
388
439
|
end
|
389
440
|
|
data/lib/discorb.rb
CHANGED
@@ -4,7 +4,10 @@
|
|
4
4
|
#
|
5
5
|
# @author sevenc-nanashi
|
6
6
|
module Discorb
|
7
|
+
#
|
8
|
+
# Method to define a macro for YARD.
|
7
9
|
# @private
|
10
|
+
#
|
8
11
|
# @!macro [new] async
|
9
12
|
# @note This is an asynchronous method, it will return a `Async::Task` object. Use `Async::Task#wait` to get the result.
|
10
13
|
#
|
@@ -23,7 +26,6 @@ module Discorb
|
|
23
26
|
# @raise [Discorb::HTTPError] HTTP request failed.
|
24
27
|
#
|
25
28
|
def macro
|
26
|
-
# NOTE: this method is only for YARD.
|
27
29
|
puts "Wow, You found the easter egg!\n"
|
28
30
|
red = "\e[31m"
|
29
31
|
reset = "\e[m"
|
@@ -43,10 +45,10 @@ require_order = %w[common flag dictionary error rate_limit http intents emoji_ta
|
|
43
45
|
%w[message_meta allowed_mentions] +
|
44
46
|
%w[user member guild emoji channel embed message] +
|
45
47
|
%w[application audit_logs color components event event_handler] +
|
46
|
-
%w[
|
48
|
+
%w[attachment guild_template image integration interaction invite permission] +
|
47
49
|
%w[presence reaction role sticker utils voice_state webhook] +
|
48
50
|
%w[gateway_requests gateway app_command] +
|
49
|
-
%w[asset extension client extend]
|
51
|
+
%w[asset extension shard client extend]
|
50
52
|
require_order.each do |name|
|
51
53
|
require_relative "discorb/#{name}.rb"
|
52
54
|
end
|