diff --git a/src/structures/Webhook.js b/src/structures/Webhook.js index 7accdec6e7f6..7f51362c05d4 100644 --- a/src/structures/Webhook.js +++ b/src/structures/Webhook.js @@ -395,6 +395,22 @@ class Webhook { return this.client.rest.cdn.Avatar(this.id, this.avatar, format, size); } + /** + * Whether or not this webhook is a channel follower webhook. + * @returns {boolean} + */ + isChannelFollower() { + return this.type === WebhookTypes['Channel Follower']; + } + + /** + * Whether or not this webhook is an incoming webhook. + * @returns {boolean} + */ + isIncoming() { + return this.type === WebhookTypes.Incoming; + } + static applyToClass(structure, ignore = []) { for (const prop of [ 'send', diff --git a/typings/index.d.ts b/typings/index.d.ts index f4e0d013564e..8a0cd5b6b19b 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2218,6 +2218,11 @@ export class Webhook extends WebhookMixin() { public sourceChannel: NewsChannel | APIPartialChannel | null; public token: string | null; public type: WebhookType; + public isIncoming(): this is this & { token: string }; + public isChannelFollower(): this is this & { + sourceGuild: Guild | APIPartialGuild; + sourceChannel: NewsChannel | APIPartialChannel; + }; } export class WebhookClient extends WebhookMixin(BaseClient) { diff --git a/typings/tests.ts b/typings/tests.ts index 4f397f2873ef..8e5b260ca08e 100644 --- a/typings/tests.ts +++ b/typings/tests.ts @@ -1,8 +1,10 @@ import { APIGuildMember, - APIInteractionDataResolvedGuildMember, APIInteractionGuildMember, APIMessage, + APIPartialChannel, + APIPartialGuild, + APIInteractionDataResolvedGuildMember, } from 'discord-api-types/v9'; import { ApplicationCommand, @@ -478,7 +480,7 @@ client.on('messageReactionRemoveAll', async message => { // This is to check that stuff is the right type declare const assertIsMessage: (m: Promise) => void; -client.on('messageCreate', message => { +client.on('messageCreate', async message => { const { channel } = message; assertIsMessage(channel.send('string')); assertIsMessage(channel.send({})); @@ -573,6 +575,22 @@ client.on('messageCreate', message => { }, }); + const webhook = await message.fetchWebhook(); + + if (webhook.isChannelFollower()) { + assertType(webhook.sourceGuild); + assertType(webhook.sourceChannel); + } else if (webhook.isIncoming()) { + assertType(webhook.token); + } + + // @ts-expect-error + assertType(webhook.sourceGuild); + // @ts-expect-error + assertType(webhook.sourceChannel); + // @ts-expect-error + assertType(webhook.token); + channel.awaitMessageComponent({ filter: i => { assertType(i);