discorb 0.13.4 → 0.15.1
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 +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
|