From 9a1623425ae2d69f5c16f0096af4951ff5096e80 Mon Sep 17 00:00:00 2001 From: Suneet Tipirneni <77477100+suneettipirneni@users.noreply.github.com> Date: Tue, 25 Jan 2022 02:34:26 -0500 Subject: [PATCH] feat(threadchannel): add `createdTimestamp` field (#7306) Co-authored-by: Rodry <38259440+ImRodry@users.noreply.github.com> Co-authored-by: Almeida --- .../src/structures/ThreadChannel.js | 28 +++++++++++++++++++ packages/discord.js/typings/index.d.ts | 14 ++++++++-- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/discord.js/src/structures/ThreadChannel.js b/packages/discord.js/src/structures/ThreadChannel.js index cd3b5cfd4..5acdee6ef 100644 --- a/packages/discord.js/src/structures/ThreadChannel.js +++ b/packages/discord.js/src/structures/ThreadChannel.js @@ -101,6 +101,15 @@ class ThreadChannel extends Channel { * @type {?number} */ this.archiveTimestamp = Date.parse(data.thread_metadata.archive_timestamp); + + if ('create_timestamp' in data.thread_metadata) { + /** + * The timestamp when this thread was created. This isn't available for threads + * created before 2022-01-09 + * @type {?number} + */ + this.createdTimestamp = Date.parse(data.thread_metadata.create_timestamp); + } } else { this.locked ??= null; this.archived ??= null; @@ -109,6 +118,8 @@ class ThreadChannel extends Channel { this.invitable ??= null; } + this.createdTimestamp ??= this.type === ChannelType.GuildPrivateThread ? super.createdTimestamp : null; + if ('owner_id' in data) { /** * The id of the member who created this thread @@ -196,6 +207,15 @@ class ThreadChannel extends Channel { return this.archiveTimestamp && new Date(this.archiveTimestamp); } + /** + * The time the thread was created at + * @type {?Date} + * @readonly + */ + get createdAt() { + return this.createdTimestamp && new Date(this.createdTimestamp); + } + /** * The parent channel of this thread * @type {?(NewsChannel|TextChannel)} @@ -495,6 +515,14 @@ class ThreadChannel extends Channel { return this.archived && (this.locked ? this.manageable : this.sendable); } + /** + * Whether this thread is a private thread + * @returns {boolean} + */ + isPrivate() { + return this.type === ChannelType.GuildPrivateThread; + } + /** * Deletes this thread. * @param {string} [reason] Reason for deleting this thread diff --git a/packages/discord.js/typings/index.d.ts b/packages/discord.js/typings/index.d.ts index 0cfe52569..49bada92e 100644 --- a/packages/discord.js/typings/index.d.ts +++ b/packages/discord.js/typings/index.d.ts @@ -512,8 +512,8 @@ export type CategoryChannelResolvable = Snowflake | CategoryChannel; export abstract class Channel extends Base { public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean); - public readonly createdAt: Date; - public readonly createdTimestamp: number; + public readonly createdAt: Date | null; + public readonly createdTimestamp: number | null; public id: Snowflake; public readonly partial: false; public type: ChannelType; @@ -1042,7 +1042,8 @@ export abstract class GuildChannel extends Channel { public constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean); private memberPermissions(member: GuildMember, checkAdmin: boolean): Readonly; private rolePermissions(role: Role, checkAdmin: boolean): Readonly; - + public readonly createdAt: Date; + public readonly createdTimestamp: number; public readonly calculatedPosition: number; public readonly deletable: boolean; public guild: Guild; @@ -2169,6 +2170,8 @@ export class ThreadChannel extends TextBasedChannelMixin(Channel) { public archived: boolean | null; public readonly archivedAt: Date | null; public archiveTimestamp: number | null; + public readonly createdAt: Date | null; + public createdTimestamp: number | null; public autoArchiveDuration: ThreadAutoArchiveDuration | null; public readonly editable: boolean; public guild: Guild; @@ -2192,6 +2195,11 @@ export class ThreadChannel extends TextBasedChannelMixin(Channel) { public rateLimitPerUser: number | null; public type: ThreadChannelType; public readonly unarchivable: boolean; + public isPrivate(): this is this & { + readonly createdTimestamp: number; + readonly createdAt: Date; + type: ChannelType.GuildPrivateThread; + }; public delete(reason?: string): Promise; public edit(data: ThreadEditData, reason?: string): Promise; public join(): Promise;