discorb 0.13.4 → 0.15.1
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/.gitattributes +2 -0
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/codeql-analysis.yml +70 -0
- data/.github/workflows/lint-push.yml +20 -0
- data/.github/workflows/lint.yml +16 -0
- data/.rubocop.yml +74 -0
- data/Changelog.md +30 -0
- data/Gemfile +7 -3
- data/Rakefile +28 -22
- data/discorb.gemspec +1 -0
- data/docs/events.md +50 -0
- data/docs/faq.md +8 -8
- 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 +71 -0
- data/lib/discorb/app_command/command.rb +336 -0
- data/lib/discorb/app_command/handler.rb +168 -0
- data/lib/discorb/app_command.rb +2 -426
- data/lib/discorb/application.rb +16 -7
- data/lib/discorb/asset.rb +11 -0
- data/lib/discorb/{file.rb → attachment.rb} +55 -33
- data/lib/discorb/audit_logs.rb +45 -7
- data/lib/discorb/channel.rb +65 -15
- data/lib/discorb/client.rb +34 -27
- data/lib/discorb/common.rb +19 -27
- data/lib/discorb/components/button.rb +105 -0
- data/lib/discorb/components/select_menu.rb +143 -0
- data/lib/discorb/components/text_input.rb +96 -0
- data/lib/discorb/components.rb +11 -276
- data/lib/discorb/dictionary.rb +5 -0
- data/lib/discorb/embed.rb +73 -40
- data/lib/discorb/emoji.rb +48 -5
- data/lib/discorb/error.rb +9 -5
- data/lib/discorb/event.rb +36 -24
- 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 +112 -51
- data/lib/discorb/gateway_requests.rb +4 -7
- data/lib/discorb/guild.rb +73 -41
- data/lib/discorb/guild_template.rb +26 -5
- data/lib/discorb/http.rb +38 -18
- data/lib/discorb/integration.rb +24 -9
- data/lib/discorb/intents.rb +16 -11
- data/lib/discorb/interaction/autocomplete.rb +6 -5
- data/lib/discorb/interaction/command.rb +66 -12
- data/lib/discorb/interaction/components.rb +19 -3
- data/lib/discorb/interaction/modal.rb +33 -0
- data/lib/discorb/interaction/response.rb +45 -4
- data/lib/discorb/interaction/root.rb +16 -0
- data/lib/discorb/interaction.rb +2 -1
- data/lib/discorb/invite.rb +11 -7
- data/lib/discorb/log.rb +5 -5
- data/lib/discorb/member.rb +22 -3
- data/lib/discorb/message.rb +39 -234
- data/lib/discorb/message_meta.rb +186 -0
- data/lib/discorb/modules.rb +39 -15
- data/lib/discorb/permission.rb +16 -7
- data/lib/discorb/presence.rb +45 -9
- data/lib/discorb/rate_limit.rb +7 -4
- data/lib/discorb/reaction.rb +6 -0
- data/lib/discorb/role.rb +12 -0
- data/lib/discorb/sticker.rb +22 -14
- data/lib/discorb/user.rb +12 -1
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +23 -2
- data/lib/discorb/webhook.rb +54 -3
- data/lib/discorb.rb +5 -2
- data/sig/discorb.rbs +838 -702
- 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 +17 -3
@@ -0,0 +1,186 @@
|
|
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
|
+
|
92
|
+
def inspect
|
93
|
+
"#<#{self.class.name} #{@channel_id}/#{@message_id}>"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# Represents a sticker.
|
99
|
+
#
|
100
|
+
class Sticker
|
101
|
+
# @return [Discorb::Snowflake] The sticker ID.
|
102
|
+
attr_reader :id
|
103
|
+
# @return [String] The sticker name.
|
104
|
+
attr_reader :name
|
105
|
+
# @return [Symbol] The sticker format.
|
106
|
+
attr_reader :format
|
107
|
+
|
108
|
+
def initialize(data)
|
109
|
+
@id = Snowflake.new(data[:id])
|
110
|
+
@name = data[:name]
|
111
|
+
@format = Discorb::Sticker::STICKER_FORMAT[data[:format]]
|
112
|
+
end
|
113
|
+
|
114
|
+
def inspect
|
115
|
+
"#<#{self.class.name} #{@id}: #{@name} format=#{@format}>"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Represents a interaction of message.
|
121
|
+
#
|
122
|
+
class Interaction < DiscordModel
|
123
|
+
# @return [Discorb::Snowflake] The interaction ID.
|
124
|
+
attr_reader :id
|
125
|
+
# @return [String] The name of command.
|
126
|
+
# @return [nil] If the message is not a command.
|
127
|
+
attr_reader :name
|
128
|
+
# @return [Class] The type of interaction.
|
129
|
+
attr_reader :type
|
130
|
+
# @return [Discorb::User] The user.
|
131
|
+
attr_reader :user
|
132
|
+
|
133
|
+
#
|
134
|
+
# Initialize a new interaction.
|
135
|
+
# @private
|
136
|
+
#
|
137
|
+
# @param [Discorb::Client] client The client.
|
138
|
+
# @param [Hash] data The interaction data.
|
139
|
+
#
|
140
|
+
def initialize(client, data)
|
141
|
+
@id = Snowflake.new(data[:id])
|
142
|
+
@name = data[:name]
|
143
|
+
@type = Discorb::Interaction.descendants.find { |c| c.interaction_type == data[:type] }
|
144
|
+
@user = client.users[data[:user][:id]] || User.new(client, data[:user])
|
145
|
+
end
|
146
|
+
|
147
|
+
def inspect
|
148
|
+
"<#{self.class.name} #{@id}: #{@name} type=#{@type} #{@user}>"
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
#
|
153
|
+
# Represents a activity of message.
|
154
|
+
#
|
155
|
+
class Activity < DiscordModel
|
156
|
+
# @return [String] The name of activity.
|
157
|
+
attr_reader :name
|
158
|
+
# @return [Symbol] The type of activity.
|
159
|
+
attr_reader :type
|
160
|
+
|
161
|
+
# @private
|
162
|
+
# @return [{Integer => Symbol}] The mapping of activity type.
|
163
|
+
TYPES = {
|
164
|
+
1 => :join,
|
165
|
+
2 => :spectate,
|
166
|
+
3 => :listen,
|
167
|
+
5 => :join_request,
|
168
|
+
}.freeze
|
169
|
+
|
170
|
+
#
|
171
|
+
# Initialize a new activity.
|
172
|
+
# @private
|
173
|
+
#
|
174
|
+
# @param [Hash] data The activity data.
|
175
|
+
#
|
176
|
+
def initialize(data)
|
177
|
+
@name = data[:name]
|
178
|
+
@type = TYPES[data[:type]]
|
179
|
+
end
|
180
|
+
|
181
|
+
def inspect
|
182
|
+
"<#{self.class.name} #{@name} type=#{@type}>"
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
data/lib/discorb/modules.rb
CHANGED
@@ -16,13 +16,13 @@ module Discorb
|
|
16
16
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions.
|
17
17
|
# @param [Discorb::Message, Discorb::Message::Reference] reference The message to reply to.
|
18
18
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
19
|
-
# @param [Discorb::
|
20
|
-
# @param [Array<Discorb::
|
19
|
+
# @param [Discorb::Attachment] attachment The attachment to send.
|
20
|
+
# @param [Array<Discorb::Attachment>] attachments The attachments to send.
|
21
21
|
#
|
22
22
|
# @return [Async::Task<Discorb::Message>] The message sent.
|
23
23
|
#
|
24
24
|
def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil,
|
25
|
-
reference: nil, components: nil,
|
25
|
+
reference: nil, components: nil, attachment: nil, attachments: nil)
|
26
26
|
Async do
|
27
27
|
payload = {}
|
28
28
|
payload[:content] = content if content
|
@@ -37,8 +37,17 @@ module Discorb
|
|
37
37
|
allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
|
38
38
|
payload[:message_reference] = reference.to_reference if reference
|
39
39
|
payload[:components] = Component.to_payload(components) if components
|
40
|
-
|
41
|
-
|
40
|
+
attachments ||= attachment ? [attachment] : []
|
41
|
+
|
42
|
+
payload[:attachments] = attachments.map.with_index do |a, i|
|
43
|
+
{
|
44
|
+
id: i,
|
45
|
+
filename: a.filename,
|
46
|
+
description: a.description,
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
_resp, data = @client.http.multipart_request(Route.new("/channels/#{channel_id.wait}/messages", "//channels/:channel_id/messages", :post), payload, attachments).wait
|
42
51
|
Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
|
43
52
|
end
|
44
53
|
end
|
@@ -48,33 +57,48 @@ module Discorb
|
|
48
57
|
#
|
49
58
|
# Edit a message.
|
50
59
|
# @async
|
60
|
+
# @!macro edit
|
51
61
|
#
|
52
62
|
# @param [#to_s] message_id The message id.
|
53
63
|
# @param [String] content The message content.
|
54
64
|
# @param [Discorb::Embed] embed The embed to send.
|
55
65
|
# @param [Array<Discorb::Embed>] embeds The embeds to send.
|
56
66
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions.
|
67
|
+
# @param [Array<Discorb::Attachment>] attachments The new attachments.
|
57
68
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
58
69
|
# @param [Boolean] supress Whether to supress embeds.
|
59
70
|
#
|
60
71
|
# @return [Async::Task<void>] The task.
|
61
72
|
#
|
62
|
-
def edit_message(message_id, content =
|
63
|
-
|
73
|
+
def edit_message(message_id, content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset,
|
74
|
+
attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset)
|
64
75
|
Async do
|
65
76
|
payload = {}
|
66
|
-
payload[:content] = content if content
|
67
|
-
tmp_embed = if embed
|
77
|
+
payload[:content] = content if content != Discorb::Unset
|
78
|
+
tmp_embed = if embed != Discorb::Unset
|
68
79
|
[embed]
|
69
|
-
elsif embeds
|
80
|
+
elsif embeds != Discorb::Unset
|
70
81
|
embeds
|
71
82
|
end
|
72
83
|
payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
|
73
84
|
payload[:allowed_mentions] =
|
74
|
-
allowed_mentions ?
|
75
|
-
payload[:components] = Component.to_payload(components) if components
|
76
|
-
payload[:flags] = (supress ? 1 << 2 : 0)
|
77
|
-
|
85
|
+
allowed_mentions == Discorb::Unset ? @client.allowed_mentions.to_hash : allowed_mentions.to_hash(@client.allowed_mentions)
|
86
|
+
payload[:components] = Component.to_payload(components) if components != Discorb::Unset
|
87
|
+
payload[:flags] = (supress ? 1 << 2 : 0) if supress != Discorb::Unset
|
88
|
+
if attachments != Discorb::Unset
|
89
|
+
payload[:attachments] = attachments.map.with_index do |a, i|
|
90
|
+
{
|
91
|
+
id: i,
|
92
|
+
filename: a.filename,
|
93
|
+
description: a.description,
|
94
|
+
}
|
95
|
+
end
|
96
|
+
end
|
97
|
+
@client.http.multipart_request(
|
98
|
+
Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :patch),
|
99
|
+
payload,
|
100
|
+
attachments == Discorb::Unset ? [] : attachments
|
101
|
+
).wait
|
78
102
|
end
|
79
103
|
end
|
80
104
|
|
@@ -204,7 +228,7 @@ module Discorb
|
|
204
228
|
post_task.stop
|
205
229
|
end
|
206
230
|
else
|
207
|
-
Async do |
|
231
|
+
Async do |_task|
|
208
232
|
@client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
|
209
233
|
end
|
210
234
|
end
|
data/lib/discorb/permission.rb
CHANGED
@@ -138,7 +138,13 @@ module Discorb
|
|
138
138
|
}.freeze
|
139
139
|
@bits = @raw_bits.transform_values { |v| 1 << v }.freeze
|
140
140
|
|
141
|
+
#
|
142
|
+
# Initializes a new PermissionOverwrite.
|
141
143
|
# @private
|
144
|
+
#
|
145
|
+
# @param allow [Integer] The allowed permissions.
|
146
|
+
# @param deny [Integer] The denied permissions.
|
147
|
+
#
|
142
148
|
def initialize(allow, deny)
|
143
149
|
@allow = allow
|
144
150
|
@deny = deny
|
@@ -174,13 +180,16 @@ module Discorb
|
|
174
180
|
# @return [Hash] The permission overwrite as a hash.
|
175
181
|
#
|
176
182
|
def to_hash
|
177
|
-
self.class.bits.keys.
|
178
|
-
[
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
183
|
+
self.class.bits.keys.to_h do |field|
|
184
|
+
[
|
185
|
+
field,
|
186
|
+
if @allow & self.class.bits[field] != 0
|
187
|
+
true
|
188
|
+
elsif @deny & self.class.bits[field] != 0
|
189
|
+
false
|
190
|
+
end,
|
191
|
+
]
|
192
|
+
end
|
184
193
|
end
|
185
194
|
|
186
195
|
#
|
data/lib/discorb/presence.rb
CHANGED
@@ -19,7 +19,13 @@ module Discorb
|
|
19
19
|
# @!attribute [r] activity
|
20
20
|
# @return [Discorb::Presence::Activity] The activity of the presence.
|
21
21
|
|
22
|
+
#
|
23
|
+
# Initialize a presence.
|
22
24
|
# @private
|
25
|
+
#
|
26
|
+
# @param [Discorb::Client] client The client.
|
27
|
+
# @param [Hash] data The data of the presence.
|
28
|
+
#
|
23
29
|
def initialize(client, data)
|
24
30
|
@client = client
|
25
31
|
@data = data
|
@@ -80,19 +86,26 @@ module Discorb
|
|
80
86
|
# @return [Discorb::Presence::Activity::Flag] The flags of the activity.
|
81
87
|
attr_reader :flags
|
82
88
|
|
83
|
-
@
|
89
|
+
# @private
|
90
|
+
# @return [{Integer => Symbol}] The mapping of activity types.
|
91
|
+
ACTIVITY_TYPES = {
|
84
92
|
0 => :game,
|
85
93
|
1 => :streaming,
|
86
94
|
2 => :listening,
|
87
95
|
3 => :watching,
|
88
96
|
4 => :custom,
|
89
97
|
5 => :competing,
|
90
|
-
}
|
98
|
+
}.freeze
|
91
99
|
|
100
|
+
#
|
101
|
+
# Initialize the activity.
|
92
102
|
# @private
|
103
|
+
#
|
104
|
+
# @param [Hash] data The activity data.
|
105
|
+
#
|
93
106
|
def initialize(data)
|
94
107
|
@name = data[:name]
|
95
|
-
@type =
|
108
|
+
@type = ACTIVITY_TYPES[data[:type]]
|
96
109
|
@url = data[:url]
|
97
110
|
@created_at = Time.at(data[:created_at])
|
98
111
|
@timestamps = data[:timestamps] && Timestamps.new(data[:timestamps])
|
@@ -105,7 +118,7 @@ module Discorb
|
|
105
118
|
@party = data[:party] && Party.new(data[:party])
|
106
119
|
@assets = data[:assets] && Asset.new(data[:assets])
|
107
120
|
@instance = data[:instance]
|
108
|
-
@buttons = data[:buttons]
|
121
|
+
@buttons = data[:buttons]&.map { |b| Button.new(b) }
|
109
122
|
@flags = data[:flags] && Flag.new(data[:flags])
|
110
123
|
end
|
111
124
|
|
@@ -140,13 +153,21 @@ module Discorb
|
|
140
153
|
# @return [Time] The end time of the activity.
|
141
154
|
attr_reader :end
|
142
155
|
|
156
|
+
#
|
157
|
+
# Initialize the timestamps.
|
143
158
|
# @private
|
159
|
+
#
|
160
|
+
# @param [Hash] data The timestamps data.
|
161
|
+
#
|
144
162
|
def initialize(data)
|
145
163
|
@start = data[:start] && Time.at(data[:start])
|
146
164
|
@end = data[:end] && Time.at(data[:end])
|
147
165
|
end
|
148
166
|
end
|
149
167
|
|
168
|
+
#
|
169
|
+
# Represents the party of an activity.
|
170
|
+
#
|
150
171
|
class Party < DiscordModel
|
151
172
|
# @return [String] The id of the party.
|
152
173
|
attr_reader :id
|
@@ -156,7 +177,12 @@ module Discorb
|
|
156
177
|
# @!attribute [r] max_size
|
157
178
|
# @return [Integer] The max size of the party.
|
158
179
|
|
180
|
+
#
|
181
|
+
# Initialize the party.
|
159
182
|
# @private
|
183
|
+
#
|
184
|
+
# @param [Hash] data The party data.
|
185
|
+
#
|
160
186
|
def initialize(data)
|
161
187
|
@id = data[:id]
|
162
188
|
@size = data[:size]
|
@@ -226,7 +252,12 @@ module Discorb
|
|
226
252
|
# @return [String] The match secret of the activity.
|
227
253
|
attr_reader :match
|
228
254
|
|
255
|
+
#
|
256
|
+
# Initialize the secrets.
|
229
257
|
# @private
|
258
|
+
#
|
259
|
+
# @param [Hash] data The secrets data.
|
260
|
+
#
|
230
261
|
def initialize(data)
|
231
262
|
@join = data[:join]
|
232
263
|
@spectate = data[:spectate]
|
@@ -244,17 +275,17 @@ module Discorb
|
|
244
275
|
attr_reader :url
|
245
276
|
alias text label
|
246
277
|
|
278
|
+
#
|
279
|
+
# Initialize the button.
|
247
280
|
# @private
|
281
|
+
#
|
282
|
+
# @param [Hash] data The button data.
|
283
|
+
#
|
248
284
|
def initialize(data)
|
249
285
|
@label = data[0]
|
250
286
|
@url = data[1]
|
251
287
|
end
|
252
288
|
end
|
253
|
-
|
254
|
-
class << self
|
255
|
-
# @private
|
256
|
-
attr_reader :activity_types
|
257
|
-
end
|
258
289
|
end
|
259
290
|
|
260
291
|
#
|
@@ -275,7 +306,12 @@ module Discorb
|
|
275
306
|
# @!attribute [r] web?
|
276
307
|
# @return [Boolean] Whether the user is not offline on web.
|
277
308
|
|
309
|
+
#
|
310
|
+
# Initialize the client status.
|
278
311
|
# @private
|
312
|
+
#
|
313
|
+
# @param [Hash] data The client status data.
|
314
|
+
#
|
279
315
|
def initialize(data)
|
280
316
|
@desktop = data[:desktop]&.to_sym || :offline
|
281
317
|
@mobile = data[:mobile]&.to_sym || :offline
|
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 = {}
|
@@ -40,7 +45,7 @@ module Discorb
|
|
40
45
|
@path_ratelimit_bucket.delete(path.identifier + path.major_param)
|
41
46
|
return
|
42
47
|
end
|
43
|
-
return if bucket[:remaining]
|
48
|
+
return if (bucket[:remaining]).positive?
|
44
49
|
|
45
50
|
time = bucket[:reset_at] - Time.now.to_f
|
46
51
|
@client.log.info("rate limit for #{path.identifier} with #{path.major_param} reached, waiting #{time.round(4)} seconds")
|
@@ -54,9 +59,7 @@ module Discorb
|
|
54
59
|
# @param [Net::HTTPResponse] resp The response.
|
55
60
|
#
|
56
61
|
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
|
62
|
+
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after] if resp["X-Ratelimit-Global"] == "true"
|
60
63
|
return unless resp["X-RateLimit-Remaining"]
|
61
64
|
@path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
|
62
65
|
@path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
|
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])
|
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
|
@@ -137,7 +148,7 @@ module Discorb
|
|
137
148
|
@avatar = data[:avatar] ? Asset.new(self, data[:avatar]) : DefaultAvatar.new(data[:discriminator])
|
138
149
|
@bot = data[:bot]
|
139
150
|
@raw_data = data
|
140
|
-
@client.users[@id] = self
|
151
|
+
@client.users[@id] = self unless data[:no_cache]
|
141
152
|
@created_at = @id.timestamp
|
142
153
|
@data.update(data)
|
143
154
|
end
|