oceanic.js 1.10.3-dev.c6c9f52 → 1.10.3-dev.ca8b6e8
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.
- package/dist/lib/Client.d.ts +99 -0
- package/dist/lib/Client.js +263 -0
- package/dist/lib/Constants.d.ts +1215 -0
- package/dist/lib/Constants.js +1513 -0
- package/dist/lib/gateway/Shard.d.ts +83 -0
- package/dist/lib/gateway/Shard.js +1621 -0
- package/dist/lib/gateway/ShardManager.d.ts +29 -0
- package/dist/lib/gateway/ShardManager.js +300 -0
- package/dist/lib/index.d.ts +84 -0
- package/dist/lib/index.js +168 -0
- package/dist/lib/rest/Bucket.d.ts +33 -0
- package/dist/lib/rest/Bucket.js +78 -0
- package/dist/lib/rest/DiscordHTTPError.d.ts +16 -0
- package/dist/lib/rest/DiscordHTTPError.js +65 -0
- package/dist/lib/rest/DiscordRESTError.d.ts +19 -0
- package/dist/lib/rest/DiscordRESTError.js +89 -0
- package/dist/lib/rest/OAuthHelper.d.ts +62 -0
- package/dist/lib/rest/OAuthHelper.js +183 -0
- package/dist/lib/rest/RESTManager.d.ts +42 -0
- package/dist/lib/rest/RESTManager.js +82 -0
- package/dist/lib/rest/RequestHandler.d.ts +28 -0
- package/dist/lib/rest/RequestHandler.js +313 -0
- package/dist/lib/rest/SequentialBucket.d.ts +25 -0
- package/dist/lib/rest/SequentialBucket.js +76 -0
- package/dist/lib/routes/Applications.d.ts +171 -0
- package/dist/lib/routes/Applications.js +447 -0
- package/dist/lib/routes/Channels.d.ts +408 -0
- package/dist/lib/routes/Channels.js +1160 -0
- package/dist/lib/routes/Guilds.d.ts +606 -0
- package/dist/lib/routes/Guilds.js +1669 -0
- package/dist/lib/routes/Interactions.d.ts +74 -0
- package/dist/lib/routes/Interactions.js +141 -0
- package/dist/lib/routes/Miscellaneous.d.ts +31 -0
- package/dist/lib/routes/Miscellaneous.js +69 -0
- package/dist/lib/routes/OAuth.d.ts +108 -0
- package/dist/lib/routes/OAuth.js +312 -0
- package/dist/lib/routes/Users.d.ts +32 -0
- package/dist/lib/routes/Users.js +59 -0
- package/dist/lib/routes/Webhooks.d.ts +128 -0
- package/dist/lib/routes/Webhooks.js +265 -0
- package/dist/lib/structures/AnnouncementChannel.d.ts +36 -0
- package/dist/lib/structures/AnnouncementChannel.js +47 -0
- package/dist/lib/structures/AnnouncementThreadChannel.d.ts +18 -0
- package/dist/lib/structures/AnnouncementThreadChannel.js +27 -0
- package/dist/lib/structures/Application.d.ts +102 -0
- package/dist/lib/structures/Application.js +189 -0
- package/dist/lib/structures/ApplicationCommand.d.ts +74 -0
- package/dist/lib/structures/ApplicationCommand.js +141 -0
- package/dist/lib/structures/Attachment.d.ts +34 -0
- package/dist/lib/structures/Attachment.js +64 -0
- package/dist/lib/structures/AuditLogEntry.d.ts +25 -0
- package/dist/lib/structures/AuditLogEntry.js +53 -0
- package/dist/lib/structures/AutoModerationRule.d.ts +49 -0
- package/dist/lib/structures/AutoModerationRule.js +139 -0
- package/dist/lib/structures/AutocompleteInteraction.d.ts +62 -0
- package/dist/lib/structures/AutocompleteInteraction.js +115 -0
- package/dist/lib/structures/Base.d.ts +20 -0
- package/dist/lib/structures/Base.js +58 -0
- package/dist/lib/structures/BaseEntitlement.d.ts +19 -0
- package/dist/lib/structures/BaseEntitlement.js +44 -0
- package/dist/lib/structures/CategoryChannel.d.ts +41 -0
- package/dist/lib/structures/CategoryChannel.js +105 -0
- package/dist/lib/structures/Channel.d.ts +20 -0
- package/dist/lib/structures/Channel.js +91 -0
- package/dist/lib/structures/ClientApplication.d.ts +153 -0
- package/dist/lib/structures/ClientApplication.js +220 -0
- package/dist/lib/structures/CommandInteraction.d.ts +127 -0
- package/dist/lib/structures/CommandInteraction.js +297 -0
- package/dist/lib/structures/ComponentInteraction.d.ts +137 -0
- package/dist/lib/structures/ComponentInteraction.js +311 -0
- package/dist/lib/structures/Entitlement.d.ts +12 -0
- package/dist/lib/structures/Entitlement.js +26 -0
- package/dist/lib/structures/ExtendedUser.d.ts +26 -0
- package/dist/lib/structures/ExtendedUser.js +57 -0
- package/dist/lib/structures/ForumChannel.d.ts +11 -0
- package/dist/lib/structures/ForumChannel.js +19 -0
- package/dist/lib/structures/GroupChannel.d.ts +62 -0
- package/dist/lib/structures/GroupChannel.js +133 -0
- package/dist/lib/structures/Guild.d.ts +654 -0
- package/dist/lib/structures/Guild.js +1319 -0
- package/dist/lib/structures/GuildChannel.d.ts +34 -0
- package/dist/lib/structures/GuildChannel.js +75 -0
- package/dist/lib/structures/GuildPreview.d.ts +50 -0
- package/dist/lib/structures/GuildPreview.js +119 -0
- package/dist/lib/structures/GuildScheduledEvent.d.ts +60 -0
- package/dist/lib/structures/GuildScheduledEvent.js +154 -0
- package/dist/lib/structures/GuildTemplate.d.ts +55 -0
- package/dist/lib/structures/GuildTemplate.js +126 -0
- package/dist/lib/structures/Integration.d.ts +54 -0
- package/dist/lib/structures/Integration.js +156 -0
- package/dist/lib/structures/Interaction.d.ts +40 -0
- package/dist/lib/structures/Interaction.js +90 -0
- package/dist/lib/structures/InteractionResolvedChannel.d.ts +28 -0
- package/dist/lib/structures/InteractionResolvedChannel.js +45 -0
- package/dist/lib/structures/Invite.d.ts +64 -0
- package/dist/lib/structures/Invite.js +193 -0
- package/dist/lib/structures/InviteGuild.d.ts +52 -0
- package/dist/lib/structures/InviteGuild.js +88 -0
- package/dist/lib/structures/MediaChannel.d.ts +11 -0
- package/dist/lib/structures/MediaChannel.js +19 -0
- package/dist/lib/structures/Member.d.ts +122 -0
- package/dist/lib/structures/Member.js +255 -0
- package/dist/lib/structures/Message.d.ts +194 -0
- package/dist/lib/structures/Message.js +477 -0
- package/dist/lib/structures/ModalSubmitInteraction.d.ts +128 -0
- package/dist/lib/structures/ModalSubmitInteraction.js +240 -0
- package/dist/lib/structures/OAuthApplication.d.ts +79 -0
- package/dist/lib/structures/OAuthApplication.js +210 -0
- package/dist/lib/structures/OAuthGuild.d.ts +35 -0
- package/dist/lib/structures/OAuthGuild.js +61 -0
- package/dist/lib/structures/PartialApplication.d.ts +30 -0
- package/dist/lib/structures/PartialApplication.js +67 -0
- package/dist/lib/structures/Permission.d.ts +21 -0
- package/dist/lib/structures/Permission.js +68 -0
- package/dist/lib/structures/PermissionOverwrite.d.ts +26 -0
- package/dist/lib/structures/PermissionOverwrite.js +49 -0
- package/dist/lib/structures/PingInteraction.d.ts +16 -0
- package/dist/lib/structures/PingInteraction.js +26 -0
- package/dist/lib/structures/Poll.d.ts +28 -0
- package/dist/lib/structures/Poll.js +78 -0
- package/dist/lib/structures/PrivateChannel.d.ts +90 -0
- package/dist/lib/structures/PrivateChannel.js +131 -0
- package/dist/lib/structures/PrivateThreadChannel.d.ts +18 -0
- package/dist/lib/structures/PrivateThreadChannel.js +27 -0
- package/dist/lib/structures/PublicThreadChannel.d.ts +21 -0
- package/dist/lib/structures/PublicThreadChannel.js +37 -0
- package/dist/lib/structures/Role.d.ts +52 -0
- package/dist/lib/structures/Role.js +137 -0
- package/dist/lib/structures/SKU.d.ts +32 -0
- package/dist/lib/structures/SKU.js +53 -0
- package/dist/lib/structures/StageChannel.d.ts +33 -0
- package/dist/lib/structures/StageChannel.js +44 -0
- package/dist/lib/structures/StageInstance.d.ts +36 -0
- package/dist/lib/structures/StageInstance.js +94 -0
- package/dist/lib/structures/Team.d.ts +22 -0
- package/dist/lib/structures/Team.js +67 -0
- package/dist/lib/structures/TestEntitlement.d.ts +10 -0
- package/dist/lib/structures/TestEntitlement.js +21 -0
- package/dist/lib/structures/TextChannel.d.ts +34 -0
- package/dist/lib/structures/TextChannel.js +46 -0
- package/dist/lib/structures/TextableChannel.d.ts +158 -0
- package/dist/lib/structures/TextableChannel.js +276 -0
- package/dist/lib/structures/TextableVoiceChannel.d.ts +39 -0
- package/dist/lib/structures/TextableVoiceChannel.js +81 -0
- package/dist/lib/structures/ThreadChannel.d.ts +159 -0
- package/dist/lib/structures/ThreadChannel.js +295 -0
- package/dist/lib/structures/ThreadOnlyChannel.d.ts +99 -0
- package/dist/lib/structures/ThreadOnlyChannel.js +233 -0
- package/dist/lib/structures/ThreadableChannel.d.ts +36 -0
- package/dist/lib/structures/ThreadableChannel.js +58 -0
- package/dist/lib/structures/UnavailableGuild.d.ts +11 -0
- package/dist/lib/structures/UnavailableGuild.js +21 -0
- package/dist/lib/structures/User.d.ts +82 -0
- package/dist/lib/structures/User.js +168 -0
- package/dist/lib/structures/VoiceChannel.d.ts +20 -0
- package/dist/lib/structures/VoiceChannel.js +35 -0
- package/dist/lib/structures/VoiceState.d.ts +51 -0
- package/dist/lib/structures/VoiceState.js +140 -0
- package/dist/lib/structures/Webhook.d.ts +129 -0
- package/dist/lib/structures/Webhook.js +206 -0
- package/dist/lib/types/applications.d.ts +466 -0
- package/dist/lib/types/audit-log.d.ts +122 -0
- package/dist/lib/types/auto-moderation.d.ts +99 -0
- package/dist/lib/types/channels.d.ts +1244 -0
- package/dist/lib/types/client.d.ts +228 -0
- package/dist/lib/types/events.d.ts +265 -0
- package/dist/lib/types/gateway-raw.d.ts +584 -0
- package/dist/lib/types/gateway.d.ts +351 -0
- package/dist/lib/types/guild-template.d.ts +33 -0
- package/dist/lib/types/guilds.d.ts +855 -0
- package/dist/lib/types/index.d.ts +18 -0
- package/dist/lib/types/interactions.d.ts +377 -0
- package/dist/lib/types/json.d.ts +742 -0
- package/dist/lib/types/misc.d.ts +28 -0
- package/dist/lib/types/oauth.d.ts +201 -0
- package/dist/lib/types/request-handler.d.ts +52 -0
- package/dist/lib/types/scheduled-events.d.ts +88 -0
- package/dist/lib/types/shared.d.ts +9 -0
- package/dist/lib/types/users.d.ts +45 -0
- package/dist/lib/types/voice.d.ts +45 -0
- package/dist/lib/types/webhooks.d.ts +74 -0
- package/dist/lib/util/Collection.d.ts +47 -0
- package/dist/lib/util/Collection.js +78 -0
- package/dist/lib/util/Errors.d.ts +29 -0
- package/dist/lib/util/Errors.js +56 -0
- package/dist/lib/util/Routes.d.ts +127 -0
- package/dist/lib/util/Routes.js +248 -0
- package/dist/lib/util/SimpleCollection.d.ts +12 -0
- package/dist/lib/util/SimpleCollection.js +81 -0
- package/dist/lib/util/TypedCollection.d.ts +24 -0
- package/dist/lib/util/TypedCollection.js +76 -0
- package/dist/lib/util/TypedEmitter.d.ts +19 -0
- package/dist/lib/util/TypedEmitter.js +19 -0
- package/dist/lib/util/Util.d.ts +58 -0
- package/dist/lib/util/Util.js +535 -0
- package/dist/lib/util/interactions/InteractionOptionsWrapper.d.ts +170 -0
- package/dist/lib/util/interactions/InteractionOptionsWrapper.js +213 -0
- package/dist/lib/util/interactions/MessageInteractionResponse.d.ts +24 -0
- package/dist/lib/util/interactions/MessageInteractionResponse.js +28 -0
- package/dist/lib/util/interactions/ModalSubmitInteractionComponentsWrapper.d.ts +24 -0
- package/dist/lib/util/interactions/ModalSubmitInteractionComponentsWrapper.js +34 -0
- package/dist/lib/util/interactions/SelectMenuValuesWrapper.d.ts +60 -0
- package/dist/lib/util/interactions/SelectMenuValuesWrapper.js +124 -0
- package/dist/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,1160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const Routes = tslib_1.__importStar(require("../util/Routes"));
|
|
5
|
+
const Invite_1 = tslib_1.__importDefault(require("../structures/Invite"));
|
|
6
|
+
const StageInstance_1 = tslib_1.__importDefault(require("../structures/StageInstance"));
|
|
7
|
+
/** Various methods for interacting with channels. Located at {@link Client#rest | Client#rest}{@link RESTManager#channels | .channels}. */
|
|
8
|
+
class Channels {
|
|
9
|
+
_manager;
|
|
10
|
+
constructor(manager) {
|
|
11
|
+
this._manager = manager;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Add a user to a group channel.
|
|
15
|
+
* @param groupID The ID of the group to add the user to.
|
|
16
|
+
* @param options The options for adding the recipient.
|
|
17
|
+
* @caching This method **does not** cache its result.
|
|
18
|
+
*/
|
|
19
|
+
async addGroupRecipient(groupID, options) {
|
|
20
|
+
await this._manager.authRequest({
|
|
21
|
+
method: "PUT",
|
|
22
|
+
path: Routes.GROUP_RECIPIENT(groupID, options.userID),
|
|
23
|
+
json: {
|
|
24
|
+
access_token: options.accessToken,
|
|
25
|
+
nick: options.nick
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Add a member to a thread.
|
|
31
|
+
* @param channelID The ID of the thread to add them to.
|
|
32
|
+
* @param userID The ID of the user to add to the thread.
|
|
33
|
+
* @caching This method **does not** cache its result.
|
|
34
|
+
*/
|
|
35
|
+
async addThreadMember(channelID, userID) {
|
|
36
|
+
await this._manager.authRequest({
|
|
37
|
+
method: "PUT",
|
|
38
|
+
path: Routes.CHANNEL_THREAD_MEMBER(channelID, userID)
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Create a direct message. This will not create a new channel if you have already started a dm with the user.
|
|
43
|
+
* @param recipient The ID of the recipient of the direct message.
|
|
44
|
+
* @caching This method **does** cache its result.
|
|
45
|
+
* @caches {@link Client#privateChannels | Client#privateChannels}
|
|
46
|
+
*/
|
|
47
|
+
async createDM(recipient) {
|
|
48
|
+
let cache;
|
|
49
|
+
if ((cache = this._manager.client.privateChannels.find(ch => ch.recipient.id === recipient))) {
|
|
50
|
+
return cache;
|
|
51
|
+
}
|
|
52
|
+
return this._manager.authRequest({
|
|
53
|
+
method: "POST",
|
|
54
|
+
path: Routes.OAUTH_CHANNELS,
|
|
55
|
+
json: { recipient_id: recipient }
|
|
56
|
+
}).then(data => this._manager.client.privateChannels.update(data));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a group dm.
|
|
60
|
+
* @param options The options for creating the group dm.
|
|
61
|
+
* @caching This method **does** cache its result.
|
|
62
|
+
* @caches {@link Client#groupChannels | Client#groupChannels}
|
|
63
|
+
*/
|
|
64
|
+
async createGroupDM(options) {
|
|
65
|
+
return this._manager.authRequest({
|
|
66
|
+
method: "POST",
|
|
67
|
+
path: Routes.OAUTH_CHANNELS,
|
|
68
|
+
json: {
|
|
69
|
+
access_tokens: options.accessTokens,
|
|
70
|
+
nicks: options.nicks
|
|
71
|
+
}
|
|
72
|
+
}).then(data => this._manager.client.groupChannels.update(data));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create an invite for a channel. If the guild is not a `COMMUNITY` server, invites can only be made to last 30 days.
|
|
76
|
+
* @param channelID The ID of the channel to create an invite for.
|
|
77
|
+
* @param options The options for creating the invite.
|
|
78
|
+
* @caching This method **does not** cache its result.
|
|
79
|
+
*/
|
|
80
|
+
async createInvite(channelID, options) {
|
|
81
|
+
const reason = options.reason;
|
|
82
|
+
if (options.reason) {
|
|
83
|
+
delete options.reason;
|
|
84
|
+
}
|
|
85
|
+
return this._manager.authRequest({
|
|
86
|
+
method: "POST",
|
|
87
|
+
path: Routes.CHANNEL_INVITES(channelID),
|
|
88
|
+
json: {
|
|
89
|
+
max_age: options.maxAge,
|
|
90
|
+
max_uses: options.maxUses,
|
|
91
|
+
target_application_id: options.targetApplicationID,
|
|
92
|
+
target_type: options.targetType,
|
|
93
|
+
target_user_id: options.targetUserID,
|
|
94
|
+
temporary: options.temporary,
|
|
95
|
+
unique: options.unique
|
|
96
|
+
},
|
|
97
|
+
reason
|
|
98
|
+
}).then(data => new Invite_1.default(data, this._manager.client));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create a message in a channel.
|
|
102
|
+
* @param channelID The ID of the channel to create the message in.
|
|
103
|
+
* @param options The options for creating the message.
|
|
104
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
105
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
106
|
+
*/
|
|
107
|
+
async createMessage(channelID, options) {
|
|
108
|
+
const files = options.files;
|
|
109
|
+
if (options.files) {
|
|
110
|
+
delete options.files;
|
|
111
|
+
}
|
|
112
|
+
return this._manager.authRequest({
|
|
113
|
+
method: "POST",
|
|
114
|
+
path: Routes.CHANNEL_MESSAGES(channelID),
|
|
115
|
+
json: {
|
|
116
|
+
allowed_mentions: this._manager.client.util.formatAllowedMentions(options.allowedMentions),
|
|
117
|
+
attachments: options.attachments,
|
|
118
|
+
components: options.components ? this._manager.client.util.componentsToRaw(options.components) : undefined,
|
|
119
|
+
content: options.content,
|
|
120
|
+
embeds: options.embeds ? this._manager.client.util.embedsToRaw(options.embeds) : undefined,
|
|
121
|
+
enforce_nonce: options.enforceNonce,
|
|
122
|
+
flags: options.flags,
|
|
123
|
+
sticker_ids: options.stickerIDs,
|
|
124
|
+
message_reference: options.messageReference ? {
|
|
125
|
+
channel_id: options.messageReference.channelID,
|
|
126
|
+
fail_if_not_exists: options.messageReference.failIfNotExists,
|
|
127
|
+
guild_id: options.messageReference.guildID,
|
|
128
|
+
message_id: options.messageReference.messageID
|
|
129
|
+
} : undefined,
|
|
130
|
+
nonce: options.nonce,
|
|
131
|
+
poll: options.poll ? {
|
|
132
|
+
allow_multiselect: options.poll.allowMultiselect,
|
|
133
|
+
answers: options.poll.answers.map(a => ({
|
|
134
|
+
poll_media: a.pollMedia
|
|
135
|
+
})),
|
|
136
|
+
duration: options.poll.duration,
|
|
137
|
+
layout_type: options.poll.layoutType,
|
|
138
|
+
question: options.poll.question
|
|
139
|
+
} : undefined,
|
|
140
|
+
tts: options.tts
|
|
141
|
+
},
|
|
142
|
+
files
|
|
143
|
+
}).then(data => this._manager.client.util.updateMessage(data));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Add a reaction to a message.
|
|
147
|
+
* @param channelID The ID of the channel the message is in.
|
|
148
|
+
* @param messageID The ID of the message to add a reaction to.
|
|
149
|
+
* @param emoji The reaction to add to the message. `name:id` for custom emojis, and the unicode codepoint for default emojis.
|
|
150
|
+
* @caching This method **does not** cache its result.
|
|
151
|
+
*/
|
|
152
|
+
async createReaction(channelID, messageID, emoji) {
|
|
153
|
+
if (emoji === decodeURIComponent(emoji)) {
|
|
154
|
+
emoji = encodeURIComponent(emoji);
|
|
155
|
+
}
|
|
156
|
+
await this._manager.authRequest({
|
|
157
|
+
method: "PUT",
|
|
158
|
+
path: Routes.CHANNEL_REACTION_USER(channelID, messageID, emoji, "@me")
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create a stage instance.
|
|
163
|
+
* @param channelID The ID of the channel to create the stage instance on.
|
|
164
|
+
* @param options The options for creating the stage instance.
|
|
165
|
+
* @caching This method **does not** cache its result.
|
|
166
|
+
*/
|
|
167
|
+
async createStageInstance(channelID, options) {
|
|
168
|
+
const reason = options.reason;
|
|
169
|
+
if (options.reason) {
|
|
170
|
+
delete options.reason;
|
|
171
|
+
}
|
|
172
|
+
return this._manager.authRequest({
|
|
173
|
+
method: "POST",
|
|
174
|
+
path: Routes.STAGE_INSTANCES,
|
|
175
|
+
json: {
|
|
176
|
+
channel_id: channelID,
|
|
177
|
+
topic: options.topic,
|
|
178
|
+
privacy_level: options.privacyLevel,
|
|
179
|
+
send_start_notification: options.sendStartNotification
|
|
180
|
+
},
|
|
181
|
+
reason
|
|
182
|
+
}).then(data => new StageInstance_1.default(data, this._manager.client));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Crosspost a message in an announcement channel.
|
|
186
|
+
* @param channelID The ID of the channel to crosspost the message in.
|
|
187
|
+
* @param messageID The ID of the message to crosspost.
|
|
188
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
189
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
190
|
+
*/
|
|
191
|
+
async crosspostMessage(channelID, messageID) {
|
|
192
|
+
return this._manager.authRequest({
|
|
193
|
+
method: "POST",
|
|
194
|
+
path: Routes.CHANNEL_MESSAGES_CROSSPOST(channelID, messageID)
|
|
195
|
+
}).then(data => this._manager.client.util.updateMessage(data));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Delete or close a channel.
|
|
199
|
+
* @param channelID The ID of the channel to delete or close.
|
|
200
|
+
* @param reason The reason to be displayed in the audit log.
|
|
201
|
+
* @caching This method **does not** cache its result.
|
|
202
|
+
*/
|
|
203
|
+
async delete(channelID, reason) {
|
|
204
|
+
await this._manager.authRequest({
|
|
205
|
+
method: "DELETE",
|
|
206
|
+
path: Routes.CHANNEL(channelID),
|
|
207
|
+
reason
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Delete an invite.
|
|
212
|
+
* @param code The code of the invite to delete.
|
|
213
|
+
* @param reason The reason for deleting the invite.
|
|
214
|
+
* @caching This method **does not** cache its result.
|
|
215
|
+
*/
|
|
216
|
+
async deleteInvite(code, reason) {
|
|
217
|
+
return this._manager.authRequest({
|
|
218
|
+
method: "DELETE",
|
|
219
|
+
path: Routes.INVITE(code),
|
|
220
|
+
reason
|
|
221
|
+
}).then(data => new Invite_1.default(data, this._manager.client));
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Delete a message.
|
|
225
|
+
* @param channelID The ID of the channel to delete the message in.
|
|
226
|
+
* @param messageID The ID of the message to delete.
|
|
227
|
+
* @param reason The reason for deleting the message.
|
|
228
|
+
* @caching This method **does not** cache its result.
|
|
229
|
+
*/
|
|
230
|
+
async deleteMessage(channelID, messageID, reason) {
|
|
231
|
+
await this._manager.authRequest({
|
|
232
|
+
method: "DELETE",
|
|
233
|
+
path: Routes.CHANNEL_MESSAGE(channelID, messageID),
|
|
234
|
+
reason
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Bulk delete messages.
|
|
239
|
+
* @param channelID The ID of the channel to delete the messages in.
|
|
240
|
+
* @param messageIDs The IDs of the messages to delete. Any duplicates or messages older than two weeks will cause an error.
|
|
241
|
+
* @param reason The reason for deleting the messages.
|
|
242
|
+
* @caching This method **does not** cache its result.
|
|
243
|
+
*/
|
|
244
|
+
async deleteMessages(channelID, messageIDs, reason) {
|
|
245
|
+
const chunks = [];
|
|
246
|
+
messageIDs = Array.from(messageIDs);
|
|
247
|
+
const amountOfMessages = messageIDs.length;
|
|
248
|
+
while (messageIDs.length !== 0) {
|
|
249
|
+
chunks.push(messageIDs.splice(0, 100));
|
|
250
|
+
}
|
|
251
|
+
let done = 0;
|
|
252
|
+
for (const chunk of chunks.values()) {
|
|
253
|
+
if (chunks.length > 1) {
|
|
254
|
+
const left = amountOfMessages - done;
|
|
255
|
+
this._manager.client.emit("debug", `Deleting ${left} messages in ${channelID}`);
|
|
256
|
+
}
|
|
257
|
+
if (chunk.length === 1) {
|
|
258
|
+
this._manager.client.emit("debug", "deleteMessages created a chunk with only 1 element, using deleteMessage instead.");
|
|
259
|
+
await this.deleteMessage(channelID, chunk[0], reason);
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
await this._manager.authRequest({
|
|
263
|
+
method: "POST",
|
|
264
|
+
path: Routes.CHANNEL_BULK_DELETE_MESSAGES(channelID),
|
|
265
|
+
json: { messages: chunk },
|
|
266
|
+
reason
|
|
267
|
+
});
|
|
268
|
+
done += chunk.length;
|
|
269
|
+
}
|
|
270
|
+
return amountOfMessages;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Delete a permission overwrite.
|
|
274
|
+
* @param channelID The ID of the channel to delete the permission overwrite in.
|
|
275
|
+
* @param overwriteID The ID of the permission overwrite to delete.
|
|
276
|
+
* @param reason The reason for deleting the permission overwrite.
|
|
277
|
+
* @caching This method **does not** cache its result.
|
|
278
|
+
*/
|
|
279
|
+
async deletePermission(channelID, overwriteID, reason) {
|
|
280
|
+
await this._manager.authRequest({
|
|
281
|
+
method: "DELETE",
|
|
282
|
+
path: Routes.CHANNEL_PERMISSION(channelID, overwriteID),
|
|
283
|
+
reason
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Remove a reaction from a message.
|
|
288
|
+
* @param channelID The ID of the channel the message is in.
|
|
289
|
+
* @param messageID The ID of the message to remove a reaction from.
|
|
290
|
+
* @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis.
|
|
291
|
+
* @param user The user to remove the reaction from, `@me` for the current user (default).
|
|
292
|
+
* @caching This method **does not** cache its result.
|
|
293
|
+
*/
|
|
294
|
+
async deleteReaction(channelID, messageID, emoji, user = "@me") {
|
|
295
|
+
if (emoji === decodeURIComponent(emoji)) {
|
|
296
|
+
emoji = encodeURIComponent(emoji);
|
|
297
|
+
}
|
|
298
|
+
await this._manager.authRequest({
|
|
299
|
+
method: "DELETE",
|
|
300
|
+
path: Routes.CHANNEL_REACTION_USER(channelID, messageID, emoji, user)
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Remove all, or a specific emoji's reactions from a message.
|
|
305
|
+
* @param channelID The ID of the channel the message is in.
|
|
306
|
+
* @param messageID The ID of the message to remove reactions from.
|
|
307
|
+
* @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis. Omit to remove all reactions.
|
|
308
|
+
* @caching This method **does not** cache its result.
|
|
309
|
+
*/
|
|
310
|
+
async deleteReactions(channelID, messageID, emoji) {
|
|
311
|
+
if (emoji && emoji === decodeURIComponent(emoji)) {
|
|
312
|
+
emoji = encodeURIComponent(emoji);
|
|
313
|
+
}
|
|
314
|
+
await this._manager.authRequest({
|
|
315
|
+
method: "DELETE",
|
|
316
|
+
path: emoji ? Routes.CHANNEL_REACTION(channelID, messageID, emoji) : Routes.CHANNEL_REACTIONS(channelID, messageID)
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Delete a stage instance.
|
|
321
|
+
* @param channelID The ID of the channel to delete the stage instance on.
|
|
322
|
+
* @param reason The reason for deleting the stage instance.
|
|
323
|
+
* @caching This method **does not** cache its result.
|
|
324
|
+
*/
|
|
325
|
+
async deleteStageInstance(channelID, reason) {
|
|
326
|
+
await this._manager.authRequest({
|
|
327
|
+
method: "DELETE",
|
|
328
|
+
path: Routes.STAGE_INSTANCE(channelID),
|
|
329
|
+
reason
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Edit a channel.
|
|
334
|
+
* @param channelID The ID of the channel to edit.
|
|
335
|
+
* @param options The options for editing the channel.
|
|
336
|
+
* @caching This method **may** cache its result. If a guild channel, the result will not be cached if the guild is not cached.
|
|
337
|
+
* @caches {@link Guild#channels | Guild#channels}<br>{@link Guild#threads | Guild#threads}<br>{@link Client#groupChannels | Client#groupChannels}
|
|
338
|
+
*/
|
|
339
|
+
async edit(channelID, options) {
|
|
340
|
+
const reason = options.reason;
|
|
341
|
+
if (options.reason) {
|
|
342
|
+
delete options.reason;
|
|
343
|
+
}
|
|
344
|
+
if (options.icon) {
|
|
345
|
+
try {
|
|
346
|
+
options.icon = this._manager.client.util.convertImage(options.icon);
|
|
347
|
+
}
|
|
348
|
+
catch (err) {
|
|
349
|
+
throw new TypeError("Invalid icon provided. Ensure you are providing a valid, fully-qualified base64 url.", { cause: err });
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return this._manager.authRequest({
|
|
353
|
+
method: "PATCH",
|
|
354
|
+
path: Routes.CHANNEL(channelID),
|
|
355
|
+
json: {
|
|
356
|
+
applied_tags: options.appliedTags,
|
|
357
|
+
archived: options.archived,
|
|
358
|
+
auto_archive_duration: options.autoArchiveDuration,
|
|
359
|
+
available_tags: options.availableTags?.map(tag => ({
|
|
360
|
+
emoji_id: tag.emoji?.id,
|
|
361
|
+
emoji_name: tag.emoji?.name,
|
|
362
|
+
moderated: tag.moderated,
|
|
363
|
+
name: tag.name,
|
|
364
|
+
id: tag.id
|
|
365
|
+
})),
|
|
366
|
+
bitrate: options.bitrate,
|
|
367
|
+
default_auto_archive_duration: options.defaultAutoArchiveDuration,
|
|
368
|
+
default_forum_layout: options.defaultForumLayout,
|
|
369
|
+
default_reaction_emoji: options.defaultReactionEmoji ? { emoji_id: options.defaultReactionEmoji.id, emoji_name: options.defaultReactionEmoji.name } : options.defaultReactionEmoji,
|
|
370
|
+
default_sort_order: options.defaultSortOrder,
|
|
371
|
+
default_thread_rate_limit_per_user: options.defaultThreadRateLimitPerUser,
|
|
372
|
+
flags: options.flags,
|
|
373
|
+
icon: options.icon,
|
|
374
|
+
invitable: options.invitable,
|
|
375
|
+
locked: options.locked,
|
|
376
|
+
name: options.name,
|
|
377
|
+
nsfw: options.nsfw,
|
|
378
|
+
parent_id: options.parentID,
|
|
379
|
+
permission_overwrites: options.permissionOverwrites,
|
|
380
|
+
position: options.position,
|
|
381
|
+
rate_limit_per_user: options.rateLimitPerUser,
|
|
382
|
+
rtc_region: options.rtcRegion,
|
|
383
|
+
topic: options.topic,
|
|
384
|
+
type: options.type,
|
|
385
|
+
user_limit: options.userLimit,
|
|
386
|
+
video_quality_mode: options.videoQualityMode
|
|
387
|
+
},
|
|
388
|
+
reason
|
|
389
|
+
}).then(data => this._manager.client.util.updateChannel(data));
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Edit a message.
|
|
393
|
+
* @param channelID The ID of the channel the message is in.
|
|
394
|
+
* @param messageID The ID of the message to edit.
|
|
395
|
+
* @param options The options for editing the message.
|
|
396
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
397
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
398
|
+
*/
|
|
399
|
+
async editMessage(channelID, messageID, options) {
|
|
400
|
+
const files = options.files ?? undefined;
|
|
401
|
+
if (options.files) {
|
|
402
|
+
delete options.files;
|
|
403
|
+
}
|
|
404
|
+
return this._manager.authRequest({
|
|
405
|
+
method: "PATCH",
|
|
406
|
+
path: Routes.CHANNEL_MESSAGE(channelID, messageID),
|
|
407
|
+
json: {
|
|
408
|
+
allowed_mentions: this._manager.client.util.formatAllowedMentions(options.allowedMentions),
|
|
409
|
+
attachments: options.attachments,
|
|
410
|
+
components: options.components ? this._manager.client.util.componentsToRaw(options.components) : undefined,
|
|
411
|
+
content: options.content,
|
|
412
|
+
embeds: options.embeds ? this._manager.client.util.embedsToRaw(options.embeds) : undefined,
|
|
413
|
+
flags: options.flags
|
|
414
|
+
},
|
|
415
|
+
files
|
|
416
|
+
}).then(data => this._manager.client.util.updateMessage(data));
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Edit a permission overwrite.
|
|
420
|
+
* @param channelID The ID of the channel to edit the permission overwrite for.
|
|
421
|
+
* @param overwriteID The ID of the permission overwrite to edit.
|
|
422
|
+
* @param options The options for editing the permission overwrite.
|
|
423
|
+
* @caching This method **does not** cache its result.
|
|
424
|
+
*/
|
|
425
|
+
async editPermission(channelID, overwriteID, options) {
|
|
426
|
+
const reason = options.reason;
|
|
427
|
+
if (options.reason) {
|
|
428
|
+
delete options.reason;
|
|
429
|
+
}
|
|
430
|
+
await this._manager.authRequest({
|
|
431
|
+
method: "PUT",
|
|
432
|
+
path: Routes.CHANNEL_PERMISSION(channelID, overwriteID),
|
|
433
|
+
json: {
|
|
434
|
+
allow: options.allow,
|
|
435
|
+
deny: options.deny,
|
|
436
|
+
type: options.type
|
|
437
|
+
},
|
|
438
|
+
reason
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Edit a stage instance.
|
|
443
|
+
* @param channelID The ID of the channel to edit the stage instance on.
|
|
444
|
+
* @param options The options for editing the stage instance.
|
|
445
|
+
* @caching This method **does not** cache its result.
|
|
446
|
+
*/
|
|
447
|
+
async editStageInstance(channelID, options) {
|
|
448
|
+
const reason = options.reason;
|
|
449
|
+
if (options.reason) {
|
|
450
|
+
delete options.reason;
|
|
451
|
+
}
|
|
452
|
+
return this._manager.authRequest({
|
|
453
|
+
method: "PATCH",
|
|
454
|
+
path: Routes.STAGE_INSTANCE(channelID),
|
|
455
|
+
json: {
|
|
456
|
+
channel_id: channelID,
|
|
457
|
+
topic: options.topic,
|
|
458
|
+
privacy_level: options.privacyLevel
|
|
459
|
+
},
|
|
460
|
+
reason
|
|
461
|
+
}).then(data => new StageInstance_1.default(data, this._manager.client));
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* End a poll now.
|
|
465
|
+
* @param channelID The ID of the channel the poll is in.
|
|
466
|
+
* @param messageID The ID of the message the poll is on.
|
|
467
|
+
* @caching This method **does not** cache its result.
|
|
468
|
+
*/
|
|
469
|
+
async expirePoll(channelID, messageID) {
|
|
470
|
+
await this._manager.authRequest({
|
|
471
|
+
method: "POST",
|
|
472
|
+
path: Routes.POLL_EXPIRE(channelID, messageID)
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Follow an announcement channel.
|
|
477
|
+
* @param channelID The ID of the channel to follow announcements from.
|
|
478
|
+
* @param webhookChannelID The ID of the channel crossposted messages should be sent to. The client must have the `MANAGE_WEBHOOKS` permission in this channel.
|
|
479
|
+
* @caching This method **does not** cache its result.
|
|
480
|
+
*/
|
|
481
|
+
async followAnnouncement(channelID, webhookChannelID) {
|
|
482
|
+
return this._manager.authRequest({
|
|
483
|
+
method: "POST",
|
|
484
|
+
path: Routes.CHANNEL_FOLLOWERS(channelID),
|
|
485
|
+
json: { webhook_channel_id: webhookChannelID }
|
|
486
|
+
}).then(data => ({
|
|
487
|
+
channelID: data.channel_id,
|
|
488
|
+
webhookID: data.webhook_id
|
|
489
|
+
}));
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Get a channel.
|
|
493
|
+
* @param channelID The ID of the channel to get.
|
|
494
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
495
|
+
* @caches {@link Guild#channels | Guild#channels}<br>{@link Guild#threads | Guild#threads}<br>{@link Client#privateChannels | Client#privateChannels}<br>{@link Client#groupChannels | Client#groupChannels}
|
|
496
|
+
*/
|
|
497
|
+
async get(channelID) {
|
|
498
|
+
return this._manager.authRequest({
|
|
499
|
+
method: "GET",
|
|
500
|
+
path: Routes.CHANNEL(channelID)
|
|
501
|
+
}).then(data => this._manager.client.util.updateChannel(data));
|
|
502
|
+
}
|
|
503
|
+
async getInvite(code, options) {
|
|
504
|
+
const query = new URLSearchParams();
|
|
505
|
+
if (options?.guildScheduledEventID !== undefined) {
|
|
506
|
+
query.set("guild_scheduled_event_id", options.guildScheduledEventID);
|
|
507
|
+
}
|
|
508
|
+
if (options?.withCounts !== undefined) {
|
|
509
|
+
query.set("with_counts", options.withCounts.toString());
|
|
510
|
+
}
|
|
511
|
+
if (options?.withExpiration !== undefined) {
|
|
512
|
+
query.set("with_expiration", options.withExpiration.toString());
|
|
513
|
+
}
|
|
514
|
+
return this._manager.authRequest({
|
|
515
|
+
method: "GET",
|
|
516
|
+
path: Routes.INVITE(code),
|
|
517
|
+
query
|
|
518
|
+
}).then(data => new Invite_1.default(data, this._manager.client));
|
|
519
|
+
}
|
|
520
|
+
/**
|
|
521
|
+
* Get the invites of a channel.
|
|
522
|
+
* @param channelID The ID of the channel to get the invites of.
|
|
523
|
+
* @caching This method **does not** cache its result.
|
|
524
|
+
*/
|
|
525
|
+
async getInvites(channelID) {
|
|
526
|
+
return this._manager.authRequest({
|
|
527
|
+
method: "GET",
|
|
528
|
+
path: Routes.CHANNEL_INVITES(channelID)
|
|
529
|
+
}).then(data => data.map(invite => new Invite_1.default(invite, this._manager.client)));
|
|
530
|
+
}
|
|
531
|
+
/**
|
|
532
|
+
* Get the private archived threads the current user has joined in a channel.
|
|
533
|
+
* @param channelID The ID of the channel to get the archived threads from.
|
|
534
|
+
* @param options The options for getting the archived threads.
|
|
535
|
+
* @caching This method **does not** cache its result.
|
|
536
|
+
*/
|
|
537
|
+
async getJoinedPrivateArchivedThreads(channelID, options) {
|
|
538
|
+
return this._manager.authRequest({
|
|
539
|
+
method: "GET",
|
|
540
|
+
path: Routes.CHANNEL_PRIVATE_ARCHIVED_THREADS(channelID),
|
|
541
|
+
json: {
|
|
542
|
+
before: options?.before,
|
|
543
|
+
limit: options?.limit
|
|
544
|
+
}
|
|
545
|
+
}).then(data => ({
|
|
546
|
+
hasMore: data.has_more,
|
|
547
|
+
members: data.members.map(m => ({
|
|
548
|
+
flags: m.flags,
|
|
549
|
+
id: m.id,
|
|
550
|
+
joinTimestamp: new Date(m.join_timestamp),
|
|
551
|
+
userID: m.user_id
|
|
552
|
+
})),
|
|
553
|
+
threads: data.threads.map(d => this._manager.client.util.updateThread(d))
|
|
554
|
+
}));
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Get a message in a channel.
|
|
558
|
+
* @param channelID The ID of the channel the message is in
|
|
559
|
+
* @param messageID The ID of the message to get.
|
|
560
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
561
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
562
|
+
*/
|
|
563
|
+
async getMessage(channelID, messageID) {
|
|
564
|
+
return this._manager.authRequest({
|
|
565
|
+
method: "GET",
|
|
566
|
+
path: Routes.CHANNEL_MESSAGE(channelID, messageID)
|
|
567
|
+
}).then(data => this._manager.client.util.updateMessage(data));
|
|
568
|
+
}
|
|
569
|
+
/**
|
|
570
|
+
* Get messages in a channel.
|
|
571
|
+
* @param channelID The ID of the channel to get messages from.
|
|
572
|
+
* @param options The options for getting messages. `before`, `after`, and `around `All are mutually exclusive.
|
|
573
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
574
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
575
|
+
*/
|
|
576
|
+
async getMessages(channelID, options) {
|
|
577
|
+
const query = new URLSearchParams();
|
|
578
|
+
let chosenOption;
|
|
579
|
+
if (options?.around !== undefined) {
|
|
580
|
+
query.set("around", options.around);
|
|
581
|
+
chosenOption = "around";
|
|
582
|
+
// eslint-disable-next-line unicorn/no-negated-condition
|
|
583
|
+
}
|
|
584
|
+
else if (options?.after !== undefined) {
|
|
585
|
+
query.set("after", options.after);
|
|
586
|
+
chosenOption = "after";
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
if (options?.before !== undefined) {
|
|
590
|
+
query.set("before", options.before);
|
|
591
|
+
}
|
|
592
|
+
chosenOption = "before";
|
|
593
|
+
}
|
|
594
|
+
if (chosenOption === "around" || (options?.limit && options.limit <= 100)) {
|
|
595
|
+
const filter = options?.filter?.bind(this) ?? (() => true);
|
|
596
|
+
if (options?.limit !== undefined) {
|
|
597
|
+
query.set("limit", Math.min(options.limit, 100).toString());
|
|
598
|
+
}
|
|
599
|
+
const messages = await this._manager.authRequest({
|
|
600
|
+
method: "GET",
|
|
601
|
+
path: Routes.CHANNEL_MESSAGES(channelID),
|
|
602
|
+
query
|
|
603
|
+
}).then(data => data.map(d => this._manager.client.util.updateMessage(d)));
|
|
604
|
+
for (const message of Array.from(messages)) {
|
|
605
|
+
const f = filter(message);
|
|
606
|
+
if (f === false) {
|
|
607
|
+
messages.splice(messages.indexOf(message), 1);
|
|
608
|
+
}
|
|
609
|
+
if (f === "break") {
|
|
610
|
+
messages.splice(messages.indexOf(message));
|
|
611
|
+
break;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
return messages;
|
|
615
|
+
}
|
|
616
|
+
const results = [];
|
|
617
|
+
const it = this.getMessagesIterator(channelID, options);
|
|
618
|
+
for await (const messages of it) {
|
|
619
|
+
const limit = messages.length < 100 ? messages.length : it.limit + 100;
|
|
620
|
+
this._manager.client.emit("debug", `Getting ${limit} more message${limit === 1 ? "" : "s"} for ${channelID}: ${it.lastMessage ?? ""}`);
|
|
621
|
+
results.push(...messages);
|
|
622
|
+
}
|
|
623
|
+
return results;
|
|
624
|
+
}
|
|
625
|
+
/**
|
|
626
|
+
* Get an async iterator for getting messages in a channel.
|
|
627
|
+
* @param channelID The ID of the channel to get messages from.
|
|
628
|
+
* @param options The options for getting messages. `before`, `after`, and `around `All are mutually exclusive.
|
|
629
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
630
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
631
|
+
*/
|
|
632
|
+
getMessagesIterator(channelID, options) {
|
|
633
|
+
const filter = options?.filter?.bind(this) ?? (() => true);
|
|
634
|
+
const chosenOption = options?.after === undefined ? "before" : "after";
|
|
635
|
+
// arrow functions cannot be generator functions
|
|
636
|
+
// eslint-disable-next-line unicorn/no-this-assignment
|
|
637
|
+
const self = this;
|
|
638
|
+
const it = {
|
|
639
|
+
lastMessage: chosenOption === "after" ? options?.after : options?.before,
|
|
640
|
+
limit: options?.limit ?? 100,
|
|
641
|
+
async *[Symbol.asyncIterator]() {
|
|
642
|
+
loop: while (it.limit > 0) {
|
|
643
|
+
const messages = await self.getMessages(channelID, {
|
|
644
|
+
limit: it.limit >= 100 ? 100 : it.limit,
|
|
645
|
+
[chosenOption]: it.lastMessage
|
|
646
|
+
});
|
|
647
|
+
const originalCount = messages.length;
|
|
648
|
+
it.limit -= messages.length;
|
|
649
|
+
for (const message of Array.from(messages)) {
|
|
650
|
+
const f = filter(message);
|
|
651
|
+
if (f === false) {
|
|
652
|
+
messages.splice(messages.indexOf(message), 1);
|
|
653
|
+
}
|
|
654
|
+
if (f === "break") {
|
|
655
|
+
messages.splice(messages.indexOf(message));
|
|
656
|
+
yield messages;
|
|
657
|
+
break loop;
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
it.lastMessage = messages.at(-1)?.id;
|
|
661
|
+
yield messages;
|
|
662
|
+
if (originalCount < 100 || it.limit <= 0) {
|
|
663
|
+
break loop;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
};
|
|
668
|
+
return it;
|
|
669
|
+
}
|
|
670
|
+
/**
|
|
671
|
+
* Get the pinned messages in a channel.
|
|
672
|
+
* @param channelID The ID of the channel to get the pinned messages from.
|
|
673
|
+
* @caching This method **may** cache its result. The result will not be cached if the channel is not cached.
|
|
674
|
+
* @caches {@link TextableChannel#messages | TextableChannel#messages}<br>{@link ThreadChannel#messages | ThreadChannel#messages}<br>{@link PrivateChannel#messages | PrivateChannel#messages}
|
|
675
|
+
*/
|
|
676
|
+
async getPinnedMessages(channelID) {
|
|
677
|
+
return this._manager.authRequest({
|
|
678
|
+
method: "GET",
|
|
679
|
+
path: Routes.CHANNEL_PINS(channelID)
|
|
680
|
+
}).then(data => data.map(d => this._manager.client.util.updateMessage(d)));
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* Get the users that voted on a poll answer.
|
|
684
|
+
* @param channelID The ID of the channel the poll is in.
|
|
685
|
+
* @param messageID The ID of the message the poll is on.
|
|
686
|
+
* @param answerID The ID of the poll answer to get voters for.
|
|
687
|
+
* @param options The options for getting the voters.
|
|
688
|
+
* @caching This method **does** cache its result.
|
|
689
|
+
* @caches {@link Client#users | Client#users}
|
|
690
|
+
*/
|
|
691
|
+
async getPollAnswerUsers(channelID, messageID, answerID, options) {
|
|
692
|
+
const qs = new URLSearchParams();
|
|
693
|
+
if (options?.after !== undefined) {
|
|
694
|
+
qs.set("before", options.after);
|
|
695
|
+
}
|
|
696
|
+
if (options?.limit !== undefined) {
|
|
697
|
+
qs.set("limit", options.limit.toString());
|
|
698
|
+
}
|
|
699
|
+
return this._manager.authRequest({
|
|
700
|
+
method: "GET",
|
|
701
|
+
path: Routes.POLL_ANSWER_USERS(channelID, messageID, answerID),
|
|
702
|
+
query: qs
|
|
703
|
+
}).then(data => {
|
|
704
|
+
const users = data.users.map(user => this._manager.client.users.update(user));
|
|
705
|
+
const message = this._manager.client.getChannel(channelID)?.messages.get(messageID);
|
|
706
|
+
if (message?.poll) {
|
|
707
|
+
this._manager.client.util.replacePollAnswer(message.poll, answerID, users.length, users.map(u => u.id));
|
|
708
|
+
}
|
|
709
|
+
return users;
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
/**
|
|
713
|
+
* Get the private archived threads in a channel.
|
|
714
|
+
* @param channelID The ID of the channel to get the archived threads from.
|
|
715
|
+
* @param options The options for getting the archived threads.
|
|
716
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
717
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
718
|
+
*/
|
|
719
|
+
async getPrivateArchivedThreads(channelID, options) {
|
|
720
|
+
const qs = new URLSearchParams();
|
|
721
|
+
if (options?.before !== undefined) {
|
|
722
|
+
qs.set("before", options.before);
|
|
723
|
+
}
|
|
724
|
+
if (options?.limit !== undefined) {
|
|
725
|
+
qs.set("limit", options.limit.toString());
|
|
726
|
+
}
|
|
727
|
+
return this._manager.authRequest({
|
|
728
|
+
method: "GET",
|
|
729
|
+
path: Routes.CHANNEL_PRIVATE_ARCHIVED_THREADS(channelID),
|
|
730
|
+
query: qs
|
|
731
|
+
}).then(data => ({
|
|
732
|
+
hasMore: data.has_more,
|
|
733
|
+
members: data.members.map(m => ({
|
|
734
|
+
flags: m.flags,
|
|
735
|
+
id: m.id,
|
|
736
|
+
joinTimestamp: new Date(m.join_timestamp),
|
|
737
|
+
userID: m.user_id
|
|
738
|
+
})),
|
|
739
|
+
threads: data.threads.map(d => this._manager.client.util.updateThread(d))
|
|
740
|
+
}));
|
|
741
|
+
}
|
|
742
|
+
/**
|
|
743
|
+
* Get the private joined archived threads in a channel.
|
|
744
|
+
* @param channelID The ID of the channel to get the archived threads from.
|
|
745
|
+
* @param options The options for getting the archived threads.
|
|
746
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
747
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
748
|
+
*/
|
|
749
|
+
async getPrivateJoinedArchivedThreads(channelID, options) {
|
|
750
|
+
const qs = new URLSearchParams();
|
|
751
|
+
if (options?.before !== undefined) {
|
|
752
|
+
qs.set("before", options.before);
|
|
753
|
+
}
|
|
754
|
+
if (options?.limit !== undefined) {
|
|
755
|
+
qs.set("limit", options.limit.toString());
|
|
756
|
+
}
|
|
757
|
+
return this._manager.authRequest({
|
|
758
|
+
method: "GET",
|
|
759
|
+
path: Routes.CHANNEL_JOINED_PRIVATE_ARCHIVED_THREADS(channelID),
|
|
760
|
+
query: qs
|
|
761
|
+
}).then(data => ({
|
|
762
|
+
hasMore: data.has_more,
|
|
763
|
+
members: data.members.map(m => ({
|
|
764
|
+
flags: m.flags,
|
|
765
|
+
id: m.id,
|
|
766
|
+
joinTimestamp: new Date(m.join_timestamp),
|
|
767
|
+
userID: m.user_id
|
|
768
|
+
})),
|
|
769
|
+
threads: data.threads.map(d => this._manager.client.util.updateThread(d))
|
|
770
|
+
}));
|
|
771
|
+
}
|
|
772
|
+
/**
|
|
773
|
+
* Get the public archived threads in a channel.
|
|
774
|
+
* @param channelID The ID of the channel to get the archived threads from.
|
|
775
|
+
* @param options The options for getting the archived threads.
|
|
776
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
777
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
778
|
+
*/
|
|
779
|
+
async getPublicArchivedThreads(channelID, options) {
|
|
780
|
+
const qs = new URLSearchParams();
|
|
781
|
+
if (options?.before !== undefined) {
|
|
782
|
+
qs.set("before", options.before);
|
|
783
|
+
}
|
|
784
|
+
if (options?.limit !== undefined) {
|
|
785
|
+
qs.set("limit", options.limit.toString());
|
|
786
|
+
}
|
|
787
|
+
return this._manager.authRequest({
|
|
788
|
+
method: "GET",
|
|
789
|
+
path: Routes.CHANNEL_PUBLIC_ARCHIVED_THREADS(channelID),
|
|
790
|
+
query: qs
|
|
791
|
+
}).then(data => ({
|
|
792
|
+
hasMore: data.has_more,
|
|
793
|
+
members: data.members.map(m => ({
|
|
794
|
+
flags: m.flags,
|
|
795
|
+
id: m.id,
|
|
796
|
+
joinTimestamp: new Date(m.join_timestamp),
|
|
797
|
+
userID: m.user_id
|
|
798
|
+
})),
|
|
799
|
+
threads: data.threads.map(d => this._manager.client.util.updateThread(d))
|
|
800
|
+
}));
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Get the users who reacted with a specific emoji on a message.
|
|
804
|
+
* @param channelID The ID of the channel the message is in.
|
|
805
|
+
* @param messageID The ID of the message to get reactions from.
|
|
806
|
+
* @param emoji The reaction to remove from the message. `name:id` for custom emojis, and the unicode codepoint for default emojis.
|
|
807
|
+
* @param options The options for getting the reactions.
|
|
808
|
+
* @caching This method **does not** cache its result.
|
|
809
|
+
*/
|
|
810
|
+
async getReactions(channelID, messageID, emoji, options) {
|
|
811
|
+
if (emoji === decodeURIComponent(emoji)) {
|
|
812
|
+
emoji = encodeURIComponent(emoji);
|
|
813
|
+
}
|
|
814
|
+
const _getReactions = async (_options) => {
|
|
815
|
+
const query = new URLSearchParams();
|
|
816
|
+
if (_options?.after !== undefined) {
|
|
817
|
+
query.set("after", _options.after);
|
|
818
|
+
}
|
|
819
|
+
if (_options?.limit !== undefined) {
|
|
820
|
+
query.set("limit", _options.limit.toString());
|
|
821
|
+
}
|
|
822
|
+
if (options?.type !== undefined) {
|
|
823
|
+
query.set("type", String(options.type));
|
|
824
|
+
}
|
|
825
|
+
return this._manager.authRequest({
|
|
826
|
+
method: "GET",
|
|
827
|
+
path: Routes.CHANNEL_REACTION(channelID, messageID, emoji),
|
|
828
|
+
query
|
|
829
|
+
}).then(data => data.map(d => this._manager.client.users.update(d)));
|
|
830
|
+
};
|
|
831
|
+
const limit = options?.limit ?? 100;
|
|
832
|
+
let after = options?.after;
|
|
833
|
+
let reactions = [];
|
|
834
|
+
while (reactions.length < limit) {
|
|
835
|
+
const limitLeft = limit - reactions.length;
|
|
836
|
+
const limitToFetch = limitLeft <= 100 ? limitLeft : 100;
|
|
837
|
+
this._manager.client.emit("debug", `Getting ${limitLeft} more ${emoji} reactions for message ${messageID} on ${channelID}: ${after ?? ""}`);
|
|
838
|
+
const reactionsChunk = await _getReactions({
|
|
839
|
+
after,
|
|
840
|
+
limit: limitToFetch
|
|
841
|
+
});
|
|
842
|
+
if (reactionsChunk.length === 0) {
|
|
843
|
+
break;
|
|
844
|
+
}
|
|
845
|
+
reactions = reactions.concat(reactionsChunk);
|
|
846
|
+
after = reactionsChunk.at(-1).id;
|
|
847
|
+
if (reactionsChunk.length < 100) {
|
|
848
|
+
break;
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
return reactions;
|
|
852
|
+
}
|
|
853
|
+
/**
|
|
854
|
+
* Get the stage instance associated with a channel.
|
|
855
|
+
* @param channelID The ID of the channel to get the stage instance on.
|
|
856
|
+
* @caching This method **does not** cache its result.
|
|
857
|
+
*/
|
|
858
|
+
async getStageInstance(channelID) {
|
|
859
|
+
return this._manager.authRequest({
|
|
860
|
+
method: "GET",
|
|
861
|
+
path: Routes.STAGE_INSTANCE(channelID)
|
|
862
|
+
}).then(data => new StageInstance_1.default(data, this._manager.client));
|
|
863
|
+
}
|
|
864
|
+
/**
|
|
865
|
+
* Get a thread member.
|
|
866
|
+
* @param channelID The ID of the thread.
|
|
867
|
+
* @param userID The ID of the user to get the thread member of.
|
|
868
|
+
* @caching This method **does not** cache its result.
|
|
869
|
+
*/
|
|
870
|
+
async getThreadMember(channelID, userID) {
|
|
871
|
+
return this._manager.authRequest({
|
|
872
|
+
method: "GET",
|
|
873
|
+
path: Routes.CHANNEL_THREAD_MEMBER(channelID, userID)
|
|
874
|
+
}).then(data => ({
|
|
875
|
+
flags: data.flags,
|
|
876
|
+
id: data.id,
|
|
877
|
+
joinTimestamp: new Date(data.join_timestamp),
|
|
878
|
+
userID: data.user_id
|
|
879
|
+
}));
|
|
880
|
+
}
|
|
881
|
+
/**
|
|
882
|
+
* Get the members of a thread.
|
|
883
|
+
* @param channelID The ID of the thread.
|
|
884
|
+
* @param options The options for getting the thread members.
|
|
885
|
+
* @caching This method **does not** cache its result.
|
|
886
|
+
*/
|
|
887
|
+
async getThreadMembers(channelID, options) {
|
|
888
|
+
const query = new URLSearchParams();
|
|
889
|
+
if (options?.after !== undefined) {
|
|
890
|
+
query.set("after", options.after);
|
|
891
|
+
}
|
|
892
|
+
if (options?.limit !== undefined) {
|
|
893
|
+
query.set("limit", options.limit.toString());
|
|
894
|
+
}
|
|
895
|
+
if (options?.withMember !== undefined) {
|
|
896
|
+
query.set("with_member", options.withMember.toString());
|
|
897
|
+
}
|
|
898
|
+
return this._manager.authRequest({
|
|
899
|
+
method: "GET",
|
|
900
|
+
path: Routes.CHANNEL_THREAD_MEMBERS(channelID),
|
|
901
|
+
query
|
|
902
|
+
}).then(data => data.map(d => {
|
|
903
|
+
// eslint-disable-next-line @typescript-eslint/dot-notation
|
|
904
|
+
const guild = this._manager.client.getChannel(channelID)?.["_cachedGuild"];
|
|
905
|
+
const member = guild && options?.withMember ? guild.members.update(d.member, guild.id) : undefined;
|
|
906
|
+
return {
|
|
907
|
+
flags: d.flags,
|
|
908
|
+
id: d.id,
|
|
909
|
+
joinTimestamp: new Date(d.join_timestamp),
|
|
910
|
+
member,
|
|
911
|
+
userID: d.user_id
|
|
912
|
+
};
|
|
913
|
+
}));
|
|
914
|
+
}
|
|
915
|
+
/** @deprecated Get the list of usable voice regions. Moved to `misc`. */
|
|
916
|
+
async getVoiceRegions() {
|
|
917
|
+
return this._manager.authRequest({
|
|
918
|
+
method: "GET",
|
|
919
|
+
path: Routes.VOICE_REGIONS
|
|
920
|
+
});
|
|
921
|
+
}
|
|
922
|
+
/**
|
|
923
|
+
* Join a thread.
|
|
924
|
+
* @param channelID The ID of the thread to join.
|
|
925
|
+
* @caching This method **does not** cache its result.
|
|
926
|
+
*/
|
|
927
|
+
async joinThread(channelID) {
|
|
928
|
+
await this._manager.authRequest({
|
|
929
|
+
method: "PUT",
|
|
930
|
+
path: Routes.CHANNEL_THREAD_MEMBER(channelID, "@me")
|
|
931
|
+
});
|
|
932
|
+
}
|
|
933
|
+
/**
|
|
934
|
+
* Leave a thread.
|
|
935
|
+
* @param channelID The ID of the thread to leave.
|
|
936
|
+
* @caching This method **does not** cache its result.
|
|
937
|
+
*/
|
|
938
|
+
async leaveThread(channelID) {
|
|
939
|
+
await this._manager.authRequest({
|
|
940
|
+
method: "DELETE",
|
|
941
|
+
path: Routes.CHANNEL_THREAD_MEMBER(channelID, "@me")
|
|
942
|
+
});
|
|
943
|
+
}
|
|
944
|
+
/**
|
|
945
|
+
* Pin a message in a channel.
|
|
946
|
+
* @param channelID The ID of the channel to pin the message in.
|
|
947
|
+
* @param messageID The ID of the message to pin.
|
|
948
|
+
* @param reason The reason for pinning the message.
|
|
949
|
+
* @caching This method **does not** cache its result.
|
|
950
|
+
*/
|
|
951
|
+
async pinMessage(channelID, messageID, reason) {
|
|
952
|
+
await this._manager.authRequest({
|
|
953
|
+
method: "PUT",
|
|
954
|
+
path: Routes.CHANNEL_PINNED_MESSAGE(channelID, messageID),
|
|
955
|
+
reason
|
|
956
|
+
});
|
|
957
|
+
}
|
|
958
|
+
/**
|
|
959
|
+
* Purge an amount of messages from a channel.
|
|
960
|
+
* @param channelID The ID of the channel to purge.
|
|
961
|
+
* @param options The options to purge. `before`, `after`, and `around `All are mutually exclusive.
|
|
962
|
+
* @caching This method **does not** cache its result.
|
|
963
|
+
*/
|
|
964
|
+
async purgeMessages(channelID, options) {
|
|
965
|
+
const filter = (message) => {
|
|
966
|
+
if (message.timestamp.getTime() < Date.now() - 1209600000) {
|
|
967
|
+
return "break";
|
|
968
|
+
}
|
|
969
|
+
return options?.filter?.(message) ?? true;
|
|
970
|
+
};
|
|
971
|
+
let chosenOption;
|
|
972
|
+
if (options.after) {
|
|
973
|
+
chosenOption = "after";
|
|
974
|
+
}
|
|
975
|
+
else if (options.around) {
|
|
976
|
+
chosenOption = "around";
|
|
977
|
+
}
|
|
978
|
+
else {
|
|
979
|
+
chosenOption = "before";
|
|
980
|
+
}
|
|
981
|
+
if (chosenOption === "around" || options.limit <= 100) {
|
|
982
|
+
const messages = await this.getMessages(channelID, {
|
|
983
|
+
limit: options.limit,
|
|
984
|
+
[chosenOption]: options[chosenOption]
|
|
985
|
+
});
|
|
986
|
+
for (const message of messages) {
|
|
987
|
+
const f = filter(message);
|
|
988
|
+
if (f === false) {
|
|
989
|
+
messages.splice(messages.indexOf(message), 1);
|
|
990
|
+
}
|
|
991
|
+
if (f === "break") {
|
|
992
|
+
messages.splice(messages.indexOf(message));
|
|
993
|
+
break;
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
return this.deleteMessages(channelID, messages.map(message => message.id), options.reason);
|
|
997
|
+
}
|
|
998
|
+
const it = this.getMessagesIterator(channelID, {
|
|
999
|
+
after: options.after,
|
|
1000
|
+
before: options.before,
|
|
1001
|
+
limit: options.limit,
|
|
1002
|
+
filter
|
|
1003
|
+
});
|
|
1004
|
+
let deleted = 0;
|
|
1005
|
+
for await (const messages of it) {
|
|
1006
|
+
deleted += await this.deleteMessages(channelID, messages.map(message => message.id), options.reason);
|
|
1007
|
+
}
|
|
1008
|
+
return deleted;
|
|
1009
|
+
}
|
|
1010
|
+
/**
|
|
1011
|
+
* Remove a user from the group channel.
|
|
1012
|
+
* @param groupID The ID of the group to remove the user from.
|
|
1013
|
+
* @param userID The ID of the user to remove.
|
|
1014
|
+
* @caching This method **does not** cache its result.
|
|
1015
|
+
*/
|
|
1016
|
+
async removeGroupRecipient(groupID, userID) {
|
|
1017
|
+
await this._manager.authRequest({
|
|
1018
|
+
method: "DELETE",
|
|
1019
|
+
path: Routes.GROUP_RECIPIENT(groupID, userID)
|
|
1020
|
+
});
|
|
1021
|
+
}
|
|
1022
|
+
/**
|
|
1023
|
+
* Remove a member from a thread.
|
|
1024
|
+
* @param channelID The ID of the thread to remove them from.
|
|
1025
|
+
* @param userID The ID of the user to remove from the thread.
|
|
1026
|
+
* @caching This method **does not** cache its result.
|
|
1027
|
+
*/
|
|
1028
|
+
async removeThreadMember(channelID, userID) {
|
|
1029
|
+
await this._manager.authRequest({
|
|
1030
|
+
method: "DELETE",
|
|
1031
|
+
path: Routes.CHANNEL_THREAD_MEMBER(channelID, userID)
|
|
1032
|
+
});
|
|
1033
|
+
}
|
|
1034
|
+
/**
|
|
1035
|
+
* Show a typing indicator in a channel. How long users see this varies from client to client.
|
|
1036
|
+
* @param channelID The ID of the channel to show the typing indicator in.
|
|
1037
|
+
* @caching This method **does not** cache its result.
|
|
1038
|
+
*/
|
|
1039
|
+
async sendTyping(channelID) {
|
|
1040
|
+
await this._manager.authRequest({
|
|
1041
|
+
method: "POST",
|
|
1042
|
+
path: Routes.CHANNEL_TYPING(channelID)
|
|
1043
|
+
});
|
|
1044
|
+
}
|
|
1045
|
+
/**
|
|
1046
|
+
* Set a voice status in a channel.
|
|
1047
|
+
* @param channelID The ID of the channel to set the voice status in.
|
|
1048
|
+
* @param status The voice status to set.
|
|
1049
|
+
*/
|
|
1050
|
+
async setVoiceStatus(channelID, status) {
|
|
1051
|
+
await this._manager.authRequest({
|
|
1052
|
+
method: "PUT",
|
|
1053
|
+
path: Routes.VOICE_STATUS(channelID),
|
|
1054
|
+
json: { status }
|
|
1055
|
+
});
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Create a thread from an existing message.
|
|
1059
|
+
* @param channelID The ID of the channel to create the thread in.
|
|
1060
|
+
* @param messageID The ID of the message to create the thread from.
|
|
1061
|
+
* @param options The options for starting the thread.
|
|
1062
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
1063
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
1064
|
+
*/
|
|
1065
|
+
async startThreadFromMessage(channelID, messageID, options) {
|
|
1066
|
+
const reason = options.reason;
|
|
1067
|
+
if (options.reason) {
|
|
1068
|
+
delete options.reason;
|
|
1069
|
+
}
|
|
1070
|
+
return this._manager.authRequest({
|
|
1071
|
+
method: "POST",
|
|
1072
|
+
path: Routes.CHANNEL_MESSAGE_THREADS(channelID, messageID),
|
|
1073
|
+
json: {
|
|
1074
|
+
auto_archive_duration: options.autoArchiveDuration,
|
|
1075
|
+
name: options.name,
|
|
1076
|
+
rate_limit_per_user: options.rateLimitPerUser
|
|
1077
|
+
},
|
|
1078
|
+
reason
|
|
1079
|
+
}).then(data => this._manager.client.util.updateThread(data));
|
|
1080
|
+
}
|
|
1081
|
+
/**
|
|
1082
|
+
* Create a thread in a thread only channel (forum & media).
|
|
1083
|
+
* @param channelID The ID of the channel to start the thread in.
|
|
1084
|
+
* @param options The options for starting the thread.
|
|
1085
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
1086
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
1087
|
+
*/
|
|
1088
|
+
async startThreadInThreadOnlyChannel(channelID, options) {
|
|
1089
|
+
const reason = options.reason;
|
|
1090
|
+
if (options.reason) {
|
|
1091
|
+
delete options.reason;
|
|
1092
|
+
}
|
|
1093
|
+
const files = options.message.files;
|
|
1094
|
+
if (options.message.files) {
|
|
1095
|
+
delete options.message.files;
|
|
1096
|
+
}
|
|
1097
|
+
return this._manager.authRequest({
|
|
1098
|
+
method: "POST",
|
|
1099
|
+
path: Routes.CHANNEL_THREADS(channelID),
|
|
1100
|
+
json: {
|
|
1101
|
+
auto_archive_duration: options.autoArchiveDuration,
|
|
1102
|
+
message: {
|
|
1103
|
+
allowed_mentions: this._manager.client.util.formatAllowedMentions(options.message.allowedMentions),
|
|
1104
|
+
attachments: options.message.attachments,
|
|
1105
|
+
components: options.message.components ? this._manager.client.util.componentsToRaw(options.message.components) : undefined,
|
|
1106
|
+
content: options.message.content,
|
|
1107
|
+
embeds: options.message.embeds ? this._manager.client.util.embedsToRaw(options.message.embeds) : undefined,
|
|
1108
|
+
flags: options.message.flags,
|
|
1109
|
+
sticker_ids: options.message.stickerIDs
|
|
1110
|
+
},
|
|
1111
|
+
name: options.name,
|
|
1112
|
+
rate_limit_per_user: options.rateLimitPerUser,
|
|
1113
|
+
applied_tags: options.appliedTags
|
|
1114
|
+
},
|
|
1115
|
+
reason,
|
|
1116
|
+
files
|
|
1117
|
+
}).then(data => this._manager.client.util.updateThread(data));
|
|
1118
|
+
}
|
|
1119
|
+
/**
|
|
1120
|
+
* Create a thread without an existing message.
|
|
1121
|
+
* @param channelID The ID of the channel to start the thread in.
|
|
1122
|
+
* @param options The options for starting the thread.
|
|
1123
|
+
* @caching This method **may** cache its result. The result will not be cached if the guild is not cached.
|
|
1124
|
+
* @caches {@link Guild#threads | Guild#threads}
|
|
1125
|
+
*/
|
|
1126
|
+
async startThreadWithoutMessage(channelID, options) {
|
|
1127
|
+
const reason = options.reason;
|
|
1128
|
+
if (options.reason) {
|
|
1129
|
+
delete options.reason;
|
|
1130
|
+
}
|
|
1131
|
+
return this._manager.authRequest({
|
|
1132
|
+
method: "POST",
|
|
1133
|
+
path: Routes.CHANNEL_THREADS(channelID),
|
|
1134
|
+
json: {
|
|
1135
|
+
auto_archive_duration: options.autoArchiveDuration,
|
|
1136
|
+
invitable: options.invitable,
|
|
1137
|
+
name: options.name,
|
|
1138
|
+
rate_limit_per_user: options.rateLimitPerUser,
|
|
1139
|
+
type: options.type
|
|
1140
|
+
},
|
|
1141
|
+
reason
|
|
1142
|
+
}).then(data => this._manager.client.util.updateThread(data));
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* Unpin a message in a channel.
|
|
1146
|
+
* @param channelID The ID of the channel to unpin the message in.
|
|
1147
|
+
* @param messageID The ID of the message to unpin.
|
|
1148
|
+
* @param reason The reason for unpinning the message.
|
|
1149
|
+
* @caching This method **does not** cache its result.
|
|
1150
|
+
*/
|
|
1151
|
+
async unpinMessage(channelID, messageID, reason) {
|
|
1152
|
+
await this._manager.authRequest({
|
|
1153
|
+
method: "DELETE",
|
|
1154
|
+
path: Routes.CHANNEL_PINNED_MESSAGE(channelID, messageID),
|
|
1155
|
+
reason
|
|
1156
|
+
});
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
exports.default = Channels;
|
|
1160
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhbm5lbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvcm91dGVzL0NoYW5uZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdEQSwrREFBeUM7QUFHekMsMEVBQTBDO0FBWTFDLHdGQUF3RDtBQUV4RCwySUFBMkk7QUFDM0ksTUFBcUIsUUFBUTtJQUNqQixRQUFRLENBQWM7SUFDOUIsWUFBWSxPQUFvQjtRQUM1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBZSxFQUFFLE9BQWlDO1FBQ3RFLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQU87WUFDbEMsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUksTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUN2RCxJQUFJLEVBQUk7Z0JBQ0osWUFBWSxFQUFFLE9BQU8sQ0FBQyxXQUFXO2dCQUNqQyxJQUFJLEVBQVUsT0FBTyxDQUFDLElBQUk7YUFDN0I7U0FDSixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQWlCLEVBQUUsTUFBYztRQUNuRCxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFPO1lBQ2xDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsSUFBSSxFQUFJLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDO1NBQzFELENBQUMsQ0FBQztJQUNQLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBaUI7UUFDNUIsSUFBSSxLQUFpQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElB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
|