Skip to content

Releases: jpereira/zapbot

ZapBot 2.0.9

Choose a tag to compare

@jpereira jpereira released this 14 Oct 17:39
443c6de

👀 Monitor de contatos

  • /monitor e /monitor -l mostram os contatos e o histórico de visto por último observado.
  • /monitor -add ou -a cadastra por nome, /Nome do Contato/, menção ou telefone.
  • /monitor -rem ou -r remove por id da lista ou pelo mesmo resolvedor do cadastro.
    /monitor -rem all limpa todos os cadastros e históricos locais.
  • Até cinco contatos (monitor.max=5), com intervalo mínimo de cinco minutos por pessoa
    (monitor.pool=300). Consultas em ordem aleatória, sem repetição, com espera de 1 a 15 segundos
    entre contatos; pausas e remoções são conferidas após a espera.
  • Histórico persistente, limitado a 30 entradas por pessoa (monitor.maxRecords=30). Reduzir
    o limite remove os horários mais antigos excedentes. monitor.enabled=false pausa sem apagar.
  • Dados podem vir do cache: os horários exibidos não são confirmados nem cobrem todos os acessos.
    Nenhum intervalo ou distribuição das consultas garante proteção contra bloqueio pelo WhatsApp.
  • Documentação com exemplos, configurações, operação, persistência e risco de bloqueio.
/monitor -a /Jorge Chip L200/
/monitor -l
/set monitor.pool=300
/set monitor.maxRecords=30
/monitor -r #1
/monitor -rem all

/get: fecha o SSRF (rede interna já não é alcançável)

  • A checagem de URL recusava endereços internos (localhost, 10.x, 192.168.x, 169.254.x...),
    mas resolvia o DNS uma vez e aprovava o host — o yt-dlp (e a prévia de link) resolvia de novo e
    seguia redirects por conta própria. Um host com DNS rebinding, ou um redirect 30x para um
    endereço interno, atravessava essa janela e alcançava a rede do servidor.
  • A prévia de link passa a ser baixada com o IP fixado (pin) no endereço já verificado e cada
    redirect revalidado — rebinding e redirect fechados no lado do Node. A checagem também recusa
    respostas de DNS mistas (um endereço público e um interno).
  • Como o yt-dlp faz a própria rede, a defesa de raiz é um firewall de egresso no container
    (ZAPBOT_EGRESS_FIREWALL=1, com NET_ADMIN): bloqueia todo acesso às faixas internas a partir do
    bot, cobrindo qualquer processo filho. Fecha também o SSRF via /set defi.*.rpc e news.*.

Comandos: adeus aos atalhos de uma letra

  • Como o comando já é completado pelo começo do nome (/watc → /watch), os atalhos curtos
    /u, /up, /w, /ver, /tr, /t, /st, /s, /p, /m, /enq, /c e /b viraram
    redundância e saíram.
  • Os atalhos que ainda desambiguam continuam: /mudo, /weather, /quiz, /translate e os demais.

ZapBot 2.0.8

Choose a tag to compare

@jpereira jpereira released this 14 Oct 02:12

Comandos: basta digitar o começo do nome

  • /wat ou /watc viram /watch: se só um comando começa com o que foi digitado, ele roda, com os
    argumentos e tudo (/watc -h mostra a ajuda do /watch).
  • Se o começo servir para mais de um, o bot responde com os possíveis comandos (/wa →
    /walissu, /watch), só com os que a pessoa pode usar.
  • O nome exato e os atalhos do /alias continuam tendo prioridade. O /e agora é o /enquete.

/get e /sticker: -ss e -es aceitam minutos

  • Além de segundos (-ss 22 -es 26), dá para marcar o trecho em min:seg (-ss 09:33 -es 09:45) ou
    até h:min:seg (-ss 1:02:03). Minutos e segundos depois do : vão de 0 a 59.
  • Vale no /get e no /sticker, no -ss e no -es. Por dentro continua tudo em segundos.

