feat(ThreadChannel): Backport creation timestamp (#7559)

This commit is contained in:
Jiralite
2022-03-02 09:32:25 +00:00
committed by GitHub
parent 679b87c4f8
commit 1d97dcff08
2 changed files with 46 additions and 3 deletions

View File

@@ -100,6 +100,11 @@ class ThreadChannel extends Channel {
* @type {?number} * @type {?number}
*/ */
this.archiveTimestamp = new Date(data.thread_metadata.archive_timestamp).getTime(); this.archiveTimestamp = new Date(data.thread_metadata.archive_timestamp).getTime();
if ('create_timestamp' in data.thread_metadata) {
// Note: this is needed because we can't assign directly to getters
this._createdTimestamp = Date.parse(data.thread_metadata.create_timestamp);
}
} else { } else {
this.locked ??= null; this.locked ??= null;
this.archived ??= null; this.archived ??= null;
@@ -108,6 +113,8 @@ class ThreadChannel extends Channel {
this.invitable ??= null; this.invitable ??= null;
} }
this._createdTimestamp ??= this.type === 'GUILD_PRIVATE_THREAD' ? super.createdTimestamp : null;
if ('owner_id' in data) { if ('owner_id' in data) {
/** /**
* The id of the member who created this thread * The id of the member who created this thread
@@ -176,6 +183,16 @@ class ThreadChannel extends Channel {
if (data.messages) for (const message of data.messages) this.messages._add(message); if (data.messages) for (const message of data.messages) this.messages._add(message);
} }
/**
* The timestamp when this thread was created. This isn't available for threads
* created before 2022-01-09
* @type {?number}
* @readonly
*/
get createdTimestamp() {
return this._createdTimestamp;
}
/** /**
* A collection of associated guild member objects of this thread's members * A collection of associated guild member objects of this thread's members
* @type {Collection<Snowflake, GuildMember>} * @type {Collection<Snowflake, GuildMember>}
@@ -196,6 +213,15 @@ class ThreadChannel extends Channel {
return new Date(this.archiveTimestamp); return 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 * The parent channel of this thread
* @type {?(NewsChannel|TextChannel)} * @type {?(NewsChannel|TextChannel)}
@@ -490,6 +516,14 @@ class ThreadChannel extends Channel {
return this.archived && this.sendable && (!this.locked || this.manageable); return this.archived && this.sendable && (!this.locked || this.manageable);
} }
/**
* Whether this thread is a private thread
* @returns {boolean}
*/
isPrivate() {
return this.type === 'GUILD_PRIVATE_THREAD';
}
/** /**
* Deletes this thread. * Deletes this thread.
* @param {string} [reason] Reason for deleting this thread * @param {string} [reason] Reason for deleting this thread

15
typings/index.d.ts vendored
View File

@@ -516,8 +516,8 @@ export type CategoryChannelResolvable = Snowflake | CategoryChannel;
export abstract class Channel extends Base { export abstract class Channel extends Base {
public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean); public constructor(client: Client, data?: RawChannelData, immediatePatch?: boolean);
public readonly createdAt: Date; public readonly createdAt: Date | null;
public readonly createdTimestamp: number; public readonly createdTimestamp: number | null;
/** @deprecated This will be removed in the next major version, see https://github.com/discordjs/discord.js/issues/7091 */ /** @deprecated This will be removed in the next major version, see https://github.com/discordjs/discord.js/issues/7091 */
public deleted: boolean; public deleted: boolean;
public id: Snowflake; public id: Snowflake;
@@ -1042,7 +1042,8 @@ export abstract class GuildChannel extends Channel {
public constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean); public constructor(guild: Guild, data?: RawGuildChannelData, client?: Client, immediatePatch?: boolean);
private memberPermissions(member: GuildMember, checkAdmin: boolean): Readonly<Permissions>; private memberPermissions(member: GuildMember, checkAdmin: boolean): Readonly<Permissions>;
private rolePermissions(role: Role, checkAdmin: boolean): Readonly<Permissions>; private rolePermissions(role: Role, checkAdmin: boolean): Readonly<Permissions>;
public readonly createdAt: Date;
public readonly createdTimestamp: number;
public readonly calculatedPosition: number; public readonly calculatedPosition: number;
public readonly deletable: boolean; public readonly deletable: boolean;
public guild: Guild; public guild: Guild;
@@ -2305,6 +2306,9 @@ export class ThreadChannel extends TextBasedChannelMixin(Channel) {
public archived: boolean | null; public archived: boolean | null;
public readonly archivedAt: Date | null; public readonly archivedAt: Date | null;
public archiveTimestamp: number | null; public archiveTimestamp: number | null;
public readonly createdAt: Date | null;
private _createdTimestamp: number | null;
public readonly createdTimestamp: number | null;
public autoArchiveDuration: ThreadAutoArchiveDuration | null; public autoArchiveDuration: ThreadAutoArchiveDuration | null;
public readonly editable: boolean; public readonly editable: boolean;
public guild: Guild; public guild: Guild;
@@ -2328,6 +2332,11 @@ export class ThreadChannel extends TextBasedChannelMixin(Channel) {
public rateLimitPerUser: number | null; public rateLimitPerUser: number | null;
public type: ThreadChannelTypes; public type: ThreadChannelTypes;
public readonly unarchivable: boolean; public readonly unarchivable: boolean;
public isPrivate(): this is this & {
readonly createdTimestamp: number;
readonly createdAt: Date;
type: 'GUILD_PRIVATE_THREAD';
};
public delete(reason?: string): Promise<this>; public delete(reason?: string): Promise<this>;
public edit(data: ThreadEditData, reason?: string): Promise<ThreadChannel>; public edit(data: ThreadEditData, reason?: string): Promise<ThreadChannel>;
public join(): Promise<ThreadChannel>; public join(): Promise<ThreadChannel>;