discorb 0.13.0 → 0.13.4

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.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build_main.yml +1 -0
  3. data/.github/workflows/build_version.yml +4 -3
  4. data/.github/workflows/crowdin.yml +32 -0
  5. data/.gitignore +3 -1
  6. data/.yardopts +2 -0
  7. data/CODE_OF_CONDUCT.md +128 -0
  8. data/Changelog.md +420 -388
  9. data/Gemfile +5 -1
  10. data/README.md +2 -2
  11. data/Rakefile +131 -1
  12. data/crowdin.yml +2 -0
  13. data/discorb.gemspec +12 -1
  14. data/docs/Examples.md +2 -0
  15. data/docs/application_command.md +7 -5
  16. data/docs/cli/irb.md +2 -0
  17. data/docs/cli/new.md +2 -0
  18. data/docs/cli/run.md +3 -1
  19. data/docs/cli/setup.md +4 -2
  20. data/docs/cli.md +2 -0
  21. data/docs/events.md +6 -4
  22. data/docs/extension.md +2 -2
  23. data/docs/faq.md +4 -2
  24. data/docs/license.md +2 -0
  25. data/docs/tutorial.md +4 -3
  26. data/docs/voice_events.md +2 -0
  27. data/lib/discorb/app_command.rb +32 -9
  28. data/lib/discorb/application.rb +1 -1
  29. data/lib/discorb/asset.rb +1 -1
  30. data/lib/discorb/channel.rb +170 -125
  31. data/lib/discorb/client.rb +20 -22
  32. data/lib/discorb/common.rb +32 -1
  33. data/lib/discorb/dictionary.rb +10 -2
  34. data/lib/discorb/emoji.rb +7 -9
  35. data/lib/discorb/emoji_table.rb +3891 -3891
  36. data/lib/discorb/event.rb +12 -11
  37. data/lib/discorb/exe/show.rb +2 -0
  38. data/lib/discorb/extension.rb +1 -1
  39. data/lib/discorb/flag.rb +1 -1
  40. data/lib/discorb/gateway.rb +63 -17
  41. data/lib/discorb/guild.rb +110 -156
  42. data/lib/discorb/guild_template.rb +15 -12
  43. data/lib/discorb/http.rb +41 -136
  44. data/lib/discorb/integration.rb +34 -2
  45. data/lib/discorb/interaction/autocomplete.rb +1 -1
  46. data/lib/discorb/interaction/response.rb +34 -32
  47. data/lib/discorb/interaction/root.rb +8 -0
  48. data/lib/discorb/invite.rb +4 -3
  49. data/lib/discorb/log.rb +3 -2
  50. data/lib/discorb/member.rb +44 -15
  51. data/lib/discorb/message.rb +33 -22
  52. data/lib/discorb/modules.rb +28 -35
  53. data/lib/discorb/presence.rb +2 -2
  54. data/lib/discorb/rate_limit.rb +14 -18
  55. data/lib/discorb/role.rb +18 -14
  56. data/lib/discorb/sticker.rb +10 -14
  57. data/lib/discorb/user.rb +10 -10
  58. data/lib/discorb/voice_state.rb +12 -7
  59. data/lib/discorb/webhook.rb +44 -50
  60. data/lib/discorb.rb +1 -1
  61. data/po/yard.pot +7772 -5154
  62. data/sig/discorb.rbs +3316 -3819
  63. data/template-replace/scripts/locale_ja.rb +62 -0
  64. metadata +18 -5
@@ -143,36 +143,37 @@ module Discorb
143
143
 
144
144
  #
145
145
  # Add a role to the member.
146
- # @macro http
147
- # @macro async
146
+ # @async
148
147
  #
149
148
  # @param [Discorb::Role] role The role to add.
150
149
  # @param [String] reason The reason for the action.
151
150
  #
151
+ # @return [Async::Task<void>] The task.
152
+ #
152
153
  def add_role(role, reason: nil)
153
154
  Async do
154
- @client.http.put("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", nil, audit_log_reason: reason).wait
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
155
156
  end
156
157
  end
157
158
 
158
159
  #
159
160
  # Remove a role to the member.
160
- # @macro http
161
- # @macro async
161
+ # @async
162
162
  #
163
163
  # @param [Discorb::Role] role The role to add.
164
164
  # @param [String] reason The reason for the action.
165
165
  #
166
+ # @return [Async::Task<void>] The task.
167
+ #
166
168
  def remove_role(role, reason: nil)