/get e /sticker: baixa só o trecho pedido, não o vídeo inteiro

  • De um link, com -ss, -es ou -st, o yt-dlp baixa apenas o trecho (--download-sections,
    cortado no tempo exato com --force-keyframes-at-cuts) em vez do vídeo todo. Pegar 10 s de um vídeo
    de uma hora passa a baixar só esses 10 s.
  • A figurinha baixa no máximo 6 s. Se o site não deixar baixar o trecho, o bot baixa o vídeo inteiro
    e o ffmpeg corta, como antes.
  • O log mostra o tamanho do que foi baixado (o trecho ou o vídeo inteiro).

/watch, /show -q e /set: recusa regex que trava o bot (ReDoS)

  • Uma regex como /(x+)+y/ testada contra uma mensagem faz backtracking exponencial e congelava a
    única thread do bot (heartbeat, reconexão e todos os comandos). Como o texto testado é o corpo de
    qualquer mensagem recebida, nem era preciso ser admin para disparar: bastava uma mensagem feita de
    propósito contra uma regra já existente.
  • Agora esse tipo de regex (quantificador sobre um grupo que já se repete) é recusado na criação, e o
    texto testado é truncado como defesa extra. Regras normais continuam funcionando igual.

ZapBot 2.0.7

Choose a tag to compare

@jpereira jpereira released this 13 Oct 17:00

Reações removidas ou trocadas (/show -r)

  • Quando alguém remove uma reação, ou troca por outra, o bot avisa no seu privado
    (😶 REAÇÃO REMOVIDA DETECTADA ou 🔄 REAÇÃO TROCADA DETECTADA), com a reação de antes, a nova
    (se trocou) e o texto da mensagem reagida. As suas reações e as dos canais ficam de fora.
  • /show -r reexibe, e as reações entram no /show -l, no -q, no -f e no /show <chat>.
  • /mute -r silencia só os avisos de reações; o -a passa a incluí-las, e quem já estava com tudo
    em silêncio ganha as reações junto.
  • Settings novos: show.alert.reaction (o aviso, ligado por padrão) e
    cache.reactionRetentionDays (30 dias). O /bot -status, o /cache e a limpeza contam com elas.

/block (/bloquear) e /unblock

  • /block bloqueia uma ou várias pessoas na sua conta do WhatsApp, pelo nome, número ou @menção
    (/block +5521999999999 /Ciclano Souza/ @Fulano), com um resumo só; respondendo uma mensagem,
    bloqueia quem a escreveu. Sem nada (ou -l), lista os bloqueados, inclusive os do celular.
  • A lista converte o id interno (@lid) de cada bloqueado para o telefone e usa o nome da agenda.
  • /unblock desbloqueia uma pessoa, o nº da lista ou todos (-all), com o "⏳ Desbloqueando…" que
    vira o resultado.
  • O bot confere na lista do WhatsApp depois de bloquear e de desbloquear: só conta o que mudou de
    verdade, e o erro de uma pessoa não derruba as outras.
  • -mask (-m) ofusca os telefones.

/search (/buscar)

  • Busca no histórico do WhatsApp Web, inclusive o que nunca passou pelo cache do bot (o /show -q
    busca só no cache). Neste chat; no seu privado, em todos os chats. 10 resultados por padrão, até
    50 com -N; -mask ofusca os telefones.

/get e /sticker

  • A figurinha do /get -st (e do /sticker de vídeo) sai direto em webp animado, reduzindo
    qualidade e fps até caber nos 500 KB do WhatsApp. Antes, o whatsapp-web.js convertia o vídeo de
    novo, sem limite, e o WhatsApp recusava o envio (o erro aparecia só como "t").
  • O aviso passa a ser "⏳ Processando…".

Removido

  • /monitor: escutava um evento que o whatsapp-web.js não emite, então nunca avisava. Saem o
    comando, o setting monitor.max e a documentação.

Dependências

  • dotenv 18.0.7 e nodemailer 10.0.16.

