Documentation Index
Fetch the complete documentation index at: https://zapo.to/llms.txt
Use this file to discover all available pages before exploring further.
Além de texto e mídia, o client.message.send aceita uma família de objetos de conteúdo interativo tipados. Cada um é discriminado pelo seu campo type.
Apontando para uma mensagem
Vários desses referenciam uma mensagem existente através de um WaSendMessageTarget:
interface WaSendMessageTarget {
stanzaId: string // o id da mensagem que você está mirando
fromMe: boolean // o alvo foi enviado por você?
participant?: string // obrigatório em grupos ao mirar a mensagem de outra pessoa
}
Você normalmente o constrói a partir de um evento recebido:
const target = {
stanzaId: event.stanzaId!,
fromMe: event.isSender ?? false,
participant: event.senderJid
}
Reações
await client.message.send(jid, {
type: 'reaction',
emoji: '👍',
target
})
Passe uma string vazia como emoji para remover uma reação anterior:
await client.message.send(jid, { type: 'reaction', emoji: '', target })
Enquetes
const result = await client.message.send(jid, {
type: 'poll',
name: 'Lunch?',
options: ['Pizza', 'Sushi', 'Salad'],
selectableCount: 1, // quantas opções um votante pode escolher
allowAddOption: false
})
As opções podem ser strings simples ou objetos { name }. A ordem importa — ela é usada no hashing dos votos.
Votando em uma enquete
Votar requer a identidade da enquete original e seu messageSecret (32 bytes do messageContextInfo.messageSecret da enquete):
await client.message.send(jid, {
type: 'poll-vote',
poll: {
stanzaId: pollStanzaId,
fromMe: false,
authorJid: pollAuthorJid,
messageSecret: pollMessageSecret, // Uint8Array, 32 bytes
participant: pollAuthorJid // obrigatório fora de conversas 1:1
},
selectedOptionNames: ['Pizza'] // exatamente como apareceram na enquete
})
Os votos recebidos chegam como eventos message_addon depois de descriptografados.
Editando uma mensagem
Para editar, envie o conteúdo novo e passe editKey nas opções. A original deve ser fromMe:
await client.message.send(jid, 'Corrected text', {
editKey: {
stanzaId: originalStanzaId,
// participant obrigatório em grupos para originais endereçadas via lid/pn
participant: undefined
}
})
O novo payload é empacotado em uma mensagem de protocolo MESSAGE_EDIT que mira o editKey.stanzaId.
Revogando (apagar para todos)
await client.message.send(jid, {
type: 'revoke',
stanzaId: targetStanzaId,
fromMe: true,
// participant obrigatório quando um admin revoga a mensagem de outra pessoa em um grupo
participant: undefined
})
Fixando
await client.message.send(jid, { type: 'pin', target }) // fixar
await client.message.send(jid, { type: 'unpin', target }) // desafixar
Manter no chat
Para chats com mensagens temporárias, mantenha (ou desfaça a manutenção de) uma mensagem específica:
await client.message.send(jid, { type: 'keep', target })
await client.message.send(jid, { type: 'unkeep', target })
Eventos
Crie uma mensagem de evento no estilo calendário:
await client.message.send(groupJid, {
type: 'event',
name: 'Team sync',
description: 'Weekly catch-up',
startTime: Math.floor(Date.now() / 1000) + 3600, // segundos unix
location: { latitude: -23.5, longitude: -46.6, name: 'HQ' },
joinLink: 'https://meet.example.com/abc',
hasReminder: true,
reminderOffsetSec: 600
})
Respondendo a um evento
await client.message.send(jid, {
type: 'event-response',
event: {
stanzaId: eventStanzaId,
fromMe: false,
authorJid: eventAuthorJid,
messageSecret: eventMessageSecret // 32 bytes
},
response: 'going' // 'going' | 'not_going' | 'maybe'
})
Ainda não existe um builder dedicado para localizações estáticas ou cartões de contato — envie-os como um Proto.IMessage bruto:
await client.message.send(jid, {
locationMessage: { degreesLatitude: -23.5, degreesLongitude: -46.6 }
})
await client.message.send(jid, {
contactMessage: { displayName: 'Jane', vcard: 'BEGIN:VCARD\n...\nEND:VCARD' }
})