167
169
  Async do
168
- @client.http.delete("/guilds/#{@guild_id}/members/#{@id}/roles/#{role.is_a?(Role) ? role.id : role}", audit_log_reason: reason).wait
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
169
171
  end
170
172
  end
171
173
 
172
174
  #
173
175
  # Edit the member.
174
- # @macro http
175
- # @macro async
176
+ # @async
176
177
  # @macro edit
177
178
  #
178
179
  # @param [String] nick The nickname of the member.
@@ -180,27 +181,54 @@ module Discorb
180
181
  # @param [Boolean] mute Whether the member is muted.
181
182
  # @param [Boolean] deaf Whether the member is deafened.
182
183
  # @param [Discorb::StageChannel] channel The channel the member is moved to.
184
+ # @param [Time, nil] communication_disabled_until The time the member is timed out. Set to `nil` to end the timeout.
185
+ # @param [Time, nil] timeout_until Alias of `communication_disabled_until`.
183
186
  # @param [String] reason The reason for the action.
184
187
  #
185
- def edit(nick: :unset, role: :unset, mute: :unset, deaf: :unset, channel: :unset, reason: nil)
188
+ # @return [Async::Task<void>] The task.
189
+ #
190
+ def edit(
191
+ nick: Discorb::Unset, role: Discorb::Unset, mute: Discorb::Unset, deaf: Discorb::Unset, channel: Discorb::Unset, communication_disabled_until: Discorb::Unset, timeout_until: Discorb::Unset,
192
+ reason: nil
193
+ )
186
194
  Async do
187
195
  payload = {}
188
- payload[:nick] = nick if nick != :unset
189
- payload[:roles] = role if role != :unset
190
- payload[:mute] = mute if mute != :unset
191
- payload[:deaf] = deaf if deaf != :unset
192
- payload[:channel_id] = channel&.id if channel != :unset
193
- @client.http.patch("/guilds/#{@guild_id}/members/#{@id}", payload, audit_log_reason: reason).wait
196
+ payload[:nick] = nick if nick != Discorb::Unset
197
+ payload[:roles] = role if role != Discorb::Unset
198
+ payload[:mute] = mute if mute != Discorb::Unset
199
+ payload[:deaf] = deaf if deaf != Discorb::Unset
200
+ communication_disabled_until = timeout_until if timeout_until != Discorb::Unset
201
+ payload[:communication_disabled_until] = communication_disabled_until&.iso8601 if communication_disabled_until != Discorb::Unset
202
+ payload[:channel_id] = channel&.id if channel != Discorb::Unset
203
+ @client.http.request(Route.new("/guilds/#{@guild_id}/members/#{@id}", "//guilds/:guild_id/members/:user_id", :patch), payload, audit_log_reason: reason).wait
194
204
  end
195
205
  end
196
206
 
197
207
  alias modify edit
198
208
 
209
+ #
210
+ # Timeout the member.
211
+ # @async
212
+ #
213
+ # @param [Time] time The time until the member is timeout.
214
+ # @param [String] reason The reason for the action.
215
+ #
216
+ # @return [Async::Task<void>] The task.
217
+ #
218
+ def timeout(time, reason: nil)
219
+ edit(communication_disabled_until: time, reason: reason)
220
+ end
221
+
222
+ alias disable_communication timeout
223
+
199
224
  #
200
225
  # Kick the member.
226
+ # @async
201
227
  #
202
228
  # @param [String] reason The reason for the action.
203
229
  #
230
+ # @return [Async::Task<void>] The task.
231
+ #
204
232
  def kick(reason: nil)
205
233
  Async do
206
234
  guild.kick_member(self, reason: reason).wait
@@ -209,6 +237,7 @@ module Discorb
209
237
 
210
238
  #
211
239
  # Ban the member.
240
+ # @async
212
241
  #
213
242
  # @param [Integer] delete_message_days The number of days to delete messages.
214
243
  # @param [String] reason The reason for the action.
@@ -294,6 +294,7 @@ module Discorb
294
294
 
295
295
  #
296
296
  # Edit the message.
297
+ # @async
297
298
  #
298
299
  # @param [String] content The message content.
299
300
  # @param [Discorb::Embed] embed The embed to send.
@@ -302,6 +303,8 @@ module Discorb
302
303
  # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
303
304
  # @param [Boolean] supress Whether to supress embeds.
304
305
  #
