Repository navigation
Releases: jpereira/zapbot
Release list
ZapBot 2.0.9
👀 Monitor de contatos
/monitore/monitor -lmostram os contatos e o histórico de visto por último observado./monitor -addou-acadastra por nome,/Nome do Contato/, menção ou telefone./monitor -remou-rremove por id da lista ou pelo mesmo resolvedor do cadastro.
/monitor -rem alllimpa 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=falsepausa 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 redirect30xpara 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, comNET_ADMIN): bloqueia todo acesso às faixas internas a partir do
bot, cobrindo qualquer processo filho. Fecha também o SSRF via/set defi.*.rpcenews.*.
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,/ce/bviraram
redundância e saíram. - Os atalhos que ainda desambiguam continuam:
/mudo,/weather,/quiz,/translatee os demais.
ZapBot 2.0.8
Comandos: basta digitar o começo do nome
/watou/watcviram/watch: se só um comando começa com o que foi digitado, ele roda, com os
argumentos e tudo (/watc -hmostra 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
/aliascontinuam tendo prioridade. O/eagora é o/enquete.
/get e /sticker: -ss e -es aceitam minutos
- Além de segundos (
-ss 22 -es 26), dá para marcar o trecho emmin: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
/gete no/sticker, no-sse 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,-esou-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
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 DETECTADAou🔄 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 -rreexibe, e as reações entram no/show -l, no-q, no-fe no/show <chat>./mute -rsilencia só os avisos de reações; o-apassa 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/cachee a limpeza contam com elas.
/block (/bloquear) e /unblock
/blockbloqueia 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. /unblockdesbloqueia 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;-maskofusca os telefones.
/get e /sticker
- A figurinha do
/get -st(e do/stickerde 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 settingmonitor.maxe 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
/get e /sticker unificados
- O
/stickeragora é o/get -sticker: aceita a URL como argumento e o-ss, o-ese o-v.
/sticker -ss 10 -es 13respondendo um link ou um vídeo faz a figurinha desse trecho; sem-es,
pega os 6 s seguintes. - Link ou URL: o
/stickerbaixa 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). /getrespondendo 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,-ssou-es, converte pelo ffmpeg.
Ex.:/get -arespondendo 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
-txtdo/stickernão combina mais com-ss,-es,-vnem URL antes dele (antes, essas
opções eram ignoradas em silêncio).
Menos mensagens
- O "💡 Processando…" do
/gete do/stickervira "✅ 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,
/showe/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 -laceita o chat (nº da lista, nome, @menção ou/regex/) e lista só os que casam./watch -s,-reme-flushaceitam a própria regra no lugar do nº (/watch -s /Jorge/), e o
-qfiltra os matches pelo texto da mensagem.- O
-qdo/showe do/watchaceita/regex/flags, como/show -5 -q /pix|boleto/i. - O
/watchrespeita o/mute: quem está silenciado não gera aviso no seu privado (os destinos
-todas 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
/getantes de ser baixada.
Desenvolvimento
make Q= <alvo>(oumake V=1 <alvo>) mostra os comandos executados pelos alvos doMakefile;
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
Comandos no texto
/aliasaceita 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
\ndigitado vira quebra de linha no/aliasde 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 aliassó lista
os aliases em que a pessoa pode usar todos os comandos.
DeFi
/defi liquidswap(ouliqswp): 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_KEYoudefi.aptos.apikey) é opcional. - A ajuda de um protocolo aceita o apelido dele:
/defi liqswp -help.
Correções
- O exemplo decimal do
-ssdo/getpassa a ser1.5: o2.5seria trocado pelobump.sh. - As mensagens do
/defiusam 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
Atalhos para comandos
/aliascadastra atalhos persistentes, com argumentos e descrição opcional.- A descrição aceita aspas retas e curvas, inclusive misturadas.
/alias,-liste-llistam os cadastros;/help aliasmostra os atalhos disponíveis.-rme-remremovem um atalho;allremove todos e é um nome reservado.- Cada execução mostra
🔗 Alias /nome -> /comando argumentosantes 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. /muteao 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
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,/watche/bot:-maskpara 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 embackup.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
📖 Documentação: jpereira.github.io/zapbot
⚠️ Antes de atualizar
/cron 6hagora é 06:00, não "daqui a 6 horas". Horas sozinhas (6h,07h,18h) viraram horário. Para "daqui a tanto tempo", use+2h,em 2houdaqui a 2h.30m,1de1h30mcontinuam sendo duração. Itens criados na 2.0.0 com6h(como duração) continuam no horário em que foram agendados: confira com/cron -l.- Settings renomeados:
resumo.maxMsgsviroutldr.maxMsgs,show.revoke.statusviroushow.alert.statuseshow.alert.editviroushow.alert.edited. O valor salvo é levado sozinho, assim como os dos settings renomeados na 2.0.0 (edit.alert,revoke.status,stats.enabledegif.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/,@Fulanoou+5521999999999. show.alert.deleted(padrãoon): comoff, as apagadas continuam guardadas para o/show, sem o aviso no privado (como oshow.alert.editedfaz 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.shtrocava "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, nodocs/e nopackage.json, e os testes conferem esses dois valores. - O
-to emailfunciona com oQRCODE_EMAIL_SMTP_TOno formatoNome <e-mail>.
Por dentro
- 426 testes automatizados (
npm test), sem rede nem WhatsApp. bump.shcom o ciclo de versão:./bump.shabre a próxima (commitBump para X.Y, sem tag) e./bump.sh -ra fecha (commitRelease X.Ycom a tagvX.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 nopacked-refs(para a imagem saber o commit da tag) e só troca a versão no README e nodocs/.- 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 zapbotChangelog completo: v2.0.0...v2.0.1
ZapBot 2.0.0
📖 Documentação: jpereira.github.io/zapbot (atualizada nesta release, com logo novo).
⚠️ Antes de atualizar
/agendarvirou/cron, com os aliases/agendae/lembrete. O/agendare o/lembdeixaram de existir./statusvirou/bot -status(atalho-s):/bot -s 06hliga o envio diário e/bot -s offdesliga. O horário do envio aparece no fim do relatório./resumovirou/tldr: o/resumocontinua como alias.- O
-tonão aceita mais@númeronem 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
/msaiu do/monitore foi para o/mudo. - Se o setting
commands.disabledtiver/statusou/agendar, o bot ignora o/status(agora é/bot -status) e troca o/agendarpelo/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.editrevoke.status→show.revoke.statusstats.enabled→stats.enablegif.giphy.api.key→giphy.api.key
/gifvirou/giphy(o/gifcontinua como alias), as opções-del(-d) do/watche do/monitorviraram-rem(-r), e o alias/undodo/showfoi 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-alertaavisa 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
-tovale em todo comando que envia para outro lugar:/cron, alertas do/cotacaoe do/crypto,/defi -alertae/backup -send. O alvo do/mudousa 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 oQRCODE_EMAIL_SMTP_TO, ou um endereço): vale nos alertas e no/backup -send. O/backup -sendpara outro chat pede-sim, porque o banco tem as mensagens de todos os chats.
Melhorias
/té alias do/tempo./setfiltra por trecho ou/regex/(ex.:/set alerta) e mostra as variáveis doconfig/.env, somente leitura e só no seu privado./cache -backup(-b) apaga os backups; o-allapaga tudo./jokeusa uma lista própria de piadas em português (a JokeAPI só tinha uma)./watch -le-srespondem no chat onde foram digitados.bump.shaceita a versão (./bump.sh 2.0.0), emake docssobe 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 -le 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 emailaceita oQRCODE_EMAIL_SMTP_TOno formatoNome <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.txtganhou 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 zapbotChangelog completo: v1.8.0...v2.0.0
ZapBot 1.8.0
📖 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 oconfig/.envao container peloenv_file. Nada muda para quem usa odocker compose, mas a imagem deixa de carregar senhas e chaves. - O alias
/moedinhado/cryptofoi 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 -ereexibe 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 -memostra 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,-ae-descolhem as moedas./enquete(/enq,/quiz): enquete nativa do WhatsApp;-mpermite várias respostas./version(/ver) e o alias/updo/uptime./ualisuagora se chama/walissu(o/ualisucontinua funcionando como alias)./everyoneagora se chama/todos(alias/todes).- Aliases
/listdo/listagerale/configdo/set.
Melhorias
- Alertas de preço:
/cotacao -alerta USD > 5.30e/crypto -alerta BTC < 90000avisam 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 settingtempo.maxDays(padrão 7, até 16)./gpt -m: lista e troca o modelo da OpenAI (settingopenai.api.model, padrãogpt-4o-mini), entre os modelos de chat aceitos (GPT-6, GPT-5.x e GPT-4)./show -llista as apagadas e as editadas de todos os chats, marcando o chat atual;/show -cfunciona 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 (settingemail.alerts). - Heartbeat e HEALTHCHECK: o container fica
unhealthyse o bot travar com o processo vivo, e o bot reinicia o cliente quando o WhatsApp para de responder. /cache -mapaga só as mídias (fotos, vídeos e áudios salvos), mantendo as mensagens;/cache -aapaga 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. /sete/helpem ordem alfabética.make deploy.destroyremove do servidor todos os containers (mesmo rodando), as imagens do projeto (inclusive as de builds e nomes antigos) e os volumes.
Correções
/crypto -ae-dsem moeda mostravam as cotações em vez da sintaxe.- O
/statssomava 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 emsrc/; a definição dos comandos saiu deconfig/bot-config.jsonparasrc/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_DIRtroca o diretório do cache.- README enxuto; a documentação completa foi para o site, com logo novo, e foi revisada inteira. O
SECURITY.mdfoi reescrito. - Sobras de outro projeto removidas do
.dockerignoree dopackage.json; oTODO.txtganhou 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 zapbotChangelog completo: v1.7.0...v1.8.0