discordrb 3.3.0 → 3.5.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.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +152 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
  5. data/.github/pull_request_template.md +37 -0
  6. data/.github/workflows/codeql.yml +65 -0
  7. data/.markdownlint.json +4 -0
  8. data/.rubocop.yml +39 -36
  9. data/CHANGELOG.md +874 -552
  10. data/Gemfile +2 -0
  11. data/LICENSE.txt +1 -1
  12. data/README.md +80 -86
  13. data/Rakefile +2 -0
  14. data/bin/console +1 -0
  15. data/discordrb-webhooks.gemspec +9 -6
  16. data/discordrb.gemspec +21 -18
  17. data/lib/discordrb/allowed_mentions.rb +36 -0
  18. data/lib/discordrb/api/application.rb +202 -0
  19. data/lib/discordrb/api/channel.rb +236 -47
  20. data/lib/discordrb/api/interaction.rb +54 -0
  21. data/lib/discordrb/api/invite.rb +5 -5
  22. data/lib/discordrb/api/server.rb +94 -66
  23. data/lib/discordrb/api/user.rb +17 -11
  24. data/lib/discordrb/api/webhook.rb +63 -6
  25. data/lib/discordrb/api.rb +55 -16
  26. data/lib/discordrb/await.rb +0 -1
  27. data/lib/discordrb/bot.rb +480 -93
  28. data/lib/discordrb/cache.rb +31 -24
  29. data/lib/discordrb/colour_rgb.rb +43 -0
  30. data/lib/discordrb/commands/command_bot.rb +35 -12
  31. data/lib/discordrb/commands/container.rb +21 -24
  32. data/lib/discordrb/commands/parser.rb +20 -20
  33. data/lib/discordrb/commands/rate_limiter.rb +4 -3
  34. data/lib/discordrb/container.rb +209 -20
  35. data/lib/discordrb/data/activity.rb +271 -0
  36. data/lib/discordrb/data/application.rb +50 -0
  37. data/lib/discordrb/data/attachment.rb +71 -0
  38. data/lib/discordrb/data/audit_logs.rb +345 -0
  39. data/lib/discordrb/data/channel.rb +993 -0
  40. data/lib/discordrb/data/component.rb +229 -0
  41. data/lib/discordrb/data/embed.rb +251 -0
  42. data/lib/discordrb/data/emoji.rb +82 -0
  43. data/lib/discordrb/data/integration.rb +122 -0
  44. data/lib/discordrb/data/interaction.rb +800 -0
  45. data/lib/discordrb/data/invite.rb +137 -0
  46. data/lib/discordrb/data/member.rb +372 -0
  47. data/lib/discordrb/data/message.rb +414 -0
  48. data/lib/discordrb/data/overwrite.rb +108 -0
  49. data/lib/discordrb/data/profile.rb +91 -0
  50. data/lib/discordrb/data/reaction.rb +33 -0
  51. data/lib/discordrb/data/recipient.rb +34 -0
  52. data/lib/discordrb/data/role.rb +248 -0
  53. data/lib/discordrb/data/server.rb +1004 -0
  54. data/lib/discordrb/data/user.rb +264 -0
  55. data/lib/discordrb/data/voice_region.rb +45 -0
  56. data/lib/discordrb/data/voice_state.rb +41 -0
  57. data/lib/discordrb/data/webhook.rb +238 -0
  58. data/lib/discordrb/data.rb +28 -4180
  59. data/lib/discordrb/errors.rb +46 -4
  60. data/lib/discordrb/events/bans.rb +7 -5
  61. data/lib/discordrb/events/channels.rb +3 -1
  62. data/lib/discordrb/events/guilds.rb +16 -9
  63. data/lib/discordrb/events/interactions.rb +482 -0
  64. data/lib/discordrb/events/invites.rb +125 -0
  65. data/lib/discordrb/events/members.rb +6 -2
  66. data/lib/discordrb/events/message.rb +72 -27
  67. data/lib/discordrb/events/presence.rb +35 -18
  68. data/lib/discordrb/events/raw.rb +1 -3
  69. data/lib/discordrb/events/reactions.rb +49 -4
  70. data/lib/discordrb/events/threads.rb +96 -0
  71. data/lib/discordrb/events/typing.rb +6 -4
  72. data/lib/discordrb/events/voice_server_update.rb +47 -0
  73. data/lib/discordrb/events/voice_state_update.rb +15 -10
  74. data/lib/discordrb/events/webhooks.rb +9 -6
  75. data/lib/discordrb/gateway.rb +99 -71
  76. data/lib/discordrb/id_object.rb +39 -0
  77. data/lib/discordrb/light/integrations.rb +1 -1
  78. data/lib/discordrb/light/light_bot.rb +1 -1
  79. data/lib/discordrb/logger.rb +4 -4
  80. data/lib/discordrb/paginator.rb +57 -0
  81. data/lib/discordrb/permissions.rb +159 -39
  82. data/lib/discordrb/version.rb +1 -1
  83. data/lib/discordrb/voice/encoder.rb +16 -7
  84. data/lib/discordrb/voice/network.rb +99 -47
  85. data/lib/discordrb/voice/sodium.rb +98 -0
  86. data/lib/discordrb/voice/voice_bot.rb +33 -25
  87. data/lib/discordrb/webhooks.rb +2 -0
  88. data/lib/discordrb.rb +107 -1
  89. metadata +126 -54
  90. data/.codeclimate.yml +0 -16
  91. data/.travis.yml +0 -33
  92. data/bin/travis_build_docs.sh +0 -17
  93. /data/{CONTRIBUTING.md → .github/CONTRIBUTING.md} +0 -0