Documentação e validação

Páginas novas do /block, do /unblock e do /search, e as do /show, do /mute, do /unmute e
dos settings revisadas. Validação local: lint, 693 testes e geração da documentação em modo estrito.

ZapBot 2.0.6

Choose a tag to compare

@jpereira jpereira released this 13 Oct 03:03

/get e /sticker unificados

  • O /sticker agora é o /get -sticker: aceita a URL como argumento e o -ss, o -es e o -v.
    /sticker -ss 10 -es 13 respondendo um link ou um vídeo faz a figurinha desse trecho; sem -es,
    pega os 6 s seguintes.
  • Link ou URL: o /sticker baixa o vídeo com o yt-dlp. Se o link não tiver vídeo (uma matéria, um
    post de foto), a figurinha sai da prévia do link, como antes.
  • Vídeo respondido com /sticker: passa pelo ffmpeg, com o recorte quadrado no meio e no máximo
    6 s (antes ia inteiro, sem recorte).
  • /get respondendo um vídeo, uma imagem ou um áudio do WhatsApp usa a própria mídia: sem opção,
    devolve o arquivo original como documento; com -a, -st, -ss ou -es, converte pelo ffmpeg.
    Ex.: /get -a respondendo um vídeo devolve só o áudio, em .mp3.
  • A URL digitada vale mais que a mensagem respondida, e na respondida a mídia vale mais que um link
    na legenda.
  • Opção desconhecida é recusada com a dica do -h, em vez de virar a URL.
  • O -txt do /sticker não combina mais com -ss, -es, -v nem URL antes dele (antes, essas
    opções eram ignoradas em silêncio).

