discorb 0.5.5 → 0.7.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/ISSUE_TEMPLATE/bug_report.md +57 -0
- data/.github/ISSUE_TEMPLATE/config.yml +8 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +38 -0
- data/.gitignore +3 -3
- data/.yardopts +1 -0
- data/Changelog.md +40 -1
- data/README.md +9 -6
- data/assets/banner.svg +125 -0
- data/docs/application_command.md +19 -19
- data/docs/cli/run.md +11 -1
- data/docs/cli/setup.md +7 -1
- data/docs/events.md +34 -0
- data/docs/extension.md +6 -6
- data/lib/discorb/{command.rb → app_command.rb} +60 -50
- data/lib/discorb/channel.rb +18 -18
- data/lib/discorb/client.rb +47 -35
- data/lib/discorb/color.rb +59 -29
- data/lib/discorb/common.rb +1 -1
- data/lib/discorb/embed.rb +12 -12
- data/lib/discorb/emoji.rb +9 -2
- data/lib/discorb/error.rb +7 -1
- data/lib/discorb/event.rb +5 -5
- data/lib/discorb/exe/run.rb +12 -0
- data/lib/discorb/exe/setup.rb +14 -1
- data/lib/discorb/extension.rb +9 -9
- data/lib/discorb/gateway.rb +40 -8
- data/lib/discorb/guild.rb +38 -38
- data/lib/discorb/http.rb +13 -11
- data/lib/discorb/intents.rb +2 -2
- data/lib/discorb/interaction.rb +3 -2
- data/lib/discorb/log.rb +16 -12
- data/lib/discorb/member.rb +3 -3
- data/lib/discorb/message.rb +8 -8
- data/lib/discorb/modules.rb +5 -5
- data/lib/discorb/user.rb +1 -1
- data/lib/discorb/webhook.rb +1 -1
- data/lib/discorb.rb +1 -1
- data/po/yard.pot +37 -37
- data/sig/discorb.rbs +7218 -0
- metadata +8 -4
- data/Gemfile.lock +0 -67
@@ -4,9 +4,9 @@ module Discorb
|
|
4
4
|
#
|
5
5
|
# Handles application commands.
|
6
6
|
#
|
7
|
-
module
|
7
|
+
module ApplicationCommand
|
8
8
|
#
|
9
|
-
# Module to handle commands.
|
9
|
+
# Module to handle application commands.
|
10
10
|
#
|
11
11
|
module Handler
|
12
12
|
#
|
@@ -24,15 +24,16 @@ module Discorb
|
|
24
24
|
# | `:type` | `Object` | Type of the option. |
|
25
25
|
# | `:choice` | `Hash{String => String, Integer, Float}` | Type of the option. |
|
26
26
|
#
|
27
|
-
# @param [Array<#to_s
|
27
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
28
28
|
# @param [Proc] block Command block.
|
29
29
|
#
|
30
|
-
# @return [Discorb::
|
30
|
+
# @return [Discorb::ApplicationCommand::Command::SlashCommand] Command object.
|
31
31
|
#
|
32
32
|
# @see file:docs/application_command.md#register-slash-command
|
33
|
+
# @see file:docs/cli/setup.md
|
33
34
|
#
|
34
|
-
def slash(command_name, description, options = {}, guild_ids:
|
35
|
-
command = Discorb::
|
35
|
+
def slash(command_name, description, options = {}, guild_ids: nil, &block)
|
36
|
+
command = Discorb::ApplicationCommand::Command::SlashCommand.new(command_name, description, options, guild_ids, block, 1, "")
|
36
37
|
@commands << command
|
37
38
|
@bottom_commands << command
|
38
39
|
command
|
@@ -43,18 +44,19 @@ module Discorb
|
|
43
44
|
#
|
44
45
|
# @param [String] command_name Command name.
|
45
46
|
# @param [String] description Command description.
|
46
|
-
# @param [Array<#to_s
|
47
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
47
48
|
#
|
48
|
-
# @yield Block to
|
49
|
-
# @
|
49
|
+
# @yield Block to yield with the command.
|
50
|
+
# @yieldparam [Discorb::ApplicationCommand::Command::GroupCommand] group Group command.
|
50
51
|
#
|
51
|
-
# @return [Discorb::
|
52
|
+
# @return [Discorb::ApplicationCommand::Command::GroupCommand] Command object.
|
52
53
|
#
|
53
54
|
# @see file:docs/slash_command.md
|
55
|
+
# @see file:docs/cli/setup.md
|
54
56
|
#
|
55
|
-
def slash_group(command_name, description, guild_ids:
|
56
|
-
command = Discorb::
|
57
|
-
command.
|
57
|
+
def slash_group(command_name, description, guild_ids: nil, &block)
|
58
|
+
command = Discorb::ApplicationCommand::Command::GroupCommand.new(command_name, description, guild_ids, nil, self)
|
59
|
+
command.yield_self(&block) if block_given?
|
58
60
|
@commands << command
|
59
61
|
command
|
60
62
|
end
|
@@ -63,16 +65,16 @@ module Discorb
|
|
63
65
|
# Add message context menu command.
|
64
66
|
#
|
65
67
|
# @param [String] command_name Command name.
|
66
|
-
# @param [Array<#to_s
|
68
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
67
69
|
# @param [Proc] block Command block.
|
68
70
|
# @yield [interaction, message] Block to execute.
|
69
|
-
# @yieldparam [Discorb::
|
70
|
-
# @yieldparam [Discorb::Message]
|
71
|
+
# @yieldparam [Discorb::ApplicationCommandInteraction::UserMenuCommand] interaction Interaction object.
|
72
|
+
# @yieldparam [Discorb::Message] message Message object.
|
71
73
|
#
|
72
|
-
# @return [Discorb::
|
74
|
+
# @return [Discorb::ApplicationCommand::Command] Command object.
|
73
75
|
#
|
74
|
-
def message_command(command_name, guild_ids:
|
75
|
-
command = Discorb::
|
76
|
+
def message_command(command_name, guild_ids: nil, &block)
|
77
|
+
command = Discorb::ApplicationCommand::Command.new(command_name, guild_ids, block, 3)
|
76
78
|
@commands << command
|
77
79
|
command
|
78
80
|
end
|
@@ -81,16 +83,16 @@ module Discorb
|
|
81
83
|
# Add user context menu command.
|
82
84
|
#
|
83
85
|
# @param [String] command_name Command name.
|
84
|
-
# @param [Array<#to_s
|
86
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to set the command to. `false` to global command, `nil` to use default.
|
85
87
|
# @param [Proc] block Command block.
|
86
88
|
# @yield [interaction, user] Block to execute.
|
87
|
-
# @yieldparam [Discorb::
|
89
|
+
# @yieldparam [Discorb::ApplicationCommandInteraction::UserMenuCommand] interaction Interaction object.
|
88
90
|
# @yieldparam [Discorb::User] user User object.
|
89
91
|
#
|
90
|
-
# @return [Discorb::
|
92
|
+
# @return [Discorb::ApplicationCommand::Command] Command object.
|
91
93
|
#
|
92
|
-
def user_command(command_name, guild_ids:
|
93
|
-
command = Discorb::
|
94
|
+
def user_command(command_name, guild_ids: nil, &block)
|
95
|
+
command = Discorb::ApplicationCommand::Command.new(command_name, guild_ids, block, 2)
|
94
96
|
@commands << command
|
95
97
|
command
|
96
98
|
end
|
@@ -100,20 +102,32 @@ module Discorb
|
|
100
102
|
# @see Client#initialize
|
101
103
|
#
|
102
104
|
# @param [String] token Bot token.
|
105
|
+
# @param [Array<#to_s>, false, nil] guild_ids Guild IDs to use as default. If `false` is given, it will be global command.
|
106
|
+
#
|
103
107
|
# @note `token` parameter only required if you don't run client.
|
104
108
|
#
|
105
|
-
def setup_commands(token = nil)
|
109
|
+
def setup_commands(token = nil, guild_ids: nil)
|
106
110
|
Async do
|
107
111
|
@token ||= token
|
108
112
|
@http = HTTP.new(self)
|
109
|
-
global_commands = @commands.select { |c| c.guild_ids.
|
110
|
-
|
113
|
+
global_commands = @commands.select { |c| c.guild_ids == false or c.guild_ids == [] }
|
114
|
+
local_commands = @commands.select { |c| c.guild_ids.is_a?(Array) and c.guild_ids.any? }
|
115
|
+
default_commands = @commands.select { |c| c.guild_ids.nil? }
|
116
|
+
if guild_ids.is_a?(Array)
|
117
|
+
default_commands.each do |command|
|
118
|
+
command.instance_variable_set(:@guild_ids, guild_ids)
|
119
|
+
end
|
120
|
+
local_commands += default_commands
|
121
|
+
else
|
122
|
+
global_commands += default_commands
|
123
|
+
end
|
124
|
+
final_guild_ids = local_commands.map(&:guild_ids).flatten.map(&:to_s).uniq
|
111
125
|
app_info = fetch_application.wait
|
112
126
|
http.put("/applications/#{app_info.id}/commands", global_commands.map(&:to_hash)).wait unless global_commands.empty?
|
113
|
-
|
114
|
-
commands =
|
127
|
+
final_guild_ids.each do |guild_id|
|
128
|
+
commands = local_commands.select { |c| c.guild_ids.include?(guild_id) }
|
115
129
|
http.put("/applications/#{app_info.id}/guilds/#{guild_id}/commands", commands.map(&:to_hash)).wait
|
116
|
-
end unless
|
130
|
+
end unless final_guild_ids.empty?
|
117
131
|
@log.info "Successfully setup commands"
|
118
132
|
end
|
119
133
|
end
|
@@ -146,10 +160,10 @@ module Discorb
|
|
146
160
|
# @!visibility private
|
147
161
|
def initialize(name, guild_ids, block, type)
|
148
162
|
@name = name
|
149
|
-
@guild_ids = guild_ids
|
163
|
+
@guild_ids = guild_ids&.map(&:to_s)
|
150
164
|
@block = block
|
151
165
|
@raw_type = type
|
152
|
-
@type = Discorb::
|
166
|
+
@type = Discorb::ApplicationCommand::Command.types[type]
|
153
167
|
@type_raw = type
|
154
168
|
@id_map = Discorb::Dictionary.new
|
155
169
|
end
|
@@ -174,12 +188,8 @@ module Discorb
|
|
174
188
|
|
175
189
|
# @!visibility private
|
176
190
|
def initialize(name, description, options, guild_ids, block, type, parent)
|
191
|
+
super(name, guild_ids, block, type)
|
177
192
|
@description = description
|
178
|
-
@name = name
|
179
|
-
@guild_ids = guild_ids.map(&:to_s)
|
180
|
-
@block = block
|
181
|
-
@type = Discorb::Command::Command.types[type]
|
182
|
-
@type_raw = 1
|
183
193
|
@options = options
|
184
194
|
@id = nil
|
185
195
|
@parent = parent
|
@@ -241,7 +251,7 @@ module Discorb
|
|
241
251
|
# Represents the command with subcommands.
|
242
252
|
#
|
243
253
|
class GroupCommand < Command
|
244
|
-
# @return [Array<Discorb::
|
254
|
+
# @return [Array<Discorb::ApplicationCommand::Command::SlashCommand, Discorb::ApplicationCommand::Command::SubcommandGroup>] The subcommands of the command.
|
245
255
|
attr_reader :commands
|
246
256
|
# @return [String] The description of the command.
|
247
257
|
attr_reader :description
|
@@ -258,11 +268,11 @@ module Discorb
|
|
258
268
|
#
|
259
269
|
# Add new subcommand.
|
260
270
|
#
|
261
|
-
# @param (see Discorb::
|
262
|
-
# @return [Discorb::
|
271
|
+
# @param (see Discorb::ApplicationCommand::Handler#slash)
|
272
|
+
# @return [Discorb::ApplicationCommand::Command::SlashCommand] The added subcommand.
|
263
273
|
#
|
264
274
|
def slash(command_name, description, options = {}, &block)
|
265
|
-
command = Discorb::
|
275
|
+
command = Discorb::ApplicationCommand::Command::SlashCommand.new(command_name, description, options, [], block, 1, @name)
|
266
276
|
@client.bottom_commands << command
|
267
277
|
@commands << command
|
268
278
|
command
|
@@ -274,16 +284,16 @@ module Discorb
|
|
274
284
|
# @param [String] command_name Group name.
|
275
285
|
# @param [String] description Group description.
|
276
286
|
#
|
277
|
-
# @yield Block to
|
278
|
-
# @
|
287
|
+
# @yield Block to yield with the command.
|
288
|
+
# @yieldparam [Discorb::ApplicationCommand::Command::SubcommandGroup] group Group command.
|
279
289
|
#
|
280
|
-
# @return [Discorb::
|
290
|
+
# @return [Discorb::ApplicationCommand::Command::SubcommandGroup] Command object.
|
281
291
|
#
|
282
292
|
# @see file:docs/slash_command.md
|
283
293
|
#
|
284
294
|
def group(command_name, description, &block)
|
285
|
-
command = Discorb::
|
286
|
-
command.
|
295
|
+
command = Discorb::ApplicationCommand::Command::SubcommandGroup.new(command_name, description, @name, @client)
|
296
|
+
command.yield_self(&block) if block_given?
|
287
297
|
@commands << command
|
288
298
|
command
|
289
299
|
end
|
@@ -332,7 +342,7 @@ module Discorb
|
|
332
342
|
# Represents the subcommand group.
|
333
343
|
#
|
334
344
|
class SubcommandGroup < GroupCommand
|
335
|
-
# @return [Array<Discorb::
|
345
|
+
# @return [Array<Discorb::ApplicationCommand::Command::SlashCommand>] The subcommands of the command.
|
336
346
|
attr_reader :commands
|
337
347
|
|
338
348
|
# @!visibility private
|
@@ -349,11 +359,11 @@ module Discorb
|
|
349
359
|
|
350
360
|
#
|
351
361
|
# Add new subcommand.
|
352
|
-
# @param (see Discorb::
|
353
|
-
# @return [Discorb::
|
362
|
+
# @param (see Discorb::ApplicationCommand::Handler#slash)
|
363
|
+
# @return [Discorb::ApplicationCommand::Command::SlashCommand] The added subcommand.
|
354
364
|
#
|
355
365
|
def slash(command_name, description, options = {}, &block)
|
356
|
-
command = Discorb::
|
366
|
+
command = Discorb::ApplicationCommand::Command::SlashCommand.new(command_name, description, options, [], block, 1, @parent + " " + @name)
|
357
367
|
@commands << command
|
358
368
|
@client.bottom_commands << command
|
359
369
|
command
|
data/lib/discorb/channel.rb
CHANGED
@@ -171,7 +171,7 @@ module Discorb
|
|
171
171
|
#
|
172
172
|
# @param [String] reason The reason of deleting the channel.
|
173
173
|
#
|
174
|
-
# @return [self] The deleted channel.
|
174
|
+
# @return [Async::Task<self>] The deleted channel.
|
175
175
|
#
|
176
176
|
def delete!(reason: nil)
|
177
177
|
Async do
|
@@ -194,7 +194,7 @@ module Discorb
|
|
194
194
|
# @param [Discorb::CategoryChannel] parent The parent of channel.
|
195
195
|
# @param [String] reason The reason of moving the channel.
|
196
196
|
#
|
197
|
-
# @return [self] The moved channel.
|
197
|
+
# @return [Async::Task<self>] The moved channel.
|
198
198
|
#
|
199
199
|
def move(position, lock_permissions: false, parent: :unset, reason: nil)
|
200
200
|
Async do
|
@@ -273,7 +273,7 @@ module Discorb
|
|
273
273
|
# @param [Integer] archive_in Alias of `default_auto_archive_duration`.
|
274
274
|
# @param [String] reason The reason of editing the channel.
|
275
275
|
#
|
276
|
-
# @return [self] The edited channel.
|
276
|
+
# @return [Async::Task<self>] The edited channel.
|
277
277
|
#
|
278
278
|
def edit(name: :unset, position: :unset, category: :unset, parent: :unset,
|
279
279
|
topic: :unset, nsfw: :unset, announce: :unset,
|
@@ -310,7 +310,7 @@ module Discorb
|
|
310
310
|
# @param [String] name The name of the webhook.
|
311
311
|
# @param [Discorb::Image] avatar The avatar of the webhook.
|
312
312
|
#
|
313
|
-
# @return [Discorb::Webhook::IncomingWebhook] The created webhook.
|
313
|
+
# @return [Async::Task<Discorb::Webhook::IncomingWebhook>] The created webhook.
|
314
314
|
#
|
315
315
|
def create_webhook(name, avatar: nil)
|
316
316
|
Async do
|
@@ -327,7 +327,7 @@ module Discorb
|
|
327
327
|
# @macro async
|
328
328
|
# @macro http
|
329
329
|
#
|
330
|
-
# @return [Array<Discorb::Webhook
|
330
|
+
# @return [Async::Task<Array<Discorb::Webhook>>] The webhooks in the channel.
|
331
331
|
#
|
332
332
|
def fetch_webhooks
|
333
333
|
Async do
|
@@ -419,7 +419,7 @@ module Discorb
|
|
419
419
|
# @macro async
|
420
420
|
# @macro http
|
421
421
|
#
|
422
|
-
# @return [Array<Discorb::Invite
|
422
|
+
# @return [Async::Task<Array<Discorb::Invite>>] The invites in the channel.
|
423
423
|
#
|
424
424
|
def fetch_invites
|
425
425
|
Async do
|
@@ -440,7 +440,7 @@ module Discorb
|
|
440
440
|
# @note if it's `false` it may return existing invite.
|
441
441
|
# @param [String] reason The reason of creating the invite.
|
442
442
|
#
|
443
|
-
# @return [Invite] The created invite.
|
443
|
+
# @return [Async::Task<Invite>] The created invite.
|
444
444
|
#
|
445
445
|
def create_invite(max_age: nil, max_uses: nil, temporary: false, unique: false, reason: nil)
|
446
446
|
Async do
|
@@ -487,7 +487,7 @@ module Discorb
|
|
487
487
|
# @macro async
|
488
488
|
# @macro http
|
489
489
|
#
|
490
|
-
# @return [Array<Discorb::Message
|
490
|
+
# @return [Async::Task<Array<Discorb::Message>>] The pinned messages in the channel.
|
491
491
|
#
|
492
492
|
def fetch_pins
|
493
493
|
Async do
|
@@ -535,7 +535,7 @@ module Discorb
|
|
535
535
|
# @param [Boolean] public Whether the thread is public.
|
536
536
|
# @param [String] reason The reason of starting the thread.
|
537
537
|
#
|
538
|
-
# @return [Discorb::ThreadChannel] The started thread.
|
538
|
+
# @return [Async::Task<Discorb::ThreadChannel>] The started thread.
|
539
539
|
#
|
540
540
|
def start_thread(name, message: nil, auto_archive_duration: 1440, public: true, reason: nil)
|
541
541
|
Async do
|
@@ -560,7 +560,7 @@ module Discorb
|
|
560
560
|
# @macro async
|
561
561
|
# @macro http
|
562
562
|
#
|
563
|
-
# @return [Array<Discorb::ThreadChannel
|
563
|
+
# @return [Async::Task<Array<Discorb::ThreadChannel>>] The archived threads in the channel.
|
564
564
|
#
|
565
565
|
def fetch_archived_public_threads
|
566
566
|
Async do
|
@@ -574,7 +574,7 @@ module Discorb
|
|
574
574
|
# @macro async
|
575
575
|
# @macro http
|
576
576
|
#
|
577
|
-
# @return [Array<Discorb::ThreadChannel
|
577
|
+
# @return [Async::Task<Array<Discorb::ThreadChannel>>] The archived private threads in the channel.
|
578
578
|
#
|
579
579
|
def fetch_archived_private_threads
|
580
580
|
Async do
|
@@ -591,7 +591,7 @@ module Discorb
|
|
591
591
|
# @param [Integer] limit The limit of threads to fetch.
|
592
592
|
# @param [Time] before <description>
|
593
593
|
#
|
594
|
-
# @return [Array<Discorb::ThreadChannel
|
594
|
+
# @return [Async::Task<Array<Discorb::ThreadChannel>>] The joined archived private threads in the channel.
|
595
595
|
#
|
596
596
|
def fetch_joined_archived_private_threads(limit: nil, before: nil)
|
597
597
|
Async do
|
@@ -660,7 +660,7 @@ module Discorb
|
|
660
660
|
# @param [Symbol] rtc_region The region of the voice channel.
|
661
661
|
# @param [String] reason The reason of editing the voice channel.
|
662
662
|
#
|
663
|
-
# @return [self] The edited voice channel.
|
663
|
+
# @return [Async::Task<self>] The edited voice channel.
|
664
664
|
#
|
665
665
|
def edit(name: :unset, position: :unset, bitrate: :unset, user_limit: :unset, rtc_region: :unset, reason: nil)
|
666
666
|
Async do
|
@@ -728,7 +728,7 @@ module Discorb
|
|
728
728
|
# @param [Symbol] rtc_region The region of the stage channel.
|
729
729
|
# @param [String] reason The reason of editing the stage channel.
|
730
730
|
#
|
731
|
-
# @return [self] The edited stage channel.
|
731
|
+
# @return [Async::Task<self>] The edited stage channel.
|
732
732
|
#
|
733
733
|
def edit(name: :unset, position: :unset, bitrate: :unset, rtc_region: :unset, reason: nil)
|
734
734
|
Async do
|
@@ -753,7 +753,7 @@ module Discorb
|
|
753
753
|
# @param [Boolean] public Whether the stage instance is public or not.
|
754
754
|
# @param [String] reason The reason of starting the stage instance.
|
755
755
|
#
|
756
|
-
# @return [Discorb::StageInstance] The started stage instance.
|
756
|
+
# @return [Async::Task<Discorb::StageInstance>] The started stage instance.
|
757
757
|
#
|
758
758
|
def start(topic, public: false, reason: nil)
|
759
759
|
Async do
|
@@ -767,8 +767,8 @@ module Discorb
|
|
767
767
|
# @macro async
|
768
768
|
# @macro http
|
769
769
|
#
|
770
|
-
# @return [StageInstance] The current stage instance.
|
771
|
-
# @return [nil] If there is no current stage instance.
|
770
|
+
# @return [Async::Task<StageInstance>] The current stage instance.
|
771
|
+
# @return [Async::Task<nil>] If there is no current stage instance.
|
772
772
|
#
|
773
773
|
def fetch_stage_instance
|
774
774
|
Async do
|
@@ -853,7 +853,7 @@ module Discorb
|
|
853
853
|
# @param [Boolean] locked Whether the thread is locked or not.
|
854
854
|
# @param [String] reason The reason of editing the thread.
|
855
855
|
#
|
856
|
-
# @return [self] The edited thread.
|
856
|
+
# @return [Async::Task<self>] The edited thread.
|
857
857
|
#
|
858
858
|
# @see #archive
|
859
859
|
# @see #lock
|
data/lib/discorb/client.rb
CHANGED
@@ -41,7 +41,7 @@ module Discorb
|
|
41
41
|
attr_reader :messages
|
42
42
|
# @return [Discorb::Logger] The logger.
|
43
43
|
attr_reader :log
|
44
|
-
# @return [Array<Discorb::
|
44
|
+
# @return [Array<Discorb::ApplicationCommand::Command>] The commands that the client is using.
|
45
45
|
attr_reader :commands
|
46
46
|
# @return [Float] The ping of the client.
|
47
47
|
# @note This will be calculated from heartbeat and heartbeat_ack.
|
@@ -91,6 +91,7 @@ module Discorb
|
|
91
91
|
@commands = []
|
92
92
|
@bottom_commands = []
|
93
93
|
@status = :initialized
|
94
|
+
set_default_events
|
94
95
|
end
|
95
96
|
|
96
97
|
#
|
@@ -99,14 +100,15 @@ module Discorb
|
|
99
100
|
#
|
100
101
|
# @param [Symbol] event_name The name of the event.
|
101
102
|
# @param [Symbol] id Custom ID of the event.
|
102
|
-
# @param [Hash]
|
103
|
+
# @param [Hash] metadata The metadata of the event.
|
103
104
|
# @param [Proc] block The block to execute when the event is triggered.
|
104
105
|
#
|
105
106
|
# @return [Discorb::Event] The event.
|
106
107
|
#
|
107
|
-
def on(event_name, id: nil, **
|
108
|
-
ne = Event.new(block, id,
|
108
|
+
def on(event_name, id: nil, **metadata, &block)
|
109
|
+
ne = Event.new(block, id, metadata)
|
109
110
|
@events[event_name] ||= []
|
111
|
+
@events[event_name].delete_if { |e| e.metadata[:override] }
|
110
112
|
@events[event_name] << ne
|
111
113
|
ne
|
112
114
|
end
|
@@ -118,12 +120,9 @@ module Discorb
|
|
118
120
|
#
|
119
121
|
# @return [Discorb::Event] The event.
|
120
122
|
#
|
121
|
-
def once(event_name, id: nil, **
|
122
|
-
|
123
|
-
|
124
|
-
@events[event_name] ||= []
|
125
|
-
@events[event_name] << ne
|
126
|
-
ne
|
123
|
+
def once(event_name, id: nil, **metadata, &block)
|
124
|
+
metadata[:once] = true
|
125
|
+
on(event_name, id: id, **metadata, &block)
|
127
126
|
end
|
128
127
|
|
129
128
|
#
|
@@ -174,23 +173,17 @@ module Discorb
|
|
174
173
|
end
|
175
174
|
@log.debug "Dispatching event #{event_name}"
|
176
175
|
events.each do |block|
|
177
|
-
|
176
|
+
Async do
|
178
177
|
Async(annotation: "Discorb event: #{event_name}") do |task|
|
179
178
|
if block.is_a?(Discorb::Event)
|
180
|
-
@events[event_name].delete(block) if block.
|
179
|
+
@events[event_name].delete(block) if block.metadata[:once]
|
181
180
|
end
|
182
|
-
block.call(*
|
181
|
+
block.call(*args)
|
183
182
|
@log.debug "Dispatched proc with ID #{block.id.inspect}"
|
184
183
|
rescue StandardError, ScriptError => e
|
185
|
-
|
186
|
-
dispatch(:error, event_name, event_args, e)
|
187
|
-
if @log.out
|
188
|
-
@log.error message
|
189
|
-
else
|
190
|
-
warn message
|
191
|
-
end
|
184
|
+
dispatch(:error, event_name, args, e)
|
192
185
|
end
|
193
|
-
|
186
|
+
end
|
194
187
|
end
|
195
188
|
end
|
196
189
|
end
|
@@ -202,7 +195,7 @@ module Discorb
|
|
202
195
|
#
|
203
196
|
# @param [#to_s] id <description>
|
204
197
|
#
|
205
|
-
# @return [Discorb::User] The user.
|
198
|
+
# @return [Async::Task<Discorb::User>] The user.
|
206
199
|
#
|
207
200
|
# @raise [Discorb::NotFoundError] If the user doesn't exist.
|
208
201
|
#
|
@@ -220,7 +213,7 @@ module Discorb
|
|
220
213
|
#
|
221
214
|
# @param [#to_s] id The ID of the channel.
|
222
215
|
#
|
223
|
-
# @return [Discorb::Channel] The channel.
|
216
|
+
# @return [Async::Task<Discorb::Channel>] The channel.
|
224
217
|
#
|
225
218
|
# @raise [Discorb::NotFoundError] If the channel doesn't exist.
|
226
219
|
#
|
@@ -238,7 +231,7 @@ module Discorb
|
|
238
231
|
#
|
239
232
|
# @param [#to_s] id <description>
|
240
233
|
#
|
241
|
-
# @return [Discorb::Guild] The guild.
|
234
|
+
# @return [Async::Task<Discorb::Guild>] The guild.
|
242
235
|
#
|
243
236
|
# @raise [Discorb::NotFoundError] If the guild doesn't exist.
|
244
237
|
#
|
@@ -258,7 +251,7 @@ module Discorb
|
|
258
251
|
# @param [Boolean] with_count Whether to include the count of the invite.
|
259
252
|
# @param [Boolean] with_expiration Whether to include the expiration of the invite.
|
260
253
|
#
|
261
|
-
# @return [Discorb::Invite] The invite.
|
254
|
+
# @return [Async::Task<Discorb::Invite>] The invite.
|
262
255
|
#
|
263
256
|
def fetch_invite(code, with_count: false, with_expiration: false)
|
264
257
|
Async do
|
@@ -275,7 +268,7 @@ module Discorb
|
|
275
268
|
#
|
276
269
|
# @param [Boolean] force Whether to force the fetch.
|
277
270
|
#
|
278
|
-
# @return [Discorb::Application] The application.
|
271
|
+
# @return [Async::Task<Discorb::Application>] The application.
|
279
272
|
#
|
280
273
|
def fetch_application(force: false)
|
281
274
|
Async do
|
@@ -292,7 +285,7 @@ module Discorb
|
|
292
285
|
# @macro async
|
293
286
|
# @macro http
|
294
287
|
#
|
295
|
-
# @return [Array<Discorb::Sticker::Pack
|
288
|
+
# @return [Async::Task<Array<Discorb::Sticker::Pack>>] The packs.
|
296
289
|
#
|
297
290
|
def fetch_nitro_sticker_packs
|
298
291
|
Async do
|
@@ -369,10 +362,11 @@ module Discorb
|
|
369
362
|
def extend(mod)
|
370
363
|
if mod.respond_to?(:events)
|
371
364
|
@events.each_value do |event|
|
372
|
-
event.delete_if { |c| c.
|
365
|
+
event.delete_if { |c| c.metadata[:extension] == mod.name }
|
373
366
|
end
|
374
367
|
mod.events.each do |name, events|
|
375
|
-
@events[name]
|
368
|
+
@events[name] ||= []
|
369
|
+
@events[name].delete_if { |c| c.metadata[:override] }
|
376
370
|
events.each do |event|
|
377
371
|
@events[name] << event
|
378
372
|
end
|
@@ -391,16 +385,20 @@ module Discorb
|
|
391
385
|
end
|
392
386
|
|
393
387
|
include Discorb::Gateway::Handler
|
394
|
-
include Discorb::
|
388
|
+
include Discorb::ApplicationCommand::Handler
|
395
389
|
|
396
390
|
#
|
397
391
|
# Starts the client.
|
398
392
|
# @note This method behavior will change by CLI.
|
399
393
|
# @see file:docs/cli.md
|
400
394
|
#
|
401
|
-
# @param [String] token The token to use.
|
395
|
+
# @param [String, nil] token The token to use.
|
402
396
|
#
|
403
|
-
|
397
|
+
# @note If the token is nil, you should use `discorb run` with the `-t` or `--token` option.
|
398
|
+
#
|
399
|
+
def run(token = nil)
|
400
|
+
token ||= ENV["DISCORB_CLI_TOKEN"]
|
401
|
+
raise ArgumentError, "Token is not specified, and -t/--token is not specified" if token.nil?
|
404
402
|
case ENV["DISCORB_CLI_FLAG"]
|
405
403
|
when nil
|
406
404
|
start_client(token)
|
@@ -436,7 +434,14 @@ module Discorb
|
|
436
434
|
end
|
437
435
|
start_client(token)
|
438
436
|
when "setup"
|
439
|
-
|
437
|
+
guild_ids = "global"
|
438
|
+
if guilds = ENV["DISCORB_SETUP_GUILDS"]
|
439
|
+
guild_ids = guilds.split(",")
|
440
|
+
end
|
441
|
+
if guild_ids == ["global"]
|
442
|
+
guild_ids = false
|
443
|
+
end
|
444
|
+
setup_commands(token, guild_ids: guild_ids).wait
|
440
445
|
end
|
441
446
|
end
|
442
447
|
|
@@ -460,7 +465,7 @@ module Discorb
|
|
460
465
|
}
|
461
466
|
@token = token.to_s
|
462
467
|
@close_condition = Async::Condition.new
|
463
|
-
main_task = Async do
|
468
|
+
@main_task = Async do
|
464
469
|
@status = :running
|
465
470
|
connect_gateway(true).wait
|
466
471
|
rescue
|
@@ -469,7 +474,14 @@ module Discorb
|
|
469
474
|
raise
|
470
475
|
end
|
471
476
|
@close_condition.wait
|
472
|
-
main_task.stop
|
477
|
+
@main_task.stop
|
478
|
+
end
|
479
|
+
end
|
480
|
+
|
481
|
+
def set_default_events
|
482
|
+
on :error, override: true do |event_name, _args, e|
|
483
|
+
message = "An error occurred while dispatching #{event_name}:\n#{e.full_message}"
|
484
|
+
@log.error message, fallback: $stderr
|
473
485
|
end
|
474
486
|
end
|
475
487
|
end
|