@@ -5,7 +5,7 @@ module Discordrb::API::Channel
5
5
  module_function
6
6
 
7
7
  # Get a channel's data
8
- # https://discordapp.com/developers/docs/resources/channel#get-channel
8
+ # https://discord.com/developers/docs/resources/channel#get-channel
9
9
  def resolve(token, channel_id)
10
10
  Discordrb::API.request(
11
11
  :channels_cid,
@@ -17,7 +17,7 @@ module Discordrb::API::Channel
17
17
  end
18
18
 
19
19
  # Update a channel's data
20
- # https://discordapp.com/developers/docs/resources/channel#modify-channel
20
+ # https://discord.com/developers/docs/resources/channel#modify-channel
21
21
  def update(token, channel_id, name, topic, position, bitrate, user_limit, nsfw, permission_overwrites = nil, parent_id = nil, rate_limit_per_user = nil, reason = nil)
22
22
  data = { name: name, position: position, topic: topic, bitrate: bitrate, user_limit: user_limit, nsfw: nsfw, parent_id: parent_id, rate_limit_per_user: rate_limit_per_user }
23
23
  data[:permission_overwrites] = permission_overwrites unless permission_overwrites.nil?
@@ -34,7 +34,7 @@ module Discordrb::API::Channel
34
34
  end
35
35
 
36
36
  # Delete a channel
37
- # https://discordapp.com/developers/docs/resources/channel#deleteclose-channel
37
+ # https://discord.com/developers/docs/resources/channel#deleteclose-channel
38
38
  def delete(token, channel_id, reason = nil)
39
39
  Discordrb::API.request(
40
40
  :channels_cid,
@@ -47,19 +47,20 @@ module Discordrb::API::Channel
47
47
  end
48
48
 
49
49
  # Get a list of messages from a channel's history
50
- # https://discordapp.com/developers/docs/resources/channel#get-channel-messages
50
+ # https://discord.com/developers/docs/resources/channel#get-channel-messages
51
51
  def messages(token, channel_id, amount, before = nil, after = nil, around = nil)
52
+ query_string = URI.encode_www_form({ limit: amount, before: before, after: after, around: around }.compact)
52
53
  Discordrb::API.request(
53
54
  :channels_cid_messages,
54
55
  channel_id,
55
56
  :get,
56
- "#{Discordrb::API.api_base}/channels/#{channel_id}/messages?limit=#{amount}#{"&before=#{before}" if before}#{"&after=#{after}" if after}#{"&around=#{around}" if around}",
57
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/messages?#{query_string}",
57
58
  Authorization: token
58
59
  )
59
60
  end
60
61
 
61
62
  # Get a single message from a channel's history by id
62
- # https://discordapp.com/developers/docs/resources/channel#get-channel-message
63
+ # https://discord.com/developers/docs/resources/channel#get-channel-message
63
64
  def message(token, channel_id, message_id)
64
65
  Discordrb::API.request(
65
66
  :channels_cid_messages_mid,
@@ -71,25 +72,38 @@ module Discordrb::API::Channel
71
72
  end
72
73
 
73
74
  # Send a message to a channel
74
- # https://discordapp.com/developers/docs/resources/channel#create-message
75
- def create_message(token, channel_id, message, tts = false, embed = nil, nonce = nil) # send message
75
+ # https://discord.com/developers/docs/resources/channel#create-message
76
+ # @param attachments [Array<File>, nil] Attachments to use with `attachment://` in embeds. See
77
+ # https://discord.com/developers/docs/resources/channel#create-message-using-attachments-within-embeds
78
+ def create_message(token, channel_id, message, tts = false, embeds = nil, nonce = nil, attachments = nil, allowed_mentions = nil, message_reference = nil, components = nil)
79
+ body = { content: message, tts: tts, embeds: embeds, nonce: nonce, allowed_mentions: allowed_mentions, message_reference: message_reference, components: components&.to_a }
80
+ body = if attachments
81
+ files = [*0...attachments.size].zip(attachments).to_h
82
+ { **files, payload_json: body.to_json }
83
+ else
84
+ body.to_json
85
+ end
86
+
87
+ headers = { Authorization: token }
88
+ headers[:content_type] = :json unless attachments
89
+
76
90
  Discordrb::API.request(
77
91
  :channels_cid_messages_mid,
78
92
  channel_id,
79
93
  :post,
80
94
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages",
81
- { content: message, tts: tts, embed: embed, nonce: nonce }.to_json,
82
- Authorization: token,
83
- content_type: :json
95
+ body,
96
+ **headers
84
97
  )
85
98
  rescue RestClient::BadRequest => e
86
99
  parsed = JSON.parse(e.response.body)
87
- raise Discordrb::Errors::MessageTooLong, "Message over the character limit (#{message.length} > 2000)" if parsed['content'] && parsed['content'].is_a?(Array) && parsed['content'].first == 'Must be 2000 or fewer in length.'
100
+ raise Discordrb::Errors::MessageTooLong, "Message over the character limit (#{message.length} > 2000)" if parsed['content'].is_a?(Array) && parsed['content'].first == 'Must be 2000 or fewer in length.'
101
+
88
102
  raise
89
103
  end
90
104
 
91
105
  # Send a file as a message to a channel
92
- # https://discordapp.com/developers/docs/resources/channel#upload-file
106
+ # https://discord.com/developers/docs/resources/channel#upload-file
93
107
  def upload_file(token, channel_id, file, caption: nil, tts: false)
94
108
  Discordrb::API.request(
95
109
  :channels_cid_messages_mid,
@@ -102,34 +116,35 @@ module Discordrb::API::Channel
102
116
  end
103
117
 
104
118
  # Edit a message
105
- # https://discordapp.com/developers/docs/resources/channel#edit-message
106
- def edit_message(token, channel_id, message_id, message, mentions = [], embed = nil)
119
+ # https://discord.com/developers/docs/resources/channel#edit-message
120
+ def edit_message(token, channel_id, message_id, message, mentions = [], embeds = nil, components = nil)
107
121
  Discordrb::API.request(
108
122
  :channels_cid_messages_mid,
109
123
  channel_id,
110
124
  :patch,
111
125
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}",
112
- { content: message, mentions: mentions, embed: embed }.to_json,
126
+ { content: message, mentions: mentions, embeds: embeds, components: components }.to_json,
113
127
  Authorization: token,
114
128
  content_type: :json
115
129
  )
116
130
  end
117
131
 
118
132
  # Delete a message
119
- # https://discordapp.com/developers/docs/resources/channel#delete-message
120
- def delete_message(token, channel_id, message_id)
133
+ # https://discord.com/developers/docs/resources/channel#delete-message
134
+ def delete_message(token, channel_id, message_id, reason = nil)
121
135
  Discordrb::API.request(
122
136
  :channels_cid_messages_mid,
123
137
  channel_id,
124
138
  :delete,
125
139
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}",
126
- Authorization: token
140
+ Authorization: token,
141
+ 'X-Audit-Log-Reason': reason
127
142
  )
128
143
  end
129
144
 
130
145
  # Delete messages in bulk
131
- # https://discordapp.com/developers/docs/resources/channel#bulk-delete-messages
132
- def bulk_delete_messages(token, channel_id, messages = [])
146
+ # https://discord.com/developers/docs/resources/channel#bulk-delete-messages
147
+ def bulk_delete_messages(token, channel_id, messages = [], reason = nil)
133
148
  Discordrb::API.request(
134
149
  :channels_cid_messages_bulk_delete,
135
150
  channel_id,
@@ -137,14 +152,15 @@ module Discordrb::API::Channel
137
152
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/bulk-delete",
138
153
  { messages: messages }.to_json,
139
154
  Authorization: token,
140
- content_type: :json
155
+ content_type: :json,
156
+ 'X-Audit-Log-Reason': reason
141
157
  )
142
158
  end
143
159
 
144
160
  # Create a reaction on a message using this client
145
- # https://discordapp.com/developers/docs/resources/channel#create-reaction
161
+ # https://discord.com/developers/docs/resources/channel#create-reaction
146
162
  def create_reaction(token, channel_id, message_id, emoji)
147
- emoji = URI.encode(emoji) unless emoji.ascii_only?
163
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
148
164
  Discordrb::API.request(
149
165
  :channels_cid_messages_mid_reactions_emoji_me,
150
166
  channel_id,
@@ -157,9 +173,9 @@ module Discordrb::API::Channel
157
173
  end
158
174
 
159
175
  # Delete this client's own reaction on a message
160
- # https://discordapp.com/developers/docs/resources/channel#delete-own-reaction
176
+ # https://discord.com/developers/docs/resources/channel#delete-own-reaction
161
177
  def delete_own_reaction(token, channel_id, message_id, emoji)
162
- emoji = URI.encode(emoji) unless emoji.ascii_only?
178
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
163
179
  Discordrb::API.request(
164
180
  :channels_cid_messages_mid_reactions_emoji_me,
165
181
  channel_id,
@@ -170,9 +186,9 @@ module Discordrb::API::Channel
170
186
  end
171
187
 
172
188
  # Delete another client's reaction on a message
173
- # https://discordapp.com/developers/docs/resources/channel#delete-user-reaction
189
+ # https://discord.com/developers/docs/resources/channel#delete-user-reaction
174
190
  def delete_user_reaction(token, channel_id, message_id, emoji, user_id)
175
- emoji = URI.encode(emoji) unless emoji.ascii_only?
191
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
176
192
  Discordrb::API.request(
177
193
  :channels_cid_messages_mid_reactions_emoji_uid,
178
194
  channel_id,
@@ -183,20 +199,21 @@ module Discordrb::API::Channel
183
199
  end
184
200
 
185
201
  # Get a list of clients who reacted with a specific reaction on a message
186
- # https://discordapp.com/developers/docs/resources/channel#get-reactions
187
- def get_reactions(token, channel_id, message_id, emoji)
188
- emoji = URI.encode(emoji) unless emoji.ascii_only?
202
+ # https://discord.com/developers/docs/resources/channel#get-reactions
203
+ def get_reactions(token, channel_id, message_id, emoji, before_id, after_id, limit = 100)
204
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
205
+ query_string = URI.encode_www_form({ limit: limit || 100, before: before_id, after: after_id }.compact)
189
206
  Discordrb::API.request(
190
207
  :channels_cid_messages_mid_reactions_emoji,
191
208
  channel_id,
192
209
  :get,
193
- "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}",
210
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}?#{query_string}",
194
211
  Authorization: token
195
212
  )
196
213
  end
197
214
 
198
215
  # Deletes all reactions on a message from all clients
199
- # https://discordapp.com/developers/docs/resources/channel#delete-all-reactions
216
+ # https://discord.com/developers/docs/resources/channel#delete-all-reactions
200
217
  def delete_all_reactions(token, channel_id, message_id)
201
218
  Discordrb::API.request(
202
219
  :channels_cid_messages_mid_reactions,
@@ -207,8 +224,22 @@ module Discordrb::API::Channel
207
224
  )
208
225
  end
209
226
 
227
+ # Deletes all the reactions for a given emoji on a message
228
+ # https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji
229
+ def delete_all_emoji_reactions(token, channel_id, message_id, emoji)
230
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
231
+
232
+ Discordrb::API.request(
233
+ :channels_cid_messages_mid_reactions_emoji,
234
+ channel_id,
235
+ :delete,
236
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}",
237
+ Authorization: token
238
+ )
239
+ end
240
+
210
241
  # Update a channels permission for a role or member
211
- # https://discordapp.com/developers/docs/resources/channel#edit-channel-permissions
242
+ # https://discord.com/developers/docs/resources/channel#edit-channel-permissions
212
243
  def update_permission(token, channel_id, overwrite_id, allow, deny, type, reason = nil)
213
244
  Discordrb::API.request(
214
245
  :channels_cid_permissions_oid,
@@ -223,7 +254,7 @@ module Discordrb::API::Channel
223
254
  end
224
255
 
225
256
  # Get a channel's invite list
226
- # https://discordapp.com/developers/docs/resources/channel#get-channel-invites
257
+ # https://discord.com/developers/docs/resources/channel#get-channel-invites
227
258
  def invites(token, channel_id)
228
259
  Discordrb::API.request(
229
260
  :channels_cid_invites,
@@ -235,7 +266,7 @@ module Discordrb::API::Channel
235
266
  end
236
267
 
237
268
  # Create an instant invite from a server or a channel id
238
- # https://discordapp.com/developers/docs/resources/channel#create-channel-invite
269
+ # https://discord.com/developers/docs/resources/channel#create-channel-invite
239
270
  def create_invite(token, channel_id, max_age = 0, max_uses = 0, temporary = false, unique = false, reason = nil)
240
271
  Discordrb::API.request(
241
272
  :channels_cid_invites,
@@ -250,7 +281,7 @@ module Discordrb::API::Channel
250
281
  end
251
282
 
252
283
  # Delete channel permission
253
- # https://discordapp.com/developers/docs/resources/channel#delete-channel-permission
284
+ # https://discord.com/developers/docs/resources/channel#delete-channel-permission
254
285
  def delete_permission(token, channel_id, overwrite_id, reason = nil)
255
286
  Discordrb::API.request(
256
287
  :channels_cid_permissions_oid,
@@ -263,7 +294,7 @@ module Discordrb::API::Channel
263
294
  end
264
295
 
265
296
  # Start typing (needs to be resent every 5 seconds to keep up the typing)
266
- # https://discordapp.com/developers/docs/resources/channel#trigger-typing-indicator
297
+ # https://discord.com/developers/docs/resources/channel#trigger-typing-indicator
267
298
  def start_typing(token, channel_id)
268
299
  Discordrb::API.request(
269
300
  :channels_cid_typing,
@@ -276,7 +307,7 @@ module Discordrb::API::Channel
276
307
  end
277
308
 
278
309
  # Get a list of pinned messages in a channel
279
- # https://discordapp.com/developers/docs/resources/channel#get-pinned-messages
310
+ # https://discord.com/developers/docs/resources/channel#get-pinned-messages
280
311
  def pinned_messages(token, channel_id)
281
312
  Discordrb::API.request(
282
313
  :channels_cid_pins,
@@ -288,31 +319,35 @@ module Discordrb::API::Channel
288
319
  end
289
320
 
290
321
  # Pin a message
291
- # https://discordapp.com/developers/docs/resources/channel#add-pinned-channel-message
292
- def pin_message(token, channel_id, message_id)
322
+ # https://discord.com/developers/docs/resources/channel#add-pinned-channel-message
323
+ def pin_message(token, channel_id, message_id, reason = nil)
293
324
  Discordrb::API.request(
294
325
  :channels_cid_pins_mid,
295
326
  channel_id,
296
327
  :put,
297
328
  "#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
298
329
  nil,
299
- Authorization: token
330
+ Authorization: token,
331
+ 'X-Audit-Log-Reason': reason
300
332
  )
301
333
  end
302
334
 
303
335
  # Unpin a message
304
- # https://discordapp.com/developers/docs/resources/channel#delete-pinned-channel-message
305
- def unpin_message(token, channel_id, message_id)
336
+ # https://discord.com/developers/docs/resources/channel#delete-pinned-channel-message
337
+ def unpin_message(token, channel_id, message_id, reason = nil)
306
338
  Discordrb::API.request(
307
339
  :channels_cid_pins_mid,
308
340
  channel_id,
309
341
  :delete,
310
342
  "#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
311
- Authorization: token
343
+ Authorization: token,
344
+ 'X-Audit-Log-Reason': reason
312
345
  )
313
346
  end
314
347
 
315
348
  # Create an empty group channel.
349
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
350
+ # https://discord.com/developers/docs/resources/user#create-group-dm
316
351
  def create_empty_group(token, bot_user_id)
317
352
  Discordrb::API.request(
318
353
  :users_uid_channels,
@@ -326,6 +361,8 @@ module Discordrb::API::Channel
326
361
  end
327
362
 
328
363
  # Create a group channel.
364
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
365
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
329
366
  def create_group(token, pm_channel_id, user_id)
330
367
  Discordrb::API.request(
331
368
  :channels_cid_recipients_uid,
@@ -345,6 +382,8 @@ module Discordrb::API::Channel
345
382
  end
346
383
 
347
384
  # Add a user to a group channel.
385
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
386
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
348
387
  def add_group_user(token, group_channel_id, user_id)
349
388
  Discordrb::API.request(
350
389
  :channels_cid_recipients_uid,
@@ -358,6 +397,8 @@ module Discordrb::API::Channel
358
397
  end
359
398
 
360
399
  # Remove a user from a group channel.
400
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
401
+ # https://discord.com/developers/docs/resources/channel#group-dm-remove-recipient
361
402
  def remove_group_user(token, group_channel_id, user_id)
362
403
  Discordrb::API.request(
363
404
  :channels_cid_recipients_uid,
@@ -370,6 +411,8 @@ module Discordrb::API::Channel
370
411
  end
371
412
 
372
413
  # Leave a group channel.
414
+ # @deprecated Discord no longer supports bots in group DMs, this endpoint was repurposed and no longer works as implemented here.
415
+ # https://discord.com/developers/docs/resources/channel#deleteclose-channel
373
416
  def leave_group(token, group_channel_id)
374
417
  Discordrb::API.request(
375
418
  :channels_cid,
@@ -382,7 +425,7 @@ module Discordrb::API::Channel
382
425
  end
383
426
 
384
427
  # Create a webhook
385
- # https://discordapp.com/developers/docs/resources/webhook#create-webhook
428
+ # https://discord.com/developers/docs/resources/webhook#create-webhook
386
429
  def create_webhook(token, channel_id, name, avatar = nil, reason = nil)
387
430
  Discordrb::API.request(
388
431
  :channels_cid_webhooks,
@@ -397,7 +440,7 @@ module Discordrb::API::Channel
397
440
  end
398
441
 
399
442
  # Get channel webhooks
400
- # https://discordapp.com/developers/docs/resources/webhook#get-channel-webhooks
443
+ # https://discord.com/developers/docs/resources/webhook#get-channel-webhooks
401
444
  def webhooks(token, channel_id)
402
445
  Discordrb::API.request(
403
446
  :channels_cid_webhooks,
@@ -407,4 +450,150 @@ module Discordrb::API::Channel
407
450
  Authorization: token
408
451
  )
409
452
  end
453
+
454
+ # Start a thread based off a channel message.
455
+ # https://discord.com/developers/docs/resources/channel#start-thread-with-message
456
+ def start_thread_with_message(token, channel_id, message_id, name, auto_archive_duration)
457
+ Discordrb::API.request(
458
+ :channels_cid_messages_mid_threads,
459
+ channel_id,
460
+ :post,
461
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/threads",
462
+ { name: name, auto_archive_duration: auto_archive_duration }.to_json,
463
+ Authorization: token,
464
+ content_type: :json
465
+ )
466
+ end
467
+
468
+ # Start a thread without an associated message.
469
+ # https://discord.com/developers/docs/resources/channel#start-thread-without-message
470
+ def start_thread_without_message(token, channel_id, name, auto_archive_duration, type = 11)
471
+ Discordrb::API.request(
472
+ :channels_cid_threads,
473
+ channel_id,
474
+ :post,
475
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/threads",
476
+ { name: name, auto_archive_duration: auto_archive_duration, type: type },
477
+ Authorization: token,
478
+ content_type: :json
479
+ )
480
+ end
481
+
482
+ # Add the current user to a thread.
483
+ # https://discord.com/developers/docs/resources/channel#join-thread
484
+ def join_thread(token, channel_id)
485
+ Discordrb::API.request(
486
+ :channels_cid_thread_members_me,
487
+ channel_id,
488
+ :put,
489
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/thread-members/@me",
490
+ nil,
491
+ Authorization: token
492
+ )
493
+ end
494
+
495
+ # Add a user to a thread.
496
+ # https://discord.com/developers/docs/resources/channel#add-thread-member
497
+ def add_thread_member(token, channel_id, user_id)
498
+ Discordrb::API.request(
499
+ :channels_cid_thread_members_uid,
500
+ channel_id,
501
+ :put,
502
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/thread-members/#{user_id}",
503
+ nil,
504
+ Authorization: token
505
+ )
506
+ end
507
+
508
+ # Remove the current user from a thread.
509
+ # https://discord.com/developers/docs/resources/channel#leave-thread
510
+ def leave_thread(token, channel_id)
511
+ Discordrb::API.request(
512
+ :channels_cid_thread_members_me,
513
+ channel_id,
514
+ :delete,
515
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/thread-members/#{user_id}",
516
+ Authorization: token
517
+ )
518
+ end
519
+
520
+ # Remove a user from a thread.
521
+ # https://discord.com/developers/docs/resources/channel#remove-thread-member
522
+ def remove_thread_member(token, channel_id, user_id)
523
+ Discordrb::API.request(
524
+ :channels_cid_thread_members_uid,
525
+ channel_id,
526
+ :delete,
527
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/thread-members/#{user_id}",
528
+ Authorization: token
529
+ )
530
+ end
531
+
532
+ # Get the members of a thread.
533
+ # https://discord.com/developers/docs/resources/channel#list-thread-members
534
+ def list_thread_members(token, channel_id, before, limit)
535
+ query = URI.encode_www_form({ before: before, limit: limit }.compact)
536
+
537
+ Discordrb::API.request(
538
+ :channels_cid_thread_members,
539
+ channel_id,
540
+ :get,
541
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/thread-members?#{query}",
542
+ Authorization: token
543
+ )
544
+ end
545
+
546
+ # List active threads
547
+ # https://discord.com/developers/docs/resources/channel#list-active-threads
548
+ def list_active_threads(token, channel_id)
549
+ Discordrb::API.request(
550
+ :channels_cid_threads_active,
551
+ channel_id,
552
+ :get,
553
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/threads/active",
554
+ Authorization: token
555
+ )
556
+ end
557
+
558
+ # List public archived threads.
559
+ # https://discord.com/developers/docs/resources/channel#list-public-archived-threads
560
+ def list_public_archived_threads(token, channel_id, before = nil, limit = nil)
561
+ query = URI.encode_www_form({ before: before, limit: limit }.compact)
562
+
563
+ Discordrb::API.request(
564
+ :channels_cid_threads_archived_public,
565
+ channel_id,
566
+ :get,
567
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/threads/archived/public?#{query}",
568
+ Authorization: token
569
+ )
570
+ end
571
+
572
+ # List private archived threads.
573
+ # https://discord.com/developers/docs/resources/channel#list-private-archived-threads
574
+ def list_private_archived_threads(token, channel_id, before = nil, limit = nil)
575
+ query = URI.encode_www_form({ before: before, limit: limit }.compact)
576
+
577
+ Discordrb::API.request(
578
+ :channels_cid_threads_archived_private,
579
+ channel_id,
580
+ :get,
581
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/threads/archived/private?#{query}",
582
+ Authorization: token
583
+ )
584
+ end
585
+
586
+ # List joined private archived threads.
587
+ # https://discord.com/developers/docs/resources/channel#list-joined-private-archived-threads
588
+ def list_joined_private_archived_threads(token, channel_id, before = nil, limit = nil)
589
+ query = URI.encode_www_form({ before: before, limit: limit }.compact)
590
+
591
+ Discordrb::API.request(
592
+ :channels_cid_users_me_threads_archived_private,
593
+ channel_id,
594
+ :get,
595
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/users/@me/threads/archived/private?#{query}",
596
+ Authorization: token
597
+ )
598
+ end
410
599
  end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ # API calls for interactions.
4
+ module Discordrb::API::Interaction
5
+ module_function
6
+
7
+ # Respond to an interaction.
8
+ # https://discord.com/developers/docs/interactions/slash-commands#create-interaction-response
9
+ def create_interaction_response(interaction_token, interaction_id, type, content = nil, tts = nil, embeds = nil, allowed_mentions = nil, flags = nil, components = nil)
10
+ data = { tts: tts, content: content, embeds: embeds, allowed_mentions: allowed_mentions, flags: flags, components: components }.compact
11
+
12
+ Discordrb::API.request(
13
+ :interactions_iid_token_callback,
14
+ interaction_id,
15
+ :post,
16
+ "#{Discordrb::API.api_base}/interactions/#{interaction_id}/#{interaction_token}/callback",
17
+ { type: type, data: data }.to_json,
18
+ content_type: :json
19
+ )
20
+ end
21
+
22
+ # Create a response that results in a modal.
23
+ # https://discord.com/developers/docs/interactions/slash-commands#create-interaction-response
24
+ def create_interaction_modal_response(interaction_token, interaction_id, custom_id, title, components)
25
+ data = { custom_id: custom_id, title: title, components: components.to_a }.compact
26
+
27
+ Discordrb::API.request(
28
+ :interactions_iid_token_callback,
29
+ interaction_id,
30
+ :post,
31
+ "#{Discordrb::API.api_base}/interactions/#{interaction_id}/#{interaction_token}/callback",
32
+ { type: 9, data: data }.to_json,
33
+ content_type: :json
34
+ )
35
+ end
36
+
37
+ # Get the original response to an interaction.
38
+ # https://discord.com/developers/docs/interactions/slash-commands#get-original-interaction-response
39
+ def get_original_interaction_response(interaction_token, application_id)
40
+ Discordrb::API::Webhook.token_get_message(interaction_token, application_id, '@original')
41
+ end
42
+
43
+ # Edit the original response to an interaction.
44
+ # https://discord.com/developers/docs/interactions/slash-commands#edit-original-interaction-response
45
+ def edit_original_interaction_response(interaction_token, application_id, content = nil, embeds = nil, allowed_mentions = nil, components = nil)
46
+ Discordrb::API::Webhook.token_edit_message(interaction_token, application_id, '@original', content, embeds, allowed_mentions, components)
47
+ end
48
+
49
+ # Delete the original response to an interaction.
50
+ # https://discord.com/developers/docs/interactions/slash-commands#delete-original-interaction-response
51
+ def delete_original_interaction_response(interaction_token, application_id)
52
+ Discordrb::API::Webhook.token_delete_message(interaction_token, application_id, '@original')
53
+ end
54
+ end
@@ -5,19 +5,19 @@ module Discordrb::API::Invite
5
5
  module_function
6
6
 
7
7
  # Resolve an invite
8
- # https://discordapp.com/developers/docs/resources/invite#get-invite
8
+ # https://discord.com/developers/docs/resources/invite#get-invite
9
9
  def resolve(token, invite_code, counts = true)
10
10
  Discordrb::API.request(
11
11
  :invite_code,
12
12
  nil,
13
13
  :get,
14
- "#{Discordrb::API.api_base}/invite/#{invite_code}#{counts ? '?with_counts=true' : ''}",
14
+ "#{Discordrb::API.api_base}/invites/#{invite_code}#{counts ? '?with_counts=true' : ''}",
15
15
  Authorization: token
16
16
  )
17
17
  end
18
18
 
19
19
  # Delete an invite by code
20
- # https://discordapp.com/developers/docs/resources/invite#delete-invite
20
+ # https://discord.com/developers/docs/resources/invite#delete-invite
21
21
  def delete(token, code, reason = nil)
22
22
  Discordrb::API.request(
23
23
  :invites_code,
@@ -30,13 +30,13 @@ module Discordrb::API::Invite
30
30
  end
31
31
 
32
32
  # Join a server using an invite
33
- # https://discordapp.com/developers/docs/resources/invite#accept-invite
33
+ # https://discord.com/developers/docs/resources/invite#accept-invite
34
34
  def accept(token, invite_code)
35
35
  Discordrb::API.request(
36
36
  :invite_code,
37
37
  nil,
38
38
  :post,
39
- "#{Discordrb::API.api_base}/invite/#{invite_code}",
39
+ "#{Discordrb::API.api_base}/invites/#{invite_code}",
40
40
  nil,
41
41
  Authorization: token
42
42
  )