> ## Documentation Index
> Fetch the complete documentation index at: https://zapo.to/llms.txt
> Use this file to discover all available pages before exploring further.

# Receitas

> Padrões prontos para copiar e colar das coisas mais comuns que você vai construir com o zapo — bots de comando, mídia, respostas e automação de grupo.

Padrões curtos e completos, construídos sobre a API real. Eles assumem que você já tem um `client` conectado — veja o [Quickstart](/pt-br/quickstart) para o setup.

<h2 id="extract-text">
  Extrair texto de qualquer mensagem
</h2>

O texto recebido pode chegar como um `conversation` simples ou um `extendedTextMessage` (quando tem reply/preview). Normalize os dois:

```ts theme={null}
function getText(message: { conversation?: string | null; extendedTextMessage?: { text?: string | null } | null } | null | undefined) {
  return message?.conversation ?? message?.extendedTextMessage?.text ?? undefined
}
```

<h2 id="command-router">
  Roteador de comandos
</h2>

Faça o parse de um `/comando` inicial e despache. Ignore suas próprias mensagens enviadas com `event.key.fromMe`:

```ts theme={null}
client.on('message', async (event) => {
  if (event.key.fromMe) return // ignora nossos próprios envios (echo multi-device)
  const text = getText(event.message)?.trim()
  const to = event.key.remoteJid
  if (!text || !text.startsWith('/') || !to) return

  const [command, ...args] = text.slice(1).split(/\s+/)
  switch (command) {
    case 'ping':
      await client.message.send(to, 'pong')
      break
    case 'echo':
      await client.message.send(to, args.join(' ') || '(nothing to echo)')
      break
    default:
      await client.message.send(to, `Unknown command: ${command}`)
  }
})
```

<h2 id="reply-quote-mention">
  Responder com citação e menção
</h2>

```ts theme={null}
client.on('message', async (event) => {
  if (event.key.fromMe) return
  const to = event.key.remoteJid
  const sender = event.key.participant ?? event.key.remoteJid

  await client.message.send(
    to,
    { type: 'text', text: 'got it 👍' },
    { quote: event, mentions: sender ? [sender] : [] }
  )
})
```

<h2 id="auto-download-media">
  Baixar mídia recebida automaticamente
</h2>

Faça stream direto para o disco — nunca bufferize arquivos grandes na memória:

```ts theme={null}
client.on('message', async (event) => {
  if (!event.message?.imageMessage) return
  const file = `./media/${Date.now()}.jpg`
  await client.message.downloadToFile(event, file)
  console.log('saved', file)
})
```

Veja [Mídia › Baixando mídia recebida](/pt-br/guides/media#downloading-incoming-media) para vídeo/áudio/documentos e `maxBytes`.

<h2 id="welcome-group-members">
  Dar boas-vindas a novos membros do grupo
</h2>

O evento `group` dispara em mudanças de participantes. Cumprimente todos que foram adicionados (`action: 'add'`) e mencione-os:

```ts theme={null}
client.on('group', async (event) => {
  if (event.action !== 'add' || !event.groupJid || !event.participants?.length) return

  const jids = event.participants.map((p) => p.jid).filter((j): j is string => Boolean(j))
  const mentions = jids.map((j) => `@${j.split('@')[0]}`).join(' ')

  await client.message.send(
    event.groupJid,
    { type: 'text', text: `Welcome ${mentions}! 🎉` },
    { mentions: jids }
  )
})
```

<h2 id="send-poll">
  Enviar uma enquete
</h2>

```ts theme={null}
await client.message.send(chatJid, {
  type: 'poll',
  name: 'Lunch?',
  options: ['Pizza', 'Sushi', 'Salad'],
  selectableCount: 1
})
```

<h2 id="react">
  Reagir a uma mensagem
</h2>

```ts theme={null}
client.on('message', async (event) => {
  if (event.key.fromMe) return
  // Passe o evento literalmente — sua key é lida para você.
  await client.message.send(event.key.remoteJid, {
    type: 'reaction',
    emoji: '❤️',
    target: event
  })
})
```

<h2 id="keep-alive">
  Manter o bot vivo entre quedas
</h2>

O `zapo` não reconecta sozinho — ligue o evento `connection` a um loop de backoff. O padrão completo (incluindo quando **não** reconectar) está em [Reconexão](/pt-br/guides/reconnection) e [Erros & desconexões](/pt-br/guides/errors).

<Note>
  Todo snippet usa a [union de conteúdo](/pt-br/guides/sending-messages#the-content-union) — os mesmos formatos que `client.message.send` aceita em todo lugar. Veja [Enviando mensagens](/pt-br/guides/sending-messages) e a [referência de tipos de mensagem](/pt-br/reference/message-types) para o conjunto completo.
</Note>