Menos mensagens

  • O "💡 Processando…" do /get e do /sticker vira "✅ Sticker criado com sucesso!" (ou "✅ Mídia
    baixada com sucesso!") no fim, ou a mensagem de erro, em vez de o bot mandar uma mensagem a mais.
  • A lista "🔎 … responda o nº" (contatos e grupos, /show e /stats) e a pergunta do
    /bot -reset, sem resposta no prazo, viram o aviso "⌛ …" no lugar.
  • Essas edições são do próprio bot e não entram no cache como mensagem editada.

/show, /watch e /mute

  • /show -l aceita o chat (nº da lista, nome, @menção ou /regex/) e lista só os que casam.
  • /watch -s, -rem e -flush aceitam a própria regra no lugar do nº (/watch -s /Jorge/), e o
    -q filtra os matches pelo texto da mensagem.
  • O -q do /show e do /watch aceita /regex/flags, como /show -5 -q /pix|boleto/i.
  • O /watch respeita o /mute: quem está silenciado não gera aviso no seu privado (os destinos
    -to das regras continuam recebendo).
  • As mensagens de erro e as dicas desses comandos quebram em linhas, com a dica em 💡 embaixo.

DeFi

  • /defi -taxas: num resumo só, a faixa, o preço e as taxas a coletar de cada posição da Orca e do
    Project X, com o total em dólar. Com -alerta, quanto falta para o limite de cada alerta. Vale no
    /cron.

Segurança

  • A miniatura externa da prévia de um link passa pelo anti-SSRF do /get antes de ser baixada.

Desenvolvimento

  • make Q= <alvo> (ou make V=1 <alvo>) mostra os comandos executados pelos alvos do Makefile;
    por padrão eles ficam ocultos.
  • Correção do Docker de desenvolvimento e do teste instável do /show -l <chat>.

Documentação e validação

Documentação do /get, do /sticker, do /show, do /watch, do /mute e dos settings revisada.
Validação local: lint, 670 testes e geração da documentação em modo estrito.

ZapBot 2.0.5

Choose a tag to compare

@jpereira jpereira released this 07 Oct 18:37

Comandos no texto

  • /alias aceita um texto com vários {/comando}, como no /cron: cada um roda na hora e a
    resposta entra no lugar, numa mensagem só.
    Ex.: /alias nome2 Verificando Orca {/defi orca}\n Verificando Prjx {/defi prjx}.
  • O \n digitado vira quebra de linha no /alias de texto e no texto do /cron, ao criar e no
    -edit.
  • No alias de texto, os comandos rodam com as permissões de quem chama, e o /help alias só lista
    os aliases em que a pessoa pode usar todos os comandos.

DeFi

  • /defi liquidswap (ou liqswp): posições de LP da Liquidswap na
    Aptos, nas versões v0 e v0.5, cadastradas pela carteira (-wallet). Mostra a fatia da pool, o
    saldo de cada token, o preço (pela curva, nas pools estáveis) e o TVL.
  • As posições são achadas pelo indexador da Aptos, inclusive as já migradas para fungible asset.
    A chave da API (APTOS_API_KEY ou defi.aptos.apikey) é opcional.
  • A ajuda de um protocolo aceita o apelido dele: /defi liqswp -help.

Correções

  • O exemplo decimal do -ss do /get passa a ser 1.5: o 2.5 seria trocado pelo bump.sh.
  • As mensagens do /defi usam o artigo de cada protocolo ("da Liquidswap", "do Project X").

Documentação e validação

O README e a página inicial ganharam a lista das principais funções, com links para a
documentação de cada comando. Documentação do /alias, do /cron e do /defi revisada.
Validação local: lint, 647 testes e geração da documentação em modo estrito.

ZapBot 2.0.4

Choose a tag to compare

@jpereira jpereira released this 06 Oct 19:16

Atalhos para comandos

  • /alias cadastra atalhos persistentes, com argumentos e descrição opcional.
  • A descrição aceita aspas retas e curvas, inclusive misturadas.
  • /alias, -list e -l listam os cadastros; /help alias mostra os atalhos disponíveis.
  • -rm e -rem removem um atalho; all remove todos e é um nome reservado.
  • Cada execução mostra 🔗 Alias /nome -> /comando argumentos antes do resultado.
  • Argumentos, opções, mensagens respondidas e permissões do destino são preservados.

Correções

  • Localizações deixam de interpretar a miniatura em base64 como comando ou texto do /watch.
    A mensagem e suas coordenadas continuam guardadas no cache.
  • /mute ao responder a um aviso identifica o grupo de origem pelo cabeçalho quando necessário.
  • O contexto Docker inclui o script que aplica os patches durante a instalação das dependências.

Dependências

  • Atualiza dotenv para 18.0.5 e nodemailer para 10.0.14.
  • Atualiza ESLint para 10.12.0 e suas regras recomendadas para 10.0.1.
  • Preserva a causa original dos erros e mantém os detalhes na resposta dos comandos.

Documentação e validação

Documentação, exemplos, site e ajuda dos comandos revisados.
Validação local: lint, 634 testes e geração da documentação em modo estrito.

ZapBot 2.0.3

Choose a tag to compare

@jpereira jpereira released this 06 Oct 16:24

Comandos e operação

  • /watch: regras de texto ou regex, origem em contato, grupo ou canal com -in,
    histórico de ocorrências e identificação de canais com 📰.
  • /show: listagem completa do cache no privado, busca por chat ou texto e identificação de
    canais.
  • /show, /watch e /bot: -mask para ofuscar telefones na saída.
  • /debug: níveis DEBUG0–DEBUG3, parser com argumentos e destinos completos, filtro com destaque
    no console e cópia para chats. Os logs de inicialização aparecem sem filtro.
  • /backup: envio do backup diário pelo destino configurado em backup.to, além da cópia local.
  • /defi: posições da Orca, Project X, Morpho e Aave V3; máscaras de valores e endereços,
    mantendo visíveis as taxas a coletar.
  • /tempo: previsão de até 16 dias, contando hoje.
  • /get: cortes de vídeo e áudio com início e fim em segundos, inclusive decimais.
  • /cache: árvore de arquivos e pastas com tamanhos, totais e contagens de mensagens e backups.
  • PHONE_NUMBER: número com DDI e DDD, em dígitos; formatação extra é removida com aviso no
    log.
  • Permissões por usuário e grupo, comandos comuns e orientação para comandos desconhecidos.
  • Makefile com testes, verificações e operações Docker locais ou remotas por DOCK_REMOTE.
  • Documentação, site e ajudas com exemplos, tabelas, limites e permissões revisados.

Segurança e validação

O alerta Dependabot #36 é resolvido
pela remoção de braces e da cadeia do patch-package. Os patches locais são aplicados pelo
Git,
com verificação de compatibilidade e reaplicação segura.

Instalação limpa validada. Lint, 616 testes e build estrito da documentação passaram.
O bump.sh valida as mensagens de commit em arquivo, com até 100 colunas, e preserva tags
existentes.

Limitação conhecida

A auditoria npm aponta dois avisos de extract-zip, sem versão corrigida publicada:
GHSA-jmr9-qjv8-65gv e
GHSA-7pqw-9j4j-h8q3.
Eles aparecem em cinco pacotes da cadeia do Puppeteer. A imagem usa o Chromium do Debian
com o download do Puppeteer desativado.

ZapBot 2.0.1

Choose a tag to compare

@jpereira jpereira released this 02 Oct 04:06

📖 Documentação: jpereira.github.io/zapbot

⚠️ Antes de atualizar

  • /cron 6h agora é 06:00, não "daqui a 6 horas". Horas sozinhas (6h, 07h, 18h) viraram horário. Para "daqui a tanto tempo", use +2h, em 2h ou daqui a 2h. 30m, 1d e 1h30m continuam sendo duração. Itens criados na 2.0.0 com 6h (como duração) continuam no horário em que foram agendados: confira com /cron -l.
  • Settings renomeados: resumo.maxMsgs virou tldr.maxMsgs, show.revoke.status virou show.alert.status e show.alert.edit virou show.alert.edited. O valor salvo é levado sozinho, assim como os dos settings renomeados na 2.0.0 (edit.alert, revoke.status, stats.enabled e gif.giphy.api.key), que a 2.0.0 tinha deixado no padrão.

Novidades

Comandos e opções

  • /pixelart (/ansi, /px): arte ANSI/ASCII aleatória do 16colo.rs, com título, artista e grupo do registro SAUCE.
  • /cron: -edit <nº> troca a hora, o texto ou a repetição de um item; -pause/-resume <nº|all> seguram e soltam; vários -to (um item por destino); -lem é atalho do -lembrete.
  • /show -q <texto>: busca nas apagadas (ou nas editadas, com -e), sem diferenciar maiúsculas nem acentos. No seu privado, em todos os chats.
  • /watch -to: cada regra pode avisar noutro chat ou por e-mail (/watch -a pix -to /Grupo/, /watch -2 -to email, -to off).
  • Admins extras (setting bot.admins): outras pessoas que usam os comandos admin, inclusive no modo admin. Só o dono altera: /set -a bot.admins /Jorge Pereira/, @Fulano ou +5521999999999.
  • show.alert.deleted (padrão on): com off, as apagadas continuam guardadas para o /show, sem o aviso no privado (como o show.alert.edited faz com as editadas).
  • /bot -status: com o aviso de apagadas, editadas ou status desligado, a linha diz como ligar (✏️ Editadas: 4 (aviso desligado; ligue com /set show.alert.edited on)).
  • /set -append (-a) e -rem: acrescentam e tiram itens de uma lista sem reescrevê-la. Numa chave que não é lista, o bot sugere o -reset.

Destinos (-to, /mudo, bot.admins)

  • Menção com @: num grupo, escolha a pessoa na lista do @ do WhatsApp (-to @Fulano Da Silva, /m -a @Fulano). Serve para quem não está na sua agenda.
  • A busca por nome não trava mais o bot. Antes ela consultava os servidores do WhatsApp para cada grupo, e as mensagens seguintes ficavam numa fila. Agora ela lê direto da memória do WhatsApp Web.
  • O mesmo contato não aparece mais duas vezes na lista de escolha (pelo telefone e pelo LID), e contatos voltam a ser achados pelo nome.

Versão com o commit e a tag

  • /version, /uptime, /bot -info, o início do boot, a mensagem de inicialização, os e-mails e os backups mostram de onde vem o código: 2.0.1 (git+8ea3681/v2.0.1) numa release, (git+<commit>/HEAD) fora dela. Lido do .git, que vai para a imagem a cada build (sem passo extra).

Correções

  • O bump.sh trocava "2.0.0" por "2.0.1" também no código: a URL da API do NVD (/cve) e o JSON-RPC da Solana (/defi). Agora ele só mexe no README, no docs/ e no package.json, e os testes conferem esses dois valores.
  • O -to email funciona com o QRCODE_EMAIL_SMTP_TO no formato Nome <e-mail>.

Por dentro

  • 426 testes automatizados (npm test), sem rede nem WhatsApp.
  • bump.sh com o ciclo de versão: ./bump.sh abre a próxima (commit Bump para X.Y, sem tag) e ./bump.sh -r a fecha (commit Release X.Y com a tag vX.Y.Z). A versão estável do README e da instalação só muda no -r, então quem instala segue na última release enquanto a próxima está em desenvolvimento. Ele grava as tags no packed-refs (para a imagem saber o commit da tag) e só troca a versão no README e no docs/.
  • Documentação revisada, com exemplos das formas de destino (/Jorge Pereira/, @Fulano Da Silva, +5521999999999) em todos os comandos.

Atualizando

git fetch --tags
git checkout v2.0.1
docker compose -f docker/docker-compose.yml build zapbot
docker compose -f docker/docker-compose.yml up -d --force-recreate --remove-orphans zapbot

Changelog completo: v2.0.0...v2.0.1

ZapBot 2.0.0

Choose a tag to compare

@jpereira jpereira released this 01 Oct 21:51

📖 Documentação: jpereira.github.io/zapbot (atualizada nesta release, com logo novo).

⚠️ Antes de atualizar

  • /agendar virou /cron, com os aliases /agenda e /lembrete. O /agendar e o /lemb deixaram de existir.
  • /status virou /bot -status (atalho -s): /bot -s 06h liga o envio diário e /bot -s off desliga. O horário do envio aparece no fim do relatório.
  • /resumo virou /tldr: o /resumo continua como alias.
  • O -to não aceita mais @número nem menções com @. Use o número com DDI (+5521999999999), o nome de um contato (/Jorge Pereira/) ou de um grupo (/Grupo L200/).
  • O alias /m saiu do /monitor e foi para o /mudo.
  • Se o setting commands.disabled tiver /status ou /agendar, o bot ignora o /status (agora é /bot -status) e troca o /agendar pelo /cron, mantendo os outros comandos desativados.
  • Settings renomeados, sem migração. Se você tinha mudado algum destes, ajuste de novo com /set:
    • edit.alert → show.alert.edit
    • revoke.status → show.revoke.status
    • stats.enabled → stats.enable
    • gif.giphy.api.key → giphy.api.key
  • /gif virou /giphy (o /gif continua como alias), as opções -del (-d) do /watch e do /monitor viraram -rem (-r), e o alias /undo do /show foi removido.

Novidades

Comandos novos

  • /cron (/agenda, /lembrete): mensagem na hora marcada (30m, às 18h, sexta 9h, 25/12 10:00...), no chat atual ou no do -to, ou um ⏰ lembrete (/lembrete, -lembrete, no seu privado com -pv). Repete com -repetir (-r) diario|semanal|mensal.
  • /mudo (/m, /mute): silencia os avisos de apagadas, editadas e/ou status de uma pessoa ou de um grupo. A mensagem continua guardada para o /show.
  • /tldr (/resumo): resume a conversa do chat pelo ChatGPT (2h, 300, -c <chat>, -pv).
  • /backup (/bkp): backup diário do banco, com lista, detalhes, restauração (com -sim) e envio do arquivo.
  • /defi: posições de liquidez da Orca (Solana), com o "Position Details" lido on-chain. O -alerta avisa sempre que a posição sai da faixa.
  • /traduzir (/tr, /translate): tradução pelo Google Cloud Translation.
  • /bot -status (-s): relatório das últimas 24 h (no ar, cache, /watch, apagadas, editadas, status, /mudo, backup), com envio diário no horário escolhido.
  • /bot -info (-i): versões do ZapBot, Node.js, whatsapp-web.js, WhatsApp Web, SQLite, Chromium, yt-dlp e ffmpeg, e o sistema (uname -a, CPU, memória, uptime).
  • /enquete -r: placar com os votos de cada opção.

Destino único: -to

  • O -to vale em todo comando que envia para outro lugar: /cron, alertas do /cotacao e do /crypto, /defi -alerta e /backup -send. O alvo do /mudo usa a mesma busca.
  • A busca é por nome: primeiro um contato da sua agenda, depois um grupo, ou um número (+DDI...). Se mais de um servir, o bot lista e você responde só com o nº (até 2 minutos).
  • E-mail como destino (-to email, que usa o QRCODE_EMAIL_SMTP_TO, ou um endereço): vale nos alertas e no /backup -send. O /backup -send para outro chat pede -sim, porque o banco tem as mensagens de todos os chats.

Melhorias

  • /t é alias do /tempo.
  • /set filtra por trecho ou /regex/ (ex.: /set alerta) e mostra as variáveis do config/.env, somente leitura e só no seu privado.
  • /cache -backup (-b) apaga os backups; o -all apaga tudo.
  • /joke usa uma lista própria de piadas em português (a JokeAPI só tinha uma).
  • /watch -l e -s respondem no chat onde foram digitados.
  • bump.sh aceita a versão (./bump.sh 2.0.0), e make docs sobe o site da documentação local.
  • Logo novo: um robô anjo e uma cara de demônio espiando do lado.
  • O README e o site contam a origem do projeto: inspirado nas antigas eggdrops do IRC.

Correções

  • O parser de opções descartava o 1º argumento começando com /.
  • As suas mensagens no privado ficavam gravadas com o outro participante como remetente (agora com from_me).
  • No privado, as suas mensagens eram gravadas com o seu nome como nome do chat (afetava o /stats, o /show -l e o /tldr -c). Agora é o nome do outro participante.
  • O log dos comandos mostrava 'undefined' used ... no privado de outra pessoa. Agora mostra quem executou e onde: [+] 'Jorge' executed '/help' in 'Erick'.
  • O -to email aceita o QRCODE_EMAIL_SMTP_TO no formato Nome <e-mail>, o mesmo dos exemplos da documentação.

Por dentro

  • 391 testes automatizados (npm test), sem rede nem WhatsApp.
  • A documentação foi revisada inteira, com uma seção sobre os destinos do -to.
  • O TODO.txt ganhou as próximas ideias.

Atualizando

git fetch --tags
git checkout v2.0.0
docker compose -f docker/docker-compose.yml build zapbot
docker compose -f docker/docker-compose.yml up -d --force-recreate --remove-orphans zapbot

Changelog completo: v1.8.0...v2.0.0

ZapBot 1.8.0

Choose a tag to compare

@jpereira jpereira released this 01 Oct 00:20

📖 Documentação nova: jpereira.github.io/zapbot, publicada a cada release.

⚠️ Antes de atualizar

  • O modo admin vem ligado por padrão (setting bot.adminMode): em instalações novas, só você usa comandos até /bot -admin. Em bots já rodando, vale o valor salvo.
  • /cache: o -force (-f) virou -all (-a), e o -media (-m) é novo: apaga só as mídias salvas.
  • O config/ não vai mais para dentro da imagem Docker: o Compose passa o config/.env ao container pelo env_file. Nada muda para quem usa o docker compose, mas a imagem deixa de carregar senhas e chaves.
  • O alias /moedinha do /crypto foi removido.

Novidades

Comandos novos

  • Mensagens editadas: o bot guarda o texto de antes e o de depois e avisa no seu privado quando alguém edita (setting edit.alert); /show -e reexibe as editadas, e o novo -d (o padrão) as apagadas.
  • /stats: ranking do chat (quem mais fala, apaga e edita, horários e dia de pico); /stats -me mostra as suas estatísticas em todos os chats.
  • /cotacao (/cambio): EUR e USDT (e USD, GBP) contra o real, com abertura, fechamento anterior, máx./mín. e variação. -l, -a e -d escolhem as moedas.
  • /enquete (/enq, /quiz): enquete nativa do WhatsApp; -m permite várias respostas.
  • /version (/ver) e o alias /up do /uptime.
  • /ualisu agora se chama /walissu (o /ualisu continua funcionando como alias).
  • /everyone agora se chama /todos (alias /todes).
  • Aliases /list do /listageral e /config do /set.

Melhorias

  • Alertas de preço: /cotacao -alerta USD > 5.30 e /crypto -alerta BTC < 90000 avisam no seu privado quando o preço passa do valor.
  • /tempo 7d Niteroi (ou /tempo 7): previsão dos próximos N dias, com máx./mín., chance de chuva e condição; o máximo vem do setting tempo.maxDays (padrão 7, até 16).
  • /gpt -m: lista e troca o modelo da OpenAI (setting openai.api.model, padrão gpt-4o-mini), entre os modelos de chat aceitos (GPT-6, GPT-5.x e GPT-4).
  • /show -l lista as apagadas e as editadas de todos os chats, marcando o chat atual; /show -c funciona em qualquer chat (com -e, nas editadas).
  • Alertas por e-mail de crash, queda, reconexão, falha de autenticação e docker stop, pelo SMTP do QR Code (setting email.alerts).
  • Heartbeat e HEALTHCHECK: o container fica unhealthy se o bot travar com o processo vivo, e o bot reinicia o cliente quando o WhatsApp para de responder.
  • /cache -m apaga só as mídias (fotos, vídeos e áudios salvos), mantendo as mensagens; /cache -a apaga tudo.
  • A ajuda (-h) mostra o caminho real das pastas no lugar de ${CACHE_DIR} e afins, e os textos de ajuda de vários comandos foram revistos.
  • /set e /help em ordem alfabética.
  • make deploy.destroy remove do servidor todos os containers (mesmo rodando), as imagens do projeto (inclusive as de builds e nomes antigos) e os volumes.

Correções

  • /crypto -a e -d sem moeda mostravam as cotações em vez da sintaxe.
  • O /stats somava as suas mensagens no privado para o outro participante.
  • O aviso antes de sair (docker stop) deixava um timer de 10 s pendurado.

Por dentro

  • O app.js (~5.500 linhas) foi dividido em módulos em src/; a definição dos comandos saiu de config/bot-config.json para src/comandos/comandos.json.
  • 285 testes automatizados (npm test), sem rede nem WhatsApp.
  • CI no GitHub (workflow Testes): ESLint, testes e a documentação em modo estrito a cada push e pull request, com o selo no README e no site.
  • ESLint no projeto (npm run lint).
  • ZAPBOT_CACHE_DIR troca o diretório do cache.
  • README enxuto; a documentação completa foi para o site, com logo novo, e foi revisada inteira. O SECURITY.md foi reescrito.
  • Sobras de outro projeto removidas do .dockerignore e do package.json; o TODO.txt ganhou as próximas ideias.

Atualizando

git fetch --tags
git checkout v1.8.0
docker compose -f docker/docker-compose.yml build zapbot
docker compose -f docker/docker-compose.yml up -d --force-recreate --remove-orphans zapbot

Changelog completo: v1.7.0...v1.8.0