diff --git a/src/structures/DMChannel.js b/src/structures/DMChannel.js index 279b3a1..9fb18bc 100644 --- a/src/structures/DMChannel.js +++ b/src/structures/DMChannel.js @@ -61,6 +61,51 @@ class DMChannel extends Channel { } else { this.lastPinTimestamp ??= null; } + + if ('is_message_request' in data) { + /** + * Whether the channel is a message request + * @type {boolean} + */ + this.messageRequest = data.is_message_request; + } + + if ('is_message_request_timestamp' in data) { + /** + * The timestamp when the message request was created + * @type {?number} + */ + this.messageRequestTimestamp = new Date(data.is_message_request_timestamp).getTime(); + } + } + + /** + * Accept this DMChannel. + * @returns {Promise} + */ + async acceptMessageRequest() { + if (!this.messageRequest) { + throw new Error('NOT_MESSAGE_REQUEST', 'This channel is not a message request'); + } + const c = await this.client.api.channels[this.id].recipients['@me'].put({ + data: { + consent_status: 2, + }, + }); + this.messageRequest = false; + return this.client.channels._add(c); + } + + /** + * Cancel this DMChannel. + * @returns {Promise} + */ + async cancelMessageRequest() { + if (!this.messageRequest) { + throw new Error('NOT_MESSAGE_REQUEST', 'This channel is not a message request'); + } + await this.client.api.channels[this.id].recipients['@me'].delete(); + return this; } /** diff --git a/typings/index.d.ts b/typings/index.d.ts index fabe447..4dd50c6 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -2384,6 +2384,10 @@ export class PartialGroupDMChannel extends TextBasedChannelMixin(Channel, [ public owner: User | null; public ownerId: Snowflake | null; public flags: null; + public messageRequest: boolean | undefined; + public messageRequestTimestamp: Date | undefined; + public acceptMessageRequest(): Promise; + public cancelMessageRequest(): Promise; public iconURL(options?: StaticImageURLOptions): string | null; public addMember(user: User): Promise; public removeMember(user: User): Promise;