discorb 0.13.1 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +2 -0
- data/.github/workflows/build_version.yml +3 -3
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.github/workflows/lint-push.yml +18 -0
- data/.github/workflows/lint.yml +16 -0
- data/.rubocop.yml +70 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/Changelog.md +33 -0
- data/Gemfile +7 -3
- data/README.md +1 -1
- data/Rakefile +35 -35
- data/discorb.gemspec +13 -1
- data/examples/commands/bookmarker.rb +2 -1
- data/examples/commands/hello.rb +1 -0
- data/examples/commands/inspect.rb +3 -2
- data/examples/components/authorization_button.rb +2 -1
- data/examples/components/select_menu.rb +2 -1
- data/examples/extension/main.rb +1 -0
- data/examples/extension/message_expander.rb +1 -0
- data/examples/simple/eval.rb +3 -2
- data/examples/simple/ping_pong.rb +1 -0
- data/examples/simple/rolepanel.rb +1 -0
- data/examples/simple/wait_for_message.rb +4 -3
- data/exe/discorb +8 -7
- data/lib/discorb/allowed_mentions.rb +64 -0
- data/lib/discorb/app_command/command.rb +274 -0
- data/lib/discorb/app_command/handler.rb +168 -0
- data/lib/discorb/app_command.rb +2 -404
- data/lib/discorb/asset.rb +3 -1
- data/lib/discorb/audit_logs.rb +3 -3
- data/lib/discorb/channel.rb +89 -53
- data/lib/discorb/client.rb +36 -33
- data/lib/discorb/common.rb +28 -21
- data/lib/discorb/components/button.rb +106 -0
- data/lib/discorb/components/select_menu.rb +157 -0
- data/lib/discorb/components/text_input.rb +96 -0
- data/lib/discorb/components.rb +11 -276
- data/lib/discorb/dictionary.rb +13 -2
- data/lib/discorb/embed.rb +2 -2
- data/lib/discorb/emoji.rb +21 -5
- data/lib/discorb/emoji_table.rb +1 -1
- data/lib/discorb/error.rb +4 -6
- data/lib/discorb/event.rb +13 -11
- data/lib/discorb/exe/about.rb +1 -0
- data/lib/discorb/exe/irb.rb +4 -3
- data/lib/discorb/exe/new.rb +6 -7
- data/lib/discorb/exe/run.rb +2 -1
- data/lib/discorb/exe/setup.rb +8 -5
- data/lib/discorb/exe/show.rb +1 -0
- data/lib/discorb/extend.rb +19 -14
- data/lib/discorb/extension.rb +5 -1
- data/lib/discorb/gateway.rb +75 -27
- data/lib/discorb/guild.rb +58 -80
- data/lib/discorb/guild_template.rb +5 -5
- data/lib/discorb/http.rb +34 -169
- data/lib/discorb/integration.rb +32 -3
- data/lib/discorb/intents.rb +1 -1
- data/lib/discorb/interaction/autocomplete.rb +5 -4
- data/lib/discorb/interaction/command.rb +34 -9
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +33 -0
- data/lib/discorb/interaction/response.rb +41 -12
- data/lib/discorb/interaction/root.rb +1 -0
- data/lib/discorb/interaction.rb +2 -1
- data/lib/discorb/invite.rb +1 -1
- data/lib/discorb/log.rb +4 -3
- data/lib/discorb/member.rb +4 -6
- data/lib/discorb/message.rb +31 -282
- data/lib/discorb/message_meta.rb +205 -0
- data/lib/discorb/modules.rb +11 -11
- data/lib/discorb/permission.rb +2 -2
- data/lib/discorb/presence.rb +6 -3
- data/lib/discorb/rate_limit.rb +15 -21
- data/lib/discorb/role.rb +3 -3
- data/lib/discorb/sticker.rb +2 -2
- data/lib/discorb/user.rb +3 -3
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +7 -2
- data/lib/discorb/webhook.rb +8 -5
- data/lib/discorb.rb +1 -0
- data/template-replace/scripts/arrow.rb +1 -0
- data/template-replace/scripts/favicon.rb +1 -0
- data/template-replace/scripts/index.rb +2 -1
- data/template-replace/scripts/locale_ja.rb +5 -4
- data/template-replace/scripts/sidebar.rb +1 -0
- data/template-replace/scripts/version.rb +7 -10
- data/template-replace/scripts/yard_replace.rb +5 -4
- metadata +29 -4
data/lib/discorb/channel.rb
CHANGED
@@ -174,7 +174,7 @@ module Discorb
|
|
174
174
|
#
|
175
175
|
def delete!(reason: nil)
|
176
176
|
Async do
|
177
|
-
@client.http.
|
177
|
+
@client.http.request(Route.new(base_url.wait.to_s, "//webhooks/:webhook_id/:token", :delete), audit_log_reason: reason).wait
|
178
178
|
@deleted = true
|
179
179
|
self
|
180
180
|
end
|
@@ -201,7 +201,7 @@ module Discorb
|
|
201
201
|
}
|
202
202
|
payload[:lock_permissions] = lock_permissions
|
203
203
|
payload[:parent_id] = parent&.id if parent != Discorb::Unset
|
204
|
-
@client.http.
|
204
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/channels", "//guilds/:guild_id/channels", :patch), payload, audit_log_reason: reason).wait
|
205
205
|
end
|
206
206
|
end
|
207
207
|
|
@@ -211,9 +211,9 @@ module Discorb
|
|
211
211
|
@guild_id = data[:guild_id]
|
212
212
|
@position = data[:position]
|
213
213
|
@permission_overwrites = if data[:permission_overwrites]
|
214
|
-
data[:permission_overwrites].
|
214
|
+
data[:permission_overwrites].to_h do |ow|
|
215
215
|
[(ow[:type] == 1 ? guild.roles : guild.members)[ow[:id]], PermissionOverwrite.new(ow[:allow], ow[:deny])]
|
216
|
-
end
|
216
|
+
end
|
217
217
|
else
|
218
218
|
{}
|
219
219
|
end
|
@@ -292,7 +292,7 @@ module Discorb
|
|
292
292
|
default_auto_archive_duration ||= archive_in
|
293
293
|
payload[:default_auto_archive_duration] = default_auto_archive_duration if default_auto_archive_duration != Discorb::Unset
|
294
294
|
|
295
|
-
@client.http.
|
295
|
+
@client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
|
296
296
|
self
|
297
297
|
end
|
298
298
|
end
|
@@ -313,7 +313,7 @@ module Discorb
|
|
313
313
|
payload = {}
|
314
314
|
payload[:name] = name
|
315
315
|
payload[:avatar] = avatar.to_s if avatar
|
316
|
-
_resp, data = @client.http.
|
316
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/webhooks", "//channels/:channel_id/webhooks", :post), payload).wait
|
317
317
|
Webhook.new([@client, data])
|
318
318
|
end
|
319
319
|
end
|
@@ -326,7 +326,7 @@ module Discorb
|
|
326
326
|
#
|
327
327
|
def fetch_webhooks
|
328
328
|
Async do
|
329
|
-
_resp, data = @client.http.
|
329
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/webhooks", "//channels/:channel_id/webhooks", :get)).wait
|
330
330
|
data.map { |webhook| Webhook.new([@client, webhook]) }
|
331
331
|
end
|
332
332
|
end
|
@@ -354,7 +354,7 @@ module Discorb
|
|
354
354
|
|
355
355
|
message_ids = messages.map { |m| Discorb::Utils.try(m, :id).to_s }
|
356
356
|
|
357
|
-
@client.http.
|
357
|
+
@client.http.request(Route.new("/channels/#{@id}/messages/bulk-delete", "//channels/:channel_id/messages/bulk-delete", :post), { messages: message_ids }).wait
|
358
358
|
end
|
359
359
|
end
|
360
360
|
|
@@ -384,7 +384,7 @@ module Discorb
|
|
384
384
|
deny: deny_value,
|
385
385
|
type: target.is_a?(Member) ? 1 : 0,
|
386
386
|
}
|
387
|
-
@client.http.
|
387
|
+
@client.http.request(Route.new("/channels/#{@id}/permissions/#{target.id}", "//channels/:channel_id/permissions/:target_id", :put), payload, audit_log_reason: reason).wait
|
388
388
|
end
|
389
389
|
end
|
390
390
|
|
@@ -404,7 +404,7 @@ module Discorb
|
|
404
404
|
#
|
405
405
|
def delete_permissions(target, reason: nil)
|
406
406
|
Async do
|
407
|
-
@client.http.
|
407
|
+
@client.http.request(Route.new("/channels/#{@id}/permissions/#{target.id}", "//channels/:channel_id/permissions/:target_id", :delete), audit_log_reason: reason).wait
|
408
408
|
end
|
409
409
|
end
|
410
410
|
|
@@ -420,7 +420,7 @@ module Discorb
|
|
420
420
|
#
|
421
421
|
def fetch_invites
|
422
422
|
Async do
|
423
|
-
_resp, data = @client.http.
|
423
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/invites", "//channels/:channel_id/invites", :get)).wait
|
424
424
|
data.map { |invite| Invite.new(@client, invite) }
|
425
425
|
end
|
426
426
|
end
|
@@ -440,7 +440,7 @@ module Discorb
|
|
440
440
|
#
|
441
441
|
def create_invite(max_age: nil, max_uses: nil, temporary: false, unique: false, reason: nil)
|
442
442
|
Async do
|
443
|
-
_resp, data = @client.http.
|
443
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/invites", "//channels/:channel_id/invites", :post), {
|
444
444
|
max_age: max_age,
|
445
445
|
max_uses: max_uses,
|
446
446
|
temporary: temporary,
|
@@ -461,7 +461,7 @@ module Discorb
|
|
461
461
|
#
|
462
462
|
def follow_from(target, reason: nil)
|
463
463
|
Async do
|
464
|
-
@client.http.
|
464
|
+
@client.http.request(Route.new("/channels/#{target.id}/followers", "//channels/:channel_id/followers", :post), { webhook_channel_id: @id }, audit_log_reason: reason).wait
|
465
465
|
end
|
466
466
|
end
|
467
467
|
|
@@ -476,7 +476,7 @@ module Discorb
|
|
476
476
|
#
|
477
477
|
def follow_to(target, reason: nil)
|
478
478
|
Async do
|
479
|
-
@client.http.
|
479
|
+
@client.http.request(Route.new("/channels/#{@id}/followers", "//channels/:channel_id/followers", :post), { webhook_channel_id: target.id }, audit_log_reason: reason).wait
|
480
480
|
end
|
481
481
|
end
|
482
482
|
|
@@ -497,17 +497,15 @@ module Discorb
|
|
497
497
|
def start_thread(name, message: nil, auto_archive_duration: 1440, public: true, rate_limit_per_user: nil, slowmode: nil, reason: nil)
|
498
498
|
Async do
|
499
499
|
_resp, data = if message.nil?
|
500
|
-
@client.http.post
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
audit_log_reason: reason,
|
508
|
-
).wait
|
500
|
+
@client.http.request(Route.new("/channels/#{@id}/threads", "//channels/:channel_id/threads", :post), {
|
501
|
+
name: name,
|
502
|
+
auto_archive_duration: auto_archive_duration,
|
503
|
+
type: public ? 11 : 10,
|
504
|
+
rate_limit_per_user: rate_limit_per_user || slowmode,
|
505
|
+
},
|
506
|
+
audit_log_reason: reason).wait
|
509
507
|
else
|
510
|
-
@client.http.
|
508
|
+
@client.http.request(Route.new("/channels/#{@id}/messages/#{Utils.try(message, :id)}/threads", "//channels/:channel_id/messages/:message_id/threads", :post), {
|
511
509
|
name: name, auto_archive_duration: auto_archive_duration,
|
512
510
|
}, audit_log_reason: reason).wait
|
513
511
|
end
|
@@ -525,7 +523,7 @@ module Discorb
|
|
525
523
|
#
|
526
524
|
def fetch_archived_public_threads
|
527
525
|
Async do
|
528
|
-
_resp, data = @client.http.
|
526
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/threads/archived/public", "//channels/:channel_id/threads/archived/public", :get)).wait
|
529
527
|
data.map { |thread| Channel.make_channel(@client, thread) }
|
530
528
|
end
|
531
529
|
end
|
@@ -538,7 +536,7 @@ module Discorb
|
|
538
536
|
#
|
539
537
|
def fetch_archived_private_threads
|
540
538
|
Async do
|
541
|
-
_resp, data = @client.http.
|
539
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/threads/archived/private", "//channels/:channel_id/threads/archived/private", :get)).wait
|
542
540
|
data.map { |thread| Channel.make_channel(@client, thread) }
|
543
541
|
end
|
544
542
|
end
|
@@ -558,7 +556,7 @@ module Discorb
|
|
558
556
|
before = 0
|
559
557
|
threads = []
|
560
558
|
loop do
|
561
|
-
_resp, data = @client.http.
|
559
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/users/@me/threads/archived/private?before=#{before}", "//channels/:channel_id/users/@me/threads/archived/private", :get)).wait
|
562
560
|
threads += data[:threads].map { |thread| Channel.make_channel(@client, thread) }
|
563
561
|
before = data[:threads][-1][:id]
|
564
562
|
|
@@ -566,7 +564,7 @@ module Discorb
|
|
566
564
|
end
|
567
565
|
threads
|
568
566
|
else
|
569
|
-
_resp, data = @client.http.
|
567
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/users/@me/threads/archived/private?limit=#{limit}&before=#{before}", "//channels/:channel_id/users/@me/threads/archived/private", :get)).wait
|
570
568
|
data.map { |thread| Channel.make_channel(@client, thread) }
|
571
569
|
end
|
572
570
|
end
|
@@ -603,6 +601,11 @@ module Discorb
|
|
603
601
|
# @return [nil] If the user limit is not set.
|
604
602
|
attr_reader :user_limit
|
605
603
|
|
604
|
+
# @!attribute [r] members
|
605
|
+
# @return [Array<Discorb::Member>] The members in the voice channel.
|
606
|
+
# @!attribute [r] voice_states
|
607
|
+
# @return [Array<Discorb::VoiceState>] The voice states associated with the voice channel.
|
608
|
+
|
606
609
|
include Connectable
|
607
610
|
|
608
611
|
@channel_type = 2
|
@@ -629,13 +632,21 @@ module Discorb
|
|
629
632
|
payload[:user_limit] = user_limit if user_limit != Discorb::Unset
|
630
633
|
payload[:rtc_region] = rtc_region if rtc_region != Discorb::Unset
|
631
634
|
|
632
|
-
@client.http.
|
635
|
+
@client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
|
633
636
|
self
|
634
637
|
end
|
635
638
|
end
|
636
639
|
|
637
640
|
alias modify edit
|
638
641
|
|
642
|
+
def voice_states
|
643
|
+
guild.voice_states.select { |state| state.channel&.id == @id }
|
644
|
+
end
|
645
|
+
|
646
|
+
def members
|
647
|
+
voice_states.map(&:member)
|
648
|
+
end
|
649
|
+
|
639
650
|
private
|
640
651
|
|
641
652
|
def _set_data(data)
|
@@ -694,7 +705,7 @@ module Discorb
|
|
694
705
|
payload[:position] = position if position != Discorb::Unset
|
695
706
|
payload[:bitrate] = bitrate if bitrate != Discorb::Unset
|
696
707
|
payload[:rtc_region] = rtc_region if rtc_region != Discorb::Unset
|
697
|
-
@client.http.
|
708
|
+
@client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
|
698
709
|
self
|
699
710
|
end
|
700
711
|
end
|
@@ -713,7 +724,7 @@ module Discorb
|
|
713
724
|
#
|
714
725
|
def start(topic, public: false, reason: nil)
|
715
726
|
Async do
|
716
|
-
_resp, data = @client.http.
|
727
|
+
_resp, data = @client.http.request(Route.new("/stage-instances", "//stage-instances", :post), { channel_id: @id, topic: topic, public: public ? 2 : 1 }, audit_log_reason: reason).wait
|
717
728
|
StageInstance.new(@client, data)
|
718
729
|
end
|
719
730
|
end
|
@@ -727,7 +738,7 @@ module Discorb
|
|
727
738
|
#
|
728
739
|
def fetch_stage_instance
|
729
740
|
Async do
|
730
|
-
_resp, data = @client.http.
|
741
|
+
_resp, data = @client.http.request(Route.new("/stage-instances/#{@id}", "//stage-instances/:stage_instance_id", :get)).wait
|
731
742
|
rescue Discorb::NotFoundError
|
732
743
|
nil
|
733
744
|
else
|
@@ -735,6 +746,22 @@ module Discorb
|
|
735
746
|
end
|
736
747
|
end
|
737
748
|
|
749
|
+
def voice_states
|
750
|
+
guild.voice_states.select { |state| state.channel&.id == @id }
|
751
|
+
end
|
752
|
+
|
753
|
+
def members
|
754
|
+
voice_states.map(&:member)
|
755
|
+
end
|
756
|
+
|
757
|
+
def speakers
|
758
|
+
voice_states.filter { |state| !state.suppress? }.map(&:member)
|
759
|
+
end
|
760
|
+
|
761
|
+
def audiences
|
762
|
+
voice_states.filter(&:suppress?).map(&:member)
|
763
|
+
end
|
764
|
+
|
738
765
|
private
|
739
766
|
|
740
767
|
def _set_data(data)
|
@@ -795,7 +822,6 @@ module Discorb
|
|
795
822
|
# @macro members_intent
|
796
823
|
# @return [Discorb::Member] The owner of the thread.
|
797
824
|
|
798
|
-
|
799
825
|
include Messageable
|
800
826
|
@channel_type = nil
|
801
827
|
|
@@ -835,7 +861,7 @@ module Discorb
|
|
835
861
|
auto_archive_duration ||= archive_in
|
836
862
|
payload[:auto_archive_duration] = auto_archive_duration if auto_archive_duration != Discorb::Unset
|
837
863
|
payload[:locked] = locked if locked != Discorb::Unset
|
838
|
-
@client.http.
|
864
|
+
@client.http.request(Route.new("/channels/#{@id}", "//channels/:channel_id", :patch), payload, audit_log_reason: reason).wait
|
839
865
|
self
|
840
866
|
end
|
841
867
|
end
|
@@ -924,9 +950,9 @@ module Discorb
|
|
924
950
|
def add_member(member = :me)
|
925
951
|
Async do
|
926
952
|
if member == :me
|
927
|
-
@client.http.
|
953
|
+
@client.http.request(Route.new("/channels/#{@id}/thread-members/@me", "//channels/:channel_id/thread-members/@me", :post)).wait
|
928
954
|
else
|
929
|
-
@client.http.
|
955
|
+
@client.http.request(Route.new("/channels/#{@id}/thread-members/#{Utils.try(member, :id)}", "//channels/:channel_id/thread-members/:user_id", :post)).wait
|
930
956
|
end
|
931
957
|
end
|
932
958
|
end
|
@@ -943,9 +969,9 @@ module Discorb
|
|
943
969
|
def remove_member(member = :me)
|
944
970
|
Async do
|
945
971
|
if member == :me
|
946
|
-
@client.http.
|
972
|
+
@client.http.request(Route.new("/channels/#{@id}/thread-members/@me", "//channels/:channel_id/thread-members/@me", :delete)).wait
|
947
973
|
else
|
948
|
-
@client.http.
|
974
|
+
@client.http.request(Route.new("/channels/#{@id}/thread-members/#{Utils.try(member, :id)}", "//channels/:channel_id/thread-members/:user_id", :delete)).wait
|
949
975
|
end
|
950
976
|
end
|
951
977
|
end
|
@@ -959,19 +985,28 @@ module Discorb
|
|
959
985
|
#
|
960
986
|
def fetch_members
|
961
987
|
Async do
|
962
|
-
_resp, data = @client.http.
|
988
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@id}/thread-members", "//channels/:channel_id/thread-members", :get)).wait
|
963
989
|
data.map { |d| @members[d[:id]] = Member.new(@client, d) }
|
964
990
|
end
|
965
991
|
end
|
966
992
|
|
993
|
+
#
|
994
|
+
# Represents a thread in news channel(aka announcement channel).
|
995
|
+
#
|
967
996
|
class News < ThreadChannel
|
968
997
|
@channel_type = 10
|
969
998
|
end
|
970
999
|
|
1000
|
+
#
|
1001
|
+
# Represents a public thread in text channel.
|
1002
|
+
#
|
971
1003
|
class Public < ThreadChannel
|
972
1004
|
@channel_type = 11
|
973
1005
|
end
|
974
1006
|
|
1007
|
+
#
|
1008
|
+
# Represents a private thread in text channel.
|
1009
|
+
#
|
975
1010
|
class Private < ThreadChannel
|
976
1011
|
@channel_type = 12
|
977
1012
|
end
|
@@ -981,7 +1016,7 @@ module Discorb
|
|
981
1016
|
end
|
982
1017
|
|
983
1018
|
#
|
984
|
-
#
|
1019
|
+
# Represents a member in a thread.
|
985
1020
|
#
|
986
1021
|
class Member < DiscordModel
|
987
1022
|
attr_reader :joined_at
|
@@ -1033,25 +1068,30 @@ module Discorb
|
|
1033
1068
|
end
|
1034
1069
|
end
|
1035
1070
|
|
1071
|
+
#
|
1072
|
+
# Represents a category in a guild.
|
1073
|
+
#
|
1036
1074
|
class CategoryChannel < GuildChannel
|
1037
|
-
attr_reader :channels
|
1038
|
-
|
1039
1075
|
@channel_type = 4
|
1040
1076
|
|
1077
|
+
def channels
|
1078
|
+
@client.channels.values.filter { |channel| channel.parent == self }
|
1079
|
+
end
|
1080
|
+
|
1041
1081
|
def text_channels
|
1042
|
-
|
1082
|
+
channels.filter { |c| c.is_a? TextChannel }
|
1043
1083
|
end
|
1044
1084
|
|
1045
1085
|
def voice_channels
|
1046
|
-
|
1086
|
+
channels.filter { |c| c.is_a? VoiceChannel }
|
1047
1087
|
end
|
1048
1088
|
|
1049
1089
|
def news_channel
|
1050
|
-
|
1090
|
+
channels.filter { |c| c.is_a? NewsChannel }
|
1051
1091
|
end
|
1052
1092
|
|
1053
1093
|
def stage_channels
|
1054
|
-
|
1094
|
+
channels.filter { |c| c.is_a? StageChannel }
|
1055
1095
|
end
|
1056
1096
|
|
1057
1097
|
def create_text_channel(*args, **kwargs)
|
@@ -1069,15 +1109,11 @@ module Discorb
|
|
1069
1109
|
def create_stage_channel(*args, **kwargs)
|
1070
1110
|
guild.create_stage_channel(*args, parent: self, **kwargs)
|
1071
1111
|
end
|
1072
|
-
|
1073
|
-
private
|
1074
|
-
|
1075
|
-
def _set_data(data)
|
1076
|
-
@channels = @client.channels.values.filter { |channel| channel.parent == self }
|
1077
|
-
super
|
1078
|
-
end
|
1079
1112
|
end
|
1080
1113
|
|
1114
|
+
#
|
1115
|
+
# Represents a DM channel.
|
1116
|
+
#
|
1081
1117
|
class DMChannel < Channel
|
1082
1118
|
include Messageable
|
1083
1119
|
|
data/lib/discorb/client.rb
CHANGED
@@ -63,7 +63,7 @@ module Discorb
|
|
63
63
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions that the client is using.
|
64
64
|
# @param [Discorb::Intents] intents The intents that the client is currently using.
|
65
65
|
# @param [Integer] message_caches The number of messages to cache.
|
66
|
-
# @param [#
|
66
|
+
# @param [#write] log The IO object to use for logging.
|
67
67
|
# @param [Boolean] colorize_log Whether to colorize the log.
|
68
68
|
# @param [:debug, :info, :warn, :error, :critical] log_level The log level.
|
69
69
|
# @param [Boolean] wait_until_ready Whether to delay event dispatch until ready.
|
@@ -186,10 +186,8 @@ module Discorb
|
|
186
186
|
@log.debug "Dispatching event #{event_name}"
|
187
187
|
events.each do |block|
|
188
188
|
Async do
|
189
|
-
Async(annotation: "Discorb event: #{event_name}") do |
|
190
|
-
if block.is_a?(Discorb::EventHandler)
|
191
|
-
@events[event_name].delete(block) if block.metadata[:once]
|
192
|
-
end
|
189
|
+
Async(annotation: "Discorb event: #{event_name}") do |_task|
|
190
|
+
@events[event_name].delete(block) if block.is_a?(Discorb::EventHandler) && block.metadata[:once]
|
193
191
|
block.call(*args)
|
194
192
|
@log.debug "Dispatched proc with ID #{block.id.inspect}"
|
195
193
|
rescue StandardError, ScriptError => e
|
@@ -212,7 +210,7 @@ module Discorb
|
|
212
210
|
#
|
213
211
|
def fetch_user(id)
|
214
212
|
Async do
|
215
|
-
_resp, data = http.
|
213
|
+
_resp, data = @http.request(Route.new("/users/#{id}", "//users/:user_id", :get)).wait
|
216
214
|
User.new(self, data)
|
217
215
|
end
|
218
216
|
end
|
@@ -229,7 +227,7 @@ module Discorb
|
|
229
227
|
#
|
230
228
|
def fetch_channel(id)
|
231
229
|
Async do
|
232
|
-
_resp, data = http.
|
230
|
+
_resp, data = @http.request(Route.new("/channels/#{id}", "//channels/:channel_id", :get)).wait
|
233
231
|
Channel.make_channel(self, data)
|
234
232
|
end
|
235
233
|
end
|
@@ -246,7 +244,7 @@ module Discorb
|
|
246
244
|
#
|
247
245
|
def fetch_guild(id)
|
248
246
|
Async do
|
249
|
-
_resp, data = http.
|
247
|
+
_resp, data = @http.request(Route.new("/guilds/#{id}", "//guilds/:guild_id", :get)).wait
|
250
248
|
Guild.new(self, data, false)
|
251
249
|
end
|
252
250
|
end
|
@@ -261,9 +259,9 @@ module Discorb
|
|
261
259
|
#
|
262
260
|
# @return [Async::Task<Discorb::Invite>] The invite.
|
263
261
|
#
|
264
|
-
def fetch_invite(code, with_count:
|
262
|
+
def fetch_invite(code, with_count: true, with_expiration: true)
|
265
263
|
Async do
|
266
|
-
_resp, data = http.
|
264
|
+
_resp, data = @http.request(Route.new("/invites/#{code}?with_count=#{with_count}&with_expiration=#{with_expiration}", "//invites/:code", :get)).wait
|
267
265
|
Invite.new(self, data, false)
|
268
266
|
end
|
269
267
|
end
|
@@ -281,7 +279,7 @@ module Discorb
|
|
281
279
|
Async do
|
282
280
|
next @application if @application && !force
|
283
281
|
|
284
|
-
_resp, data = http.
|
282
|
+
_resp, data = @http.request(Route.new("/oauth2/applications/@me", "//oauth2/applications/@me", :get)).wait
|
285
283
|
@application = Application.new(self, data)
|
286
284
|
@application
|
287
285
|
end
|
@@ -295,8 +293,8 @@ module Discorb
|
|
295
293
|
#
|
296
294
|
def fetch_nitro_sticker_packs
|
297
295
|
Async do
|
298
|
-
_resp, data = http.
|
299
|
-
data.map { |pack| Sticker::Pack.new(self, pack) }
|
296
|
+
_resp, data = @http.request(Route.new("/sticker-packs", "//sticker-packs", :get)).wait
|
297
|
+
data[:sticker_packs].map { |pack| Sticker::Pack.new(self, pack) }
|
300
298
|
end
|
301
299
|
end
|
302
300
|
|
@@ -305,18 +303,14 @@ module Discorb
|
|
305
303
|
#
|
306
304
|
# @param [Discorb::Activity] activity The activity to update.
|
307
305
|
# @param [:online, :idle, :dnd, :invisible] status The status to update.
|
308
|
-
# @param [String] afk Whether to set the client as AFK.
|
309
306
|
#
|
310
|
-
def update_presence(activity = nil, status: nil
|
307
|
+
def update_presence(activity = nil, status: nil)
|
311
308
|
payload = {
|
312
309
|
activities: [],
|
313
310
|
status: status,
|
314
|
-
afk: nil,
|
315
311
|
since: nil,
|
316
312
|
}
|
317
|
-
|
318
|
-
payload[:activities] = [activity.to_hash]
|
319
|
-
end
|
313
|
+
payload[:activities] = [activity.to_hash] unless activity.nil?
|
320
314
|
payload[:status] = status unless status.nil?
|
321
315
|
if @connection
|
322
316
|
Async do
|
@@ -374,10 +368,11 @@ module Discorb
|
|
374
368
|
# @param [Object] ... The arguments to pass to the `ext#initialize`.
|
375
369
|
#
|
376
370
|
def load_extension(ext, ...)
|
377
|
-
|
371
|
+
case ext
|
372
|
+
when Class
|
378
373
|
raise ArgumentError, "#{ext} is not a extension" unless ext < Discorb::Extension
|
379
374
|
ins = ext.new(self, ...)
|
380
|
-
|
375
|
+
when Discorb::Extension
|
381
376
|
ins = ext
|
382
377
|
else
|
383
378
|
raise ArgumentError, "#{ext} is not a extension"
|
@@ -398,12 +393,20 @@ module Discorb
|
|
398
393
|
ins.class.commands.each do |cmd|
|
399
394
|
cmd.define_singleton_method(:extension) { ins.class.name }
|
400
395
|
cmd.replace_block(ins)
|
396
|
+
cmd.block.define_singleton_method(:self_replaced) { true }
|
401
397
|
@commands << cmd
|
402
398
|
end
|
403
399
|
|
404
400
|
cls = ins.class
|
405
401
|
cls.loaded(self, ...) if cls.respond_to? :loaded
|
406
|
-
|
402
|
+
ins.class.bottom_commands.each do |cmd|
|
403
|
+
unless cmd.respond_to? :self_replaced
|
404
|
+
cmd.define_singleton_method(:extension) { ins.class.name }
|
405
|
+
cmd.replace_block(ins)
|
406
|
+
cmd.block.define_singleton_method(:self_replaced) { true }
|
407
|
+
end
|
408
|
+
@bottom_commands << cmd
|
409
|
+
end
|
407
410
|
@extensions[ins.class.name] = ins
|
408
411
|
ins
|
409
412
|
end
|
@@ -463,7 +466,7 @@ module Discorb
|
|
463
466
|
::File.open(options[:log_file], "a")
|
464
467
|
end
|
465
468
|
@log.level = options[:log_level].to_sym
|
466
|
-
@log.colorize_log = options[:log_color]
|
469
|
+
@log.colorize_log = options[:log_color].nil? ? @log.out.isatty : options[:log_color]
|
467
470
|
end
|
468
471
|
end
|
469
472
|
end
|
@@ -473,29 +476,29 @@ module Discorb
|
|
473
476
|
if guilds = ENV["DISCORB_SETUP_GUILDS"]
|
474
477
|
guild_ids = guilds.split(",")
|
475
478
|
end
|
476
|
-
if guild_ids == ["global"]
|
477
|
-
guild_ids = false
|
478
|
-
end
|
479
|
+
guild_ids = false if guild_ids == ["global"]
|
479
480
|
setup_commands(token, guild_ids: guild_ids).wait
|
480
|
-
|
481
|
-
event
|
481
|
+
if ENV["DISCORB_SETUP_SCRIPT"] == "true"
|
482
|
+
@events[:setup]&.each do |event|
|
483
|
+
event.call
|
484
|
+
end
|
485
|
+
self.on_setup if respond_to? :on_setup
|
482
486
|
end
|
483
|
-
self.on_setup if respond_to? :on_setup
|
484
487
|
end
|
485
488
|
|
486
489
|
def start_client(token)
|
487
|
-
Async do |
|
488
|
-
Signal.trap(:SIGINT)
|
490
|
+
Async do |_task|
|
491
|
+
Signal.trap(:SIGINT) do
|
489
492
|
@log.info "SIGINT received, closing..."
|
490
493
|
Signal.trap(:SIGINT, "DEFAULT")
|
491
494
|
close!
|
492
|
-
|
495
|
+
end
|
493
496
|
@token = token.to_s
|
494
497
|
@close_condition = Async::Condition.new
|
495
498
|
@main_task = Async do
|
496
499
|
@status = :running
|
497
500
|
connect_gateway(false).wait
|
498
|
-
rescue
|
501
|
+
rescue StandardError
|
499
502
|
@status = :stopped
|
500
503
|
@close_condition.signal
|
501
504
|
raise
|
data/lib/discorb/common.rb
CHANGED
@@ -4,9 +4,9 @@ module Discorb
|
|
4
4
|
# @return [String] The API base URL.
|
5
5
|
API_BASE_URL = "https://discord.com/api/v9"
|
6
6
|
# @return [String] The version of discorb.
|
7
|
-
VERSION = "0.
|
7
|
+
VERSION = "0.14.0"
|
8
8
|
# @return [String] The user agent for the bot.
|
9
|
-
USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}"
|
9
|
+
USER_AGENT = "DiscordBot (https://discorb-lib.github.io #{VERSION}) Ruby/#{RUBY_VERSION}".freeze
|
10
10
|
|
11
11
|
#
|
12
12
|
# @abstract
|
@@ -26,9 +26,6 @@ module Discorb
|
|
26
26
|
end
|
27
27
|
|
28
28
|
# @private
|
29
|
-
def inspect
|
30
|
-
super
|
31
|
-
end
|
32
29
|
|
33
30
|
def hash
|
34
31
|
@id.hash
|
@@ -111,32 +108,42 @@ module Discorb
|
|
111
108
|
end
|
112
109
|
|
113
110
|
def inspect
|
114
|
-
"#<#{self.class} #{
|
111
|
+
"#<#{self.class} #{self}>"
|
115
112
|
end
|
116
113
|
|
117
114
|
alias id to_s
|
118
115
|
end
|
119
116
|
|
120
|
-
#
|
121
|
-
#
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
117
|
+
#
|
118
|
+
# Represents an endpoint.
|
119
|
+
# @private
|
120
|
+
#
|
121
|
+
class Route
|
122
|
+
attr_reader :url, :key, :method
|
123
|
+
|
124
|
+
def initialize(url, key, method)
|
125
|
+
@url = url
|
126
|
+
@key = key
|
127
|
+
@method = method
|
126
128
|
end
|
127
129
|
|
128
|
-
def
|
129
|
-
|
130
|
+
def hash
|
131
|
+
@url.hash
|
130
132
|
end
|
131
|
-
end
|
132
133
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
134
|
+
def identifier
|
135
|
+
"#{@method} #{@key}"
|
136
|
+
end
|
137
|
+
|
138
|
+
def major_param
|
139
|
+
param_type = @key.split("/").find { |k| k.start_with?(":") }
|
140
|
+
return "" unless param_type
|
141
|
+
param = url.gsub(API_BASE_URL, "").split("/")[@key.split("/").index(param_type) - 1]
|
142
|
+
%w[:channel_id :guild_id :webhook_id].include?(param_type) ? param : ""
|
138
143
|
end
|
139
144
|
end
|
140
145
|
|
141
|
-
|
146
|
+
# @return [Object] Object that represents unspecified value.
|
147
|
+
# This is used as a default value for optional parameters.
|
148
|
+
Unset = Object.new
|
142
149
|
end
|