vox 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/deploy_docs.yml +39 -0
- data/.github/workflows/rspec.yml +29 -0
- data/.github/workflows/rubocop.yml +24 -0
- data/.github/workflows/yard.yml +32 -0
- data/.gitignore +14 -0
- data/.rspec +3 -0
- data/.rubocop.yml +22 -0
- data/.yardopts +4 -0
- data/CHANGELOG.md +0 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/LICENSE.md +25 -0
- data/README.md +44 -0
- data/Rakefile +14 -0
- data/lib/vox.rb +10 -0
- data/lib/vox/http/client.rb +146 -0
- data/lib/vox/http/error.rb +56 -0
- data/lib/vox/http/middleware.rb +14 -0
- data/lib/vox/http/middleware/log_formatter.rb +62 -0
- data/lib/vox/http/middleware/rate_limiter.rb +206 -0
- data/lib/vox/http/route.rb +59 -0
- data/lib/vox/http/routes.rb +22 -0
- data/lib/vox/http/routes/audit_log.rb +71 -0
- data/lib/vox/http/routes/channel.rb +425 -0
- data/lib/vox/http/routes/emoji.rb +87 -0
- data/lib/vox/http/routes/guild.rb +292 -0
- data/lib/vox/http/routes/invite.rb +37 -0
- data/lib/vox/http/routes/user.rb +114 -0
- data/lib/vox/http/routes/voice.rb +22 -0
- data/lib/vox/http/routes/webhook.rb +177 -0
- data/lib/vox/http/upload_io.rb +23 -0
- data/lib/vox/http/util.rb +33 -0
- data/lib/vox/version.rb +6 -0
- data/vox.gemspec +42 -0
- metadata +234 -0
@@ -0,0 +1,425 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'vox/http/route'
|
4
|
+
require 'vox/http/util'
|
5
|
+
|
6
|
+
module Vox
|
7
|
+
module HTTP
|
8
|
+
module Routes
|
9
|
+
# Mixin for /channel/ routes.
|
10
|
+
module Channel
|
11
|
+
# Channel types.
|
12
|
+
TYPES = {
|
13
|
+
GUILD_TEXT: 0,
|
14
|
+
DM: 1,
|
15
|
+
GUILD_VOICE: 2,
|
16
|
+
GROUP_DM: 3,
|
17
|
+
GUILD_CATEGORY: 4,
|
18
|
+
GUILD_NEWS: 5,
|
19
|
+
GUILD_STORE: 6
|
20
|
+
}.freeze
|
21
|
+
|
22
|
+
include Util
|
23
|
+
|
24
|
+
# Get a channel by ID.
|
25
|
+
# @param channel_id [String, Integer] ID of the desired channel.
|
26
|
+
# @return [Hash<Symbol, Object>] A [channel](https://discord.com/developers/docs/resources/channel#channel-object)
|
27
|
+
# object.
|
28
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-channel
|
29
|
+
def get_channel(channel_id)
|
30
|
+
request(Route.new(:GET, '/channels/%{channel_id}', channel_id: channel_id))
|
31
|
+
end
|
32
|
+
|
33
|
+
# Update a channel's settings. Parameters other than `channel_id` are all optional.
|
34
|
+
# @param name [String] Channel name, must be between 2-100 characters.
|
35
|
+
# @param type [Integer] Channel type, only switching between `GUILD_TEXT` and `GUILD_NEWS`
|
36
|
+
# is supported on guilds which have the `NEWS` feature.
|
37
|
+
# @param position [Integer, nil] The position of the channel in the listing.
|
38
|
+
# @param topic [String, nil] Channel topic, must be between 0-1024 characters. Only usable in `GUILD_TEXT`
|
39
|
+
# and `GUILD_NEWS` channels.
|
40
|
+
# @param nsfw [true, false, nil] Whether the channel is not safe for work. Only usable on
|
41
|
+
# `GUILD_TEXT`, `GUILD_NEWS`, and `GUILD_STORE` channels.
|
42
|
+
# @param rate_limit_per_user [Integer, nil] The amount of seconds a user has to wait between sending
|
43
|
+
# messages. This value can be between 0-21600 seconds. Users and bots with `MANAGE_MESSAGES`
|
44
|
+
# or `MANAGE_CHANNEL` are unaffected by this limit. Only usable in `GUILD_TEXT` channels.
|
45
|
+
# @param bitrate [Integer, nil] The bitrate of a `GUILD_VOICE` channel. Between 8000 and 96000, or
|
46
|
+
# 128000 for VIP servers.
|
47
|
+
# @param user_limit [Integer, nil] The maximum amount of users allowed in a voice channel. 0 is no limit,
|
48
|
+
# and limiting values can be between 1-99.
|
49
|
+
# @param permission_overwrites [Array<Overwrite, Hash>] Channel or category specific permissions.
|
50
|
+
# @param parent_id [String, Integer] The ID of the new parent category for a channel. Only usable in
|
51
|
+
# `GUILD_TEXT`, `GUILD_NEWS`, `GUILD_STORE`, and `GUILD_VOICE` channels.
|
52
|
+
# @param reason [String, nil] The reason for modifying the channel.
|
53
|
+
# @return [Hash<Symbol, Object>] A [channel](https://discord.com/developers/docs/resources/channel#channel-object)
|
54
|
+
# object.
|
55
|
+
# @note Fires a channel update. In the event of modifying a category, individual
|
56
|
+
# channel updates will fire for each child that is also modified.
|
57
|
+
# @vox.permissions MANAGE_CHANNELS
|
58
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#modify-channel
|
59
|
+
def modify_channel(channel_id, name: :undef, type: :undef, position: :undef,
|
60
|
+
topic: :undef, nsfw: :undef, rate_limit_per_user: :undef,
|
61
|
+
bitrate: :undef, user_limit: :undef,
|
62
|
+
permission_overwrites: :undef, parent_id: :undef, reason: nil)
|
63
|
+
json = filter_undef({
|
64
|
+
name: name, type: type, position: position, topic: topic, nsfw: nsfw,
|
65
|
+
rate_limit_per_user: rate_limit_per_user, bitrate: bitrate,
|
66
|
+
user_limit: user_limit, permission_overwrites: permission_overwrites,
|
67
|
+
parent_id: parent_id
|
68
|
+
})
|
69
|
+
route = Route.new(:PATCH, '/channels/%{channel_id}', channel_id: channel_id)
|
70
|
+
request(route, json: json, reason: reason)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Delete a channel by ID, or close a private message.
|
74
|
+
# @param channel_id [String, Integer] The ID of the channel to be deleted.
|
75
|
+
# @param reason [String, nil] The reason the channel is being deleted.
|
76
|
+
# @return [Hash<Symbol, Object>] The [channel](https://discord.com/developers/docs/resources/channel#channel-object)
|
77
|
+
# object of the deleted channel.
|
78
|
+
# @note Fires a channel delete event.
|
79
|
+
# @note Deleting a category will not delete its children, each child will have
|
80
|
+
# its `parent_id` field removed and a channel update will be fired for each
|
81
|
+
# of them.
|
82
|
+
# @vox.permissions MANAGE_CHANNELS
|
83
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#deleteclose-channel
|
84
|
+
def delete_channel(channel_id, reason: nil)
|
85
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}', channel_id: channel_id)
|
86
|
+
request(route, reason: reason)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get messages from a channel, by channel ID. All parameters other than `channel_id` are
|
90
|
+
# optional.
|
91
|
+
# @param channel_id [String, Integer] The ID of the channel where the messages
|
92
|
+
# are being fetched from.
|
93
|
+
# @param around [String, Integer] Retreive messages around this ID.
|
94
|
+
# @param before [String, Integer] Retreive messages before this ID.
|
95
|
+
# @param after [String, Integer] Retreive messages after this ID.
|
96
|
+
# @param limit [Integer] Maximum number of messages to return. Can be between 1-100.
|
97
|
+
# @return [Array<Hash<Symbol, Object>>] [Message](https://discord.com/developers/docs/resources/channel#message-object)
|
98
|
+
# objects returned from the channel history.
|
99
|
+
# @note If you lack the `READ_MESSAGE_HISTORY` permission in the desired channel this
|
100
|
+
# will return no messages.
|
101
|
+
# @vox.permissions VIEW_CHANNEL
|
102
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-channel-messages
|
103
|
+
def get_channel_messages(channel_id, around: :undef, before: :undef, after: :undef, limit: :undef)
|
104
|
+
route = Route.new(:GET, '/channels/%{channel_id}/messages', channel_id: channel_id)
|
105
|
+
params = filter_undef({ around: around, before: before, after: after, limit: limit })
|
106
|
+
request(route, query: params)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Get a specific message from a channel by ID.
|
110
|
+
# @param channel_id [String, Integer] The ID of the channel containing the desired message.
|
111
|
+
# @param message_id [String, Integer] The ID of the desired message.
|
112
|
+
# @return [Hash<Symbol, Object>] The [message](https://discord.com/developers/docs/resources/channel#message-object)
|
113
|
+
# object.
|
114
|
+
# @note In guild channels the `READ_MESSAGE_HISTORY` permission is requred.
|
115
|
+
# @vox.permissions READ_MESSAGE_HISTORY
|
116
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-channel-message
|
117
|
+
def get_channel_message(channel_id, message_id)
|
118
|
+
route = Route.new(:GET, '/channels/%{channel_id}/messages/%{message_id}',
|
119
|
+
channel_id: channel_id, message_id: message_id)
|
120
|
+
request(route)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Create a message in a channel. All parameters other than `channel_id` are optional.
|
124
|
+
# @param channel_id [String, Integer] The ID of the target channel.
|
125
|
+
# @param content [String] Message contents, up to 2000 characters.
|
126
|
+
# @param nonce [String, Integer] A nonce used for optimistic message sending.
|
127
|
+
# @param tts [true, false] Whether this message should use TTS (text to speech).
|
128
|
+
# @param file [File, String] A File object, or path to a file, to be uploaded.
|
129
|
+
# @param embed [Hash] Embedded rich content. See [embed object](https://discord.com/developers/docs/resources/channel#embed-object).
|
130
|
+
# @param allowed_mentions [Hash<(:parse, :roles, :users), Array<:roles, :users, :everyone>>] Rules for what
|
131
|
+
# mentions are allowed in the message. See [allowed_mentions object](https://discord.com/developers/docs/resources/channel#allowed-mentions-object).
|
132
|
+
# @param attachments [Hash<String, UploadIO>, Array<UploadIO>] A hash in the form of `filename => upload_io` to
|
133
|
+
# be referenced in embeds via the `attachment://` URI, or an array of {UploadIO} who's filenames are derived
|
134
|
+
# from the existing UploadIO object. See [attachment:// docs](https://discord.com/developers/docs/resources/channel#create-message-using-attachments-within-embeds).
|
135
|
+
# @return [Hash<Symbol, Object>] The created [message](https://discord.com/developers/docs/resources/channel#message-object)
|
136
|
+
# object.
|
137
|
+
# @note You must send one of `content`, `embed`, or `file`.
|
138
|
+
# @note If `tts` is set to `true`, you also require the `SEND_TTS_MESSAGES` permission.
|
139
|
+
# @vox.permissions SEND_MESSAGES SEND_TTS_MESSAGES
|
140
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#create-message
|
141
|
+
def create_message(channel_id, content: :undef, nonce: :undef, tts: :undef, file: :undef, embed: :undef,
|
142
|
+
allowed_mentions: :undef, attachments: :undef)
|
143
|
+
route = Route.new(:POST, '/channels/%{channel_id}/messages', channel_id: channel_id)
|
144
|
+
json = filter_undef({ content: content, nonce: nonce, tts: tts, embed: embed,
|
145
|
+
allowed_mentions: allowed_mentions })
|
146
|
+
|
147
|
+
if file != :undef
|
148
|
+
data = { file: file, payload_json: MultiJson.dump(json) }
|
149
|
+
request(route, data: data)
|
150
|
+
elsif attachments != :undef
|
151
|
+
attachments = attachments.collect { |k, v| UploadIO.new(v.io, v.content_type, k) } if attachments.is_a? Hash
|
152
|
+
attach_hash = Array(0...attachments.size).zip(attachments).to_h
|
153
|
+
data = attach_hash.merge({ payload_json: MultiJson.dump(json) })
|
154
|
+
request(route, data: data)
|
155
|
+
else
|
156
|
+
request(route, json: json)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
# Create a reaction on a message.
|
161
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
162
|
+
# @param message_id [String, Integer] The ID of the target message.
|
163
|
+
# @param emoji [String] Either a unicode emoji, or Discord emoji in the format of `name:id`.
|
164
|
+
# @note Requires `READ_MESSAGE_HISTORY`, and `ADD_REACTIONS` if no other user has reacted with
|
165
|
+
# the emoji.
|
166
|
+
# @note If your emoji is in the wrong format you will receive error code `10014: Unknown Emoji`
|
167
|
+
# @note If the emoji name is unknown, you can provide any alphanumeric value as a placeholder.
|
168
|
+
# @vox.permissions READ_MESSAGE_HISTORY ADD_REACTIONS
|
169
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#create-reaction
|
170
|
+
def create_reaction(channel_id, message_id, emoji)
|
171
|
+
escaped_emoji = URI.encode_www_form_component(emoji)
|
172
|
+
route = Route.new(:PUT, '/channels/%{channel_id}/messages/%{message_id}/reactions/%{emoji}/@me',
|
173
|
+
channel_id: channel_id, message_id: message_id, emoji: escaped_emoji)
|
174
|
+
request(route)
|
175
|
+
end
|
176
|
+
|
177
|
+
# Delete a reaction from the current user on a message.
|
178
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
179
|
+
# @param message_id [String, Integer] The ID of the target message.
|
180
|
+
# @param emoji [String] Either a unicode emoji, or Discord emoji in the format of `name:id`.
|
181
|
+
# @note If your emoji is in the wrong format you will receive error code `10014: Unknown Emoji`
|
182
|
+
# @note If the emoji name is unknown, you can provide any alphanumeric value as a placeholder.
|
183
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-own-reaction
|
184
|
+
def delete_own_reaction(channel_id, message_id, emoji)
|
185
|
+
escaped_emoji = URI.encode_www_form_component(emoji)
|
186
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/messages/%{message_id}/reactions/%{emoji}/@me',
|
187
|
+
channel_id: channel_id, message_id: message_id, emoji: escaped_emoji)
|
188
|
+
request(route)
|
189
|
+
end
|
190
|
+
|
191
|
+
# Delete a reaction from a user on a message.
|
192
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
193
|
+
# @param message_id [String, Integer] The ID of the target message.
|
194
|
+
# @param emoji [String] Either a unicode emoji, or Discord emoji in the format of `name:id`.
|
195
|
+
# @param user_id [String, Integer] The ID of the user to delete the reaction for.
|
196
|
+
# @vox.permissions MANAGE_MESSAGES
|
197
|
+
# @note If your emoji is in the wrong format you will receive error code `10014: Unknown Emoji`
|
198
|
+
# @note If the emoji name is unknown, you can provide any alphanumeric value as a placeholder.
|
199
|
+
# @vox.permissions MANAGE_MESSAGES
|
200
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-user-reaction
|
201
|
+
def delete_user_reaction(channel_id, message_id, emoji, user_id)
|
202
|
+
escaped_emoji = URI.encode_www_form_component(emoji)
|
203
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/messages/%{message_id}/reactions/%{emoji}/%{user_id}',
|
204
|
+
channel_id: channel_id, message_id: message_id, emoji: escaped_emoji, user_id: user_id)
|
205
|
+
request(route)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Get a list of users that have reacted with a specific emoji.
|
209
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
210
|
+
# @param message_id [String, Integer] The ID of the target message.
|
211
|
+
# @param emoji [String] Either a unicode emoji, or Discord emoji in the format of `name:id`.
|
212
|
+
# @param before [String, Integer] Retreive users before this ID.
|
213
|
+
# @param after [String, Integer] Retreive users after this ID.
|
214
|
+
# @param limit [Integer] The maximum number of users to receive. Between 1-100.
|
215
|
+
# @note If your emoji is in the wrong format you will receive error code `10014: Unknown Emoji`
|
216
|
+
# @note If the emoji name is unknown, you can provide any alphanumeric value as a placeholder.
|
217
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-reactions
|
218
|
+
def get_reactions(channel_id, message_id, emoji, before: :undef, after: :undef, limit: :undef)
|
219
|
+
escaped_emoji = URI.encode_www_form_component(emoji)
|
220
|
+
params = filter_undef({ before: before, after: after, limit: limit })
|
221
|
+
route = Route.new(:GET, '/channels/%{channel_id}/messages/%{message_id}/reactions/%{emoji}',
|
222
|
+
channel_id: channel_id, message_id: message_id, emoji: escaped_emoji)
|
223
|
+
request(route, query: params)
|
224
|
+
end
|
225
|
+
|
226
|
+
# Delete all reactions on a message.
|
227
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
228
|
+
# @param message_id [String, Integer] The ID of the target message.
|
229
|
+
# @vox.permissions MANAGE_MESSAGES
|
230
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-all-reactions
|
231
|
+
def delete_all_reactions(channel_id, message_id)
|
232
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/messages/%{message_id}/reactions',
|
233
|
+
channel_id: channel_id, message_id: message_id)
|
234
|
+
request(route)
|
235
|
+
end
|
236
|
+
|
237
|
+
# Delete all reactions of a specific emoji on a message.
|
238
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
239
|
+
# @param message_id [String, Integer] The ID of the target message.
|
240
|
+
# @param emoji [String] Either a unicode emoji, or Discord emoji in the format of `name:id`.
|
241
|
+
# @note If your emoji is in the wrong format you will receive error code `10014: Unknown Emoji`
|
242
|
+
# @note If the emoji name is unknown, you can provide any alphanumeric value as a placeholder.
|
243
|
+
# @vox.permissions MANAGE_MESSAGES
|
244
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-all-reactions-for-emoji
|
245
|
+
def delete_all_reactions_for_emoji(channel_id, message_id, emoji)
|
246
|
+
escaped_emoji = URI.encode_www_form_component(emoji)
|
247
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/messages/%{message_id}/reactions/%{emoji}',
|
248
|
+
channel_id: channel_id, message_id: message_id, emoji: escaped_emoji)
|
249
|
+
request(route)
|
250
|
+
end
|
251
|
+
|
252
|
+
# Edit a previously sent message. All parameters other than `channel_id` and `message_id`
|
253
|
+
# are optional and nullable.
|
254
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
255
|
+
# @param message_id [String, Integer] The ID of the target message.
|
256
|
+
# @param content [String, nil] The message content. If `nil`, existing content will be removed.
|
257
|
+
# @param embed [Hash] Embedded rich content. If `nil`, the existing embed will be removed.
|
258
|
+
# @param flags [Integer] Message flags. If `nil`, the existing flags will be removed. When setting flags be sure
|
259
|
+
# to include all previously set flags in addition to the ones you are modifying.
|
260
|
+
# See [message flags](https://discord.com/developers/docs/resources/channel#message-object-message-flags).
|
261
|
+
# @note You can only edit the flags of a message not sent by the current user, and only if the current
|
262
|
+
# user has `MANAGE_MESSAGES` permissions.
|
263
|
+
# @vox.permissions MANAGE_MESSAGES (if editing the flags of a message not sent by the current user)
|
264
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#edit-message
|
265
|
+
def edit_message(channel_id, message_id, content: :undef, embed: :undef, flags: :undef)
|
266
|
+
route = Route.new(:PATCH, '/channels/%{channel_id}/messages/%{message_id}',
|
267
|
+
channel_id: channel_id, message_id: message_id)
|
268
|
+
json = filter_undef({ content: content, embed: embed, flags: flags })
|
269
|
+
request(route, json: json)
|
270
|
+
end
|
271
|
+
|
272
|
+
# Delete a previously sent message.
|
273
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target message.
|
274
|
+
# @param message_id [String, Integer] The ID of the target message.
|
275
|
+
# @param reason [String] The reason for deleting this message.
|
276
|
+
# @vox.permissions MANAGE_MESSAGES (if not the message was not sent by the current user)
|
277
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-message
|
278
|
+
def delete_message(channel_id, message_id, reason: nil)
|
279
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/messages/%{message_id}',
|
280
|
+
channel_id: channel_id, message_id: message_id)
|
281
|
+
request(route, reason: reason)
|
282
|
+
end
|
283
|
+
|
284
|
+
# Delete multiple message in a single request.
|
285
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target messages.
|
286
|
+
# @param messages [Array<String, Integer>] The IDs of the target messages.
|
287
|
+
# @param reason [String] The reason the messages are being deleted.
|
288
|
+
# @note The endpoint will not delete messages older than 2 weeks and will fail with {HTTP::Error::BadRequest}
|
289
|
+
# if any message provided is older than that, or a duplicate within the list of message IDs.
|
290
|
+
# @vox.permissions MANAGE_MESSAGES
|
291
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#bulk-delete-messages
|
292
|
+
def bulk_delete_messages(channel_id, messages, reason: nil)
|
293
|
+
route = Route.new(:POST, '/channels/%{channel_id}/messages/bulk-delete', channel_id: channel_id)
|
294
|
+
request(route, json: { messages: messages }, reason: reason)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Edit the channel permission overwrites for a user or role in a channel.
|
298
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target overwrite.
|
299
|
+
# @param overwrite_id [String, Integer] The ID of the target user or role.
|
300
|
+
# @param allow [Integer] Bitwise value of all allowed permissions.
|
301
|
+
# @param deny [Integer] Bitwise value of all denied permissions.
|
302
|
+
# @param type [:member, :role]
|
303
|
+
# @note Only usable for guild channels.
|
304
|
+
# @vox.permissions MANAGE_ROLES
|
305
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#edit-channel-permissions
|
306
|
+
def edit_channel_permissions(channel_id, overwrite_id, allow:, deny:, type:, reason: nil)
|
307
|
+
route = Route.new(:PUT, '/channels/%{channel_id}/permissions/%{overwrite_id}',
|
308
|
+
channel_id: channel_id, overwrite_id: overwrite_id)
|
309
|
+
json = { allow: allow, deny: deny, type: type }
|
310
|
+
request(route, json: json, reason: reason)
|
311
|
+
end
|
312
|
+
|
313
|
+
# Get a list of invites (with invite metadata) for a channel.
|
314
|
+
# @param channel_id [String, Integer] The ID of the target channel.
|
315
|
+
# @return [Array<Hash<Symbol, Object>>] An array of [invite objects](https://discord.com/developers/docs/resources/invite#invite-object-invite-structure)
|
316
|
+
# with [invite metadata](https://discord.com/developers/docs/resources/invite#invite-metadata-object-invite-metadata-structure).
|
317
|
+
# @vox.permissions MANAGE_CHANNELS
|
318
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-channel-invites
|
319
|
+
def get_channel_invites(channel_id)
|
320
|
+
route = Route.new(:GET, '/channels/%{channel_id}/invites', channel_id: channel_id)
|
321
|
+
request(route)
|
322
|
+
end
|
323
|
+
|
324
|
+
# Create a new invite for a channel. All parameters aside from `channel_id` are optional.
|
325
|
+
# @param channel_id [String, Integer] The ID of the channel to create an invite in.
|
326
|
+
# @param max_age [Integer] Duration of invite in seconds before expiry, or 0 for never. Defaults to 24 hours.
|
327
|
+
# @param max_uses [Integer] Maximum number of uses, or 0 for unlimited uses. Defaults to 0.
|
328
|
+
# @param temporary [true, false] Whether this invite only grants temporary membership. Defaults to false.
|
329
|
+
# @param unique [true, false] Whether or not to avoid using an existing similar invite. Defaults to false.
|
330
|
+
# @param target_user [String, Integer] The ID of the user intended for this invite.
|
331
|
+
# @param target_user_type [Integer] The [target user type](https://discord.com/developers/docs/resources/invite#invite-object-target-user-types)
|
332
|
+
# of this invite.
|
333
|
+
# @param reason [String] The reason for creating this invite.
|
334
|
+
# @return [Hash<Symbol, Object>] The created [invite object](https://discord.com/developers/docs/resources/invite#invite-object-invite-structure).
|
335
|
+
# @vox.permissions CREATE_INSTANT_INVITE
|
336
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#create-channel-invite
|
337
|
+
def create_channel_invite(channel_id, max_age: :undef, max_uses: :undef, temporary: :undef, unique: :undef,
|
338
|
+
target_user: :undef, target_user_type: :undef, reason: nil)
|
339
|
+
route = Route.new(:POST, '/channels/%{channel_id}/invites', channel_id: channel_id)
|
340
|
+
json = filter_undef({ max_age: max_age, max_uses: max_uses, temporary: temporary, unique: unique,
|
341
|
+
target_user: target_user, target_user_type: target_user_type })
|
342
|
+
request(route, json: json, reason: reason)
|
343
|
+
end
|
344
|
+
|
345
|
+
# Delete a channel permission overwrite for a user or role in a channel.
|
346
|
+
# @param channel_id [String, Integer] The ID of the channel that contains the target overwrite.
|
347
|
+
# @param overwrite_id [String, Integer] The ID of the target user or role.
|
348
|
+
# @param reason [String] The reason this overwrite is being deleted.
|
349
|
+
# @note Only usable within guild channels.
|
350
|
+
# @vox.permissions MANAGE_ROLES
|
351
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-channel-permission
|
352
|
+
def delete_channel_permission(channel_id, overwrite_id, reason: nil)
|
353
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/permissions/%{overwrite_id}',
|
354
|
+
channel_id: channel_id, overwrite_id: overwrite_id)
|
355
|
+
request(route, reason: reason)
|
356
|
+
end
|
357
|
+
|
358
|
+
# Post a typing indicator for a channel.
|
359
|
+
# @param channel_id [String, Integer] The ID of the channel to appear as typing in.
|
360
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#trigger-typing-indicator
|
361
|
+
def trigger_typing_indicator(channel_id)
|
362
|
+
route = Route.new(:POST, '/channels/%{channel_id}/typing', channel_id: channel_id)
|
363
|
+
request(route)
|
364
|
+
end
|
365
|
+
|
366
|
+
# Get all pinned messages in a channel.
|
367
|
+
# @param channel_id [String, Integer] The ID of the channel to fetch the pins of.
|
368
|
+
# @return [Array<Hash<Symbol, Object>>] An array of pinned [message objects](https://discord.com/developers/docs/resources/channel#message-object).
|
369
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#get-pinned-messages
|
370
|
+
def get_pinned_messages(channel_id)
|
371
|
+
route = Route.new(:GET, '/channels/%{channel_id}/pins', channel_id: channel_id)
|
372
|
+
request(route)
|
373
|
+
end
|
374
|
+
|
375
|
+
# Add a message to a channel's pins.
|
376
|
+
# @param channel_id [String, Integer] The ID of the channel to add a pinned message to.
|
377
|
+
# @param message_id [String, Integer] The ID of the message to pin.
|
378
|
+
# @param reason [String] The reason a message is being pinned.
|
379
|
+
# @vox.permissions MANAGE_MESSAGES
|
380
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#add-pinned-channel-message
|
381
|
+
def add_pinned_channel_message(channel_id, message_id, reason: nil)
|
382
|
+
route = Route.new(:POST, '/channels/%{channel_id}/pins/%{message_id}',
|
383
|
+
channel_id: channel_id, message_id: message_id)
|
384
|
+
request(route, reason: reason)
|
385
|
+
end
|
386
|
+
|
387
|
+
# Remove a message from a channel's pins.
|
388
|
+
# @param channel_id [String, Integer] The ID of the channel to remove a pinned message from.
|
389
|
+
# @param message_id [String, Integer] The ID of the message to unpin.
|
390
|
+
# @param reason [String] The reason a message is being unpinned.
|
391
|
+
# @vox.permissions MANAGE_MESSAGES
|
392
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#delete-pinned-channel-message
|
393
|
+
def delete_pinned_channel_message(channel_id, message_id, reason: nil)
|
394
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/pins/%{message_id}',
|
395
|
+
channel_id: channel_id, message_id: message_id)
|
396
|
+
request(route, reason: reason)
|
397
|
+
end
|
398
|
+
|
399
|
+
# Add a recipient to a group DM using their access token.
|
400
|
+
# @param channel_id [String, Integer] The ID of the group DM to add the user to.
|
401
|
+
# @param user_id [String, Integer] The ID of the user to add.
|
402
|
+
# @param access_token [String] The access token of a user that has granted your app
|
403
|
+
# the `gdm.join` scope.
|
404
|
+
# @param nick [String] The nickname of the user being added.
|
405
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#group-dm-add-recipient
|
406
|
+
def group_dm_add_recipient(channel_id, user_id, access_token:, nick: :undef)
|
407
|
+
route = Route.new(:PUT, '/channels/%{channel_id}/recipients/%{user_id}',
|
408
|
+
channel_id: channel_id, user_id: user_id)
|
409
|
+
json = filter_undef({ access_token: access_token, nick: nick })
|
410
|
+
request(route, json: json)
|
411
|
+
end
|
412
|
+
|
413
|
+
# Remove a recipient from a group DM.
|
414
|
+
# @param channel_id [String, Integer] The ID of the channel the user is being removed from.
|
415
|
+
# @param user_id [String, Integer] The ID of the user being removed from the group DM.
|
416
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/channel#group-dm-remove-recipient
|
417
|
+
def group_dm_remove_recipient(channel_id, user_id)
|
418
|
+
route = Route.new(:DELETE, '/channels/%{channel_id}/recipients/%{user_id}',
|
419
|
+
channel_id: channel_id, user_id: user_id)
|
420
|
+
request(route)
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'base64'
|
4
|
+
require 'vox/http/route'
|
5
|
+
require 'vox/http/util'
|
6
|
+
|
7
|
+
module Vox
|
8
|
+
module HTTP
|
9
|
+
module Routes
|
10
|
+
# Mixin for emoji routes.
|
11
|
+
module Emoji
|
12
|
+
include Util
|
13
|
+
|
14
|
+
# Fetch a list of emojis for a given guild.
|
15
|
+
# @param guild_id [String, Integer] The ID of the guild this emoji belongs to.
|
16
|
+
# @return [Array<Hash<Symbol, Object>>] An array of [emoji](https://discord.com/developers/docs/resources/emoji#emoji-object)
|
17
|
+
# objects.
|
18
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/emoji#list-guild-emojis
|
19
|
+
def list_guild_emojis(guild_id)
|
20
|
+
route = Route.new(:GET, '/guilds/%{guild_id}/emojis', guild_id: guild_id)
|
21
|
+
request(route)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Get an emoji object by ID.
|
25
|
+
# @param guild_id [String, Integer] The ID of the guild this emoji belongs to.
|
26
|
+
# @param emoji_id [String, Integer] The ID of the desired emoji.
|
27
|
+
# @return [Hash<Symbol, Object>] An [emoji](https://discord.com/developers/docs/resources/emoji#emoji-object)
|
28
|
+
# object.
|
29
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/emoji#get-guild-emoji
|
30
|
+
def get_guild_emoji(guild_id, emoji_id)
|
31
|
+
route = Route.new(:GET, '/guilds/%{guild_id}/emojis/%{emoji_id}', guild_id: guild_id, emoji_id: emoji_id)
|
32
|
+
request(route)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Create an emoji in a target guild.
|
36
|
+
# @param guild_id [String, Integer] The ID of the guild to create an emoji in.
|
37
|
+
# @param image [UploadIO] {UploadIO} for the emoji image. Can be up to 256kb in size.
|
38
|
+
# @param name [String] The name for the emoji.
|
39
|
+
# @param roles [Array<String, Integer>] Roles for which the emoji will be whitelisted.
|
40
|
+
# @return [Hash<Symbol, Object>] An [emoji](https://discord.com/developers/docs/resources/emoji#emoji-object)
|
41
|
+
# object.
|
42
|
+
# @note Attempting to upload an emoji image larger than 256kb will result in a {Error::BadRequest} with
|
43
|
+
# no JSON status code.
|
44
|
+
# @vox.permissions MANAGE_EMOJIS
|
45
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/emoji#create-guild-emoji
|
46
|
+
def create_guild_emoji(guild_id, image:, name: :undef, roles: :undef)
|
47
|
+
image_data = image.io.read
|
48
|
+
json = filter_undef({ name: name, roles: roles,
|
49
|
+
image: "data:#{image.content_type};base64,#{Base64.encode64(image_data)}" })
|
50
|
+
|
51
|
+
route = Route.new(:POST, '/guilds/%{guild_id}/emojis', guild_id: guild_id)
|
52
|
+
request(route, json: json)
|
53
|
+
end
|
54
|
+
|
55
|
+
# Modify a guild emoji.
|
56
|
+
# @param guild_id [String, Integer] The ID of the guild the emoji is in.
|
57
|
+
# @param emoji_id [String, Integer] The ID of the target emoji.
|
58
|
+
# @param name [String] The name for the emoji.
|
59
|
+
# @param roles [Array<String, Integer>] Roles for which the emoji will be whitelisted.
|
60
|
+
# @param reason [String] The reason this emoji is being modified.
|
61
|
+
# @return [Hash<Symbol, Object>] The updated [emoji](https://discord.com/developers/docs/resources/emoji#emoji-object)
|
62
|
+
# object.
|
63
|
+
# @vox.permissions MANAGE_EMOJIS
|
64
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/emoji#modify-guild-emoji
|
65
|
+
def modify_guild_emoji(guild_id, emoji_id, name: :undef, roles: :undef, reason: nil)
|
66
|
+
json = filter_undef({ name: name, roles: roles })
|
67
|
+
route = Route.new(:PATCH, '/guilds/%{guild_id}/emojis/%{emoji_id}',
|
68
|
+
guild_id: guild_id, emoji_id: emoji_id)
|
69
|
+
request(route, json: json, reason: reason)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Delete an emoji by its ID.
|
73
|
+
# @param guild_id [String, Integer] The ID of the guild that owns this emoji.
|
74
|
+
# @param emoji_id [String, Integer] The ID of the emoji to be deleted.
|
75
|
+
# @param reason [String] The reason this emoji is being deleted.
|
76
|
+
# @return [nil] Returns `nil` on success.
|
77
|
+
# @vox.permissions MANAGE_EMOJIS
|
78
|
+
# @vox.api_docs https://discord.com/developers/docs/resources/emoji#delete-guild-emoji
|
79
|
+
def delete_guild_emoji(guild_id, emoji_id, reason: nil)
|
80
|
+
route = Route.new(:DELETE, '/guilds/%{guild_id}/emojis/%{emoji_id}',
|
81
|
+
guild_id: guild_id, emoji_id: emoji_id)
|
82
|
+
request(route, reason: reason)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|