diff --git a/src/structures/Webhook.js b/src/structures/Webhook.js index da7dcd12f..b4c228e97 100644 --- a/src/structures/Webhook.js +++ b/src/structures/Webhook.js @@ -1,6 +1,8 @@ 'use strict'; +const { WebhookTypes } = require('../util/Constants'); const DataResolver = require('../util/DataResolver'); +const Snowflake = require('../util/Snowflake'); const Channel = require('./Channel'); const APIMessage = require('./APIMessage'); @@ -29,9 +31,9 @@ class Webhook { /** * The token for the webhook * @name Webhook#token - * @type {string} + * @type {?string} */ - Object.defineProperty(this, 'token', { value: data.token, writable: true, configurable: true }); + Object.defineProperty(this, 'token', { value: data.token || null, writable: true, configurable: true }); /** * The avatar for the webhook @@ -45,6 +47,12 @@ class Webhook { */ this.id = data.id; + /** + * The type of the webhook + * @type {WebhookTypes} + */ + this.type = WebhookTypes[data.type]; + /** * The guild the webhook belongs to * @type {Snowflake} @@ -210,6 +218,23 @@ class Webhook { delete(reason) { return this.client.api.webhooks(this.id, this.token).delete({ reason }); } + /** + * The timestamp the webhook was created at + * @type {number} + * @readonly + */ + get createdTimestamp() { + return Snowflake.deconstruct(this.id).timestamp; + } + + /** + * The time the webhook was created at + * @type {Date} + * @readonly + */ + get createdAt() { + return new Date(this.createdTimestamp); + } /** * The url of this webhook @@ -236,6 +261,9 @@ class Webhook { 'sendSlackMessage', 'edit', 'delete', + 'createdTimestamp', + 'createdAt', + 'url', ]) { Object.defineProperty(structure.prototype, prop, Object.getOwnPropertyDescriptor(Webhook.prototype, prop)); diff --git a/src/util/Constants.js b/src/util/Constants.js index 06f12f36c..4c2f60590 100644 --- a/src/util/Constants.js +++ b/src/util/Constants.js @@ -628,6 +628,19 @@ exports.MembershipStates = [ 'ACCEPTED', ]; +/** + * The value set for a webhook's type: + * * Incoming + * * Channel Follower + * @typedef {string} WebhookTypes + */ +exports.WebhookTypes = [ + // They start at 1 + null, + 'Incoming', + 'Channel Follower', +]; + function keyMirror(arr) { let tmp = Object.create(null); for (const value of arr) tmp[value] = value; diff --git a/typings/index.d.ts b/typings/index.d.ts index ed0882269..de3f707a8 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1636,11 +1636,13 @@ declare module 'discord.js' { public guildID: Snowflake; public name: string; public owner: User | object | null; - public readonly url: string; + public token: string | null; + public type: WebhookTypes; } export class WebhookClient extends WebhookMixin(BaseClient) { constructor(id: string, token: string, options?: ClientOptions); + public token: string; } export class WebSocketManager extends EventEmitter { @@ -1909,7 +1911,9 @@ declare module 'discord.js' { interface WebhookFields { readonly client: Client; id: Snowflake; - token: string; + readonly createdAt: Date; + readonly createdTimestamp: number; + readonly url: string; delete(reason?: string): Promise; edit(options: WebhookEditData): Promise; send(content?: StringResolvable, options?: WebhookMessageOptions & { split?: false } | MessageAdditions): Promise; @@ -2654,6 +2658,8 @@ declare module 'discord.js' { split?: boolean | SplitOptions; } + type WebhookTypes = 'Incoming' | 'Channel Follower'; + interface WebSocketOptions { large_threshold?: number; compress?: boolean;