diff --git a/src/Socket/chats.ts b/src/Socket/chats.ts index 639ebd4d..85575693 100644 --- a/src/Socket/chats.ts +++ b/src/Socket/chats.ts @@ -54,6 +54,7 @@ import { } from '../WABinary' import { USyncQuery, USyncUser } from '../WAUSync' import { makeSocket } from './socket.js' +import { buildTcTokenFromJid } from '../Utils/tc-token-utils' const MAX_SYNC_ATTEMPTS = 2 export const makeChatsSocket = (config: SocketConfig) => { @@ -612,7 +613,10 @@ export const makeChatsSocket = (config: SocketConfig) => { * type = "image for the high res picture" */ const profilePictureUrl = async (jid: string, type: 'preview' | 'image' = 'preview', timeoutMs?: number) => { - // TOOD: Add support for tctoken, existingID, and newsletter + group options + const baseContent: BinaryNode[] = [{ tag: 'picture', attrs: { type, query: 'url' } }] + + const tcTokenContent = await buildTcTokenFromJid({ authState, jid, baseContent }) + jid = jidNormalizedUser(jid) const result = await query( { @@ -623,7 +627,7 @@ export const makeChatsSocket = (config: SocketConfig) => { type: 'get', xmlns: 'w:profile:picture' }, - content: [{ tag: 'picture', attrs: { type, query: 'url' } }] + content: tcTokenContent }, timeoutMs ) @@ -694,24 +698,19 @@ export const makeChatsSocket = (config: SocketConfig) => { * @param toJid the jid to subscribe to * @param tcToken token for subscription, use if present */ - const presenceSubscribe = (toJid: string, tcToken?: Buffer) => - sendNode({ + const presenceSubscribe = async (toJid: string) => { + const tcTokenContent = await buildTcTokenFromJid({ authState, jid: toJid }) + + return sendNode({ tag: 'presence', attrs: { to: toJid, id: generateMessageTag(), type: 'subscribe' }, - content: tcToken - ? [ - { - tag: 'tctoken', - attrs: {}, - content: tcToken - } - ] - : undefined + content: tcTokenContent }) + } const handlePresenceUpdate = ({ tag, attrs, content }: BinaryNode) => { let presence: PresenceData | undefined diff --git a/src/Utils/tc-token-utils.ts b/src/Utils/tc-token-utils.ts new file mode 100644 index 00000000..2d387e7c --- /dev/null +++ b/src/Utils/tc-token-utils.ts @@ -0,0 +1,34 @@ +import type { AuthenticationCreds, SignalKeyStoreWithTransaction } from '../Types' +import type { BinaryNode } from '../WABinary' + +type TcTokenParams = { + jid: string + baseContent?: BinaryNode[] + authState: { + keys: SignalKeyStoreWithTransaction + } +} + +export async function buildTcTokenFromJid({ + authState, + jid, + baseContent = [] +}: TcTokenParams): Promise { + try { + const tcTokenData = await authState.keys.get('tctoken', [jid]) + + const tcTokenBuffer = tcTokenData?.[jid]?.token + + if (!tcTokenBuffer) return baseContent.length > 0 ? baseContent : undefined + + baseContent.push({ + tag: 'tctoken', + attrs: {}, + content: tcTokenBuffer + }) + + return baseContent + } catch (error) { + return baseContent.length > 0 ? baseContent : undefined + } +}