Skip to content

Commit

Permalink
feat: add typeguards to webhooks (#6850)
Browse files Browse the repository at this point in the history
  • Loading branch information
suneettipirneni committed Oct 19, 2021
1 parent 4dff279 commit e0afcad
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 2 deletions.
16 changes: 16 additions & 0 deletions src/structures/Webhook.js
Expand Up @@ -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',
Expand Down
5 changes: 5 additions & 0 deletions typings/index.d.ts
Expand Up @@ -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) {
Expand Down
22 changes: 20 additions & 2 deletions typings/tests.ts
@@ -1,8 +1,10 @@
import {
APIGuildMember,
APIInteractionDataResolvedGuildMember,
APIInteractionGuildMember,
APIMessage,
APIPartialChannel,
APIPartialGuild,
APIInteractionDataResolvedGuildMember,
} from 'discord-api-types/v9';
import {
ApplicationCommand,
Expand Down Expand Up @@ -478,7 +480,7 @@ client.on('messageReactionRemoveAll', async message => {
// This is to check that stuff is the right type
declare const assertIsMessage: (m: Promise<Message>) => void;

client.on('messageCreate', message => {
client.on('messageCreate', async message => {
const { channel } = message;
assertIsMessage(channel.send('string'));
assertIsMessage(channel.send({}));
Expand Down Expand Up @@ -573,6 +575,22 @@ client.on('messageCreate', message => {
},
});

const webhook = await message.fetchWebhook();

if (webhook.isChannelFollower()) {
assertType<Guild | APIPartialGuild>(webhook.sourceGuild);
assertType<NewsChannel | APIPartialChannel>(webhook.sourceChannel);
} else if (webhook.isIncoming()) {
assertType<string>(webhook.token);
}

// @ts-expect-error
assertType<Guild | APIPartialGuild>(webhook.sourceGuild);
// @ts-expect-error
assertType<NewsChannel | APIPartialChannel>(webhook.sourceChannel);
// @ts-expect-error
assertType<string>(webhook.token);

channel.awaitMessageComponent({
filter: i => {
assertType<MessageComponentInteraction>(i);
Expand Down

0 comments on commit e0afcad

Please sign in to comment.