discorb 0.13.4 → 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/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/Changelog.md +12 -0
- data/Gemfile +7 -3
- data/Rakefile +22 -22
- data/discorb.gemspec +1 -0
- 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 -426
- data/lib/discorb/asset.rb +2 -0
- data/lib/discorb/audit_logs.rb +3 -3
- data/lib/discorb/channel.rb +19 -4
- data/lib/discorb/client.rb +30 -27
- data/lib/discorb/common.rb +4 -26
- 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 +3 -0
- data/lib/discorb/embed.rb +2 -2
- data/lib/discorb/emoji.rb +19 -3
- data/lib/discorb/emoji_table.rb +1 -1
- data/lib/discorb/error.rb +4 -6
- data/lib/discorb/event.rb +9 -7
- 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 +28 -30
- data/lib/discorb/guild.rb +11 -13
- data/lib/discorb/guild_template.rb +2 -2
- data/lib/discorb/http.rb +15 -17
- data/lib/discorb/integration.rb +1 -1
- data/lib/discorb/intents.rb +1 -1
- data/lib/discorb/interaction/autocomplete.rb +4 -3
- 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 +33 -4
- data/lib/discorb/interaction/root.rb +1 -0
- data/lib/discorb/interaction.rb +2 -1
- data/lib/discorb/log.rb +1 -1
- data/lib/discorb/member.rb +1 -3
- data/lib/discorb/message.rb +26 -277
- data/lib/discorb/message_meta.rb +205 -0
- data/lib/discorb/modules.rb +1 -1
- data/lib/discorb/permission.rb +2 -2
- data/lib/discorb/presence.rb +4 -1
- data/lib/discorb/rate_limit.rb +2 -4
- data/lib/discorb/user.rb +1 -1
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +3 -0
- data/lib/discorb/webhook.rb +1 -1
- 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 +16 -2
data/lib/discorb/message.rb
CHANGED
@@ -1,68 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Discorb
|
4
|
-
#
|
5
|
-
# Represents a allowed mentions in a message.
|
6
|
-
#
|
7
|
-
class AllowedMentions
|
8
|
-
# @return [Boolean] Whether to allow @everyone or @here.
|
9
|
-
attr_accessor :everyone
|
10
|
-
# @return [Boolean, Array<Discorb::Role>] The roles to allow, or false to disable.
|
11
|
-
attr_accessor :roles
|
12
|
-
# @return [Boolean, Array<Discorb::User>] The users to allow, or false to disable.
|
13
|
-
attr_accessor :users
|
14
|
-
# @return [Boolean] Whether to ping the user that sent the message to reply.
|
15
|
-
attr_accessor :replied_user
|
16
|
-
|
17
|
-
#
|
18
|
-
# Initializes a new instance of the AllowedMentions class.
|
19
|
-
#
|
20
|
-
# @param [Boolean] everyone Whether to allow @everyone or @here.
|
21
|
-
# @param [Boolean, Array<Discorb::Role>] roles The roles to allow, or false to disable.
|
22
|
-
# @param [Boolean, Array<Discorb::User>] users The users to allow, or false to disable.
|
23
|
-
# @param [Boolean] replied_user Whether to ping the user that sent the message to reply.
|
24
|
-
#
|
25
|
-
def initialize(everyone: nil, roles: nil, users: nil, replied_user: nil)
|
26
|
-
@everyone = everyone
|
27
|
-
@roles = roles
|
28
|
-
@users = users
|
29
|
-
@replied_user = replied_user
|
30
|
-
end
|
31
|
-
|
32
|
-
def inspect
|
33
|
-
"#<#{self.class} @everyone=#{@everyone} @roles=#{@roles} @users=#{@users} @replied_user=#{@replied_user}>"
|
34
|
-
end
|
35
|
-
|
36
|
-
# @private
|
37
|
-
def to_hash(other = nil)
|
38
|
-
payload = {
|
39
|
-
parse: %w[everyone roles users],
|
40
|
-
}
|
41
|
-
replied_user = nil_merge(@replied_user, other&.replied_user)
|
42
|
-
everyone = nil_merge(@everyone, other&.everyone)
|
43
|
-
roles = nil_merge(@roles, other&.roles)
|
44
|
-
users = nil_merge(@users, other&.users)
|
45
|
-
payload[:replied_user] = replied_user
|
46
|
-
payload[:parse].delete("everyone") if everyone == false
|
47
|
-
if (roles == false) || roles.is_a?(Array)
|
48
|
-
payload[:roles] = roles.map { |u| u.id.to_s } if roles.is_a? Array
|
49
|
-
payload[:parse].delete("roles")
|
50
|
-
end
|
51
|
-
if (users == false) || users.is_a?(Array)
|
52
|
-
payload[:users] = users.map { |u| u.id.to_s } if users.is_a? Array
|
53
|
-
payload[:parse].delete("users")
|
54
|
-
end
|
55
|
-
payload
|
56
|
-
end
|
57
|
-
|
58
|
-
def nil_merge(*args)
|
59
|
-
args.each do |a|
|
60
|
-
return a unless a.nil?
|
61
|
-
end
|
62
|
-
nil
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
4
|
#
|
67
5
|
# Represents a message.
|
68
6
|
#
|
@@ -257,38 +195,44 @@ module Discorb
|
|
257
195
|
#
|
258
196
|
def clean_content(user: true, channel: true, role: true, emoji: true, everyone: true, codeblock: false)
|
259
197
|
ret = @content.dup
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
198
|
+
if user
|
199
|
+
ret.gsub!(/<@!?(\d+)>/) do |_match|
|
200
|
+
member = guild&.members&.[]($1)
|
201
|
+
member ||= @client.users[$1]
|
202
|
+
member ? "@#{member.name}" : "@Unknown User"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
ret.gsub!(/<#(\d+)>/) do |_match|
|
266
206
|
channel = @client.channels[$1]
|
267
207
|
channel ? "<##{channel.id}>" : "#Unknown Channel"
|
268
208
|
end
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
209
|
+
if role
|
210
|
+
ret.gsub!(/<@&(\d+)>/) do |_match|
|
211
|
+
role = guild&.roles&.[]($1)
|
212
|
+
role ? "@#{role.name}" : "@Unknown Role"
|
213
|
+
end
|
214
|
+
end
|
215
|
+
if emoji
|
216
|
+
ret.gsub!(/<a?:([a-zA-Z0-9_]+):\d+>/) do |_match|
|
217
|
+
$1
|
218
|
+
end
|
219
|
+
end
|
276
220
|
ret.gsub!(/@(everyone|here)/, "@\u200b\\1") if everyone
|
277
|
-
|
221
|
+
if codeblock
|
222
|
+
ret
|
223
|
+
else
|
278
224
|
codeblocks = ret.split("```", -1)
|
279
225
|
original_codeblocks = @content.scan(/```(.+?)```/m)
|
280
226
|
res = []
|
281
227
|
max = codeblocks.length
|
282
|
-
codeblocks.each_with_index do |
|
283
|
-
if max
|
284
|
-
|
228
|
+
codeblocks.each_with_index do |single_codeblock, i|
|
229
|
+
res << if max.even? && i == max - 1 || i.even?
|
230
|
+
single_codeblock
|
285
231
|
else
|
286
|
-
|
232
|
+
original_codeblocks[i / 2]
|
287
233
|
end
|
288
234
|
end
|
289
235
|
res.join("```")
|
290
|
-
else
|
291
|
-
ret
|
292
236
|
end
|
293
237
|
end
|
294
238
|
|
@@ -501,201 +445,6 @@ module Discorb
|
|
501
445
|
"#<#{self.class} #{@content.inspect} id=#{@id}>"
|
502
446
|
end
|
503
447
|
|
504
|
-
#
|
505
|
-
# Represents message flag.
|
506
|
-
# ## Flag fields
|
507
|
-
# |Field|Value|
|
508
|
-
# |-|-|
|
509
|
-
# |`1 << 0`|`:crossposted`|
|
510
|
-
# |`1 << 1`|`:crosspost`|
|
511
|
-
# |`1 << 2`|`:supress_embeds`|
|
512
|
-
# |`1 << 3`|`:source_message_deleted`|
|
513
|
-
# |`1 << 4`|`:urgent`|
|
514
|
-
# |`1 << 5`|`:has_thread`|
|
515
|
-
# |`1 << 6`|`:ephemeral`|
|
516
|
-
# |`1 << 7`|`:loading`|
|
517
|
-
#
|
518
|
-
class Flag < Discorb::Flag
|
519
|
-
@bits = {
|
520
|
-
crossposted: 0,
|
521
|
-
crosspost: 1,
|
522
|
-
supress_embeds: 2,
|
523
|
-
source_message_deleted: 3,
|
524
|
-
urgent: 4,
|
525
|
-
has_thread: 5,
|
526
|
-
ephemeral: 6,
|
527
|
-
loading: 7,
|
528
|
-
}.freeze
|
529
|
-
end
|
530
|
-
|
531
|
-
#
|
532
|
-
# Represents reference of message.
|
533
|
-
#
|
534
|
-
class Reference
|
535
|
-
# @return [Discorb::Snowflake] The guild ID.
|
536
|
-
attr_accessor :guild_id
|
537
|
-
# @return [Discorb::Snowflake] The channel ID.
|
538
|
-
attr_accessor :channel_id
|
539
|
-
# @return [Discorb::Snowflake] The message ID.
|
540
|
-
attr_accessor :message_id
|
541
|
-
# @return [Boolean] Whether fail the request if the message is not found.
|
542
|
-
attr_accessor :fail_if_not_exists
|
543
|
-
|
544
|
-
alias fail_if_not_exists? fail_if_not_exists
|
545
|
-
|
546
|
-
#
|
547
|
-
# Initialize a new reference.
|
548
|
-
#
|
549
|
-
# @param [Discorb::Snowflake] guild_id The guild ID.
|
550
|
-
# @param [Discorb::Snowflake] channel_id The channel ID.
|
551
|
-
# @param [Discorb::Snowflake] message_id The message ID.
|
552
|
-
# @param [Boolean] fail_if_not_exists Whether fail the request if the message is not found.
|
553
|
-
#
|
554
|
-
def initialize(guild_id, channel_id, message_id, fail_if_not_exists: true)
|
555
|
-
@guild_id = guild_id
|
556
|
-
@channel_id = channel_id
|
557
|
-
@message_id = message_id
|
558
|
-
@fail_if_not_exists = fail_if_not_exists
|
559
|
-
end
|
560
|
-
|
561
|
-
#
|
562
|
-
# Convert the reference to a hash.
|
563
|
-
#
|
564
|
-
# @return [Hash] The hash.
|
565
|
-
#
|
566
|
-
def to_hash
|
567
|
-
{
|
568
|
-
message_id: @message_id,
|
569
|
-
channel_id: @channel_id,
|
570
|
-
guild_id: @guild_id,
|
571
|
-
fail_if_not_exists: @fail_if_not_exists,
|
572
|
-
}
|
573
|
-
end
|
574
|
-
|
575
|
-
alias to_reference to_hash
|
576
|
-
|
577
|
-
#
|
578
|
-
# Initialize a new reference from a hash.
|
579
|
-
#
|
580
|
-
# @param [Hash] data The hash.
|
581
|
-
#
|
582
|
-
# @return [Discorb::Message::Reference] The reference.
|
583
|
-
# @see https://discord.com/developers/docs/resources/channel#message-reference-object
|
584
|
-
#
|
585
|
-
def self.from_hash(data)
|
586
|
-
new(data[:guild_id], data[:channel_id], data[:message_id], fail_if_not_exists: data[:fail_if_not_exists])
|
587
|
-
end
|
588
|
-
end
|
589
|
-
|
590
|
-
class Sticker
|
591
|
-
attr_reader :id, :name, :format
|
592
|
-
|
593
|
-
def initialize(data)
|
594
|
-
@id = Snowflake.new(data[:id])
|
595
|
-
@name = data[:name]
|
596
|
-
@format = Discorb::Sticker.sticker_format[data[:format]]
|
597
|
-
end
|
598
|
-
end
|
599
|
-
|
600
|
-
private
|
601
|
-
|
602
|
-
def _set_data(data)
|
603
|
-
@id = Snowflake.new(data[:id])
|
604
|
-
@channel_id = data[:channel_id]
|
605
|
-
|
606
|
-
if data[:guild_id]
|
607
|
-
@guild_id = data[:guild_id]
|
608
|
-
@dm = nil
|
609
|
-
else
|
610
|
-
@dm = Discorb::DMChannel.new(@client, data[:channel_id])
|
611
|
-
@guild_id = nil
|
612
|
-
end
|
613
|
-
|
614
|
-
if data[:member].nil? && data[:webhook_id]
|
615
|
-
@webhook_id = Snowflake.new(data[:webhook_id])
|
616
|
-
@author = Webhook::Message::Author.new(data[:author])
|
617
|
-
elsif data[:guild_id].nil? || data[:guild_id].empty? || data[:member].nil?
|
618
|
-
@author = @client.users[data[:author][:id]] || User.new(@client, data[:author])
|
619
|
-
else
|
620
|
-
@author = guild&.members&.get(data[:author][:id]) || Member.new(@client,
|
621
|
-
@guild_id, data[:author], data[:member])
|
622
|
-
end
|
623
|
-
@content = data[:content]
|
624
|
-
@created_at = Time.iso8601(data[:timestamp])
|
625
|
-
@updated_at = data[:edited_timestamp].nil? ? nil : Time.iso8601(data[:edited_timestamp])
|
626
|
-
|
627
|
-
@tts = data[:tts]
|
628
|
-
@mention_everyone = data[:mention_everyone]
|
629
|
-
@mention_roles = data[:mention_roles].map { |r| guild.roles[r] }
|
630
|
-
@attachments = data[:attachments].map { |a| Attachment.new(a) }
|
631
|
-
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.new(data: e) } : []
|
632
|
-
@reactions = data[:reactions] ? data[:reactions].map { |r| Reaction.new(self, r) } : []
|
633
|
-
@pinned = data[:pinned]
|
634
|
-
@type = self.class.message_type[data[:type]]
|
635
|
-
@activity = data[:activity] && Activity.new(data[:activity])
|
636
|
-
@application_id = data[:application_id]
|
637
|
-
@message_reference = data[:message_reference] && Reference.from_hash(data[:message_reference])
|
638
|
-
@flag = Flag.new(0b111 - data[:flags])
|
639
|
-
@sticker_items = data[:sticker_items] ? data[:sticker_items].map { |s| Message::Sticker.new(s) } : []
|
640
|
-
# @referenced_message = data[:referenced_message] && Message.new(@client, data[:referenced_message])
|
641
|
-
@interaction = data[:interaction] && Message::Interaction.new(@client, data[:interaction])
|
642
|
-
@thread = data[:thread] && Channel.make_channel(@client, data[:thread])
|
643
|
-
@components = data[:components].map { |c| c[:components].map { |co| Component.from_hash(co) } }
|
644
|
-
@data.update(data)
|
645
|
-
@deleted = false
|
646
|
-
end
|
647
|
-
|
648
|
-
#
|
649
|
-
# Represents a interaction of message.
|
650
|
-
#
|
651
|
-
class Interaction < DiscordModel
|
652
|
-
# @return [Discorb::Snowflake] The user ID.
|
653
|
-
attr_reader :id
|
654
|
-
# @return [String] The name of command.
|
655
|
-
# @return [nil] If the message is not a command.
|
656
|
-
attr_reader :name
|
657
|
-
# @return [Class] The type of interaction.
|
658
|
-
attr_reader :type
|
659
|
-
# @return [Discorb::User] The user.
|
660
|
-
attr_reader :user
|
661
|
-
|
662
|
-
# @private
|
663
|
-
def initialize(client, data)
|
664
|
-
@id = Snowflake.new(data[:id])
|
665
|
-
@name = data[:name]
|
666
|
-
@type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
|
667
|
-
@user = client.users[data[:user][:id]] || User.new(client, data[:user])
|
668
|
-
end
|
669
|
-
end
|
670
|
-
|
671
|
-
#
|
672
|
-
# Represents a activity of message.
|
673
|
-
#
|
674
|
-
class Activity < DiscordModel
|
675
|
-
# @return [String] The name of activity.
|
676
|
-
attr_reader :name
|
677
|
-
# @return [Symbol] The type of activity.
|
678
|
-
attr_reader :type
|
679
|
-
|
680
|
-
@type = {
|
681
|
-
1 => :join,
|
682
|
-
2 => :spectate,
|
683
|
-
3 => :listen,
|
684
|
-
5 => :join_request,
|
685
|
-
}
|
686
|
-
|
687
|
-
# @private
|
688
|
-
def initialize(data)
|
689
|
-
@name = data[:name]
|
690
|
-
@type = self.class.type(data[:type])
|
691
|
-
end
|
692
|
-
|
693
|
-
class << self
|
694
|
-
# @private
|
695
|
-
attr_reader :type
|
696
|
-
end
|
697
|
-
end
|
698
|
-
|
699
448
|
class << self
|
700
449
|
# @private
|
701
450
|
attr_reader :message_type
|
@@ -0,0 +1,205 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Discorb
|
3
|
+
#
|
4
|
+
# Represents a message in Discord.
|
5
|
+
#
|
6
|
+
class Message < DiscordModel
|
7
|
+
#
|
8
|
+
# Represents message flag.
|
9
|
+
# ## Flag fields
|
10
|
+
# |Field|Value|
|
11
|
+
# |-|-|
|
12
|
+
# |`1 << 0`|`:crossposted`|
|
13
|
+
# |`1 << 1`|`:crosspost`|
|
14
|
+
# |`1 << 2`|`:supress_embeds`|
|
15
|
+
# |`1 << 3`|`:source_message_deleted`|
|
16
|
+
# |`1 << 4`|`:urgent`|
|
17
|
+
# |`1 << 5`|`:has_thread`|
|
18
|
+
# |`1 << 6`|`:ephemeral`|
|
19
|
+
# |`1 << 7`|`:loading`|
|
20
|
+
#
|
21
|
+
class Flag < Discorb::Flag
|
22
|
+
@bits = {
|
23
|
+
crossposted: 0,
|
24
|
+
crosspost: 1,
|
25
|
+
supress_embeds: 2,
|
26
|
+
source_message_deleted: 3,
|
27
|
+
urgent: 4,
|
28
|
+
has_thread: 5,
|
29
|
+
ephemeral: 6,
|
30
|
+
loading: 7,
|
31
|
+
}.freeze
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Represents reference of message.
|
36
|
+
#
|
37
|
+
class Reference
|
38
|
+
# @return [Discorb::Snowflake] The guild ID.
|
39
|
+
attr_accessor :guild_id
|
40
|
+
# @return [Discorb::Snowflake] The channel ID.
|
41
|
+
attr_accessor :channel_id
|
42
|
+
# @return [Discorb::Snowflake] The message ID.
|
43
|
+
attr_accessor :message_id
|
44
|
+
# @return [Boolean] Whether fail the request if the message is not found.
|
45
|
+
attr_accessor :fail_if_not_exists
|
46
|
+
|
47
|
+
alias fail_if_not_exists? fail_if_not_exists
|
48
|
+
|
49
|
+
#
|
50
|
+
# Initialize a new reference.
|
51
|
+
#
|
52
|
+
# @param [Discorb::Snowflake] guild_id The guild ID.
|
53
|
+
# @param [Discorb::Snowflake] channel_id The channel ID.
|
54
|
+
# @param [Discorb::Snowflake] message_id The message ID.
|
55
|
+
# @param [Boolean] fail_if_not_exists Whether fail the request if the message is not found.
|
56
|
+
#
|
57
|
+
def initialize(guild_id, channel_id, message_id, fail_if_not_exists: true)
|
58
|
+
@guild_id = guild_id
|
59
|
+
@channel_id = channel_id
|
60
|
+
@message_id = message_id
|
61
|
+
@fail_if_not_exists = fail_if_not_exists
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# Convert the reference to a hash.
|
66
|
+
#
|
67
|
+
# @return [Hash] The hash.
|
68
|
+
#
|
69
|
+
def to_hash
|
70
|
+
{
|
71
|
+
message_id: @message_id,
|
72
|
+
channel_id: @channel_id,
|
73
|
+
guild_id: @guild_id,
|
74
|
+
fail_if_not_exists: @fail_if_not_exists,
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
alias to_reference to_hash
|
79
|
+
|
80
|
+
#
|
81
|
+
# Initialize a new reference from a hash.
|
82
|
+
#
|
83
|
+
# @param [Hash] data The hash.
|
84
|
+
#
|
85
|
+
# @return [Discorb::Message::Reference] The reference.
|
86
|
+
# @see https://discord.com/developers/docs/resources/channel#message-reference-object
|
87
|
+
#
|
88
|
+
def self.from_hash(data)
|
89
|
+
new(data[:guild_id], data[:channel_id], data[:message_id], fail_if_not_exists: data[:fail_if_not_exists])
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
#
|
94
|
+
# Represents a sticker.
|
95
|
+
#
|
96
|
+
class Sticker
|
97
|
+
attr_reader :id, :name, :format
|
98
|
+
|
99
|
+
def initialize(data)
|
100
|
+
@id = Snowflake.new(data[:id])
|
101
|
+
@name = data[:name]
|
102
|
+
@format = Discorb::Sticker.sticker_format[data[:format]]
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def _set_data(data)
|
109
|
+
@id = Snowflake.new(data[:id])
|
110
|
+
@channel_id = data[:channel_id]
|
111
|
+
|
112
|
+
if data[:guild_id]
|
113
|
+
@guild_id = data[:guild_id]
|
114
|
+
@dm = nil
|
115
|
+
else
|
116
|
+
@dm = Discorb::DMChannel.new(@client, data[:channel_id])
|
117
|
+
@guild_id = nil
|
118
|
+
end
|
119
|
+
|
120
|
+
if data[:member].nil? && data[:webhook_id]
|
121
|
+
@webhook_id = Snowflake.new(data[:webhook_id])
|
122
|
+
@author = Webhook::Message::Author.new(data[:author])
|
123
|
+
elsif data[:guild_id].nil? || data[:guild_id].empty? || data[:member].nil?
|
124
|
+
@author = @client.users[data[:author][:id]] || User.new(@client, data[:author])
|
125
|
+
else
|
126
|
+
@author = guild&.members&.get(data[:author][:id]) || Member.new(@client,
|
127
|
+
@guild_id, data[:author], data[:member])
|
128
|
+
end
|
129
|
+
@content = data[:content]
|
130
|
+
@created_at = Time.iso8601(data[:timestamp])
|
131
|
+
@updated_at = data[:edited_timestamp].nil? ? nil : Time.iso8601(data[:edited_timestamp])
|
132
|
+
|
133
|
+
@tts = data[:tts]
|
134
|
+
@mention_everyone = data[:mention_everyone]
|
135
|
+
@mention_roles = data[:mention_roles].map { |r| guild.roles[r] }
|
136
|
+
@attachments = data[:attachments].map { |a| Attachment.new(a) }
|
137
|
+
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.new(data: e) } : []
|
138
|
+
@reactions = data[:reactions] ? data[:reactions].map { |r| Reaction.new(self, r) } : []
|
139
|
+
@pinned = data[:pinned]
|
140
|
+
@type = self.class.message_type[data[:type]]
|
141
|
+
@activity = data[:activity] && Activity.new(data[:activity])
|
142
|
+
@application_id = data[:application_id]
|
143
|
+
@message_reference = data[:message_reference] && Reference.from_hash(data[:message_reference])
|
144
|
+
@flag = Flag.new(0b111 - data[:flags])
|
145
|
+
@sticker_items = data[:sticker_items] ? data[:sticker_items].map { |s| Message::Sticker.new(s) } : []
|
146
|
+
# @referenced_message = data[:referenced_message] && Message.new(@client, data[:referenced_message])
|
147
|
+
@interaction = data[:interaction] && Message::Interaction.new(@client, data[:interaction])
|
148
|
+
@thread = data[:thread] && Channel.make_channel(@client, data[:thread])
|
149
|
+
@components = data[:components].map { |c| c[:components].map { |co| Component.from_hash(co) } }
|
150
|
+
@data.update(data)
|
151
|
+
@deleted = false
|
152
|
+
end
|
153
|
+
|
154
|
+
#
|
155
|
+
# Represents a interaction of message.
|
156
|
+
#
|
157
|
+
class Interaction < DiscordModel
|
158
|
+
# @return [Discorb::Snowflake] The user ID.
|
159
|
+
attr_reader :id
|
160
|
+
# @return [String] The name of command.
|
161
|
+
# @return [nil] If the message is not a command.
|
162
|
+
attr_reader :name
|
163
|
+
# @return [Class] The type of interaction.
|
164
|
+
attr_reader :type
|
165
|
+
# @return [Discorb::User] The user.
|
166
|
+
attr_reader :user
|
167
|
+
|
168
|
+
# @private
|
169
|
+
def initialize(client, data)
|
170
|
+
@id = Snowflake.new(data[:id])
|
171
|
+
@name = data[:name]
|
172
|
+
@type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
|
173
|
+
@user = client.users[data[:user][:id]] || User.new(client, data[:user])
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
#
|
178
|
+
# Represents a activity of message.
|
179
|
+
#
|
180
|
+
class Activity < DiscordModel
|
181
|
+
# @return [String] The name of activity.
|
182
|
+
attr_reader :name
|
183
|
+
# @return [Symbol] The type of activity.
|
184
|
+
attr_reader :type
|
185
|
+
|
186
|
+
@type = {
|
187
|
+
1 => :join,
|
188
|
+
2 => :spectate,
|
189
|
+
3 => :listen,
|
190
|
+
5 => :join_request,
|
191
|
+
}
|
192
|
+
|
193
|
+
# @private
|
194
|
+
def initialize(data)
|
195
|
+
@name = data[:name]
|
196
|
+
@type = self.class.type(data[:type])
|
197
|
+
end
|
198
|
+
|
199
|
+
class << self
|
200
|
+
# @private
|
201
|
+
attr_reader :type
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
data/lib/discorb/modules.rb
CHANGED
data/lib/discorb/permission.rb
CHANGED
@@ -174,13 +174,13 @@ module Discorb
|
|
174
174
|
# @return [Hash] The permission overwrite as a hash.
|
175
175
|
#
|
176
176
|
def to_hash
|
177
|
-
self.class.bits.keys.
|
177
|
+
self.class.bits.keys.to_h do |field|
|
178
178
|
[field, if @allow & self.class.bits[field] != 0
|
179
179
|
true
|
180
180
|
elsif @deny & self.class.bits[method] != 0
|
181
181
|
false
|
182
182
|
end]
|
183
|
-
end
|
183
|
+
end
|
184
184
|
end
|
185
185
|
|
186
186
|
#
|
data/lib/discorb/presence.rb
CHANGED
@@ -105,7 +105,7 @@ module Discorb
|
|
105
105
|
@party = data[:party] && Party.new(data[:party])
|
106
106
|
@assets = data[:assets] && Asset.new(data[:assets])
|
107
107
|
@instance = data[:instance]
|
108
|
-
@buttons = data[:buttons]
|
108
|
+
@buttons = data[:buttons]&.map { |b| Button.new(b) }
|
109
109
|
@flags = data[:flags] && Flag.new(data[:flags])
|
110
110
|
end
|
111
111
|
|
@@ -147,6 +147,9 @@ module Discorb
|
|
147
147
|
end
|
148
148
|
end
|
149
149
|
|
150
|
+
#
|
151
|
+
# Represents the party of an activity.
|
152
|
+
#
|
150
153
|
class Party < DiscordModel
|
151
154
|
# @return [String] The id of the party.
|
152
155
|
attr_reader :id
|
data/lib/discorb/rate_limit.rb
CHANGED
@@ -40,7 +40,7 @@ module Discorb
|
|
40
40
|
@path_ratelimit_bucket.delete(path.identifier + path.major_param)
|
41
41
|
return
|
42
42
|
end
|
43
|
-
return if bucket[:remaining]
|
43
|
+
return if (bucket[:remaining]).positive?
|
44
44
|
|
45
45
|
time = bucket[:reset_at] - Time.now.to_f
|
46
46
|
@client.log.info("rate limit for #{path.identifier} with #{path.major_param} reached, waiting #{time.round(4)} seconds")
|
@@ -54,9 +54,7 @@ module Discorb
|
|
54
54
|
# @param [Net::HTTPResponse] resp The response.
|
55
55
|
#
|
56
56
|
def save(path, resp)
|
57
|
-
if resp["X-Ratelimit-Global"] == "true"
|
58
|
-
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after]
|
59
|
-
end
|
57
|
+
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after] if resp["X-Ratelimit-Global"] == "true"
|
60
58
|
return unless resp["X-RateLimit-Remaining"]
|
61
59
|
@path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
|
62
60
|
@path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
|
data/lib/discorb/user.rb
CHANGED
@@ -137,7 +137,7 @@ module Discorb
|
|
137
137
|
@avatar = data[:avatar] ? Asset.new(self, data[:avatar]) : DefaultAvatar.new(data[:discriminator])
|
138
138
|
@bot = data[:bot]
|
139
139
|
@raw_data = data
|
140
|
-
@client.users[@id] = self
|
140
|
+
@client.users[@id] = self unless data[:no_cache]
|
141
141
|
@created_at = @id.timestamp
|
142
142
|
@data.update(data)
|
143
143
|
end
|
data/lib/discorb/voice_state.rb
CHANGED
data/lib/discorb/webhook.rb
CHANGED
@@ -151,7 +151,7 @@ module Discorb
|
|
151
151
|
payload[:attachments] = attachments.map(&:to_hash) if attachments != Discorb::Unset
|
152
152
|
payload[:allowed_mentions] = allowed_mentions if allowed_mentions != Discorb::Unset
|
153
153
|
files = [file] if file != Discorb::Unset
|
154
|
-
_resp, data = @http.multipart_request(Route.new("#{url}/messages/#{Utils.try(message, :id)}", "//webhooks/:webhook_id/:token/messages/:message_id", :patch), payload,
|
154
|
+
_resp, data = @http.multipart_request(Route.new("#{url}/messages/#{Utils.try(message, :id)}", "//webhooks/:webhook_id/:token/messages/:message_id", :patch), payload, files).wait
|
155
155
|
message.send(:_set_data, data)
|
156
156
|
message
|
157
157
|
end
|
data/lib/discorb.rb
CHANGED
@@ -40,6 +40,7 @@ module Discorb
|
|
40
40
|
end
|
41
41
|
|
42
42
|
require_order = %w[common flag dictionary error rate_limit http intents emoji_table modules] +
|
43
|
+
%w[message_meta allowed_mentions] +
|
43
44
|
%w[user member guild emoji channel embed message] +
|
44
45
|
%w[application audit_logs color components event event_handler] +
|
45
46
|
%w[file guild_template image integration interaction invite log permission] +
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
require "fileutils"
|
2
3
|
|
3
4
|
def replace_index(dir, version)
|
@@ -5,7 +6,7 @@ def replace_index(dir, version)
|
|
5
6
|
next if (m = file.match(/[0-9]+\.[0-9]+\.[0-9]+(-[a-z]+)?/)) && m[0] != version
|
6
7
|
|
7
8
|
content = File.read(file)
|
8
|
-
content.gsub!(
|
9
|
+
content.gsub!(%r{(?<=["/])_index.html}, "a_index.html")
|
9
10
|
File.write(file, content)
|
10
11
|
end
|
11
12
|
|