306
+ # @return [Async::Task<void>] The task.
307
+ #
305
308
  def edit(content = nil, embed: nil, embeds: nil, allowed_mentions: nil,
306
309
  components: nil, supress: nil)
307
310
  Async do
@@ -312,9 +315,12 @@ module Discorb
312
315
 
313
316
  #
314
317
  # Delete the message.
318
+ # @async
315
319
  #
316
320
  # @param [String] reason The reason for deleting the message.
317
321
  #
322
+ # @return [Async::Task<void>] The task.
323
+ #
318
324
  def delete!(reason: nil)
319
325
  Async do
320
326
  channel.delete_message!(@id, reason: reason).wait
@@ -342,8 +348,7 @@ module Discorb
342
348
  end
343
349
 
344
350
  # Reply to the message.
345
- # @macro async
346
- # @macro http
351
+ # @async
347
352
  # @param (see #post)
348
353
  # @return [Async::Task<Discorb::Message>] The message.
349
354
  def reply(*args, **kwargs)
@@ -354,8 +359,9 @@ module Discorb
354
359
 
355
360
  #
356
361
  # Publish the message.
357
- # @macro async
358
- # @macro http
362
+ # @async
363
+ #
364
+ # @return [Async::Task<void>] The task.
359
365
  #
360
366
  def publish
361
367
  Async do
@@ -365,14 +371,15 @@ module Discorb
365
371
 
366
372
  #
367
373
  # Add a reaction to the message.
368
- # @macro async
369
- # @macro http
374
+ # @async
370
375
  #
371
376
  # @param [Discorb::Emoji] emoji The emoji to react with.
372
377
  #
378
+ # @return [Async::Task<void>] The task.
379
+ #
373
380
  def add_reaction(emoji)
374
381
  Async do
375
- @client.http.put("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me", nil).wait
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
376
383
  end
377
384
  end
378
385
 
@@ -380,14 +387,15 @@ module Discorb
380
387
 
381
388
  #
382
389
  # Remove a reaction from the message.
383
- # @macro async
384
- # @macro http
390
+ # @async
385
391
  #
386
392
  # @param [Discorb::Emoji] emoji The emoji to remove.
387
393
  #
394
+ # @return [Async::Task<void>] The task.
395
+ #
388
396
  def remove_reaction(emoji)
389
397
  Async do
390
- @client.http.delete("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/@me").wait
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
391
399
  end
392
400
  end
393
401
 
@@ -395,15 +403,16 @@ module Discorb
395
403
 
396
404
  #
397
405
  # Remove other member's reaction from the message.
398
- # @macro async
399
- # @macro http
406
+ # @async
400
407
  #
401
408
  # @param [Discorb::Emoji] emoji The emoji to remove.
402
409
  # @param [Discorb::Member] member The member to remove the reaction from.
403
410
  #
411
+ # @return [Async::Task<void>] The task.
412
+ #
404
413
  def remove_reaction_of(emoji, member)
405
414
  Async do
406
- @client.http.delete("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}/#{member.is_a?(Member) ? member.id : member}").wait
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
407
416
  end
408
417
  end
409
418
 
@@ -411,8 +420,7 @@ module Discorb
411
420
 
412
421
  #
413
422
  # Fetch reacted users of reaction.
414
- # @macro async
415
- # @macro http
423
+ # @async
416
424
  #
417
425
  # @param [Discorb::Emoji] emoji The emoji to fetch.
418
426
  # @param [Integer, nil] limit The maximum number of users to fetch. `nil` for no limit.
@@ -426,7 +434,7 @@ module Discorb
426
434
  after = 0
427
435
  users = []
428
436
  loop do
429
- _resp, data = @client.http.get("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=100&after=#{after}").wait
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
430
438
  break if data.empty?
431
439
 
432
440
  users += data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
@@ -437,7 +445,7 @@ module Discorb
437
445
  end
438
446
  next users
439
447
  else
440
- _resp, data = @client.http.get("/channels/#{@channel_id}/messages/#{@id}/reactions/#{emoji.to_uri}?limit=#{limit}&after=#{after}").wait
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
441
449
  next data.map { |r| guild&.members&.[](r[:id]) || @client.users[r[:id]] || User.new(@client, r) }
442
450
  end
443
451
  end
@@ -445,11 +453,12 @@ module Discorb
445
453
 
446
454
  #
447
455
  # Pin the message.
448
- # @macro async
449
- # @macro http
456
+ # @async
450
457
  #
451
458
  # @param [String] reason The reason for pinning the message.
452
459
  #
