discorb 0.13.3 → 0.13.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +128 -0
- data/Changelog.md +8 -0
- data/lib/discorb/app_command.rb +24 -2
- data/lib/discorb/channel.rb +42 -49
- data/lib/discorb/client.rb +7 -7
- data/lib/discorb/common.rb +30 -1
- data/lib/discorb/dictionary.rb +10 -2
- data/lib/discorb/emoji.rb +2 -2
- data/lib/discorb/event.rb +4 -4
- data/lib/discorb/gateway.rb +26 -5
- data/lib/discorb/guild.rb +47 -67
- data/lib/discorb/guild_template.rb +3 -3
- data/lib/discorb/http.rb +25 -158
- data/lib/discorb/integration.rb +1 -1
- data/lib/discorb/interaction/autocomplete.rb +1 -1
- data/lib/discorb/interaction/response.rb +8 -8
- data/lib/discorb/invite.rb +1 -1
- data/lib/discorb/log.rb +3 -2
- data/lib/discorb/member.rb +3 -3
- data/lib/discorb/message.rb +5 -5
- data/lib/discorb/modules.rb +10 -10
- data/lib/discorb/presence.rb +2 -2
- data/lib/discorb/rate_limit.rb +14 -18
- data/lib/discorb/role.rb +3 -3
- data/lib/discorb/sticker.rb +2 -2
- data/lib/discorb/user.rb +3 -3
- data/lib/discorb/voice_state.rb +4 -2
- data/lib/discorb/webhook.rb +8 -5
- metadata +3 -2
data/lib/discorb/http.rb
CHANGED
@@ -17,10 +17,11 @@ module Discorb
|
|
17
17
|
end
|
18
18
|
|
19
19
|
#
|
20
|
-
# Execute a
|
20
|
+
# Execute a request.
|
21
21
|
# @async
|
22
22
|
#
|
23
|
-
# @param [
|
23
|
+
# @param [Discorb::Route] path The path to the resource.
|
24
|
+
# @param [String, Hash] body The body of the request. Defaults to an empty string.
|
24
25
|
# @param [Hash] headers The headers to send with the request.
|
25
26
|
# @param [String] audit_log_reason The audit log reason to send with the request.
|
26
27
|
# @param [Hash] kwargs The keyword arguments.
|
@@ -30,46 +31,25 @@ module Discorb
|
|
30
31
|
#
|
31
32
|
# @raise [Discorb::HTTPError] The request was failed.
|
32
33
|
#
|
33
|
-
def
|
34
|
+
def request(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
34
35
|
Async do |task|
|
35
|
-
@ratelimit_handler.wait(
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
#
|
44
|
-
# Execute a POST request.
|
45
|
-
# @async
|
46
|
-
#
|
47
|
-
# @param [String] path The path to the resource.
|
48
|
-
# @param [String, Hash] body The body of the request.
|
49
|
-
# @param [Hash] headers The headers to send with the request.
|
50
|
-
# @param [String] audit_log_reason The audit log reason to send with the request.
|
51
|
-
# @param [Hash] kwargs The keyword arguments.
|
52
|
-
#
|
53
|
-
# @return [Async::Task<Array(Net::HTTPResponse, Hash)>] The response and as JSON.
|
54
|
-
# @return [Async::Task<Array(Net::HTTPResponse, nil)>] The response was 204.
|
55
|
-
#
|
56
|
-
# @raise [Discorb::HTTPError] The request was failed.
|
57
|
-
#
|
58
|
-
def post(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
59
|
-
Async do |task|
|
60
|
-
@ratelimit_handler.wait("POST", path)
|
61
|
-
resp = http.post(get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
36
|
+
@ratelimit_handler.wait(path)
|
37
|
+
if %i[post patch put].include? path.method
|
38
|
+
resp = http.send(path.method, get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
39
|
+
else
|
40
|
+
resp = http.send(path.method, get_path(path), get_headers(headers, body, audit_log_reason), **kwargs)
|
41
|
+
end
|
62
42
|
data = get_response_data(resp)
|
63
|
-
@ratelimit_handler.save(
|
64
|
-
handle_response(
|
43
|
+
@ratelimit_handler.save(path, resp)
|
44
|
+
handle_response(resp, data, path, body, headers, audit_log_reason, kwargs)
|
65
45
|
end
|
66
46
|
end
|
67
47
|
|
68
48
|
#
|
69
|
-
# Execute a multipart
|
49
|
+
# Execute a multipart request.
|
70
50
|
# @async
|
71
51
|
#
|
72
|
-
# @param [
|
52
|
+
# @param [Discorb::Route] path The path to the resource.
|
73
53
|
# @param [String, Hash] body The body of the request.
|
74
54
|
# @param [Array<Discorb::File>] files The files to upload.
|
75
55
|
# @param [Hash] headers The headers to send with the request.
|
@@ -81,10 +61,10 @@ module Discorb
|
|
81
61
|
#
|
82
62
|
# @raise [Discorb::HTTPError] The request was failed.
|
83
63
|
#
|
84
|
-
def
|
64
|
+
def multipart_request(path, body = "", files, headers: nil, audit_log_reason: nil, **kwargs)
|
85
65
|
Async do |task|
|
86
|
-
@ratelimit_handler.wait(
|
87
|
-
req = Net::HTTP
|
66
|
+
@ratelimit_handler.wait(path)
|
67
|
+
req = Net::HTTP.const_get(path.method.to_s.capitalize).new(get_path(path), get_headers(headers, body, audit_log_reason), **kwargs)
|
88
68
|
data = [
|
89
69
|
["payload_json", get_body(body)],
|
90
70
|
]
|
@@ -97,117 +77,8 @@ module Discorb
|
|
97
77
|
session.use_ssl = true
|
98
78
|
resp = session.request(req)
|
99
79
|
data = get_response_data(resp)
|
100
|
-
@ratelimit_handler.save(
|
101
|
-
handle_response(
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
#
|
106
|
-
# Execute a PATCH request.
|
107
|
-
# @async
|
108
|
-
#
|
109
|
-
# @param [String] path The path to the resource.
|
110
|
-
# @param [String, Hash] body The body of the request.
|
111
|
-
# @param [Hash] headers The headers to send with the request.
|
112
|
-
# @param [String] audit_log_reason The audit log reason to send with the request.
|
113
|
-
# @param [Hash] kwargs The keyword arguments.
|
114
|
-
#
|
115
|
-
# @return [Async::Task<Array(Net::HTTPResponse, Hash)>] The response and as JSON.
|
116
|
-
# @return [Async::Task<Array(Net::HTTPResponse, nil)>] The response was 204.
|
117
|
-
#
|
118
|
-
# @raise [Discorb::HTTPError] The request was failed.
|
119
|
-
#
|
120
|
-
def patch(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
121
|
-
Async do |task|
|
122
|
-
@ratelimit_handler.wait("PATCH", path)
|
123
|
-
resp = http.patch(get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
124
|
-
data = get_response_data(resp)
|
125
|
-
@ratelimit_handler.save("PATCH", path, resp)
|
126
|
-
handle_response(:patch, resp, data, path, body, headers, audit_log_reason, kwargs)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
#
|
131
|
-
# Execute a PATCH request.
|
132
|
-
# @async
|
133
|
-
#
|
134
|
-
# @param [String] path The path to the resource.
|
135
|
-
# @param [String, Hash] body The body of the request.
|
136
|
-
# @param [Hash] headers The headers to send with the request.
|
137
|
-
# @param [String] audit_log_reason The audit log reason to send with the request.
|
138
|
-
# @param [Hash] kwargs The keyword arguments.
|
139
|
-
#
|
140
|
-
# @return [Async::Task<Array(Net::HTTPResponse, Hash)>] The response and as JSON.
|
141
|
-
# @return [Async::Task<Array(Net::HTTPResponse, nil)>] The response was 204.
|
142
|
-
#
|
143
|
-
# @raise [Discorb::HTTPError] The request was failed.
|
144
|
-
#
|
145
|
-
def multipart_patch(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
146
|
-
Async do |task|
|
147
|
-
@ratelimit_handler.wait("PATCH", path)
|
148
|
-
req = Net::HTTP::Patch.new(get_path(path), get_headers(headers, body, audit_log_reason), **kwargs)
|
149
|
-
data = [
|
150
|
-
["payload_json", get_body(body)],
|
151
|
-
]
|
152
|
-
files&.each_with_index do |file, i|
|
153
|
-
data << ["files[#{i}]", file.io, { filename: file.filename, content_type: file.content_type }]
|
154
|
-
end
|
155
|
-
req.set_form(data, "multipart/form-data")
|
156
|
-
session = Net::HTTP.new("discord.com", 443)
|
157
|
-
session.use_ssl = true
|
158
|
-
resp = session.request(req)
|
159
|
-
data = get_response_data(resp)
|
160
|
-
@ratelimit_handler.save("PATCH", path, resp)
|
161
|
-
handle_response(:patch, resp, data, path, body, headers, audit_log_reason, kwargs)
|
162
|
-
end
|
163
|
-
end
|
164
|
-
|
165
|
-
#
|
166
|
-
# Execute a PUT request.
|
167
|
-
# @async
|
168
|
-
#
|
169
|
-
# @param [String] path The path to the resource.
|
170
|
-
# @param [String, Hash] body The body of the request.
|
171
|
-
# @param [Hash] headers The headers to send with the request.
|
172
|
-
# @param [String] audit_log_reason The audit log reason to send with the request.
|
173
|
-
# @param [Hash] kwargs The keyword arguments.
|
174
|
-
#
|
175
|
-
# @return [Async::Task<Array(Net::HTTPResponse, Hash)>] The response and as JSON.
|
176
|
-
# @return [Async::Task<Array(Net::HTTPResponse, nil)>] The response was 204.
|
177
|
-
#
|
178
|
-
# @raise [Discorb::HTTPError] The request was failed.
|
179
|
-
#
|
180
|
-
def put(path, body = "", headers: nil, audit_log_reason: nil, **kwargs)
|
181
|
-
Async do |task|
|
182
|
-
@ratelimit_handler.wait("PUT", path)
|
183
|
-
resp = http.put(get_path(path), get_body(body), get_headers(headers, body, audit_log_reason), **kwargs)
|
184
|
-
data = get_response_data(resp)
|
185
|
-
@ratelimit_handler.save("PUT", path, resp)
|
186
|
-
handle_response(:put, resp, data, path, body, headers, audit_log_reason, kwargs)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
#
|
191
|
-
# Execute a DELETE request.
|
192
|
-
# @async
|
193
|
-
#
|
194
|
-
# @param [String] path The path to the resource.
|
195
|
-
# @param [Hash] headers The headers to send with the request.
|
196
|
-
# @param [String] audit_log_reason The audit log reason to send with the request.
|
197
|
-
# @param [Hash] kwargs The keyword arguments.
|
198
|
-
#
|
199
|
-
# @return [Async::Task<Array(Net::HTTPResponse, Hash)>] The response and as JSON.
|
200
|
-
# @return [Async::Task<Array(Net::HTTPResponse, nil)>] The response was 204.
|
201
|
-
#
|
202
|
-
# @raise [Discorb::HTTPError] The request was failed.
|
203
|
-
#
|
204
|
-
def delete(path, headers: nil, audit_log_reason: nil, **kwargs)
|
205
|
-
Async do
|
206
|
-
@ratelimit_handler.wait("DELETE", path)
|
207
|
-
resp = http.delete(get_path(path), get_headers(headers, "", audit_log_reason))
|
208
|
-
data = get_response_data(resp)
|
209
|
-
@ratelimit_handler.save("DELETE", path, resp)
|
210
|
-
handle_response(:delete, resp, data, path, nil, headers, audit_log_reason, kwargs)
|
80
|
+
@ratelimit_handler.save(path, resp)
|
81
|
+
handle_response(resp, data, path, body, headers, audit_log_reason, kwargs)
|
211
82
|
end
|
212
83
|
end
|
213
84
|
|
@@ -217,16 +88,12 @@ module Discorb
|
|
217
88
|
|
218
89
|
private
|
219
90
|
|
220
|
-
def handle_response(
|
91
|
+
def handle_response(resp, data, path, body, headers, audit_log_reason, kwargs)
|
221
92
|
case resp.code
|
222
93
|
when "429"
|
223
|
-
@client.log.info("Rate limit exceeded for #{method} #{path}, waiting #{data[:retry_after]} seconds")
|
94
|
+
@client.log.info("Rate limit exceeded for #{path.method} #{path.url}, waiting #{data[:retry_after]} seconds")
|
224
95
|
sleep(data[:retry_after])
|
225
|
-
|
226
|
-
__send__(method, path, body, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
227
|
-
else
|
228
|
-
__send__(method, path, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
229
|
-
end
|
96
|
+
request(path, body, headers: headers, audit_log_reason: audit_log_reason, **kwargs).wait
|
230
97
|
when "400"
|
231
98
|
raise BadRequestError.new(resp, data)
|
232
99
|
when "401"
|
@@ -263,10 +130,10 @@ module Discorb
|
|
263
130
|
end
|
264
131
|
|
265
132
|
def get_path(path)
|
266
|
-
full_path = if path.start_with?("https://")
|
267
|
-
path
|
133
|
+
full_path = if path.url.start_with?("https://")
|
134
|
+
path.url
|
268
135
|
else
|
269
|
-
API_BASE_URL + path
|
136
|
+
API_BASE_URL + path.url
|
270
137
|
end
|
271
138
|
uri = URI(full_path)
|
272
139
|
full_path.sub(uri.scheme + "://" + uri.host, "")
|
data/lib/discorb/integration.rb
CHANGED
@@ -65,7 +65,7 @@ module Discorb
|
|
65
65
|
#
|
66
66
|
def delete!(reason: nil)
|
67
67
|
Async do
|
68
|
-
@client.http.
|
68
|
+
@client.http.request(Route.new("/guilds/#{@guild}/integrations/#{@id}", "//guilds/:guild_id/integrations/:integration_id", :delete), audit_log_reason: reason).wait
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -27,7 +27,7 @@ module Discorb
|
|
27
27
|
|
28
28
|
# @private
|
29
29
|
def send_complete_result(val)
|
30
|
-
@client.http.
|
30
|
+
@client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
|
31
31
|
type: 8,
|
32
32
|
data: {
|
33
33
|
choices: val.map do |vk, vv|
|
@@ -15,7 +15,7 @@ module Discorb
|
|
15
15
|
#
|
16
16
|
def defer_source(ephemeral: false)
|
17
17
|
Async do
|
18
|
-
@client.http.
|
18
|
+
@client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
|
19
19
|
type: 5,
|
20
20
|
data: {
|
21
21
|
flags: (ephemeral ? 1 << 6 : 0),
|
@@ -51,14 +51,14 @@ module Discorb
|
|
51
51
|
payload[:flags] = (ephemeral ? 1 << 6 : 0)
|
52
52
|
|
53
53
|
ret = if @responded
|
54
|
-
_resp, data = @client.http.
|
54
|
+
_resp, data = @client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}", "//webhooks/:webhook_id/:token", :post), payload).wait
|
55
55
|
webhook = Webhook::URLWebhook.new("/webhooks/#{@application_id}/#{@token}")
|
56
56
|
Webhook::Message.new(webhook, data, @client)
|
57
57
|
elsif @defered
|
58
|
-
@client.http.
|
58
|
+
@client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :patch), payload).wait
|
59
59
|
CallbackMessage.new(@client, payload, @application_id, @token)
|
60
60
|
else
|
61
|
-
@client.http.
|
61
|
+
@client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), { type: 4, data: payload }).wait
|
62
62
|
CallbackMessage.new(@client, payload, @application_id, @token)
|
63
63
|
end
|
64
64
|
@responded = true
|
@@ -103,7 +103,7 @@ module Discorb
|
|
103
103
|
payload[:attachments] = attachments.map(&:to_hash) if attachments != Discorb::Unset
|
104
104
|
files = [file] if file != Discorb::Unset
|
105
105
|
files = [] if files == Discorb::Unset
|
106
|
-
@client.http.
|
106
|
+
@client.http.multipart_request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :patch), payload, files, headers: headers).wait
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
@@ -118,7 +118,7 @@ module Discorb
|
|
118
118
|
#
|
119
119
|
def delete!
|
120
120
|
Async do
|
121
|
-
@client.http.
|
121
|
+
@client.http.request(Route.new("/webhooks/#{@application_id}/#{@token}/messages/@original", "//webhooks/:webhook_id/:token/messages/@original", :delete)).wait
|
122
122
|
end
|
123
123
|
end
|
124
124
|
end
|
@@ -138,7 +138,7 @@ module Discorb
|
|
138
138
|
#
|
139
139
|
def defer_update(ephemeral: false)
|
140
140
|
Async do
|
141
|
-
@client.http.
|
141
|
+
@client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), {
|
142
142
|
type: 6,
|
143
143
|
data: {
|
144
144
|
flags: (ephemeral ? 1 << 6 : 0),
|
@@ -176,7 +176,7 @@ module Discorb
|
|
176
176
|
payload[:allowed_mentions] = allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
|
177
177
|
payload[:components] = Component.to_payload(components) if components
|
178
178
|
payload[:flags] = (ephemeral ? 1 << 6 : 0)
|
179
|
-
@client.http.
|
179
|
+
@client.http.request(Route.new("/interactions/#{@id}/#{@token}/callback", "//interactions/:interaction_id/:token/callback", :post), { type: 7, data: payload }).wait
|
180
180
|
end
|
181
181
|
end
|
182
182
|
end
|
data/lib/discorb/invite.rb
CHANGED
@@ -105,7 +105,7 @@ module Discorb
|
|
105
105
|
#
|
106
106
|
def delete!(reason: nil)
|
107
107
|
Async do
|
108
|
-
@client.http.
|
108
|
+
@client.http.request(Route.new("/invites/#{@code}", "//invites/:code", :delete), audit_log_reason: reason)
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
data/lib/discorb/log.rb
CHANGED
@@ -71,10 +71,11 @@ module Discorb
|
|
71
71
|
|
72
72
|
time = Time.now.iso8601
|
73
73
|
if @colorize_log
|
74
|
-
@out.
|
74
|
+
@out.write("\e[90m#{time}\e[0m #{color}#{name.ljust(5)}\e[0m #{message}\n")
|
75
75
|
else
|
76
|
-
@out.
|
76
|
+
@out.write("#{time} #{name.ljust(5)} #{message}\n")
|
77
77
|
end
|
78
|
+
@out.flush
|
78
79
|
end
|
79
80
|
end
|
80
81
|
end
|
data/lib/discorb/member.rb
CHANGED
@@ -152,7 +152,7 @@ module Discorb
|
|
152
152
|
#
|
153
153
|
def add_role(role, reason: nil)
|
154
154
|
Async do
|
155
|
-
@client.http.
|
155
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", "//guilds/:guild_id/members/:user_id/roles/:role_id", :put), nil, audit_log_reason: reason).wait
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
@@ -167,7 +167,7 @@ module Discorb
|
|
167
167
|
#
|
168
168
|
def remove_role(role, reason: nil)
|
169
169
|
Async do
|
170
|
-
@client.http.
|
170
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", "//guilds/:guild_id/members/:user_id/roles/:role_id", :delete), audit_log_reason: reason).wait
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
@@ -200,7 +200,7 @@ module Discorb
|
|
200
200
|
communication_disabled_until = timeout_until if timeout_until != Discorb::Unset
|
201
201
|
payload[:communication_disabled_until] = communication_disabled_until&.iso8601 if communication_disabled_until != Discorb::Unset
|
202
202
|
payload[:channel_id] = channel&.id if channel != Discorb::Unset
|
203
|
-
@client.http.
|
203
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}", "//guilds/:guild_id/members/:user_id", :patch), payload, audit_log_reason: reason).wait
|
204
204
|
end
|
205
205
|
end
|
206
206
|
|
data/lib/discorb/message.rb
CHANGED
@@ -379,7 +379,7 @@ module Discorb
|
|
379
379
|
#
|
380
380
|
def add_reaction(emoji)
|
381
381
|
Async do
|
382
|
-
@client.http.
|
382
|
+
@client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me", "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me", :put), nil).wait
|
383
383
|
end
|
384
384
|
end
|
385
385
|
|
@@ -395,7 +395,7 @@ module Discorb
|
|
395
395
|
#
|
396
396
|
def remove_reaction(emoji)
|
397
397
|
Async do
|
398
|
-
@client.http.
|
398
|
+
@client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me", "//channels/:channel_id/messages/:message_id/reactions/:emoji/@me", :delete)).wait
|
399
399
|
end
|
400
400
|
end
|
401
401
|
|
@@ -412,7 +412,7 @@ module Discorb
|
|
412
412
|
#
|
413
413
|
def remove_reaction_of(emoji, member)
|
414
414
|
Async do
|
415
|
-
@client.http.
|
415
|
+
@client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/#{member.is_a?(Member) ? member.id : member}", "//channels/:channel_id/messages/:message_id/reactions/:emoji/:user_id", :delete)).wait
|
416
416
|
end
|
417
417
|
end
|
418
418
|
|
@@ -434,7 +434,7 @@ module Discorb
|
|
434
434
|
after = 0
|
435
435
|
users = []
|
436
436
|
loop do
|
437
|
-
_resp, data = @client.http.
|
437
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=100&after=#{after}", "//channels/:channel_id/messages/:message_id/reactions/:emoji", :get)).wait
|
438
438
|
break if data.empty?
|
439
439
|
|
440
440
|
users += data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
|
@@ -445,7 +445,7 @@ module Discorb
|
|
445
445
|
end
|
446
446
|
next users
|
447
447
|
else
|
448
|
-
_resp, data = @client.http.
|
448
|
+
_resp, data = @client.http.request(Route.new("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=#{limit}&after=#{after}", "//channels/:channel_id/messages/:message_id/reactions/:emoji", :get)).wait
|
449
449
|
next data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
|
450
450
|
end
|
451
451
|
end
|
data/lib/discorb/modules.rb
CHANGED
@@ -38,7 +38,7 @@ module Discorb
|
|
38
38
|
payload[:message_reference] = reference.to_reference if reference
|
39
39
|
payload[:components] = Component.to_payload(components) if components
|
40
40
|
files = [file]
|
41
|
-
_resp, data = @client.http.
|
41
|
+
_resp, data = @client.http.multipart_request(Route.new("/channels/#{channel_id.wait}/messages", "//channels/:channel_id/messages", :post), payload, files).wait
|
42
42
|
Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
|
43
43
|
end
|
44
44
|
end
|
@@ -74,7 +74,7 @@ module Discorb
|
|
74
74
|
allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
|
75
75
|
payload[:components] = Component.to_payload(components) if components
|
76
76
|
payload[:flags] = (supress ? 1 << 2 : 0) unless supress.nil?
|
77
|
-
@client.http.
|
77
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :patch), payload).wait
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -89,7 +89,7 @@ module Discorb
|
|
89
89
|
#
|
90
90
|
def delete_message!(message_id, reason: nil)
|
91
91
|
Async do
|
92
|
-
@client.http.
|
92
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :delete), audit_log_reason: reason).wait
|
93
93
|
end
|
94
94
|
end
|
95
95
|
|
@@ -106,7 +106,7 @@ module Discorb
|
|
106
106
|
#
|
107
107
|
def fetch_message(id)
|
108
108
|
Async do
|
109
|
-
_resp, data = @client.http.
|
109
|
+
_resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{id}", "//channels/:channel_id/messages/:message_id", :get)).wait
|
110
110
|
Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
|
111
111
|
end
|
112
112
|
end
|
@@ -130,7 +130,7 @@ module Discorb
|
|
130
130
|
after: Discorb::Utils.try(around, :id),
|
131
131
|
around: Discorb::Utils.try(before, :id),
|
132
132
|
}.filter { |_k, v| !v.nil? }.to_h
|
133
|
-
_resp, messages = @client.http.
|
133
|
+
_resp, messages = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}", "//channels/:channel_id/messages", :get)).wait
|
134
134
|
messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
|
135
135
|
end
|
136
136
|
end
|
@@ -143,7 +143,7 @@ module Discorb
|
|
143
143
|
#
|
144
144
|
def fetch_pins
|
145
145
|
Async do
|
146
|
-
_resp, data = @client.http.
|
146
|
+
_resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/pins", "//channels/:channel_id/pins", :get)).wait
|
147
147
|
data.map { |pin| Message.new(@client, pin) }
|
148
148
|
end
|
149
149
|
end
|
@@ -159,7 +159,7 @@ module Discorb
|
|
159
159
|
#
|
160
160
|
def pin_message(message, reason: nil)
|
161
161
|
Async do
|
162
|
-
@client.http.
|
162
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :put), {}, audit_log_reason: reason).wait
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -174,7 +174,7 @@ module Discorb
|
|
174
174
|
#
|
175
175
|
def unpin_message(message, reason: nil)
|
176
176
|
Async do
|
177
|
-
@client.http.
|
177
|
+
@client.http.request(Route.new("/channels/#{channel_id.wait}/pins/#{message.id}", "//channels/:channel_id/pins/:message_id", :delete), audit_log_reason: reason).wait
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
@@ -195,7 +195,7 @@ module Discorb
|
|
195
195
|
begin
|
196
196
|
post_task = Async do
|
197
197
|
loop do
|
198
|
-
@client.http.
|
198
|
+
@client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
|
199
199
|
sleep(5)
|
200
200
|
end
|
201
201
|
end
|
@@ -205,7 +205,7 @@ module Discorb
|
|
205
205
|
end
|
206
206
|
else
|
207
207
|
Async do |task|
|
208
|
-
@client.http.
|
208
|
+
@client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
|
209
209
|
end
|
210
210
|
end
|
211
211
|
end
|
data/lib/discorb/presence.rb
CHANGED
@@ -175,12 +175,12 @@ module Discorb
|
|
175
175
|
# Represents the assets of an activity.
|
176
176
|
#
|
177
177
|
class Asset < DiscordModel
|
178
|
-
# @return [String] The large image ID of the asset.
|
178
|
+
# @return [String] The large image ID or URL of the asset.
|
179
179
|
attr_reader :large_image
|
180
180
|
alias large_id large_image
|
181
181
|
# @return [String] The large text of the activity.
|
182
182
|
attr_reader :large_text
|
183
|
-
# @return [String] The small image ID of the activity.
|
183
|
+
# @return [String] The small image ID or URL of the activity.
|
184
184
|
attr_reader :small_image
|
185
185
|
alias small_id small_image
|
186
186
|
# @return [String] The small text of the activity.
|
data/lib/discorb/rate_limit.rb
CHANGED
@@ -9,8 +9,8 @@ module Discorb
|
|
9
9
|
# @private
|
10
10
|
def initialize(client)
|
11
11
|
@client = client
|
12
|
-
@current_ratelimits = {}
|
13
12
|
@path_ratelimit_bucket = {}
|
13
|
+
@path_ratelimit_hash = {}
|
14
14
|
@global = false
|
15
15
|
end
|
16
16
|
|
@@ -21,12 +21,10 @@ module Discorb
|
|
21
21
|
#
|
22
22
|
# Wait for the rate limit to reset.
|
23
23
|
#
|
24
|
-
# @param [
|
25
|
-
# @param [String] path The path.
|
24
|
+
# @param [Discorb::Route] path The path.
|
26
25
|
#
|
27
|
-
def wait(
|
28
|
-
return if path.start_with?("https://")
|
29
|
-
|
26
|
+
def wait(path)
|
27
|
+
# return if path.url.start_with?("https://")
|
30
28
|
if @global && @global > Time.now.to_f
|
31
29
|
time = @global - Time.now.to_f
|
32
30
|
@client.log.info("global rate limit reached, waiting #{time} seconds")
|
@@ -34,36 +32,34 @@ module Discorb
|
|
34
32
|
@global = false
|
35
33
|
end
|
36
34
|
|
37
|
-
return unless hash = @
|
35
|
+
return unless hash = @path_ratelimit_hash[path.identifier]
|
38
36
|
|
39
|
-
return unless
|
37
|
+
return unless bucket = @path_ratelimit_bucket[hash + path.major_param]
|
40
38
|
|
41
|
-
if
|
42
|
-
@
|
39
|
+
if bucket[:reset_at] < Time.now.to_f
|
40
|
+
@path_ratelimit_bucket.delete(path.identifier + path.major_param)
|
43
41
|
return
|
44
42
|
end
|
45
|
-
return if
|
43
|
+
return if bucket[:remaining] > 0
|
46
44
|
|
47
|
-
time =
|
48
|
-
@client.log.info("rate limit for #{
|
45
|
+
time = bucket[:reset_at] - Time.now.to_f
|
46
|
+
@client.log.info("rate limit for #{path.identifier} with #{path.major_param} reached, waiting #{time.round(4)} seconds")
|
49
47
|
sleep(time)
|
50
48
|
end
|
51
49
|
|
52
50
|
#
|
53
51
|
# Save the rate limit.
|
54
52
|
#
|
55
|
-
# @param [String] method The HTTP method.
|
56
53
|
# @param [String] path The path.
|
57
54
|
# @param [Net::HTTPResponse] resp The response.
|
58
55
|
#
|
59
|
-
def save(
|
56
|
+
def save(path, resp)
|
60
57
|
if resp["X-Ratelimit-Global"] == "true"
|
61
58
|
@global = Time.now.to_f + JSON.parse(resp.body, symbolize_names: true)[:retry_after]
|
62
59
|
end
|
63
60
|
return unless resp["X-RateLimit-Remaining"]
|
64
|
-
|
65
|
-
@path_ratelimit_bucket[
|
66
|
-
@current_ratelimits[resp["X-RateLimit-Bucket"]] = {
|
61
|
+
@path_ratelimit_hash[path.identifier] = resp["X-Ratelimit-Bucket"]
|
62
|
+
@path_ratelimit_bucket[resp["X-Ratelimit-Bucket"] + path.major_param] = {
|
67
63
|
remaining: resp["X-RateLimit-Remaining"].to_i,
|
68
64
|
reset_at: Time.now.to_f + resp["X-RateLimit-Reset-After"].to_f,
|
69
65
|
}
|
data/lib/discorb/role.rb
CHANGED
@@ -99,7 +99,7 @@ module Discorb
|
|
99
99
|
#
|
100
100
|
def move(position, reason: nil)
|
101
101
|
Async do
|
102
|
-
@client.http.
|
102
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles", "//guilds/:guild_id/roles", :patch), { id: @id, position: position }, audit_log_reason: reason).wait
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -133,7 +133,7 @@ module Discorb
|
|
133
133
|
payload[:unicode_emoji] = icon.to_s
|
134
134
|
end
|
135
135
|
end
|
136
|
-
@client.http.
|
136
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :patch), payload, audit_log_reason: reason).wait
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
@@ -148,7 +148,7 @@ module Discorb
|
|
148
148
|
#
|
149
149
|
def delete!(reason: nil)
|
150
150
|
Async do
|
151
|
-
@client.http.
|
151
|
+
@client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :delete), audit_log_reason: reason).wait
|
152
152
|
end
|
153
153
|
end
|
154
154
|
|
data/lib/discorb/sticker.rb
CHANGED
@@ -83,7 +83,7 @@ module Discorb
|
|
83
83
|
payload[:name] = name unless name == Discorb::Unset
|
84
84
|
payload[:description] = description unless description == Discorb::Unset
|
85
85
|
payload[:tags] = tag.name unless tag == Discorb::Unset
|
86
|
-
@client.http.
|
86
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/stickers/#{@id}", "//guilds/:guild_id/stickers/:sticker_id", :patch), payload, audit_log_reason: reason).wait
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -97,7 +97,7 @@ module Discorb
|
|
97
97
|
#
|
98
98
|
def delete!(reason: nil)
|
99
99
|
Async do
|
100
|
-
@client.http.
|
100
|
+
@client.http.request(Route.new("/guilds/#{@guild_id}/stickers/#{@id}", "//guilds/:guild_id/stickers/:sticker_id", :delete), audit_log_reason: reason).wait
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|