discordrb 3.3.0 → 3.4.3

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +126 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +25 -0
  5. data/.github/pull_request_template.md +37 -0
  6. data/.rubocop.yml +34 -37
  7. data/.travis.yml +5 -6
  8. data/CHANGELOG.md +504 -347
  9. data/Gemfile +2 -0
  10. data/LICENSE.txt +1 -1
  11. data/README.md +61 -79
  12. data/Rakefile +2 -0
  13. data/bin/console +1 -0
  14. data/discordrb-webhooks.gemspec +6 -6
  15. data/discordrb.gemspec +18 -18
  16. data/lib/discordrb/allowed_mentions.rb +36 -0
  17. data/lib/discordrb/api/channel.rb +62 -39
  18. data/lib/discordrb/api/invite.rb +3 -3
  19. data/lib/discordrb/api/server.rb +57 -50
  20. data/lib/discordrb/api/user.rb +9 -8
  21. data/lib/discordrb/api/webhook.rb +6 -6
  22. data/lib/discordrb/api.rb +40 -15
  23. data/lib/discordrb/await.rb +0 -1
  24. data/lib/discordrb/bot.rb +175 -73
  25. data/lib/discordrb/cache.rb +4 -2
  26. data/lib/discordrb/colour_rgb.rb +43 -0
  27. data/lib/discordrb/commands/command_bot.rb +30 -9
  28. data/lib/discordrb/commands/container.rb +20 -23
  29. data/lib/discordrb/commands/parser.rb +18 -18
  30. data/lib/discordrb/commands/rate_limiter.rb +3 -2
  31. data/lib/discordrb/container.rb +77 -17
  32. data/lib/discordrb/data/activity.rb +271 -0
  33. data/lib/discordrb/data/application.rb +50 -0
  34. data/lib/discordrb/data/attachment.rb +56 -0
  35. data/lib/discordrb/data/audit_logs.rb +345 -0
  36. data/lib/discordrb/data/channel.rb +849 -0
  37. data/lib/discordrb/data/embed.rb +251 -0
  38. data/lib/discordrb/data/emoji.rb +82 -0
  39. data/lib/discordrb/data/integration.rb +83 -0
  40. data/lib/discordrb/data/invite.rb +137 -0
  41. data/lib/discordrb/data/member.rb +297 -0
  42. data/lib/discordrb/data/message.rb +334 -0
  43. data/lib/discordrb/data/overwrite.rb +102 -0
  44. data/lib/discordrb/data/profile.rb +91 -0
  45. data/lib/discordrb/data/reaction.rb +33 -0
  46. data/lib/discordrb/data/recipient.rb +34 -0
  47. data/lib/discordrb/data/role.rb +191 -0
  48. data/lib/discordrb/data/server.rb +1002 -0
  49. data/lib/discordrb/data/user.rb +204 -0
  50. data/lib/discordrb/data/voice_region.rb +45 -0
  51. data/lib/discordrb/data/voice_state.rb +41 -0
  52. data/lib/discordrb/data/webhook.rb +145 -0
  53. data/lib/discordrb/data.rb +25 -4180
  54. data/lib/discordrb/errors.rb +2 -1
  55. data/lib/discordrb/events/bans.rb +7 -5
  56. data/lib/discordrb/events/channels.rb +2 -0
  57. data/lib/discordrb/events/guilds.rb +16 -9
  58. data/lib/discordrb/events/invites.rb +125 -0
  59. data/lib/discordrb/events/members.rb +6 -2
  60. data/lib/discordrb/events/message.rb +69 -27
  61. data/lib/discordrb/events/presence.rb +14 -4
  62. data/lib/discordrb/events/raw.rb +1 -3
  63. data/lib/discordrb/events/reactions.rb +49 -3
  64. data/lib/discordrb/events/typing.rb +6 -4
  65. data/lib/discordrb/events/voice_server_update.rb +47 -0
  66. data/lib/discordrb/events/voice_state_update.rb +15 -10
  67. data/lib/discordrb/events/webhooks.rb +9 -6
  68. data/lib/discordrb/gateway.rb +72 -57
  69. data/lib/discordrb/id_object.rb +39 -0
  70. data/lib/discordrb/light/integrations.rb +1 -1
  71. data/lib/discordrb/light/light_bot.rb +1 -1
  72. data/lib/discordrb/logger.rb +4 -4
  73. data/lib/discordrb/paginator.rb +57 -0
  74. data/lib/discordrb/permissions.rb +103 -8
  75. data/lib/discordrb/version.rb +1 -1
  76. data/lib/discordrb/voice/encoder.rb +16 -7
  77. data/lib/discordrb/voice/network.rb +84 -43
  78. data/lib/discordrb/voice/sodium.rb +96 -0
  79. data/lib/discordrb/voice/voice_bot.rb +34 -26
  80. data/lib/discordrb.rb +73 -0
  81. metadata +98 -60
  82. /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,7 +47,7 @@ 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