460
+ # @return [Async::Task<void>] The task.
461
+ #
453
462
  def pin(reason: nil)
454
463
  Async do
455
464
  channel.pin_message(self, reason: reason).wait
@@ -458,11 +467,12 @@ module Discorb
458
467
 
459
468
  #
460
469
  # Unpin the message.
461
- # @macro async
462
- # @macro http
470
+ # @async
463
471
  #
464
472
  # @param [String] reason The reason for unpinning the message.
465
473
  #
474
+ # @return [Async::Task<void>] The task.
475
+ #
466
476
  def unpin(reason: nil)
467
477
  Async do
468
478
  channel.unpin_message(self, reason: reason).wait
@@ -471,10 +481,11 @@ module Discorb
471
481
 
472
482
  #
473
483
  # Start thread from the message.
484
+ # @async
474
485
  #
475
486
  # @param (see Discorb::Channel#start_thread)
476
487
  #
477
- # @return [Async::Task<<Type>>] <description>
488
+ # @return [Async::Task<Discorb::ThreadChannel>] <description>
478
489
  #
479
490
  def start_thread(*args, **kwargs)
480
491
  Async do
@@ -7,8 +7,7 @@ module Discorb
7
7
  module Messageable
8
8
  #
9
9
  # Post a message to the channel.
10
- # @macro async
11
- # @macro http
10
+ # @async
12
11
  #
13
12
  # @param [String] content The message content.
14
13
  # @param [Boolean] tts Whether the message is tts.
@@ -38,14 +37,8 @@ module Discorb
38
37
  allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
39
38
  payload[:message_reference] = reference.to_reference if reference
40
39
  payload[:components] = Component.to_payload(components) if components
41
- files = [file] if file
42
- if files
43
- seperator, payload = HTTP.multipart(payload, files)
44
- headers = { "content-type" => "multipart/form-data; boundary=#{seperator}" }
45
- else
46
- headers = {}
47
- end
48
- _resp, data = @client.http.post("/channels/#{channel_id.wait}/messages", payload, headers: headers).wait
40
+ files = [file]
41
+ _resp, data = @client.http.multipart_request(Route.new("/channels/#{channel_id.wait}/messages", "//channels/:channel_id/messages", :post), payload, files).wait
49
42
  Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
50
43
  end
51
44
  end
@@ -54,8 +47,7 @@ module Discorb
54
47
 
55
48
  #
56
49
  # Edit a message.
57
- # @macro async
58
- # @macro http
50
+ # @async
59
51
  #
60
52
  # @param [#to_s] message_id The message id.
61
53
  # @param [String] content The message content.
@@ -65,6 +57,8 @@ module Discorb
65
57
  # @param [Array<Discorb::Component>, Array<Array<Discorb::Component>>] components The components to send.
66
58
  # @param [Boolean] supress Whether to supress embeds.
67
59
  #
60
+ # @return [Async::Task<void>] The task.
61
+ #
68
62
  def edit_message(message_id, content = nil, embed: nil, embeds: nil, allowed_mentions: nil,
69
63
  components: nil, supress: nil)
70
64
  Async do
@@ -80,21 +74,22 @@ module Discorb
80
74
  allowed_mentions ? allowed_mentions.to_hash(@client.allowed_mentions) : @client.allowed_mentions.to_hash
81
75
  payload[:components] = Component.to_payload(components) if components
82
76
  payload[:flags] = (supress ? 1 << 2 : 0) unless supress.nil?
83
- @client.http.patch("/channels/#{channel_id.wait}/messages/#{message_id}", payload).wait
77
+ @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{message_id}", "//channels/:channel_id/messages/:message_id", :patch), payload).wait
84
78
  end
85
79
  end
86
80
 
87
81
  #
88
82
  # Delete a message.
89
- # @macro async
90
- # @macro http
83
+ # @async
91
84
  #
92
85
  # @param [#to_s] message_id The message id.
93
86
  # @param [String] reason The reason for deleting the message.
94
87
  #
88
+ # @return [Async::Task<void>] The task.
89
+ #
95
90
  def delete_message!(message_id, reason: nil)
96
91
  Async do
97
- @client.http.delete("/channels/#{channel_id.wait}/messages/#{message_id}", audit_log_reason: reason).wait
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
98
93
  end
99
94
  end
100
95
 
@@ -102,8 +97,7 @@ module Discorb
102
97
 
103
98
  #
104
99
  # Fetch a message from ID.
