diff --git a/index.d.ts b/index.d.ts index 560a94c..2a63741 100644 --- a/index.d.ts +++ b/index.d.ts @@ -116,7 +116,7 @@ declare namespace WAWebJS { * @param chatId ID of the chat that will be muted * @param unmuteDate Date when the chat will be unmuted, leave as is to mute forever */ - muteChat(chatId: string, unmuteDate?: Date): Promise + muteChat(chatId: string, unmuteDate?: Date): Promise<{ isMuted: boolean, muteExpiration: number }> /** * Request authentication via pairing code instead of QR code @@ -208,7 +208,7 @@ declare namespace WAWebJS { unarchiveChat(chatId: string): Promise /** Unmutes the Chat */ - unmuteChat(chatId: string): Promise + unmuteChat(chatId: string): Promise<{ isMuted: boolean, muteExpiration: number }> /** Sets the current user's profile picture */ setProfilePicture(media: MessageMedia): Promise @@ -1468,10 +1468,10 @@ declare namespace WAWebJS { /** Loads chat messages, sorted from earliest to latest. */ fetchMessages: (searchOptions: MessageSearchOptions) => Promise, /** Mutes this chat forever, unless a date is specified */ - mute: (unmuteDate?: Date) => Promise, + mute: (unmuteDate?: Date) => Promise<{ isMuted: boolean, muteExpiration: number }>, /** Send a message to this chat */ sendMessage: (content: MessageContent, options?: MessageSendOptions) => Promise, - /** Set the message as seen */ + /** Set the chat as seen */ sendSeen: () => Promise, /** Simulate recording audio in chat. This will last for 25 seconds */ sendStateRecording: () => Promise, @@ -1480,7 +1480,7 @@ declare namespace WAWebJS { /** un-archives this chat */ unarchive: () => Promise, /** Unmutes this chat */ - unmute: () => Promise, + unmute: () => Promise<{ isMuted: boolean, muteExpiration: number }>, /** Returns the Contact that corresponds to this Chat. */ getContact: () => Promise, /** Marks this Chat as unread */ diff --git a/src/Client.js b/src/Client.js index e6de355..223c48a 100644 --- a/src/Client.js +++ b/src/Client.js @@ -1193,25 +1193,38 @@ class Client extends EventEmitter { /** * Mutes this chat forever, unless a date is specified * @param {string} chatId ID of the chat that will be muted - * @param {?Date} unmuteDate Date when the chat will be unmuted, leave as is to mute forever + * @param {?Date} unmuteDate Date when the chat will be unmuted, don't provide a value to mute forever + * @returns {Promise<{isMuted: boolean, muteExpiration: number}>} */ async muteChat(chatId, unmuteDate) { - unmuteDate = unmuteDate ? unmuteDate.getTime() / 1000 : -1; - await this.pupPage.evaluate(async (chatId, timestamp) => { - let chat = await window.Store.Chat.get(chatId); - await chat.mute.mute({expiration: timestamp, sendDevice:!0}); - }, chatId, unmuteDate || -1); + unmuteDate = unmuteDate ? Math.floor(unmuteDate.getTime() / 1000) : -1; + return this._muteUnmuteChat(chatId, 'MUTE', unmuteDate); } /** * Unmutes the Chat * @param {string} chatId ID of the chat that will be unmuted + * @returns {Promise<{isMuted: boolean, muteExpiration: number}>} */ async unmuteChat(chatId) { - await this.pupPage.evaluate(async chatId => { - let chat = await window.Store.Chat.get(chatId); - await window.Store.Cmd.muteChat(chat, false); - }, chatId); + return this._muteUnmuteChat(chatId, 'UNMUTE'); + } + + /** + * Internal method to mute or unmute the chat + * @param {string} chatId ID of the chat that will be muted/unmuted + * @param {string} action The action: 'MUTE' or 'UNMUTE' + * @param {number} unmuteDateTs Timestamp at which the chat will be unmuted + * @returns {Promise<{isMuted: boolean, muteExpiration: number}>} + */ + async _muteUnmuteChat (chatId, action, unmuteDateTs) { + return this.pupPage.evaluate(async (chatId, action, unmuteDateTs) => { + const chat = window.Store.Chat.get(chatId) ?? await window.Store.Chat.find(chatId); + action === 'MUTE' + ? await chat.mute.mute({ expiration: unmuteDateTs, sendDevice: true }) + : await chat.mute.unmute({ sendDevice: true }); + return { isMuted: chat.mute.expiration !== 0, muteExpiration: chat.mute.expiration }; + }, chatId, action, unmuteDateTs || -1); } /** diff --git a/src/structures/Chat.js b/src/structures/Chat.js index 2dc4d5c..3fbff21 100644 --- a/src/structures/Chat.js +++ b/src/structures/Chat.js @@ -95,7 +95,7 @@ class Chat extends Base { } /** - * Set the message as seen + * Set the chat as seen * @returns {Promise} result */ async sendSeen() { @@ -154,17 +154,25 @@ class Chat extends Base { /** * Mutes this chat forever, unless a date is specified - * @param {?Date} unmuteDate Date at which the Chat will be unmuted, leave as is to mute forever + * @param {?Date} unmuteDate Date when the chat will be unmuted, don't provide a value to mute forever + * @returns {Promise<{isMuted: boolean, muteExpiration: number}>} */ async mute(unmuteDate) { - return this.client.muteChat(this.id._serialized, unmuteDate); + const result = await this.client.muteChat(this.id._serialized, unmuteDate); + this.isMuted = result.isMuted; + this.muteExpiration = result.muteExpiration; + return result; } /** * Unmutes this chat + * @returns {Promise<{isMuted: boolean, muteExpiration: number}>} */ async unmute() { - return this.client.unmuteChat(this.id._serialized); + const result = await this.client.unmuteChat(this.id._serialized); + this.isMuted = result.isMuted; + this.muteExpiration = result.muteExpiration; + return result; } /** diff --git a/src/util/Injected/Utils.js b/src/util/Injected/Utils.js index 8a9b349..b11d38d 100644 --- a/src/util/Injected/Utils.js +++ b/src/util/Injected/Utils.js @@ -461,7 +461,7 @@ exports.LoadUtils = () => { let res = chat.serialize(); res.isGroup = false; res.formattedTitle = chat.formattedTitle; - res.isMuted = chat.muteExpiration == 0 ? false : true; + res.isMuted = chat.mute?.expiration !== 0; if (chat.groupMetadata) { res.isGroup = true;