feat: add typeguards to webhooks (#6850)

This commit is contained in:
Suneet Tipirneni
2021-10-19 10:11:21 -04:00
committed by GitHub
parent 4dff279a6f
commit e0afcadda4
3 changed files with 41 additions and 2 deletions

View File

@@ -395,6 +395,22 @@ class Webhook {
return this.client.rest.cdn.Avatar(this.id, this.avatar, format, size); 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 = []) { static applyToClass(structure, ignore = []) {
for (const prop of [ for (const prop of [
'send', 'send',

5
typings/index.d.ts vendored
View File

@@ -2218,6 +2218,11 @@ export class Webhook extends WebhookMixin() {
public sourceChannel: NewsChannel | APIPartialChannel | null; public sourceChannel: NewsChannel | APIPartialChannel | null;
public token: string | null; public token: string | null;
public type: WebhookType; 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) { export class WebhookClient extends WebhookMixin(BaseClient) {

View File

@@ -1,8 +1,10 @@
import { import {
APIGuildMember, APIGuildMember,
APIInteractionDataResolvedGuildMember,
APIInteractionGuildMember, APIInteractionGuildMember,
APIMessage, APIMessage,
APIPartialChannel,
APIPartialGuild,
APIInteractionDataResolvedGuildMember,
} from 'discord-api-types/v9'; } from 'discord-api-types/v9';
import { import {
ApplicationCommand, ApplicationCommand,
@@ -478,7 +480,7 @@ client.on('messageReactionRemoveAll', async message => {
// This is to check that stuff is the right type // This is to check that stuff is the right type
declare const assertIsMessage: (m: Promise<Message>) => void; declare const assertIsMessage: (m: Promise<Message>) => void;
client.on('messageCreate', message => { client.on('messageCreate', async message => {
const { channel } = message; const { channel } = message;
assertIsMessage(channel.send('string')); assertIsMessage(channel.send('string'));
assertIsMessage(channel.send({})); assertIsMessage(channel.send({}));
@@ -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({ channel.awaitMessageComponent({
filter: i => { filter: i => {
assertType<MessageComponentInteraction>(i); assertType<MessageComponentInteraction>(i);