105
- # @macro async
106
- # @macro http
100
+ # @async
107
101
  #
108
102
  # @param [Discorb::Snowflake] id The ID of the message.
109
103
  #
@@ -112,15 +106,14 @@ module Discorb
112
106
  #
113
107
  def fetch_message(id)
114
108
  Async do
115
- _resp, data = @client.http.get("/channels/#{channel_id.wait}/messages/#{id}").wait
109
+ _resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages/#{id}", "//channels/:channel_id/messages/:message_id", :get)).wait
116
110
  Message.new(@client, data.merge({ guild_id: @guild_id.to_s }))
117
111
  end
118
112
  end
119
113
 
120
114
  #
121
115
  # Fetch a message history.
122
- # @macro async
123
- # @macro http
116
+ # @async
124
117
  #
125
118
  # @param [Integer] limit The number of messages to fetch.
126
119
  # @param [Discorb::Snowflake] before The ID of the message to fetch before.
@@ -137,57 +130,57 @@ module Discorb
137
130
  after: Discorb::Utils.try(around, :id),
138
131
  around: Discorb::Utils.try(before, :id),
139
132
  }.filter { |_k, v| !v.nil? }.to_h
140
- _resp, messages = @client.http.get("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}").wait
133
+ _resp, messages = @client.http.request(Route.new("/channels/#{channel_id.wait}/messages?#{URI.encode_www_form(params)}", "//channels/:channel_id/messages", :get)).wait
141
134
  messages.map { |m| Message.new(@client, m.merge({ guild_id: @guild_id.to_s })) }
142
135
  end
143
136
  end
144
137
 
145
138
  #
146
139
  # Fetch the pinned messages in the channel.
147
- # @macro async
148
- # @macro http
140
+ # @async
149
141
  #
150
142
  # @return [Async::Task<Array<Discorb::Message>>] The pinned messages in the channel.
151
143
  #
152
144
  def fetch_pins
153
145
  Async do
154
- _resp, data = @client.http.get("/channels/#{channel_id.wait}/pins").wait
146
+ _resp, data = @client.http.request(Route.new("/channels/#{channel_id.wait}/pins", "//channels/:channel_id/pins", :get)).wait
155
147
  data.map { |pin| Message.new(@client, pin) }
156
148
  end
157
149
  end
158
150
 
159
151
  #
160
152
  # Pin a message in the channel.
161
- # @macro async
162
- # @macro http
153
+ # @async
163
154
  #
164
155
  # @param [Discorb::Message] message The message to pin.
165
156
  # @param [String] reason The reason of pinning the message.
166
157
  #
158
+ # @return [Async::Task<void>] The task.
159
+ #
167
160
  def pin_message(message, reason: nil)
168
161
  Async do
169
- @client.http.put("/channels/#{channel_id.wait}/pins/#{message.id}", {}, audit_log_reason: reason).wait
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
170
163
  end
171
164
  end
172
165
 
173
166
  #
174
167
  # Unpin a message in the channel.
175
- # @macro async
176
- # @macro http
168
+ # @async
177
169
  #
178
170
  # @param [Discorb::Message] message The message to unpin.
179
171
  # @param [String] reason The reason of unpinning the message.
180
172
  #
173
+ # @return [Async::Task<void>] The task.
174
+ #
181
175
  def unpin_message(message, reason: nil)
182
176
  Async do
183
- @client.http.delete("/channels/#{channel_id.wait}/pins/#{message.id}", audit_log_reason: reason).wait
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
184
178
  end
185
179
  end
186
180
 
187
181
  #
188
182
  # Trigger the typing indicator in the channel.
189
- # @macro async
190
- # @macro http
183
+ # @async
191
184
  #
192
185
  # If block is given, trigger typing indicator during executing block.
193
186
  # @example
@@ -202,7 +195,7 @@ module Discorb
202
195
  begin
203
196
  post_task = Async do
204
197
  loop do
205
- @client.http.post("/channels/#{@id}/typing", {})
198
+ @client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
206
199
  sleep(5)
207
200
  end
208
201
  end
@@ -212,7 +205,7 @@ module Discorb
212
205
  end
213
206
  else
214
207
  Async do |task|
215
- @client.http.post("/channels/#{@id}/typing", {})
208
+ @client.http.request(Route.new("/channels/#{@id}/typing", "//channels/:channel_id/typing", :post), {})
216
209
  end
217
210
  end
218
211
  end
