discorb 0.16.0 → 0.17.0
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 +1 -0
- data/.github/workflows/build_main.yml +2 -2
- data/.github/workflows/build_version.yml +1 -1
- data/.github/workflows/codeql-analysis.yml +1 -1
- data/.github/workflows/lint-push.yml +3 -5
- data/.github/workflows/lint.yml +1 -1
- data/.github/workflows/spec.yml +30 -0
- data/.lefthook/commit-msg/validator.rb +5 -0
- data/.rspec +2 -0
- data/.rspec_parallel +2 -0
- data/.rubocop.yml +43 -6
- data/Changelog.md +14 -1
- data/Gemfile +14 -8
- data/Rakefile +41 -26
- data/bin/console +3 -3
- data/docs/Examples.md +1 -1
- data/docs/application_command.md +138 -46
- data/docs/cli/irb.md +2 -2
- data/docs/cli/new.md +14 -9
- data/docs/cli/run.md +7 -11
- data/docs/cli.md +17 -10
- data/docs/events.md +209 -211
- data/docs/extension.md +1 -2
- data/docs/faq.md +0 -1
- data/docs/tutorial.md +12 -12
- data/docs/voice_events.md +106 -106
- data/examples/commands/message.rb +63 -0
- data/examples/commands/permission.rb +18 -0
- data/examples/commands/slash.rb +44 -0
- data/examples/commands/user.rb +51 -0
- data/examples/components/authorization_button.rb +2 -2
- data/examples/components/select_menu.rb +2 -2
- data/examples/extension/main.rb +1 -1
- data/examples/extension/message_expander.rb +5 -2
- data/examples/simple/eval.rb +2 -2
- data/examples/simple/ping_pong.rb +1 -1
- data/examples/simple/rolepanel.rb +1 -1
- data/examples/simple/shard.rb +1 -1
- data/examples/simple/wait_for_message.rb +1 -1
- data/exe/discorb +31 -16
- data/lefthook.yml +45 -0
- data/lib/discorb/allowed_mentions.rb +1 -0
- data/lib/discorb/app_command/command.rb +127 -65
- data/lib/discorb/app_command/common.rb +25 -0
- data/lib/discorb/app_command/handler.rb +115 -33
- data/lib/discorb/app_command.rb +2 -1
- data/lib/discorb/application.rb +1 -0
- data/lib/discorb/asset.rb +1 -2
- data/lib/discorb/attachment.rb +1 -1
- data/lib/discorb/audit_logs.rb +11 -8
- data/lib/discorb/channel/base.rb +108 -0
- data/lib/discorb/channel/category.rb +32 -0
- data/lib/discorb/channel/container.rb +44 -0
- data/lib/discorb/channel/dm.rb +28 -0
- data/lib/discorb/channel/guild.rb +245 -0
- data/lib/discorb/channel/stage.rb +140 -0
- data/lib/discorb/channel/text.rb +345 -0
- data/lib/discorb/channel/thread.rb +321 -0
- data/lib/discorb/channel/voice.rb +79 -0
- data/lib/discorb/channel.rb +2 -1165
- data/lib/discorb/client.rb +38 -26
- data/lib/discorb/common.rb +2 -1
- data/lib/discorb/components/button.rb +2 -1
- data/lib/discorb/components/select_menu.rb +4 -2
- data/lib/discorb/components/text_input.rb +12 -2
- data/lib/discorb/components.rb +1 -1
- data/lib/discorb/embed.rb +22 -7
- data/lib/discorb/emoji.rb +30 -3
- data/lib/discorb/emoji_table.rb +4969 -3
- data/lib/discorb/event.rb +29 -4
- data/lib/discorb/exe/about.rb +1 -0
- data/lib/discorb/exe/irb.rb +2 -4
- data/lib/discorb/exe/new.rb +90 -23
- data/lib/discorb/exe/run.rb +8 -22
- data/lib/discorb/exe/setup.rb +25 -12
- data/lib/discorb/exe/show.rb +4 -3
- data/lib/discorb/extend.rb +1 -0
- data/lib/discorb/extension.rb +6 -3
- data/lib/discorb/flag.rb +11 -0
- data/lib/discorb/gateway.rb +67 -19
- data/lib/discorb/guild.rb +188 -56
- data/lib/discorb/guild_template.rb +10 -4
- data/lib/discorb/http.rb +16 -9
- data/lib/discorb/integration.rb +4 -1
- data/lib/discorb/intents.rb +1 -1
- data/lib/discorb/interaction/autocomplete.rb +28 -16
- data/lib/discorb/interaction/command.rb +36 -12
- data/lib/discorb/interaction/components.rb +5 -2
- data/lib/discorb/interaction/modal.rb +0 -1
- data/lib/discorb/interaction/response.rb +61 -22
- data/lib/discorb/interaction/root.rb +13 -13
- data/lib/discorb/interaction.rb +1 -0
- data/lib/discorb/invite.rb +5 -2
- data/lib/discorb/member.rb +25 -5
- data/lib/discorb/message.rb +47 -14
- data/lib/discorb/message_meta.rb +1 -0
- data/lib/discorb/modules.rb +56 -14
- data/lib/discorb/presence.rb +2 -2
- data/lib/discorb/rate_limit.rb +7 -2
- data/lib/discorb/reaction.rb +4 -4
- data/lib/discorb/role.rb +19 -4
- data/lib/discorb/shard.rb +1 -1
- data/lib/discorb/sticker.rb +8 -7
- data/lib/discorb/user.rb +2 -1
- data/lib/discorb/utils/colored_puts.rb +1 -0
- data/lib/discorb/voice_state.rb +10 -6
- data/lib/discorb/webhook.rb +36 -24
- data/lib/discorb.rb +5 -3
- data/po/yard.pot +9 -9
- data/sig/discorb.rbs +7232 -7235
- metadata +21 -5
- data/examples/commands/bookmarker.rb +0 -42
- data/examples/commands/hello.rb +0 -10
- data/examples/commands/inspect.rb +0 -25
data/lib/discorb/http.rb
CHANGED
|
@@ -40,7 +40,8 @@ module Discorb
|
|
|
40
40
|
Async do |_task|
|
|
41
41
|
@ratelimit_handler.wait(path)
|
|
42
42
|
resp = if %i[post patch put].include? path.method
|
|
43
|
-
|
|
43
|
+
http.send(path.method, get_path(path), get_body(body), get_headers(headers, body, audit_log_reason),
|
|
44
|
+
**kwargs)
|
|
44
45
|
else
|
|
45
46
|
http.send(path.method, get_path(path), get_headers(headers, body, audit_log_reason), **kwargs)
|
|
46
47
|
end
|
|
@@ -69,18 +70,23 @@ module Discorb
|
|
|
69
70
|
def multipart_request(path, body, files, headers: nil, audit_log_reason: nil, **kwargs)
|
|
70
71
|
Async do |_task|
|
|
71
72
|
@ratelimit_handler.wait(path)
|
|
72
|
-
req = Net::HTTP.const_get(path.method.to_s.capitalize).new(
|
|
73
|
+
req = Net::HTTP.const_get(path.method.to_s.capitalize).new(
|
|
74
|
+
get_path(path),
|
|
75
|
+
get_headers(headers, body, audit_log_reason),
|
|
76
|
+
**kwargs,
|
|
77
|
+
)
|
|
73
78
|
data = [
|
|
74
79
|
["payload_json", get_body(body)],
|
|
75
80
|
]
|
|
76
81
|
files&.each_with_index do |file, i|
|
|
77
82
|
next if file.nil?
|
|
83
|
+
|
|
78
84
|
if file.created_by == :discord
|
|
79
85
|
request_io = StringIO.new(
|
|
80
86
|
cdn_http.get(URI.parse(file.url).path, {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
"Content-Type" => nil,
|
|
88
|
+
"User-Agent" => Discorb::USER_AGENT,
|
|
89
|
+
}).body
|
|
84
90
|
)
|
|
85
91
|
data << ["files[#{i}]", request_io, { filename: file.filename, content_type: file.content_type }]
|
|
86
92
|
else
|
|
@@ -125,10 +131,10 @@ module Discorb
|
|
|
125
131
|
|
|
126
132
|
def get_headers(headers, body = "", audit_log_reason = nil)
|
|
127
133
|
ret = if body.nil? || body == ""
|
|
128
|
-
|
|
134
|
+
{ "User-Agent" => USER_AGENT, "authorization" => "Bot #{@client.token}" }
|
|
129
135
|
else
|
|
130
136
|
{ "User-Agent" => USER_AGENT, "authorization" => "Bot #{@client.token}",
|
|
131
|
-
"content-type" => "application/json" }
|
|
137
|
+
"content-type" => "application/json", }
|
|
132
138
|
end
|
|
133
139
|
ret.merge!(headers) if !headers.nil? && headers.length.positive?
|
|
134
140
|
ret["X-Audit-Log-Reason"] = audit_log_reason unless audit_log_reason.nil?
|
|
@@ -147,7 +153,7 @@ module Discorb
|
|
|
147
153
|
|
|
148
154
|
def get_path(path)
|
|
149
155
|
full_path = if path.url.start_with?("https://")
|
|
150
|
-
|
|
156
|
+
path.url
|
|
151
157
|
else
|
|
152
158
|
API_BASE_URL + path.url
|
|
153
159
|
end
|
|
@@ -160,12 +166,13 @@ module Discorb
|
|
|
160
166
|
data = JSON.parse(resp.body, symbolize_names: true)
|
|
161
167
|
rescue JSON::ParserError, TypeError
|
|
162
168
|
data = if resp.body.nil? || resp.body.empty?
|
|
163
|
-
|
|
169
|
+
nil
|
|
164
170
|
else
|
|
165
171
|
resp.body
|
|
166
172
|
end
|
|
167
173
|
end
|
|
168
174
|
raise CloudFlareBanError.new(resp, @client) if resp["Via"].nil? && resp.code == "429" && data.is_a?(String)
|
|
175
|
+
|
|
169
176
|
data
|
|
170
177
|
end
|
|
171
178
|
|
data/lib/discorb/integration.rb
CHANGED
|
@@ -74,7 +74,10 @@ module Discorb
|
|
|
74
74
|
#
|
|
75
75
|
def delete!(reason: nil)
|
|
76
76
|
Async do
|
|
77
|
-
@client.http.request(
|
|
77
|
+
@client.http.request(
|
|
78
|
+
Route.new("/guilds/#{@guild}/integrations/#{@id}", "//guilds/:guild_id/integrations/:integration_id",
|
|
79
|
+
:delete), {}, audit_log_reason: reason
|
|
80
|
+
).wait
|
|
78
81
|
end
|
|
79
82
|
end
|
|
80
83
|
|
data/lib/discorb/intents.rb
CHANGED
|
@@ -47,7 +47,7 @@ module Discorb
|
|
|
47
47
|
#
|
|
48
48
|
# @note You must enable privileged intents to use `members` and/or `presences` intents.
|
|
49
49
|
# @note Message Content Intent is not required to use `message_content` intents for now,
|
|
50
|
-
# this will be required in
|
|
50
|
+
# this will be required in September 1, 2022. [Learn More](https://support-dev.discord.com/hc/en-us/articles/4404772028055).
|
|
51
51
|
# You should specify `message_content` intent for preventing unexpected changes in the future.
|
|
52
52
|
#
|
|
53
53
|
def initialize(guilds: true,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Discorb
|
|
3
4
|
#
|
|
4
5
|
# Represents auto complete interaction.
|
|
@@ -12,35 +13,46 @@ module Discorb
|
|
|
12
13
|
def _set_data(data)
|
|
13
14
|
super
|
|
14
15
|
Sync do
|
|
15
|
-
name, options = Discorb::CommandInteraction::
|
|
16
|
+
name, options = Discorb::CommandInteraction::ChatInputCommand.get_command_data(data)
|
|
16
17
|
|
|
17
|
-
unless (command = @client.
|
|
18
|
+
unless (command = @client.callable_commands.find { |c| c.to_s == name && c.type_raw == 1 })
|
|
18
19
|
@client.logger.warn "Unknown command name #{name}, ignoring"
|
|
19
20
|
next
|
|
20
21
|
end
|
|
21
22
|
|
|
22
23
|
option_map = command.options.to_h { |k, v| [k.to_s, v[:default]] }
|
|
23
|
-
Discorb::CommandInteraction::
|
|
24
|
+
Discorb::CommandInteraction::ChatInputCommand.modify_option_map(option_map, options, guild, {}, {})
|
|
24
25
|
focused_index = options.find_index { |o| o[:focused] }
|
|
25
|
-
val = command.options.values.filter
|
|
26
|
+
val = command.options.values.filter do |option|
|
|
27
|
+
option[:type] != :attachment
|
|
28
|
+
end[focused_index][:autocomplete]&.call(self, *command.options.map do |k, _v|
|
|
29
|
+
option_map[k.to_s]
|
|
30
|
+
end)
|
|
26
31
|
send_complete_result(val)
|
|
27
32
|
end
|
|
28
33
|
end
|
|
29
34
|
|
|
30
35
|
def send_complete_result(val)
|
|
31
|
-
@client.http.request(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
@client.http.request(
|
|
37
|
+
Route.new(
|
|
38
|
+
"/interactions/#{@id}/#{@token}/callback",
|
|
39
|
+
"//interactions/:interaction_id/:token/callback",
|
|
40
|
+
:post
|
|
41
|
+
), {
|
|
42
|
+
type: 8,
|
|
43
|
+
data: {
|
|
44
|
+
choices: val.map do |vk, vv|
|
|
45
|
+
{
|
|
46
|
+
name: vk,
|
|
47
|
+
value: vv,
|
|
48
|
+
}
|
|
49
|
+
end,
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
).wait
|
|
42
53
|
rescue Discorb::NotFoundError
|
|
43
|
-
@client.logger.warn "Failed to send auto complete result,
|
|
54
|
+
@client.logger.warn "Failed to send auto complete result, " \
|
|
55
|
+
"This may be caused by the suggestion is taking too long (over 3 seconds) to respond"
|
|
44
56
|
end
|
|
45
57
|
|
|
46
58
|
class << self
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Discorb
|
|
3
4
|
#
|
|
4
5
|
# Represents a command interaction.
|
|
@@ -12,7 +13,7 @@ module Discorb
|
|
|
12
13
|
#
|
|
13
14
|
# Represents a slash command interaction.
|
|
14
15
|
#
|
|
15
|
-
class
|
|
16
|
+
class ChatInputCommand < CommandInteraction
|
|
16
17
|
@command_type = 1
|
|
17
18
|
@event_name = :slash_command
|
|
18
19
|
|
|
@@ -21,15 +22,15 @@ module Discorb
|
|
|
21
22
|
def _set_data(data)
|
|
22
23
|
super
|
|
23
24
|
|
|
24
|
-
name, options =
|
|
25
|
+
name, options = ChatInputCommand.get_command_data(data)
|
|
25
26
|
|
|
26
|
-
unless (command = @client.
|
|
27
|
+
unless (command = @client.callable_commands.find { |c| c.to_s == name && c.type_raw == 1 })
|
|
27
28
|
@client.logger.warn "Unknown command name #{name}, ignoring"
|
|
28
29
|
return
|
|
29
30
|
end
|
|
30
31
|
|
|
31
32
|
option_map = command.options.to_h { |k, v| [k.to_s, v[:default]] }
|
|
32
|
-
|
|
33
|
+
ChatInputCommand.modify_option_map(option_map, options, guild, @members, @attachments)
|
|
33
34
|
|
|
34
35
|
command.block.call(self, *command.options.map { |k, _v| option_map[k.to_s] })
|
|
35
36
|
end
|
|
@@ -84,11 +85,19 @@ module Discorb
|
|
|
84
85
|
when 6
|
|
85
86
|
members[option[:value]] || guild.members[option[:value]] || guild.fetch_member(option[:value]).wait
|
|
86
87
|
when 7
|
|
87
|
-
guild.channels[option[:value]] || guild.fetch_channels.wait.find
|
|
88
|
+
guild.channels[option[:value]] || guild.fetch_channels.wait.find do |channel|
|
|
89
|
+
channel.id == option[:value]
|
|
90
|
+
end
|
|
88
91
|
when 8
|
|
89
92
|
guild.roles[option[:value]] || guild.fetch_roles.wait.find { |role| role.id == option[:value] }
|
|
90
93
|
when 9
|
|
91
|
-
members[option[:value]] ||
|
|
94
|
+
members[option[:value]] ||
|
|
95
|
+
guild.members[option[:value]] ||
|
|
96
|
+
guild.roles[option[:value]] ||
|
|
97
|
+
guild.fetch_member(option[:value]).wait ||
|
|
98
|
+
guild.fetch_roles.wait.find do |role|
|
|
99
|
+
role.id == option[:value]
|
|
100
|
+
end
|
|
92
101
|
when 11
|
|
93
102
|
attachments[option[:value]]
|
|
94
103
|
end
|
|
@@ -112,8 +121,17 @@ module Discorb
|
|
|
112
121
|
|
|
113
122
|
def _set_data(data)
|
|
114
123
|
super
|
|
115
|
-
@target = guild.members[data[:target_id]] || Discorb::Member.new(
|
|
116
|
-
|
|
124
|
+
@target = guild.members[data[:target_id]] || Discorb::Member.new(
|
|
125
|
+
@client, @guild_id,
|
|
126
|
+
data[:resolved][:users][data[:target_id].to_sym],
|
|
127
|
+
data[:resolved][:members][data[:target_id].to_sym]
|
|
128
|
+
)
|
|
129
|
+
command = @client.commands.find { |c| c.name["default"] == data[:name] && c.type_raw == 2 }
|
|
130
|
+
if command
|
|
131
|
+
command.block.call(self, @target)
|
|
132
|
+
else
|
|
133
|
+
@client.logger.warn "Unknown command name #{data[:name]}, ignoring"
|
|
134
|
+
end
|
|
117
135
|
end
|
|
118
136
|
end
|
|
119
137
|
|
|
@@ -132,7 +150,12 @@ module Discorb
|
|
|
132
150
|
def _set_data(data)
|
|
133
151
|
super
|
|
134
152
|
@target = @messages[data[:target_id]]
|
|
135
|
-
@client.commands.find { |c| c.name == data[:name] && c.type_raw == 3 }
|
|
153
|
+
command = @client.commands.find { |c| c.name["default"] == data[:name] && c.type_raw == 3 }
|
|
154
|
+
if command
|
|
155
|
+
command.block.call(self, @target)
|
|
156
|
+
else
|
|
157
|
+
@client.logger.warn "Unknown command name #{data[:name]}, ignoring"
|
|
158
|
+
end
|
|
136
159
|
end
|
|
137
160
|
end
|
|
138
161
|
|
|
@@ -152,10 +175,11 @@ module Discorb
|
|
|
152
175
|
@client, @guild_id, data[:resolved][:users][id], member
|
|
153
176
|
)
|
|
154
177
|
end
|
|
155
|
-
|
|
156
|
-
|
|
178
|
+
|
|
179
|
+
data[:resolved][:messages]&.each do |id, message|
|
|
180
|
+
@messages[id.to_s] = Message.new(@client, message.merge(guild_id: @guild_id.to_s))
|
|
157
181
|
end
|
|
158
|
-
data[:resolved][:attachments]&.
|
|
182
|
+
data[:resolved][:attachments]&.each do |id, attachment|
|
|
159
183
|
@attachments[id.to_s] = Attachment.new(attachment)
|
|
160
184
|
end
|
|
161
185
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
module Discorb
|
|
3
2
|
|
|
3
|
+
module Discorb
|
|
4
4
|
#
|
|
5
5
|
# Represents a message component interaction.
|
|
6
6
|
# @abstract
|
|
@@ -41,7 +41,10 @@ module Discorb
|
|
|
41
41
|
#
|
|
42
42
|
def make_interaction(client, data)
|
|
43
43
|
nested_classes.each do |klass|
|
|
44
|
-
|
|
44
|
+
if !klass.component_type.nil? && klass.component_type == data[:data][:component_type]
|
|
45
|
+
return klass.new(client,
|
|
46
|
+
data)
|
|
47
|
+
end
|
|
45
48
|
end
|
|
46
49
|
client.logger.warn("Unknown component type #{data[:component_type]}, initialized Interaction")
|
|
47
50
|
MessageComponentInteraction.new(client, data)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Discorb
|
|
3
4
|
#
|
|
4
5
|
# Represents an interaction of Discord.
|
|
@@ -19,12 +20,18 @@ module Discorb
|
|
|
19
20
|
#
|
|
20
21
|
def defer_source(ephemeral: false)
|
|
21
22
|
Async do
|
|
22
|
-
@client.http.request(
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
@client.http.request(
|
|
24
|
+
Route.new(
|
|
25
|
+
"/interactions/#{@id}/#{@token}/callback",
|
|
26
|
+
"//interactions/:interaction_id/:token/callback",
|
|
27
|
+
:post
|
|
28
|
+
), {
|
|
29
|
+
type: 5,
|
|
30
|
+
data: {
|
|
31
|
+
flags: (ephemeral ? 1 << 6 : 0),
|
|
32
|
+
},
|
|
33
|
+
}
|
|
34
|
+
).wait
|
|
28
35
|
@defered = true
|
|
29
36
|
end
|
|
30
37
|
end
|
|
@@ -42,27 +49,45 @@ module Discorb
|
|
|
42
49
|
# @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
|
|
43
50
|
# @param [Boolean] ephemeral Whether to make the response ephemeral.
|
|
44
51
|
#
|
|
45
|
-
# @return [Discorb::Interaction::SourceResponder::CallbackMessage, Discorb::Webhook::Message]
|
|
52
|
+
# @return [Discorb::Interaction::SourceResponder::CallbackMessage, Discorb::Webhook::Message]
|
|
53
|
+
# The callback message.
|
|
46
54
|
#
|
|
47
|
-
def post(
|
|
55
|
+
def post(
|
|
56
|
+
content = nil,
|
|
57
|
+
tts: false,
|
|
58
|
+
embed: nil,
|
|
59
|
+
embeds: nil,
|
|
60
|
+
allowed_mentions: nil,
|
|
61
|
+
components: nil,
|
|
62
|
+
ephemeral: false
|
|
63
|
+
)
|
|
48
64
|
Async do
|
|
49
65
|
payload = {}
|
|
50
66
|
payload[:content] = content if content
|
|
51
67
|
payload[:tts] = tts
|
|
52
68
|
payload[:embeds] = (embeds || [embed]).map { |e| e&.to_hash }.filter { _1 }
|
|
53
|
-
payload[:allowed_mentions] =
|
|
69
|
+
payload[:allowed_mentions] =
|
|
70
|
+
allowed_mentions&.to_hash(@client.allowed_mentions) || @client.allowed_mentions.to_hash
|
|
54
71
|
payload[:components] = Component.to_payload(components) if components
|
|
55
72
|
payload[:flags] = (ephemeral ? 1 << 6 : 0)
|
|
56
73
|
|
|
57
74
|
ret = if @responded
|
|
58
|
-
_resp, data = @client.http.request(
|
|
75
|
+
_resp, data = @client.http.request(
|
|
76
|
+
Route.new("/webhooks/#{@application_id}/#{@token}", "//webhooks/:webhook_id/:token", :post), payload
|
|
77
|
+
).wait
|
|
59
78
|
webhook = Webhook::URLWebhook.new("/webhooks/#{@application_id}/#{@token}")
|
|
60
79
|
Webhook::Message.new(webhook, data, @client)
|
|
61
80
|
elsif @defered
|
|
62
|
-
@client.http.request(
|
|
81
|
+
@client.http.request(
|
|
82
|
+
Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original",
|
|
83
|
+
"//webhooks/:webhook_id/:token/messages/@original", :patch), payload
|
|
84
|
+
).wait
|
|
63
85
|
CallbackMessage.new(@client, payload, @application_id, @token)
|
|
64
86
|
else
|
|
65
|
-
@client.http.request(
|
|
87
|
+
@client.http.request(
|
|
88
|
+
Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback",
|
|
89
|
+
:post), { type: 4, data: payload }
|
|
90
|
+
).wait
|
|
66
91
|
CallbackMessage.new(@client, payload, @application_id, @token)
|
|
67
92
|
end
|
|
68
93
|
@responded = true
|
|
@@ -118,7 +143,10 @@ module Discorb
|
|
|
118
143
|
payload[:attachments] = attachments.map(&:to_hash) if attachments != Discorb::Unset
|
|
119
144
|
files = [file] if file != Discorb::Unset
|
|
120
145
|
files = [] if files == Discorb::Unset
|
|
121
|
-
@client.http.multipart_request(
|
|
146
|
+
@client.http.multipart_request(
|
|
147
|
+
Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original",
|
|
148
|
+
"//webhooks/:webhook_id/:token/messages/@original", :patch), payload, files, headers: headers,
|
|
149
|
+
).wait
|
|
122
150
|
end
|
|
123
151
|
end
|
|
124
152
|
|
|
@@ -133,7 +161,8 @@ module Discorb
|
|
|
133
161
|
#
|
|
134
162
|
def delete!
|
|
135
163
|
Async do
|
|
136
|
-
@client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original",
|
|
164
|
+
@client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original",
|
|
165
|
+
"//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
|
|
137
166
|
end
|
|
138
167
|
end
|
|
139
168
|
|
|
@@ -157,12 +186,18 @@ module Discorb
|
|
|
157
186
|
#
|
|
158
187
|
def defer_update(ephemeral: false)
|
|
159
188
|
Async do
|
|
160
|
-
@client.http.request(
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
189
|
+
@client.http.request(
|
|
190
|
+
Route.new(
|
|
191
|
+
"/interactions/#{@id}/#{@token}/callback",
|
|
192
|
+
"//interactions/:interaction_id/:token/callback",
|
|
193
|
+
:post
|
|
194
|
+
), {
|
|
195
|
+
type: 6,
|
|
196
|
+
data: {
|
|
197
|
+
flags: (ephemeral ? 1 << 6 : 0),
|
|
198
|
+
},
|
|
199
|
+
}
|
|
200
|
+
).wait
|
|
166
201
|
end
|
|
167
202
|
end
|
|
168
203
|
|
|
@@ -192,10 +227,14 @@ module Discorb
|
|
|
192
227
|
embeds
|
|
193
228
|
end
|
|
194
229
|
payload[:embeds] = tmp_embed.map(&:to_hash) if tmp_embed
|
|
195
|
-
payload[:allowed_mentions] =
|
|
230
|
+
payload[:allowed_mentions] =
|
|
231
|
+
allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
|
|
196
232
|
payload[:components] = Component.to_payload(components) if components
|
|
197
233
|
payload[:flags] = (ephemeral ? 1 << 6 : 0)
|
|
198
|
-
@client.http.request(
|
|
234
|
+
@client.http.request(
|
|
235
|
+
Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback",
|
|
236
|
+
:post), { type: 7, data: payload }
|
|
237
|
+
).wait
|
|
199
238
|
end
|
|
200
239
|
end
|
|
201
240
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Discorb
|
|
3
4
|
#
|
|
4
5
|
# Represents a user interaction with the bot.
|
|
@@ -10,10 +11,9 @@ module Discorb
|
|
|
10
11
|
attr_reader :application_id
|
|
11
12
|
# @return [Symbol] The type of interaction.
|
|
12
13
|
attr_reader :type
|
|
13
|
-
# @return [Discorb::Member] The member that created the interaction.
|
|
14
|
-
attr_reader :member
|
|
15
|
-
# @return [Discorb::User] The user that created the interaction.
|
|
14
|
+
# @return [Discorb::User, Discorb::Member] The user or member that created the interaction.
|
|
16
15
|
attr_reader :user
|
|
16
|
+
alias member user
|
|
17
17
|
# @return [Integer] The type of interaction.
|
|
18
18
|
# @note This is always `1` for now.
|
|
19
19
|
attr_reader :version
|
|
@@ -53,8 +53,12 @@ module Discorb
|
|
|
53
53
|
@type_id = self.class.interaction_type
|
|
54
54
|
@guild_id = data[:guild_id] && Snowflake.new(data[:guild_id])
|
|
55
55
|
@channel_id = data[:channel_id] && Snowflake.new(data[:channel_id])
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
if data[:member]
|
|
57
|
+
@user = guild.members[data[:member][:id]] || Member.new(@client, @guild_id, data[:member][:user],
|
|
58
|
+
data[:member])
|
|
59
|
+
elsif data[:user]
|
|
60
|
+
@user = @client.users[data[:user][:id]] || User.new(@client, data[:user])
|
|
61
|
+
end
|
|
58
62
|
@token = data[:token]
|
|
59
63
|
@locale = data[:locale].to_s.gsub("-", "_").to_sym
|
|
60
64
|
@guild_locale = data[:guild_locale].to_s.gsub("-", "_").to_sym
|
|
@@ -72,13 +76,6 @@ module Discorb
|
|
|
72
76
|
@client.channels[@channel_id]
|
|
73
77
|
end
|
|
74
78
|
|
|
75
|
-
def target
|
|
76
|
-
@member || @user
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
alias fired_by target
|
|
80
|
-
alias from target
|
|
81
|
-
|
|
82
79
|
def inspect
|
|
83
80
|
"#<#{self.class} id=#{@id}>"
|
|
84
81
|
end
|
|
@@ -97,7 +94,10 @@ module Discorb
|
|
|
97
94
|
def make_interaction(client, data)
|
|
98
95
|
interaction = nil
|
|
99
96
|
descendants.each do |klass|
|
|
100
|
-
|
|
97
|
+
if !klass.interaction_type.nil? && klass.interaction_type == data[:type]
|
|
98
|
+
interaction = klass.make_interaction(client,
|
|
99
|
+
data)
|
|
100
|
+
end
|
|
101
101
|
end
|
|
102
102
|
if interaction.nil?
|
|
103
103
|
client.logger.warn("Unknown interaction type #{data[:type]}, initialized Interaction")
|
data/lib/discorb/interaction.rb
CHANGED
data/lib/discorb/invite.rb
CHANGED
|
@@ -114,7 +114,7 @@ module Discorb
|
|
|
114
114
|
#
|
|
115
115
|
def delete!(reason: nil)
|
|
116
116
|
Async do
|
|
117
|
-
@client.http.request(Route.new("/invites/#{@code}", "//invites/:code", :delete), audit_log_reason: reason)
|
|
117
|
+
@client.http.request(Route.new("/invites/#{@code}", "//invites/:code", :delete), {}, audit_log_reason: reason)
|
|
118
118
|
end
|
|
119
119
|
end
|
|
120
120
|
|
|
@@ -134,7 +134,10 @@ module Discorb
|
|
|
134
134
|
end
|
|
135
135
|
@inviter_data = data[:inviter]
|
|
136
136
|
@target_type = TARGET_TYPES[data[:target_type]]
|
|
137
|
-
|
|
137
|
+
if data[:target_user]
|
|
138
|
+
@target_user = @client.users[data[:target_user][:id]] || User.new(@client,
|
|
139
|
+
data[:target_user])
|
|
140
|
+
end
|
|
138
141
|
# @target_application = nil
|
|
139
142
|
|
|
140
143
|
# @stage_instance = data[:stage_instance] && Invite::StageInstance.new(self, data[:stage_instance])
|
data/lib/discorb/member.rb
CHANGED
|
@@ -114,6 +114,7 @@ module Discorb
|
|
|
114
114
|
|
|
115
115
|
def permissions
|
|
116
116
|
return Permission.new((1 << 38) - 1) if owner?
|
|
117
|
+
|
|
117
118
|
roles.map(&:permissions).sum(Permission.new(0))
|
|
118
119
|
end
|
|
119
120
|
|
|
@@ -158,7 +159,10 @@ module Discorb
|
|
|
158
159
|
#
|
|
159
160
|
def add_role(role, reason: nil)
|
|
160
161
|
Async do
|
|
161
|
-
@client.http.request(
|
|
162
|
+
@client.http.request(
|
|
163
|
+
Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}",
|
|
164
|
+
"//guilds/:guild_id/members/:user_id/roles/:role_id", :put), nil, audit_log_reason: reason,
|
|
165
|
+
).wait
|
|
162
166
|
end
|
|
163
167
|
end
|
|
164
168
|
|
|
@@ -173,7 +177,10 @@ module Discorb
|
|
|
173
177
|
#
|
|
174
178
|
def remove_role(role, reason: nil)
|
|
175
179
|
Async do
|
|
176
|
-
@client.http.request(
|
|
180
|
+
@client.http.request(
|
|
181
|
+
Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}",
|
|
182
|
+
"//guilds/:guild_id/members/:user_id/roles/:role_id", :delete), {}, audit_log_reason: reason,
|
|
183
|
+
).wait
|
|
177
184
|
end
|
|
178
185
|
end
|
|
179
186
|
|
|
@@ -194,7 +201,13 @@ module Discorb
|
|
|
194
201
|
# @return [Async::Task<void>] The task.
|
|
195
202
|
#
|
|
196
203
|
def edit(
|
|
197
|
-
nick: Discorb::Unset,
|
|
204
|
+
nick: Discorb::Unset,
|
|
205
|
+
role: Discorb::Unset,
|
|
206
|
+
mute: Discorb::Unset,
|
|
207
|
+
deaf: Discorb::Unset,
|
|
208
|
+
channel: Discorb::Unset,
|
|
209
|
+
communication_disabled_until: Discorb::Unset,
|
|
210
|
+
timeout_until: Discorb::Unset,
|
|
198
211
|
reason: nil
|
|
199
212
|
)
|
|
200
213
|
Async do
|
|
@@ -204,9 +217,15 @@ module Discorb
|
|
|
204
217
|
payload[:mute] = mute if mute != Discorb::Unset
|
|
205
218
|
payload[:deaf] = deaf if deaf != Discorb::Unset
|
|
206
219
|
communication_disabled_until = timeout_until if timeout_until != Discorb::Unset
|
|
207
|
-
|
|
220
|
+
if communication_disabled_until != Discorb::Unset
|
|
221
|
+
payload[:communication_disabled_until] =
|
|
222
|
+
communication_disabled_until&.iso8601
|
|
223
|
+
end
|
|
208
224
|
payload[:channel_id] = channel&.id if channel != Discorb::Unset
|
|
209
|
-
@client.http.request(
|
|
225
|
+
@client.http.request(
|
|
226
|
+
Route.new("/guilds/#{@guild_id}/members/#{@id}", "//guilds/:guild_id/members/:user_id",
|
|
227
|
+
:patch), payload, audit_log_reason: reason,
|
|
228
|
+
).wait
|
|
210
229
|
end
|
|
211
230
|
end
|
|
212
231
|
|
|
@@ -265,6 +284,7 @@ module Discorb
|
|
|
265
284
|
#
|
|
266
285
|
def can_manage?(role)
|
|
267
286
|
return true if owner?
|
|
287
|
+
|
|
268
288
|
top_role = roles.max_by(&:position)
|
|
269
289
|
top_role.position > role.position
|
|
270
290
|
end
|