From 3b87d74f04b6023cf928453a296a9ed28ba903d8 Mon Sep 17 00:00:00 2001 From: Codeboss <131376628+codebossdev@users.noreply.github.com> Date: Sun, 28 Apr 2024 13:44:53 +0300 Subject: [PATCH] Fix pfp change notification (#323) * Crash if chat is already deleted * Crash if chat is already deleted (#321) (#322) * Update messages-recv.ts * Update make-in-memory-store.ts * Update messages-recv.ts * Update make-in-memory-store.ts * Fix store errors * Fix hash issue * Fix eslint * Update messages-recv.ts * Update messages-recv.ts * ESLint final * no more eslint errors! --- src/Socket/messages-recv.ts | 4 ++-- src/Store/make-in-memory-store.ts | 29 ++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/Socket/messages-recv.ts b/src/Socket/messages-recv.ts index 60ae7a1dc1c..e90cbb174ed 100644 --- a/src/Socket/messages-recv.ts +++ b/src/Socket/messages-recv.ts @@ -378,8 +378,8 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => { const delPicture = getBinaryNodeChild(node, 'delete') ev.emit('contacts.update', [{ - id: from, - imgUrl: setPicture ? 'changed' : null + id: jidNormalizedUser(node?.attrs?.jid) || ((setPicture || delPicture)?.attrs?.hash) || '', + imgUrl: setPicture ? 'changed' : 'removed' }]) if(isJidGroup(from)) { diff --git a/src/Store/make-in-memory-store.ts b/src/Store/make-in-memory-store.ts index 7fdd444a42e..96dc749c482 100644 --- a/src/Store/make-in-memory-store.ts +++ b/src/Store/make-in-memory-store.ts @@ -7,7 +7,7 @@ import type makeMDSocket from '../Socket' import type { BaileysEventEmitter, Chat, ConnectionState, Contact, GroupMetadata, PresenceData, WAMessage, WAMessageCursor, WAMessageKey } from '../Types' import { Label } from '../Types/Label' import { LabelAssociation, LabelAssociationType, MessageLabelAssociation } from '../Types/LabelAssociation' -import { toNumber, updateMessageWithReaction, updateMessageWithReceipt } from '../Utils' +import { md5, toNumber, updateMessageWithReaction, updateMessageWithReceipt } from '../Utils' import { jidNormalizedUser } from '../WABinary' import makeOrderedDictionary from './make-ordered-dictionary' import { ObjectRepository } from './object-repository' @@ -30,6 +30,7 @@ export type BaileysInMemoryStoreConfig = { chatKey?: Comparable labelAssociationKey?: Comparable logger?: Logger + socket?: WASocket } const makeMessagesDictionary = () => makeOrderedDictionary(waMessageID) @@ -73,7 +74,7 @@ const predefinedLabels = Object.freeze>({ }) export default ( - { logger: _logger, chatKey, labelAssociationKey }: BaileysInMemoryStoreConfig + { logger: _logger, chatKey, labelAssociationKey, socket }: BaileysInMemoryStoreConfig ) => { // const logger = _logger || DEFAULT_CONNECTION_CONFIG.logger.child({ stream: 'in-mem-store' }) chatKey = chatKey || waChatKey(true) @@ -167,13 +168,31 @@ export default ( contactsUpsert(contacts) }) - ev.on('contacts.update', updates => { + ev.on('contacts.update', async updates => { for(const update of updates) { + let contact: Contact if(contacts[update.id!]) { - Object.assign(contacts[update.id!], update) + contact = contacts[update.id!] } else { - logger.debug({ update }, 'got update for non-existant contact') + const contactHashes = await Promise.all(Object.keys(contacts).map(async a => { + return (await md5(Buffer.from(a + 'WA_ADD_NOTIF', 'utf8'))).toString('base64').slice(0, 3) + })) + contact = contacts[contactHashes.find(a => a === update.id) || ''] } + + if(update.imgUrl === 'changed' || update.imgUrl === 'removed') { + if(contact) { + if(update.imgUrl === 'changed') { + contact.imgUrl = socket ? await socket?.profilePictureUrl(contact.id) : undefined + } else { + delete contact.imgUrl + } + } else { + return logger.debug({ update }, 'got update for non-existant contact') + } + } + + Object.assign(contacts[update.id!], contact) } }) ev.on('chats.upsert', newChats => {