@@ -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.
@@ -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 [String] method The HTTP method.
25
- # @param [String] path The path.
24
+ # @param [Discorb::Route] path The path.
26
25
  #
27
- def wait(method, path)
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 = @path_ratelimit_bucket[method + path]
35
+ return unless hash = @path_ratelimit_hash[path.identifier]
38
36
 
39
- return unless b = @current_ratelimits[hash]
37
+ return unless bucket = @path_ratelimit_bucket[hash + path.major_param]
40
38
 
41
- if b[:reset_at] < Time.now.to_f
42
- @current_ratelimits.delete(hash)
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 b[:remaining] > 0
43
+ return if bucket[:remaining] > 0
46
44
 
47
- time = b[:reset_at] - Time.now.to_f
48
- @client.log.info("rate limit for #{method} #{path} reached, waiting #{time} seconds")
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(method, path, resp)
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[method + path] = resp["X-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
@@ -90,22 +90,22 @@ module Discorb
90
90
 
91
91
  #
92
92
  # Moves the role to a new position.
93
- # @macro async
94
- # @macro http
93
+ # @async
95
94
  #
96
95
  # @param [Integer] position The new position.
97
96
  # @param [String] reason The reason for moving the role.
98
97
  #
98
+ # @return [Async::Task<void>] The task.
99
+ #
99
100
  def move(position, reason: nil)
100
101
  Async do
101
- @client.http.patch("/guilds/#{@guild.id}/roles", { id: @id, position: position }, audit_log_reason: reason).wait
102
+ @client.http.request(Route.new("/guilds/#{@guild.id}/roles", "//guilds/:guild_id/roles", :patch), { id: @id, position: position }, audit_log_reason: reason).wait
102
103
  end
103
104
  end
104
105
 
105
106
  #
106
107
  # Edits the role.
107
- # @macro async
108
- # @macro http
108
+ # @async
109
109
  # @macro edit
110
110
  #
111
111
  # @param [String] name The new name of the role.
@@ -116,22 +116,24 @@ module Discorb
116
116
  # @param [Discorb::Image, Discorb::UnicodeEmoji] icon The new icon or emoji of the role.
117
117
  # @param [String] reason The reason for editing the role.
118
118
  #
119
- def edit(name: :unset, position: :unset, color: :unset, hoist: :unset, mentionable: :unset, icon: :unset, reason: nil)
119
+ # @return [Async::Task<void>] The task.
120
+ #
121
+ def edit(name: Discorb::Unset, position: Discorb::Unset, color: Discorb::Unset, hoist: Discorb::Unset, mentionable: Discorb::Unset, icon: Discorb::Unset, reason: nil)
120
122
  Async do
121
123
  payload = {}
122
- payload[:name] = name if name != :unset
123
- payload[:position] = position if position != :unset
124
- payload[:color] = color.to_i if color != :unset
125
- payload[:hoist] = hoist if hoist != :unset
126
- payload[:mentionable] = mentionable if mentionable != :unset
127
- if icon != :unset
124
+ payload[:name] = name if name != Discorb::Unset
125
+ payload[:position] = position if position != Discorb::Unset
126
+ payload[:color] = color.to_i if color != Discorb::Unset
127
+ payload[:hoist] = hoist if hoist != Discorb::Unset
128
+ payload[:mentionable] = mentionable if mentionable != Discorb::Unset
129
+ if icon != Discorb::Unset
128
130
  if icon.is_a?(Discorb::Image)
129
131
  payload[:icon] = icon.to_s
130
132
  else
131
133
  payload[:unicode_emoji] = icon.to_s
132
134
  end
133
135
  end
134
- @client.http.patch("/guilds/#{@guild.id}/roles/#{@id}", payload, audit_log_reason: reason).wait
136
+ @client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :patch), payload, audit_log_reason: reason).wait
135
137
  end
136
138
  end
137
139
 
@@ -142,9 +144,11 @@ module Discorb
142
144
  #
143
145
  # @param [String] reason The reason for deleting the role.
144
146
  #
147
+ # @return [Async::Task<void>] The task.
148
+ #
145
149
  def delete!(reason: nil)
146
150
  Async do
147
- @client.http.delete("/guilds/#{@guild.id}/roles/#{@id}", audit_log_reason: reason).wait
151
+ @client.http.request(Route.new("/guilds/#{@guild.id}/roles/#{@id}", "//guilds/:guild_id/roles/:role_id", :delete), audit_log_reason: reason).wait
148
152
  end
149
153
  end
150
154