52
  Discordrb::API.request(
53
53
  :channels_cid_messages,
@@ -59,7 +59,7 @@ module Discordrb::API::Channel
59
59
  end
60
60
 
61
61
  # Get a single message from a channel's history by id
62
- # https://discordapp.com/developers/docs/resources/channel#get-channel-message
62
+ # https://discord.com/developers/docs/resources/channel#get-channel-message
63
63
  def message(token, channel_id, message_id)
64
64
  Discordrb::API.request(
65
65
  :channels_cid_messages_mid,
@@ -72,24 +72,37 @@ module Discordrb::API::Channel
72
72
 
73
73
  # Send a message to a channel
74
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
+ # @param attachments [Array<File>, nil] Attachments to use with `attachment://` in embeds. See
76
+ # https://discord.com/developers/docs/resources/channel#create-message-using-attachments-within-embeds
77
+ def create_message(token, channel_id, message, tts = false, embed = nil, nonce = nil, attachments = nil, allowed_mentions = nil, message_reference = nil)
78
+ body = { content: message, tts: tts, embed: embed, nonce: nonce, allowed_mentions: allowed_mentions, message_reference: message_reference }
79
+ body = if attachments
80
+ files = [*0...attachments.size].zip(attachments).to_h
81
+ { **files, payload_json: body.to_json }
82
+ else
83
+ body.to_json
84
+ end
85
+
86
+ headers = { Authorization: token }
87
+ headers[:content_type] = :json unless attachments
88
+
76
89
  Discordrb::API.request(
77
90
  :channels_cid_messages_mid,
78
91
  channel_id,
79
92
  :post,
80
93
  "#{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
94
+ body,
95
+ **headers
84
96
  )
85
97
  rescue RestClient::BadRequest => e
86
98
  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.'
99
+ 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.'
100
+
88
101
  raise
89
102
  end
90
103
 
91
104
  # Send a file as a message to a channel
92
- # https://discordapp.com/developers/docs/resources/channel#upload-file
105
+ # https://discord.com/developers/docs/resources/channel#upload-file
93
106
  def upload_file(token, channel_id, file, caption: nil, tts: false)
94
107
  Discordrb::API.request(
95
108
  :channels_cid_messages_mid,
@@ -102,7 +115,7 @@ module Discordrb::API::Channel
102
115
  end
103
116
 
104
117
  # Edit a message
105
- # https://discordapp.com/developers/docs/resources/channel#edit-message
118
+ # https://discord.com/developers/docs/resources/channel#edit-message
106
119
  def edit_message(token, channel_id, message_id, message, mentions = [], embed = nil)
107
120
  Discordrb::API.request(
108
121
  :channels_cid_messages_mid,
@@ -117,19 +130,20 @@ module Discordrb::API::Channel
117
130
 
118
131
  # Delete a message
119
132
  # https://discordapp.com/developers/docs/resources/channel#delete-message
120
- def delete_message(token, channel_id, message_id)
133
+ def delete_message(token, channel_id, message_id, reason = nil)
121
134
  Discordrb::API.request(
122
135
  :channels_cid_messages_mid,
123
136
  channel_id,
124
137
  :delete,
125
138
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}",
126
- Authorization: token
139
+ Authorization: token,
140
+ 'X-Audit-Log-Reason': reason
127
141
  )
128
142
  end
129
143
 
130
144
  # Delete messages in bulk
131
145
  # https://discordapp.com/developers/docs/resources/channel#bulk-delete-messages
132
- def bulk_delete_messages(token, channel_id, messages = [])
146
+ def bulk_delete_messages(token, channel_id, messages = [], reason = nil)
133
147
  Discordrb::API.request(
134
148
  :channels_cid_messages_bulk_delete,
135
149
  channel_id,
@@ -137,14 +151,15 @@ module Discordrb::API::Channel
137
151
  "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/bulk-delete",
138
152
  { messages: messages }.to_json,
139
153
  Authorization: token,
140
- content_type: :json
154
+ content_type: :json,
155
+ 'X-Audit-Log-Reason': reason
141
156
  )
142
157
  end
143
158
 
144
159
  # Create a reaction on a message using this client
145
- # https://discordapp.com/developers/docs/resources/channel#create-reaction
160
+ # https://discord.com/developers/docs/resources/channel#create-reaction
146
161
  def create_reaction(token, channel_id, message_id, emoji)
147
- emoji = URI.encode(emoji) unless emoji.ascii_only?
162
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
148
163
  Discordrb::API.request(
149
164
  :channels_cid_messages_mid_reactions_emoji_me,
150
165
  channel_id,
@@ -157,9 +172,9 @@ module Discordrb::API::Channel
157
172
  end
158
173
 
159
174
  # Delete this client's own reaction on a message
160
- # https://discordapp.com/developers/docs/resources/channel#delete-own-reaction
175
+ # https://discord.com/developers/docs/resources/channel#delete-own-reaction
161
176
  def delete_own_reaction(token, channel_id, message_id, emoji)
162
- emoji = URI.encode(emoji) unless emoji.ascii_only?
177
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
163
178
  Discordrb::API.request(
164
179
  :channels_cid_messages_mid_reactions_emoji_me,
165
180
  channel_id,
@@ -170,9 +185,9 @@ module Discordrb::API::Channel
170
185
  end
171
186
 
172
187
  # Delete another client's reaction on a message
173
- # https://discordapp.com/developers/docs/resources/channel#delete-user-reaction
188
+ # https://discord.com/developers/docs/resources/channel#delete-user-reaction
174
189
  def delete_user_reaction(token, channel_id, message_id, emoji, user_id)
175
- emoji = URI.encode(emoji) unless emoji.ascii_only?
190
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
176
191
  Discordrb::API.request(
177
192
  :channels_cid_messages_mid_reactions_emoji_uid,
178
193
  channel_id,
@@ -183,20 +198,21 @@ module Discordrb::API::Channel
183
198
  end
184
199
 
185
200
  # 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?
201
+ # https://discord.com/developers/docs/resources/channel#get-reactions
202
+ def get_reactions(token, channel_id, message_id, emoji, before_id, after_id, limit = 100)
203
+ emoji = URI.encode_www_form_component(emoji) unless emoji.ascii_only?
204
+ query_string = "limit=#{limit}#{"&before=#{before_id}" if before_id}#{"&after=#{after_id}" if after_id}"
189
205
  Discordrb::API.request(
190
206
  :channels_cid_messages_mid_reactions_emoji,
191
207
  channel_id,
192
208
  :get,
193
- "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}",
209
+ "#{Discordrb::API.api_base}/channels/#{channel_id}/messages/#{message_id}/reactions/#{emoji}?#{query_string}",
194
210
  Authorization: token
195
211
  )
196
212
  end
197
213
 
198
214
  # Deletes all reactions on a message from all clients
199
- # https://discordapp.com/developers/docs/resources/channel#delete-all-reactions
215
+ # https://discord.com/developers/docs/resources/channel#delete-all-reactions
200
216
  def delete_all_reactions(token, channel_id, message_id)
201
217
  Discordrb::API.request(
202
218
  :channels_cid_messages_mid_reactions,
@@ -208,7 +224,7 @@ module Discordrb::API::Channel
208
224
  end
209
225
 
210
226
  # Update a channels permission for a role or member
211
- # https://discordapp.com/developers/docs/resources/channel#edit-channel-permissions
227
+ # https://discord.com/developers/docs/resources/channel#edit-channel-permissions
212
228
  def update_permission(token, channel_id, overwrite_id, allow, deny, type, reason = nil)
213
229
  Discordrb::API.request(
214
230
  :channels_cid_permissions_oid,
@@ -223,7 +239,7 @@ module Discordrb::API::Channel
223
239
  end
224
240
 
225
241
  # Get a channel's invite list
226
- # https://discordapp.com/developers/docs/resources/channel#get-channel-invites
242
+ # https://discord.com/developers/docs/resources/channel#get-channel-invites
227
243
  def invites(token, channel_id)
228
244
  Discordrb::API.request(
229
245
  :channels_cid_invites,
@@ -235,7 +251,7 @@ module Discordrb::API::Channel
235
251
  end
236
252
 
237
253
  # Create an instant invite from a server or a channel id
238
- # https://discordapp.com/developers/docs/resources/channel#create-channel-invite
254
+ # https://discord.com/developers/docs/resources/channel#create-channel-invite
239
255
  def create_invite(token, channel_id, max_age = 0, max_uses = 0, temporary = false, unique = false, reason = nil)
240
256
  Discordrb::API.request(
241
257
  :channels_cid_invites,
@@ -250,7 +266,7 @@ module Discordrb::API::Channel
250
266
  end
251
267
 
252
268
  # Delete channel permission
253
- # https://discordapp.com/developers/docs/resources/channel#delete-channel-permission
269
+ # https://discord.com/developers/docs/resources/channel#delete-channel-permission
254
270
  def delete_permission(token, channel_id, overwrite_id, reason = nil)
255
271
  Discordrb::API.request(
256
272
  :channels_cid_permissions_oid,
@@ -263,7 +279,7 @@ module Discordrb::API::Channel
263
279
  end
264
280
 
265
281
  # 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
282
+ # https://discord.com/developers/docs/resources/channel#trigger-typing-indicator
267
283
  def start_typing(token, channel_id)
268
284
  Discordrb::API.request(
269
285
  :channels_cid_typing,
@@ -276,7 +292,7 @@ module Discordrb::API::Channel
276
292
  end
277
293
 
278
294
  # Get a list of pinned messages in a channel
279
- # https://discordapp.com/developers/docs/resources/channel#get-pinned-messages
295
+ # https://discord.com/developers/docs/resources/channel#get-pinned-messages
280
296
  def pinned_messages(token, channel_id)
281
297
  Discordrb::API.request(
282
298
  :channels_cid_pins,
@@ -289,30 +305,33 @@ module Discordrb::API::Channel
289
305
 
290
306
  # Pin a message
291
307
  # https://discordapp.com/developers/docs/resources/channel#add-pinned-channel-message
292
- def pin_message(token, channel_id, message_id)
308
+ def pin_message(token, channel_id, message_id, reason = nil)
293
309
  Discordrb::API.request(
294
310
  :channels_cid_pins_mid,
295
311
  channel_id,
296
312
  :put,
297
313
  "#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
298
314
  nil,
299
- Authorization: token
315
+ Authorization: token,
316
+ 'X-Audit-Log-Reason': reason
300
317
  )
301
318
  end
302
319
 
303
320
  # Unpin a message
304
321
  # https://discordapp.com/developers/docs/resources/channel#delete-pinned-channel-message
305
- def unpin_message(token, channel_id, message_id)
322
+ def unpin_message(token, channel_id, message_id, reason = nil)
306
323
  Discordrb::API.request(
307
324
  :channels_cid_pins_mid,
308
325
  channel_id,
309
326
  :delete,
310
327
  "#{Discordrb::API.api_base}/channels/#{channel_id}/pins/#{message_id}",
311
- Authorization: token
328
+ Authorization: token,
329
+ 'X-Audit-Log-Reason': reason
312
330
  )
313
331
  end
314
332
 
315
333
  # Create an empty group channel.
334
+ # https://discord.com/developers/docs/resources/user#create-group-dm
316
335
  def create_empty_group(token, bot_user_id)
317
336
  Discordrb::API.request(
318
337
  :users_uid_channels,
@@ -326,6 +345,7 @@ module Discordrb::API::Channel
326
345
  end
327
346
 
328
347
  # Create a group channel.
348
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
329
349
  def create_group(token, pm_channel_id, user_id)
330
350
  Discordrb::API.request(
331
351
  :channels_cid_recipients_uid,
@@ -345,6 +365,7 @@ module Discordrb::API::Channel
345
365
  end
346
366
 
347
367
  # Add a user to a group channel.
368
+ # https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
348
369
  def add_group_user(token, group_channel_id, user_id)
349
370
  Discordrb::API.request(
350
371
  :channels_cid_recipients_uid,
@@ -358,6 +379,7 @@ module Discordrb::API::Channel
358
379
  end
359
380
 
360
381
  # Remove a user from a group channel.
382
+ # https://discord.com/developers/docs/resources/channel#group-dm-remove-recipient
361
383
  def remove_group_user(token, group_channel_id, user_id)
362
384
  Discordrb::API.request(
363
385
  :channels_cid_recipients_uid,
@@ -370,6 +392,7 @@ module Discordrb::API::Channel
370
392
  end
371
393
 
372
394
  # Leave a group channel.
395
+ # https://discord.com/developers/docs/resources/channel#deleteclose-channel
373
396
  def leave_group(token, group_channel_id)
374
397
  Discordrb::API.request(
375
398
  :channels_cid,
@@ -382,7 +405,7 @@ module Discordrb::API::Channel
382
405
  end
383
406
 
384
407
  # Create a webhook
385
- # https://discordapp.com/developers/docs/resources/webhook#create-webhook
408
+ # https://discord.com/developers/docs/resources/webhook#create-webhook
386
409
  def create_webhook(token, channel_id, name, avatar = nil, reason = nil)
387
410
  Discordrb::API.request(
388
411
  :channels_cid_webhooks,
@@ -397,7 +420,7 @@ module Discordrb::API::Channel
397
420
  end
398
421
 
399
422
  # Get channel webhooks
400
- # https://discordapp.com/developers/docs/resources/webhook#get-channel-webhooks
423
+ # https://discord.com/developers/docs/resources/webhook#get-channel-webhooks
401
424
  def webhooks(token, channel_id)
402
425
  Discordrb::API.request(
403
426
  :channels_cid_webhooks,
@@ -5,7 +5,7 @@ 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,
@@ -17,7 +17,7 @@ module Discordrb::API::Invite
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,7 +30,7 @@ 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,