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
@@ -1,9 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Discorb
|
3
|
+
#
|
4
|
+
# Represents an interaction of Discord.
|
5
|
+
#
|
2
6
|
class Interaction
|
3
7
|
#
|
4
8
|
# A module for response with source.
|
5
9
|
#
|
6
|
-
module
|
10
|
+
module SourceResponder
|
7
11
|
#
|
8
12
|
# Response with `DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE`(`5`).
|
9
13
|
#
|
@@ -38,14 +42,14 @@ module Discorb
|
|
38
42
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
39
43
|
# @param [Boolean] ephemeral Whether to make the response ephemeral.
|
40
44
|
#
|
41
|
-
# @return [Discorb::Interaction::
|
45
|
+
# @return [Discorb::Interaction::SourceResponder::CallbackMessage, Discorb::Webhook::Message] The callback message.
|
42
46
|
#
|
43
47
|
def post(content = nil, tts: false, embed: nil, embeds: nil, allowed_mentions: nil, components: nil, ephemeral: false)
|
44
48
|
Async do
|
45
49
|
payload = {}
|
46
50
|
payload[:content] = content if content
|
47
51
|
payload[:tts] = tts
|
48
|
-
payload[:embeds] = (embeds || [embed])
|
52
|
+
payload[:embeds] = (embeds || [embed]).map { |e| e&.to_hash }.filter { _1 }
|
49
53
|
payload[:allowed_mentions] = allowed_mentions&.to_hash(@client.allowed_mentions) || @client.allowed_mentions.to_hash
|
50
54
|
payload[:components] = Component.to_payload(components) if components
|
51
55
|
payload[:flags] = (ephemeral ? 1 << 6 : 0)
|
@@ -66,8 +70,19 @@ module Discorb
|
|
66
70
|
end
|
67
71
|
end
|
68
72
|
|
73
|
+
#
|
74
|
+
# Represents of a callback message of interaction.
|
75
|
+
#
|
69
76
|
class CallbackMessage
|
77
|
+
#
|
78
|
+
# Initializes a new instance of CallbackMessage.
|
70
79
|
# @private
|
80
|
+
#
|
81
|
+
# @param [Client] client The client.
|
82
|
+
# @param [Hash] data The payload.
|
83
|
+
# @param [String] application_id The application ID.
|
84
|
+
# @param [String] token The token.
|
85
|
+
#
|
71
86
|
def initialize(client, data, application_id, token)
|
72
87
|
@client = client
|
73
88
|
@data = data
|
@@ -121,13 +136,17 @@ module Discorb
|
|
121
136
|
@client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
|
122
137
|
end
|
123
138
|
end
|
139
|
+
|
140
|
+
def inspect
|
141
|
+
"#<#{self.class.name} application_id=#{@application_id}"
|
142
|
+
end
|
124
143
|
end
|
125
144
|
end
|
126
145
|
|
127
146
|
#
|
128
147
|
# A module for response with update.
|
129
148
|
#
|
130
|
-
module
|
149
|
+
module UpdateResponder
|
131
150
|
#
|
132
151
|
# Response with `DEFERRED_UPDATE_MESSAGE`(`6`).
|
133
152
|
# @async
|
@@ -181,6 +200,28 @@ module Discorb
|
|
181
200
|
end
|
182
201
|
end
|
183
202
|
|
203
|
+
#
|
204
|
+
# A module for response with modal.
|
205
|
+
#
|
206
|
+
module ModalResponder
|
207
|
+
#
|
208
|
+
# Response with `MODAL`(`9`).
|
209
|
+
#
|
210
|
+
# @param [String] title The title of the modal.
|
211
|
+
# @param [String] custom_id The custom id of the modal.
|
212
|
+
# @param [Array<Discorb::TextInput>] components The text inputs to send.
|
213
|
+
#
|
214
|
+
# @return [Async::Task<void>] The task.
|
215
|
+
#
|
216
|
+
def show_modal(title, custom_id, components)
|
217
|
+
payload = { title: title, custom_id: custom_id, components: Component.to_payload(components) }
|
218
|
+
@client.http.request(
|
219
|
+
Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post),
|
220
|
+
{ type: 9, data: payload }
|
221
|
+
).wait
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
184
225
|
private
|
185
226
|
|
186
227
|
def _set_data(*)
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module Discorb
|
2
3
|
#
|
3
4
|
# Represents a user interaction with the bot.
|
@@ -37,7 +38,13 @@ module Discorb
|
|
37
38
|
@interaction_type = nil
|
38
39
|
@interaction_name = nil
|
39
40
|
|
41
|
+
#
|
42
|
+
# Initialize a new interaction.
|
40
43
|
# @private
|
44
|
+
#
|
45
|
+
# @param [Discorb::Client] client The client this interaction belongs to.
|
46
|
+
# @param [Hash] data The data of the interaction.
|
47
|
+
#
|
41
48
|
def initialize(client, data)
|
42
49
|
@client = client
|
43
50
|
@id = Snowflake.new(data[:id])
|
@@ -80,7 +87,13 @@ module Discorb
|
|
80
87
|
# @private
|
81
88
|
attr_reader :interaction_type, :interaction_name, :event_name
|
82
89
|
|
90
|
+
#
|
91
|
+
# Create a new Interaction instance from the data.
|
83
92
|
# @private
|
93
|
+
#
|
94
|
+
# @param [Discorb::Client] client The client this interaction belongs to.
|
95
|
+
# @param [Hash] data The data of the interaction.
|
96
|
+
#
|
84
97
|
def make_interaction(client, data)
|
85
98
|
interaction = nil
|
86
99
|
descendants.each do |klass|
|
@@ -93,7 +106,10 @@ module Discorb
|
|
93
106
|
interaction
|
94
107
|
end
|
95
108
|
|
109
|
+
#
|
110
|
+
# Returns the descendants of the class.
|
96
111
|
# @private
|
112
|
+
#
|
97
113
|
def descendants
|
98
114
|
ObjectSpace.each_object(Class).select { |klass| klass < self }
|
99
115
|
end
|
data/lib/discorb/interaction.rb
CHANGED
data/lib/discorb/invite.rb
CHANGED
@@ -66,13 +66,22 @@ module Discorb
|
|
66
66
|
# Whether the invite is temporary.
|
67
67
|
# @return [Boolean]
|
68
68
|
|
69
|
-
@
|
69
|
+
# @private
|
70
|
+
# @return [{Integer => Symbol}] The mapping of target types.
|
71
|
+
TARGET_TYPES = {
|
70
72
|
nil => :voice,
|
71
73
|
1 => :stream,
|
72
74
|
2 => :guild,
|
73
75
|
}.freeze
|
74
76
|
|
77
|
+
#
|
78
|
+
# Initialize a new invite.
|
75
79
|
# @private
|
80
|
+
#
|
81
|
+
# @param [Discorb::Client] client The client.
|
82
|
+
# @param [Hash] data The data of invite.
|
83
|
+
# @param [Boolean] gateway Whether the data is from gateway.
|
84
|
+
#
|
76
85
|
def initialize(client, data, gateway)
|
77
86
|
@client = client
|
78
87
|
@data = data[:data]
|
@@ -124,7 +133,7 @@ module Discorb
|
|
124
133
|
@expires_at = data[:expires_at] && Time.iso8601(data[:expires_at])
|
125
134
|
end
|
126
135
|
@inviter_data = data[:inviter]
|
127
|
-
@target_type =
|
136
|
+
@target_type = TARGET_TYPES[data[:target_type]]
|
128
137
|
@target_user = @client.users[data[:target_user][:id]] || User.new(@client, data[:target_user]) if data[:target_user]
|
129
138
|
# @target_application = nil
|
130
139
|
|
@@ -137,10 +146,5 @@ module Discorb
|
|
137
146
|
@temporary = data[:temporary]
|
138
147
|
@created_at = Time.iso8601(data[:created_at])
|
139
148
|
end
|
140
|
-
|
141
|
-
class << self
|
142
|
-
# @private
|
143
|
-
attr_reader :target_types
|
144
|
-
end
|
145
149
|
end
|
146
150
|
end
|
data/lib/discorb/log.rb
CHANGED
@@ -5,11 +5,11 @@ module Discorb
|
|
5
5
|
class Logger
|
6
6
|
attr_accessor :out, :colorize_log
|
7
7
|
|
8
|
-
|
8
|
+
LEVELS = %i[debug info warn error fatal].freeze
|
9
9
|
|
10
10
|
def initialize(out, colorize_log, level)
|
11
11
|
@out = out
|
12
|
-
@level =
|
12
|
+
@level = LEVELS.index(level)
|
13
13
|
@colorize_log = colorize_log
|
14
14
|
end
|
15
15
|
|
@@ -18,11 +18,11 @@ module Discorb
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def level
|
21
|
-
|
21
|
+
LEVELS[@level]
|
22
22
|
end
|
23
23
|
|
24
24
|
def level=(level)
|
25
|
-
@level =
|
25
|
+
@level = LEVELS.index(level)
|
26
26
|
raise ArgumentError, "Invalid log level: #{level}" unless @level
|
27
27
|
end
|
28
28
|
|
@@ -64,7 +64,7 @@ module Discorb
|
|
64
64
|
|
65
65
|
def write_output(name, color, message, fallback)
|
66
66
|
unless @out
|
67
|
-
fallback
|
67
|
+
fallback&.puts(message)
|
68
68
|
|
69
69
|
return
|
70
70
|
end
|
data/lib/discorb/member.rb
CHANGED
@@ -62,7 +62,15 @@ module Discorb
|
|
62
62
|
# @!attribute [r] owner?
|
63
63
|
# @return [Boolean] Whether the member is the owner of the guild.
|
64
64
|
|
65
|
+
#
|
66
|
+
# Initialize a new instance of the member.
|
65
67
|
# @private
|
68
|
+
#
|
69
|
+
# @param [Discorb::Client] client The client.
|
70
|
+
# @param [Discorb::Snowflake] guild_id The ID of the guild.
|
71
|
+
# @param [Hash] user_data The data of the user.
|
72
|
+
# @param [Hash] member_data The data of the member.
|
73
|
+
#
|
66
74
|
def initialize(client, guild_id, user_data, member_data)
|
67
75
|
@guild_id = guild_id
|
68
76
|
@client = client
|
@@ -105,9 +113,7 @@ module Discorb
|
|
105
113
|
end
|
106
114
|
|
107
115
|
def permissions
|
108
|
-
if owner?
|
109
|
-
return Permission.new((1 << 38) - 1)
|
110
|
-
end
|
116
|
+
return Permission.new((1 << 38) - 1) if owner?
|
111
117
|
roles.map(&:permissions).sum(Permission.new(0))
|
112
118
|
end
|
113
119
|
|
@@ -250,6 +256,19 @@ module Discorb
|
|
250
256
|
end
|
251
257
|
end
|
252
258
|
|
259
|
+
#
|
260
|
+
# Checks if the member can manage the given role.
|
261
|
+
#
|
262
|
+
# @param [Discorb::Role] role The role.
|
263
|
+
#
|
264
|
+
# @return [Boolean] `true` if the member can manage the role.
|
265
|
+
#
|
266
|
+
def can_manage?(role)
|
267
|
+
return true if owner?
|
268
|
+
top_role = roles.max_by(&:position)
|
269
|
+
top_role.position > role.position
|
270
|
+
end
|
271
|
+
|
253
272
|
private
|
254
273
|
|
255
274
|
def _set_data(user_data, member_data)
|
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
|
#
|
@@ -214,7 +152,14 @@ module Discorb
|
|
214
152
|
!@guild_id.nil?
|
215
153
|
end
|
216
154
|
|
155
|
+
#
|
156
|
+
# Initialize a new message.
|
217
157
|
# @private
|
158
|
+
#
|
159
|
+
# @param [Discorb::Client] client The client.
|
160
|
+
# @param [Hash] data The data of the welcome screen.
|
161
|
+
# @param [Boolean] no_cache Whether to disable caching.
|
162
|
+
#
|
218
163
|
def initialize(client, data, no_cache: false)
|
219
164
|
@client = client
|
220
165
|
@data = {}
|
@@ -257,38 +202,44 @@ module Discorb
|
|
257
202
|
#
|
258
203
|
def clean_content(user: true, channel: true, role: true, emoji: true, everyone: true, codeblock: false)
|
259
204
|
ret = @content.dup
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
205
|
+
if user
|
206
|
+
ret.gsub!(/<@!?(\d+)>/) do |_match|
|
207
|
+
member = guild&.members&.[]($1)
|
208
|
+
member ||= @client.users[$1]
|
209
|
+
member ? "@#{member.name}" : "@Unknown User"
|
210
|
+
end
|
211
|
+
end
|
212
|
+
ret.gsub!(/<#(\d+)>/) do |_match|
|
266
213
|
channel = @client.channels[$1]
|
267
214
|
channel ? "<##{channel.id}>" : "#Unknown Channel"
|
268
215
|
end
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
216
|
+
if role
|
217
|
+
ret.gsub!(/<@&(\d+)>/) do |_match|
|
218
|
+
role = guild&.roles&.[]($1)
|
219
|
+
role ? "@#{role.name}" : "@Unknown Role"
|
220
|
+
end
|
221
|
+
end
|
222
|
+
if emoji
|
223
|
+
ret.gsub!(/<a?:([a-zA-Z0-9_]+):\d+>/) do |_match|
|
224
|
+
$1
|
225
|
+
end
|
226
|
+
end
|
276
227
|
ret.gsub!(/@(everyone|here)/, "@\u200b\\1") if everyone
|
277
|
-
|
228
|
+
if codeblock
|
229
|
+
ret
|
230
|
+
else
|
278
231
|
codeblocks = ret.split("```", -1)
|
279
232
|
original_codeblocks = @content.scan(/```(.+?)```/m)
|
280
233
|
res = []
|
281
234
|
max = codeblocks.length
|
282
|
-
codeblocks.each_with_index do |
|
283
|
-
if max
|
284
|
-
|
235
|
+
codeblocks.each_with_index do |single_codeblock, i|
|
236
|
+
res << if max.even? && i == max - 1 || i.even?
|
237
|
+
single_codeblock
|
285
238
|
else
|
286
|
-
|
239
|
+
original_codeblocks[i / 2]
|
287
240
|
end
|
288
241
|
end
|
289
242
|
res.join("```")
|
290
|
-
else
|
291
|
-
ret
|
292
243
|
end
|
293
244
|
end
|
294
245
|
|
@@ -300,16 +251,17 @@ module Discorb
|
|
300
251
|
# @param [Discorb::Embed] embed The embed to send.
|
301
252
|
# @param [Array<Discorb::Embed>] embeds The embeds to send.
|
302
253
|
# @param [Discorb::AllowedMentions] allowed_mentions The allowed mentions.
|
254
|
+
# @param [Array<Discorb::Attachment>] attachments The new attachments.
|
303
255
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
304
256
|
# @param [Boolean] supress Whether to supress embeds.
|
305
257
|
#
|
306
258
|
# @return [Async::Task<void>] The task.
|
307
259
|
#
|
308
|
-
def edit(content =
|
309
|
-
|
260
|
+
def edit(content = Discorb::Unset, embed: Discorb::Unset, embeds: Discorb::Unset, allowed_mentions: Discorb::Unset,
|
261
|
+
attachments: Discorb::Unset, components: Discorb::Unset, supress: Discorb::Unset)
|
310
262
|
Async do
|
311
263
|
channel.edit_message(@id, content, embed: embed, embeds: embeds, allowed_mentions: allowed_mentions,
|
312
|
-
components: components, supress: supress).wait
|
264
|
+
attachments: attachments, components: components, supress: supress).wait
|
313
265
|
end
|
314
266
|
end
|
315
267
|
|
@@ -501,102 +453,6 @@ module Discorb
|
|
501
453
|
"#<#{self.class} #{@content.inspect} id=#{@id}>"
|
502
454
|
end
|
503
455
|
|
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
456
|
private
|
601
457
|
|
602
458
|
def _set_data(data)
|
@@ -627,8 +483,8 @@ module Discorb
|
|
627
483
|
@tts = data[:tts]
|
628
484
|
@mention_everyone = data[:mention_everyone]
|
629
485
|
@mention_roles = data[:mention_roles].map { |r| guild.roles[r] }
|
630
|
-
@attachments = data[:attachments].map { |a| Attachment.
|
631
|
-
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.
|
486
|
+
@attachments = data[:attachments].map { |a| Attachment.from_hash(a) }
|
487
|
+
@embeds = data[:embeds] ? data[:embeds].map { |e| Embed.from_hash(e) } : []
|
632
488
|
@reactions = data[:reactions] ? data[:reactions].map { |r| Reaction.new(self, r) } : []
|
633
489
|
@pinned = data[:pinned]
|
634
490
|
@type = self.class.message_type[data[:type]]
|
@@ -645,57 +501,6 @@ module Discorb
|
|
645
501
|
@deleted = false
|
646
502
|
end
|
647
503
|
|
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
504
|
class << self
|
700
505
|
# @private
|
701
506
|
attr_reader :message_type
|