From e96a60361ad76a9aee9205d09b2962e0d7979db1 Mon Sep 17 00:00:00 2001 From: Ash <28841569+Asshley@users.noreply.github.com> Date: Mon, 3 Sep 2018 03:11:52 -0400 Subject: [PATCH] feat(TextBasedChannel): add lastPinTimestamp and lastPinAt (#2813) * add lastPinTimestamp * typings * use or instead of ternary --- .../packets/handlers/ChannelPinsUpdate.js | 7 ++++++- src/structures/DMChannel.js | 7 +++++++ src/structures/GroupDMChannel.js | 7 +++++++ src/structures/TextChannel.js | 7 +++++++ src/structures/interfaces/TextBasedChannel.js | 16 ++++++++++++++++ typings/index.d.ts | 2 ++ 6 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/client/websocket/packets/handlers/ChannelPinsUpdate.js b/src/client/websocket/packets/handlers/ChannelPinsUpdate.js index 6332ec463..ea6c8f31d 100644 --- a/src/client/websocket/packets/handlers/ChannelPinsUpdate.js +++ b/src/client/websocket/packets/handlers/ChannelPinsUpdate.js @@ -16,7 +16,12 @@ class ChannelPinsUpdate extends AbstractHandler { const data = packet.d; const channel = client.channels.get(data.channel_id); const time = new Date(data.last_pin_timestamp); - if (channel && time) client.emit(Events.CHANNEL_PINS_UPDATE, channel, time); + if (channel && time) { + // Discord sends null for last_pin_timestamp if the last pinned message was removed + channel.lastPinTimestamp = time.getTime() || null; + + client.emit(Events.CHANNEL_PINS_UPDATE, channel, time); + } } } diff --git a/src/structures/DMChannel.js b/src/structures/DMChannel.js index 5c784b3a3..1f45f490f 100644 --- a/src/structures/DMChannel.js +++ b/src/structures/DMChannel.js @@ -32,6 +32,12 @@ class DMChannel extends Channel { * @type {?Snowflake} */ this.lastMessageID = data.last_message_id; + + /** + * The timestamp when the last pinned message was pinned, if there was one + * @type {?number} + */ + this.lastPinTimestamp = data.last_pin_timestamp ? new Date(data.last_pin_timestamp).getTime() : null; } /** @@ -49,6 +55,7 @@ class DMChannel extends Channel { // These are here only for documentation purposes - they are implemented by TextBasedChannel /* eslint-disable no-empty-function */ get lastMessage() {} + get lastPinAt() {} send() {} search() {} startTyping() {} diff --git a/src/structures/GroupDMChannel.js b/src/structures/GroupDMChannel.js index 933c701bb..b2fe7200f 100644 --- a/src/structures/GroupDMChannel.js +++ b/src/structures/GroupDMChannel.js @@ -103,6 +103,12 @@ class GroupDMChannel extends Channel { * @type {?Snowflake} */ this.lastMessageID = data.last_message_id; + + /** + * The timestamp when the last pinned message was pinned, if there was one + * @type {?number} + */ + this.lastPinTimestamp = data.last_pin_timestamp ? new Date(data.last_pin_timestamp).getTime() : null; } /** @@ -219,6 +225,7 @@ class GroupDMChannel extends Channel { // These are here only for documentation purposes - they are implemented by TextBasedChannel /* eslint-disable no-empty-function */ get lastMessage() {} + get lastPinAt() {} send() {} search() {} startTyping() {} diff --git a/src/structures/TextChannel.js b/src/structures/TextChannel.js index df734a748..698e23f20 100644 --- a/src/structures/TextChannel.js +++ b/src/structures/TextChannel.js @@ -43,6 +43,12 @@ class TextChannel extends GuildChannel { */ this.lastMessageID = data.last_message_id; + /** + * The timestamp when the last pinned message was pinned, if there was one + * @type {?number} + */ + this.lastPinTimestamp = data.last_pin_timestamp ? new Date(data.last_pin_timestamp).getTime() : null; + if (data.messages) for (const message of data.messages) this.messages.add(message); } @@ -101,6 +107,7 @@ class TextChannel extends GuildChannel { // These are here only for documentation purposes - they are implemented by TextBasedChannel /* eslint-disable no-empty-function */ get lastMessage() {} + get lastPinAt() {} send() {} search() {} startTyping() {} diff --git a/src/structures/interfaces/TextBasedChannel.js b/src/structures/interfaces/TextBasedChannel.js index 207f74248..45eecf750 100644 --- a/src/structures/interfaces/TextBasedChannel.js +++ b/src/structures/interfaces/TextBasedChannel.js @@ -21,6 +21,12 @@ class TextBasedChannel { * @type {?Snowflake} */ this.lastMessageID = null; + + /** + * The timestamp when the last pinned message was pinned, if there was one + * @type {?number} + */ + this.lastPinTimestamp = null; } /** @@ -32,6 +38,15 @@ class TextBasedChannel { return this.messages.get(this.lastMessageID) || null; } + /** + * The date when the last pinned message was pinned, if there was one + * @type {?Date} + * @readonly + */ + get lastPinAt() { + return this.lastPinTimestamp ? new Date(this.lastPinTimestamp) : null; + } + /** * Options provided when sending or editing a message. * @typedef {Object} MessageOptions @@ -322,6 +337,7 @@ class TextBasedChannel { if (full) { props.push( 'lastMessage', + 'lastPinAt', 'bulkDelete', 'startTyping', 'stopTyping', diff --git a/typings/index.d.ts b/typings/index.d.ts index 7eca0f3a6..555272ad6 100644 --- a/typings/index.d.ts +++ b/typings/index.d.ts @@ -1390,6 +1390,8 @@ declare module 'discord.js' { lastMessageID: Snowflake; lastMessageChannelID: Snowflake; readonly lastMessage: Message; + lastPinTimestamp: number; + readonly lastPinAt: Date; send(content?: StringResolvable, options?: MessageOptions | MessageAdditions): Promise; send(options?: MessageOptions | MessageAdditions): Promise; };