feat: add inbound username support and USync username protocol (#382)
* feat: add inbound username support and USync username protocol Aligns with Baileys upstream PR #2480. WhatsApp is rolling out an inbound username field that maps to the user's LID. This change is purely additive — it captures and propagates the new optional field through types, decoders, USync queries, and group/contact events. Skipped intentionally to preserve InfiniteAPI's LID/PN customization: - handleGroupNotification in messages-recv.ts (custom LID->PN flow on groups.upsert / participants.map). Username for these specific events still flows via process-message's emitParticipantsUpdate (reads message.key.participantUsername added in decode-wa-message). Carousel/buttons code (messages.ts, messages-send.ts) untouched. Co-Authored-By: Renato Alcara
This commit is contained in:
@@ -343,11 +343,13 @@ export const extractGroupMetadata = (result: BinaryNode) => {
|
||||
let descId: string | undefined
|
||||
let descOwner: string | undefined
|
||||
let descOwnerPn: string | undefined
|
||||
let descOwnerUsername: string | undefined
|
||||
let descTime: number | undefined
|
||||
if (descChild) {
|
||||
desc = getBinaryNodeChildString(descChild, 'body')
|
||||
descOwner = descChild.attrs.participant ? jidNormalizedUser(descChild.attrs.participant) : undefined
|
||||
descOwnerPn = descChild.attrs.participant_pn ? jidNormalizedUser(descChild.attrs.participant_pn) : undefined
|
||||
descOwnerUsername = descChild.attrs.participant_username || undefined
|
||||
descTime = +descChild.attrs.t!
|
||||
descId = descChild.attrs.id
|
||||
}
|
||||
@@ -362,16 +364,19 @@ export const extractGroupMetadata = (result: BinaryNode) => {
|
||||
subject: group.attrs.subject!,
|
||||
subjectOwner: group.attrs.s_o,
|
||||
subjectOwnerPn: group.attrs.s_o_pn,
|
||||
subjectOwnerUsername: group.attrs.s_o_username,
|
||||
subjectTime: +(group.attrs.s_t ?? '0'),
|
||||
size: group.attrs.size ? +group.attrs.size : getBinaryNodeChildren(group, 'participant').length,
|
||||
creation: +(group.attrs.creation ?? '0'),
|
||||
owner: group.attrs.creator ? jidNormalizedUser(group.attrs.creator) : undefined,
|
||||
ownerPn: group.attrs.creator_pn ? jidNormalizedUser(group.attrs.creator_pn) : undefined,
|
||||
ownerUsername: group.attrs.creator_username || undefined,
|
||||
owner_country_code: group.attrs.creator_country_code,
|
||||
desc,
|
||||
descId,
|
||||
descOwner,
|
||||
descOwnerPn,
|
||||
descOwnerUsername,
|
||||
descTime,
|
||||
linkedParent: getBinaryNodeChild(group, 'linked_parent')?.attrs.jid || undefined,
|
||||
restrict: !!getBinaryNodeChild(group, 'locked'),
|
||||
@@ -386,6 +391,7 @@ export const extractGroupMetadata = (result: BinaryNode) => {
|
||||
id: attrs.jid!,
|
||||
phoneNumber: isLidUser(attrs.jid) && isPnUser(attrs.phone_number) ? attrs.phone_number : undefined,
|
||||
lid: isPnUser(attrs.jid) && isLidUser(attrs.lid) ? attrs.lid : undefined,
|
||||
username: attrs.participant_username || attrs.username || undefined,
|
||||
admin: (attrs.type || null) as GroupParticipant['admin']
|
||||
}
|
||||
}),
|
||||
|
||||
@@ -2223,6 +2223,7 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
||||
fromMe,
|
||||
participant: node.attrs.participant,
|
||||
participantAlt,
|
||||
participantUsername: node.attrs.participant_username,
|
||||
addressingMode,
|
||||
id: node.attrs.id,
|
||||
...(msg.key || {})
|
||||
@@ -2231,6 +2232,10 @@ export const makeMessagesRecvSocket = (config: SocketConfig) => {
|
||||
msg.messageTimestamp = +node.attrs.t!
|
||||
|
||||
const fullMsg = proto.WebMessageInfo.fromObject(msg) as WAMessage
|
||||
// Preserve custom WAMessageKey fields (participantAlt, participantUsername,
|
||||
// addressingMode) that proto.WebMessageInfo.fromObject strips because
|
||||
// they aren't part of the proto.MessageKey schema.
|
||||
fullMsg.key = msg.key
|
||||
await upsertMessage(fullMsg, 'append')
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user