diff --git a/src/WAConnection/4.Events.ts b/src/WAConnection/4.Events.ts index 5504e74..634ea16 100644 --- a/src/WAConnection/4.Events.ts +++ b/src/WAConnection/4.Events.ts @@ -374,6 +374,11 @@ export class WAConnection extends Base { this.emit ('chat-new', chat) return chat } + protected contactAddOrGet (jid: string) { + jid = whatsappID(jid) + if (!this.contacts[jid]) this.contacts[jid] = { jid } + return this.contacts[jid] + } /** find a chat or return an error */ protected assertChatGet = jid => { const chat = this.chats.get (jid) @@ -501,18 +506,18 @@ export class WAConnection extends Base { if (meta) { switch (action) { case 'add': - participants.forEach(id => ( - meta.participants.push({ id, isAdmin: false, isSuperAdmin: false }) + participants.forEach(jid => ( + meta.participants.push({ ...this.contactAddOrGet(jid), isAdmin: false, isSuperAdmin: false }) )) break case 'remove': - meta.participants = meta.participants.filter(p => !participants.includes(whatsappID(p.id))) + meta.participants = meta.participants.filter(p => !participants.includes(p.jid)) break case 'promote': case 'demote': const isAdmin = action==='promote' meta.participants.forEach(p => { - if (participants.includes(whatsappID(p.id))) p.isAdmin = isAdmin + if (participants.includes( p.jid )) p.isAdmin = isAdmin }) break } diff --git a/src/WAConnection/8.Groups.ts b/src/WAConnection/8.Groups.ts index 2cf77b1..324a3c6 100644 --- a/src/WAConnection/8.Groups.ts +++ b/src/WAConnection/8.Groups.ts @@ -1,7 +1,7 @@ import {WAConnection as Base} from './7.MessagesExtra' import { WAMetric, WAFlag, WANode, WAGroupMetadata, WAGroupCreateResponse, WAGroupModification, BaileysError } from '../WAConnection/Constants' import { GroupSettingChange } from './Constants' -import { generateMessageID } from '../WAConnection/Utils' +import { generateMessageID, whatsappID } from '../WAConnection/Utils' import { Mutex } from './Mutex' export class WAConnection extends Base { @@ -41,7 +41,13 @@ export class WAConnection extends Base { return metadata } /** Get the metadata of the group from WA */ - fetchGroupMetadataFromWA = (jid: string) => this.query({json: ['query', 'GroupMetadata', jid], expect200: true}) as Promise + fetchGroupMetadataFromWA = async (jid: string) => { + const metadata = await this.query({json: ['query', 'GroupMetadata', jid], expect200: true}) + metadata.participants = metadata.participants.map(p => ( + { ...this.contactAddOrGet(p.id), ...p } + )) + return metadata as WAGroupMetadata + } /** Get the metadata (works after you've left the group also) */ groupMetadataMinimal = async (jid: string) => { const query = ['query', {type: 'group', jid: jid, epoch: this.msgCount.toString()}, null] @@ -56,8 +62,10 @@ export class WAConnection extends Base { creator: creatorDesc?.creator, creation: parseInt(creatorDesc?.create), subject: null, - desc: description ? description[2].toString('utf-8') : null, - participants: participants.map (item => ({ id: item[1].jid, isAdmin: item[1].type==='admin' })) + desc: description && description[2].toString('utf-8'), + participants: participants.map (item => ( + { ...this.contactAddOrGet(item[1].jid), isAdmin: item[1].type === 'admin' } + )) } as WAGroupMetadata } /** diff --git a/src/WAConnection/Constants.ts b/src/WAConnection/Constants.ts index fdee690..485339c 100644 --- a/src/WAConnection/Constants.ts +++ b/src/WAConnection/Constants.ts @@ -168,6 +168,7 @@ export interface WAGroupCreateResponse { gid?: string participants?: [{ [key: string]: any }] } +export type WAGroupParticipant = (WAContact & { isAdmin: boolean; isSuperAdmin: boolean }) export interface WAGroupMetadata { id: string owner: string @@ -180,7 +181,8 @@ export interface WAGroupMetadata { restrict?: 'true' | 'false' /** is set when the group only allows admins to write messages */ announce?: 'true' | 'false' - participants: { id: string; isAdmin: boolean; isSuperAdmin: boolean }[] + // Baileys modified array + participants: WAGroupParticipant[] } export interface WAGroupModification { status: number