From a8f4e14412973e26c405b7950446fd1dd4478b54 Mon Sep 17 00:00:00 2001 From: Adhiraj Singh Date: Fri, 19 Mar 2021 21:18:21 +0530 Subject: [PATCH] Disappearing messages fix - Fixes crash issue on groups - Fixes (i) on group chats when disappearing messages is on --- src/WAConnection/4.Events.ts | 14 ++++++++++++-- src/WAConnection/6.MessagesSend.ts | 26 ++++++++++++++++++-------- src/WAConnection/7.MessagesExtra.ts | 2 -- src/WAConnection/Constants.ts | 1 + 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/WAConnection/4.Events.ts b/src/WAConnection/4.Events.ts index 9c13806..a41bcf0 100644 --- a/src/WAConnection/4.Events.ts +++ b/src/WAConnection/4.Events.ts @@ -254,8 +254,6 @@ export class WAConnection extends Base { if (chat.messages.upsert(message).length) { const chatUpdate: Partial = { jid, messages: newMessagesDB([ message ]) } this.emit ('chat-update', chatUpdate) - // emit deprecated - this.emit ('message-update', message) } } else { this.logger.debug ({ unhandled: true }, 'received message update for non-present message from ' + jid) @@ -578,6 +576,18 @@ export class WAConnection extends Base { const emitGroupUpdate = (update: Partial) => this.emitGroupUpdate(jid, update) switch (message.messageStubType) { + case WA_MESSAGE_STUB_TYPE.CHANGE_EPHEMERAL_SETTING: + chatUpdate.eph_setting_ts = message.messageTimestamp.toString() + chatUpdate.ephemeral = message.messageStubParameters[0] + + if (+chatUpdate.ephemeral) { + chat.eph_setting_ts = chatUpdate.eph_setting_ts + chat.ephemeral = chatUpdate.ephemeral + } else { + delete chat.eph_setting_ts + delete chat.ephemeral + } + break case WA_MESSAGE_STUB_TYPE.GROUP_PARTICIPANT_LEAVE: case WA_MESSAGE_STUB_TYPE.GROUP_PARTICIPANT_REMOVE: participants = message.messageStubParameters.map (whatsappID) diff --git a/src/WAConnection/6.MessagesSend.ts b/src/WAConnection/6.MessagesSend.ts index 0782846..f4e7c9a 100644 --- a/src/WAConnection/6.MessagesSend.ts +++ b/src/WAConnection/6.MessagesSend.ts @@ -12,7 +12,7 @@ import { WATextMessage, WAMessageContent, WAMetric, WAFlag, WAMessage, BaileysError, WA_MESSAGE_STATUS_TYPE, WAMessageProto, MediaConnInfo, MessageTypeProto, URL_REGEX, WAUrlInfo, WA_DEFAULT_EPHEMERAL, WAMediaUpload } from './Constants' -import { generateMessageID, extensionForMediaMessage, whatsappID, unixTimestampSeconds, getAudioDuration, newMessagesDB, encryptedStream, decryptMediaMessageBuffer, generateThumbnail } from './Utils' +import { isGroupID, generateMessageID, extensionForMediaMessage, whatsappID, unixTimestampSeconds, getAudioDuration, newMessagesDB, encryptedStream, decryptMediaMessageBuffer, generateThumbnail } from './Utils' import { Mutex } from './Mutex' import { Readable } from 'stream' @@ -57,13 +57,23 @@ export class WAConnection extends Base { * For the default see WA_DEFAULT_EPHEMERAL */ async toggleDisappearingMessages(jid: string, ephemeralExpiration?: number, opts: { waitForAck: boolean } = { waitForAck: true }) { - const message = this.prepareMessageFromContent( - jid, - this.prepareDisappearingMessageSettingContent(ephemeralExpiration), - {} - ) - await this.relayWAMessage(message, opts) - return message + if(isGroupID(jid)) { + const tag = this.generateMessageTag(true) + await this.setQuery([ + [ + 'group', + { id: tag, jid, tyoe: 'prop', author: this.user.jid }, + [ [ 'ephemeral', { value: ephemeralExpiration.toString() }, null ] ] + ] + ], [WAMetric.group, WAFlag.other], tag) + } else { + const message = this.prepareMessageFromContent( + jid, + this.prepareDisappearingMessageSettingContent(ephemeralExpiration), + {} + ) + await this.relayWAMessage(message, opts) + } } /** Prepares the message content */ async prepareMessageContent (message: string | WATextMessage | WALocationMessage | WAContactMessage | WAContactsArrayMessage | WAMediaUpload, type: MessageType, options: MessageOptions) { diff --git a/src/WAConnection/7.MessagesExtra.ts b/src/WAConnection/7.MessagesExtra.ts index a1197a3..879172c 100644 --- a/src/WAConnection/7.MessagesExtra.ts +++ b/src/WAConnection/7.MessagesExtra.ts @@ -317,8 +317,6 @@ export class WAConnection extends Base { const chatUpdate: Partial = { jid: messageKey.remoteJid, messages: newMessagesDB([ message ]) } this.emit ('chat-update', chatUpdate) - // emit deprecated - this.emit ('message-update', message) } } return result diff --git a/src/WAConnection/Constants.ts b/src/WAConnection/Constants.ts index eec4fc8..6675ca5 100644 --- a/src/WAConnection/Constants.ts +++ b/src/WAConnection/Constants.ts @@ -273,6 +273,7 @@ export const STORIES_JID = 'status@broadcast' export enum WAFlag { available = 160, + other = 136, // don't know this one ignore = 1 << 7, acknowledge = 1 << 6, unavailable = 1 << 4,