@kaikybrofc/omnizap-system 2.3.2 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,522 +1,119 @@
1
1
  <img width="1318" height="352" alt="OmniZap banner" src="https://github.com/user-attachments/assets/d44835e7-021a-4c67-a0e7-5b858d51eb91" />
2
2
 
3
- ![Node.js](https://img.shields.io/badge/Node.js-18%2B-3C873A?logo=node.js&logoColor=white)
4
- ![JavaScript](https://img.shields.io/badge/JavaScript-ES2022-F7DF1E?logo=javascript&logoColor=000)
5
- ![MySQL](https://img.shields.io/badge/MySQL-8%2B-4479A1?logo=mysql&logoColor=white)
6
- ![Baileys](https://img.shields.io/badge/Baileys-WhatsApp%20SDK-25D366?logo=whatsapp&logoColor=white)
7
- ![PM2](https://img.shields.io/badge/PM2-Process%20Manager-2B037A?logo=pm2&logoColor=white)
8
- ![OpenAI](https://img.shields.io/badge/OpenAI-SDK-111111?logo=openai&logoColor=white)
9
- ![License](https://img.shields.io/badge/License-MIT-0B6E4F?logo=opensourceinitiative&logoColor=white)
3
+ # OmniZap System
10
4
 
11
- O **OmniZap System** é uma plataforma de automação para WhatsApp usando **Node.js + Baileys**, com foco em:
5
+ Plataforma de automacao para WhatsApp com foco em figurinhas, packs, catalogo web e comandos inteligentes.
12
6
 
13
- - comando por chat (grupos e privado)
14
- - persistência em MySQL
15
- - automações administrativas
16
- - mídia/figurinhas com packs persistentes
17
- - observabilidade (Prometheus/Grafana/Loki)
7
+ ## Links oficiais
18
8
 
19
- **Versão atual:** `2.1.3`
20
-
21
- ## Links oficiais do projeto
22
-
23
- - Site principal: https://omnizap.shop/
24
- - Catálogo web de stickers: https://omnizap.shop/stickers/
9
+ - Site: https://omnizap.shop/
10
+ - Login web: https://omnizap.shop/login/
11
+ - Painel do usuario: https://omnizap.shop/user/
12
+ - Catalogo de figurinhas: https://omnizap.shop/stickers/
25
13
  - API Docs: https://omnizap.shop/api-docs/
26
14
  - Termos de uso: https://omnizap.shop/termos-de-uso/
27
- - Licença: https://omnizap.shop/licenca/
15
+ - Licenca: https://omnizap.shop/licenca/
16
+
17
+ ## Como comecar (usuario final)
18
+
19
+ 1. Abra o WhatsApp e envie `iniciar` para o bot.
20
+ 2. Use o link seguro recebido para abrir o login web.
21
+ 3. Faça login com Google para vincular sua conta.
22
+ 4. Volte para o WhatsApp e use os comandos de figurinha e pack.
23
+ 5. Acesse o painel em `https://omnizap.shop/user/` para gerenciar seus packs.
24
+
25
+ ## Experiencia OmniZap
26
+
27
+ - Login seguro com Google e vinculacao ao numero do WhatsApp.
28
+ - Sessao web compartilhada entre as paginas (login unico).
29
+ - Criacao de packs com capa, descricao, tags e visibilidade.
30
+ - Catalogo publico com busca por packs e figurinhas.
31
+ - Comandos rapidos para transformar imagem/video/texto em sticker.
32
+
33
+ ## Comandos mais usados no WhatsApp
34
+
35
+ O prefixo pode variar no seu grupo. Nos exemplos abaixo, foi usado `/`.
36
+
37
+ - `/s` ou `/sticker`: cria figurinha da midia respondida.
38
+ - `/st`, `/stw`, `/stb`: sticker de texto (normal, branco, blink).
39
+ - `/toimg`: converte figurinha para imagem.
40
+ - `/pack create "Meu Pack"`: cria um novo pack.
41
+ - `/pack add <pack>`: adiciona a ultima figurinha no pack.
42
+ - `/pack list`: lista seus packs.
43
+ - `/pack send <pack>`: envia figurinhas de um pack.
44
+ - `/pack publish <pack> <public|private|unlisted>`: define visibilidade.
45
+ - `/user perfil`: mostra dados e resumo do usuario.
28
46
 
29
- ## Snapshot dinâmico para README/NPM
47
+ ## Fluxo rapido de packs
30
48
 
31
- Use as rotas abaixo para consumir o bloco renderizado com dados do sistema:
49
+ 1. Crie o pack com `/pack create "Nome do Pack"`.
50
+ 2. Gere figurinhas com `/s` e adicione com `/pack add <pack>`.
51
+ 3. Confira com `/pack list`.
52
+ 4. Publique com `/pack publish <pack> public`.
53
+ 5. Veja no catalogo web em `https://omnizap.shop/stickers/`.
32
54
 
33
- - JSON: `GET /api/sticker-packs/readme-summary`
34
- - Markdown: `GET /api/sticker-packs/readme-markdown`
55
+ ## Paginas web principais
35
56
 
36
- Para atualizar este `README.md` automaticamente com o conteúdo renderizado:
57
+ - `/login/`: autenticacao e vinculacao da conta.
58
+ - `/user/`: painel com perfil, estatisticas e seus packs.
59
+ - `/stickers/`: busca de packs publicados e visualizacao das figurinhas.
37
60
 
38
- ```bash
39
- npm run readme:sync-snapshot
40
- ```
61
+ ## Nao estou vendo meu pack. E agora?
41
62
 
42
- Conteúdo incluído no snapshot:
63
+ - Confirme se o pack foi publicado com visibilidade correta.
64
+ - Rode `/pack list` para validar se o pack esta na sua conta.
65
+ - No painel `/user/`, verifique se voce esta logado com o mesmo Google usado no WhatsApp.
66
+ - Se estiver em outra conta/sessao antiga, saia e faça login novamente.
43
67
 
44
- - total de usuários (`lid_map`)
45
- - total de grupos
46
- - total de packs e stickers
47
- - total de mensagens registradas
48
- - tipos de mensagem mais usados
49
- - lista de comandos disponíveis no menu
68
+ ## Boas praticas
50
69
 
51
- Atualização em cache: **30 minutos** por padrão (`README_SUMMARY_CACHE_SECONDS=1800`).
70
+ - Nao compartilhe o link de login recebido no WhatsApp.
71
+ - Use apenas o dominio oficial `omnizap.shop`.
72
+ - Revise os termos antes de publicar conteudo publico.
73
+
74
+ ## Snapshot dinamico do sistema
75
+
76
+ Este bloco pode ser atualizado automaticamente pela API (`/api/sticker-packs/readme-markdown`).
52
77
 
53
78
  <!-- README_SNAPSHOT:START -->
54
79
 
55
80
  ### Snapshot do Sistema
56
81
 
57
- > Atualizado em `2026-03-01T00:19:39.897Z` | cache `1800s`
82
+ > Atualizado em `2026-03-01T02:48:19.346Z` | cache `1800s`
58
83
 
59
- | Métrica | Valor |
84
+ | Metrica | Valor |
60
85
  | --------------------- | ------: |
61
- | Usuários (lid_map) | 5.516 |
86
+ | Usuarios (lid_map) | 5.516 |
62
87
  | Grupos | 116 |
63
88
  | Packs | 307 |
64
- | Stickers | 7.216 |
65
- | Mensagens registradas | 445.538 |
89
+ | Stickers | 7.245 |
90
+ | Mensagens registradas | 446.542 |
66
91
 
67
92
  #### Tipos de mensagem mais usados (amostra: 25.000)
68
93
 
69
94
  | Tipo | Total |
70
95
  | ----------- | -----: |
71
- | `texto` | 15.762 |
72
- | `figurinha` | 4.789 |
73
- | `reacao` | 1.663 |
74
- | `imagem` | 1.421 |
75
- | `outros` | 940 |
76
- | `video` | 221 |
77
- | `audio` | 197 |
96
+ | `texto` | 15.772 |
97
+ | `figurinha` | 4.775 |
98
+ | `reacao` | 1.652 |
99
+ | `imagem` | 1.386 |
100
+ | `outros` | 1.000 |
101
+ | `video` | 225 |
102
+ | `audio` | 183 |
78
103
  | `documento` | 7 |
79
104
 
80
- <details><summary>Comandos disponíveis (62)</summary>
105
+ <details><summary>Comandos disponiveis (62)</summary>
81
106
 
82
107
  `/add` · `/addmode` · `/autorequests` · `/autosticker` · `/ban` · `/captcha` · `/cat` · `/catimg` · `/catprompt` · `/catprompt reset` · `/dado` · `/down` · `/farewell` · `/groups` · `/info` · `/invite` · `/join` · `/leave` · `/menu anime` · `/menu figurinhas` · `/menu ia` · `/menu midia` · `/menu quote` · `/menu stats` · `/menuadm` · `/metadata` · `/newgroup` · `/noticias` · `/nsfw` · `/pack add` · `/pack create` · `/pack list` · `/pack send` · `/ping` · `/play` · `/playvid` · `/prefix` · `/premium` · `/quote` · `/ranking` · `/rankingglobal` · `/requests` · `/revoke` · `/s` · `/semmsg` · `/setdesc` · `/setgroup` · `/setsubject` · `/st` · `/stb` · `/sticker` · `/stickertext` · `/stickertextblink` · `/stickertextwhite` · `/stw` · `/temp` · `/tiktok` · `/toimg` · `/up` · `/updaterequests` · `/user perfil` · `/welcome`
83
108
 
84
109
  </details>
85
110
  <!-- README_SNAPSHOT:END -->
86
111
 
87
- ## Recursos principais
88
-
89
- - Gerenciamento de grupos (admin, boas-vindas, despedida, anti-link, captcha).
90
- - Prefixo de comando por grupo.
91
- - Comandos de mídia (`play`, `playvid`, stickers e conversões).
92
- - Sticker packs persistentes com CRUD e envio com fallback.
93
- - Recursos de IA (`cat`, `catimg`, `catprompt`) com OpenAI.
94
- - Estatísticas (`ranking`, `rankingglobal`, `semmsg`, `user perfil`).
95
- - Suporte a LID/JID com reconciliação automática (`lid_map`).
96
- - Métricas e logs estruturados para operação em produção.
97
-
98
- ## Pré-requisitos
99
-
100
- - Node.js 18+ recomendado.
101
- - MySQL 8+.
102
- - FFmpeg instalado e acessível no `PATH`.
103
- - PM2 (opcional): `npm i -g pm2`.
104
- - Docker Compose (opcional, para stack de observabilidade).
105
-
106
- ## Instalação rápida
107
-
108
- 1. Clone o repositório:
109
-
110
- ```bash
111
- git clone https://github.com/Kaikygr/omnizap-system.git
112
- cd omnizap-system
113
- ```
114
-
115
- 2. Instale dependências:
116
-
117
- ```bash
118
- npm install
119
- ```
120
-
121
- 3. Crie o `.env` a partir do exemplo:
122
-
123
- ```bash
124
- cp .env.example .env
125
- ```
126
-
127
- 4. Ajuste as variáveis mínimas obrigatórias no `.env` (o restante já vem com defaults no `.env.example`):
128
-
129
- ```env
130
- DB_HOST=localhost
131
- DB_USER=seu_usuario
132
- DB_PASSWORD=sua_senha
133
- DB_NAME=omnizap
134
- USER_ADMIN=seu_jid@s.whatsapp.net
135
- IMAGE_MENU=https://example.com/menu.png
136
- ```
137
-
138
- Para recursos de IA (`cat`, `catimg`, `catprompt`), configure também:
139
-
140
- ```env
141
- OPENAI_API_KEY=sua_chave
142
- ```
143
-
144
- 5. Inicialize banco e tabelas:
145
-
146
- ```bash
147
- npm run db:init
148
- ```
149
-
150
- 6. Inicie o bot:
151
-
152
- ```bash
153
- npm run start
154
- ```
155
-
156
- 7. Escaneie o QR Code no terminal.
157
-
158
- ## Observações importantes de ambiente
159
-
160
- - `DB_NAME` recebe sufixo automaticamente:
161
- - `NODE_ENV=development` => `_dev`
162
- - `NODE_ENV=production` => `_prod`
163
- - Se já terminar com `_dev` ou `_prod`, o nome é preservado.
164
- - `COMMAND_PREFIX` pode ser global e também por grupo (via comandos admin).
165
- - `LID_BACKFILL_ON_START=true` habilita backfill de `lid_map` no boot.
166
- - `LID_BACKFILL_BATCH` padrão do serviço: `50000`.
167
-
168
- ## Referência de variáveis (`.env.example`)
169
-
170
- O `.env.example` foi atualizado para cobrir todas as variáveis atualmente referenciadas no código e no `docker-compose.yml`.
171
-
172
- Principais blocos do arquivo:
173
-
174
- - Core do bot (prefixo, admin, imagem de menu, logs e Baileys).
175
- - Banco MySQL (conexão, fila de escrita, monitor de query lenta).
176
- - Métricas/observabilidade do app (`METRICS_*`, `DB_QUERY_ALERT_THRESHOLDS`, social metrics).
177
- - OpenAI (chat, imagem, TTS, timeout e retry).
178
- - Mídia (`play`, TikTok, FFmpeg/FFprobe).
179
- - Sticker packs (storage, limites, auto-coleta, catálogo web).
180
- - XP e RPG Pokémon (economia, PvP, raids, social XP, canvas).
181
- - Stack de observabilidade no Docker (Prometheus, Grafana, Loki, Promtail e exporters).
182
-
183
- Variáveis legadas foram mantidas por compatibilidade (`QUOTE_API_URL`, `WAIFU_API_*`, `STORE_PATH`), mas não participam do fluxo principal atual.
184
-
185
- ## Scripts npm
186
-
187
- - `npm run start`: inicia o app (`node index.js`).
188
- - `npm run dev`: alias de start.
189
- - `npm run db:init`: cria/valida schema e executa migrations.
190
- - `npm run pm2:prod`: sobe com PM2 usando `ecosystem.prod.config.cjs`.
191
- - `npm run deploy`: deploy automático de `public/` com cache-bust, backup, validação e reload do Nginx.
192
- - `npm run deploy:dry-run`: simula o deploy sem publicar/recarregar serviços.
193
- - `npm run readme:sync-snapshot`: sincroniza o bloco dinâmico do README consumindo `/api/sticker-packs/readme-markdown`.
194
- - `npm run release`: release completo com versão unificada (npmjs + GitHub Packages + GitHub Release) e verificação final.
195
- - `npm run release:minor`: bump `minor` + deploy + publish do package.
196
- - `npm run release:major`: bump `major` + deploy + publish do package.
197
- - `npm run test`: executa testes Node (`node --test`).
198
- - `npm run lint`: lint com ESLint.
199
- - `npm run lint:fix`: lint com correções automáticas.
200
-
201
- ## Deploy automático (Nginx + cache-bust)
202
-
203
- Comando padrão:
204
-
205
- ```bash
206
- npm run deploy
207
- ```
208
-
209
- Variáveis úteis:
210
-
211
- - `DEPLOY_TARGET_DIR` (default: `/var/www/omnizap`)
212
- - `DEPLOY_NGINX_SERVICE` (default: `nginx`)
213
- - `DEPLOY_PM2_APP_NAME` (default: `omnizap-system-production`)
214
- - `DEPLOY_RESTART_PM2` (default: `1`)
215
- - `DEPLOY_CREATE_BACKUP` (default: `1`)
216
- - `DEPLOY_VERIFY_URL` (default: `https://omnizap.shop/`)
217
- - `DEPLOY_GITHUB_NOTIFY` (default: `1`) - cria/atualiza deployment no GitHub
218
- - `DEPLOY_GITHUB_ENVIRONMENT` (default: `production`)
219
- - `DEPLOY_GITHUB_REPO` (opcional, ex.: `kaikybrofc/omnizap-system`)
220
- - `DEPLOY_GITHUB_TOKEN` (opcional; se vazio usa `GITHUB_TOKEN`/`GH_TOKEN`)
221
- - `DEPLOY_PACKAGE_STEP` (default: `0`) - executa etapa de package durante o deploy
222
- - `DEPLOY_PACKAGE_INSTALL` (default: `1`) - instala dependências (`npm ci --omit=dev`)
223
- - `DEPLOY_PACKAGE_TEST` (default: `0`) - executa `npm test`
224
- - `DEPLOY_PACKAGE_PACK` (default: `0`) - gera artefato `npm pack`
225
- - `DEPLOY_PACKAGE_ARTIFACTS_DIR` (default: `.artifacts`) - pasta dos artefatos do pack
226
- - `DEPLOY_PACKAGE_PUBLISH` (default: `0`) - publica em registry npm
227
- - `DEPLOY_PACKAGE_REGISTRY` (default: `https://npm.pkg.github.com`)
228
- - `DEPLOY_PACKAGE_TOKEN` (opcional; fallback automático por tipo de registry)
229
- - `DEPLOY_PACKAGE_OTP` (opcional) - OTP para publish quando 2FA interativo for exigido
230
- - `DEPLOY_PACKAGE_SCOPE_OWNER` (opcional) - owner esperado do scope para publish (ex.: `kaikybrofc` ou sua org)
231
- - `DEPLOY_PACKAGE_TAG` (default: `latest`)
232
- - `DEPLOY_PACKAGE_PUBLISH_SKIP_IF_EXISTS` (default: `1`) - evita erro se versão já existir
233
- - `DEPLOY_PACKAGE_PUBLISH_SECONDARY` (default: `0`) - habilita publish secundário (dual publish)
234
- - `DEPLOY_PACKAGE_SECONDARY_REGISTRY` (default: `https://registry.npmjs.org`)
235
- - `DEPLOY_PACKAGE_SECONDARY_TOKEN` (opcional; fallback: `NPM_TOKEN`/`NODE_AUTH_TOKEN`/demais tokens)
236
- - `DEPLOY_PACKAGE_SECONDARY_OTP` (opcional) - OTP do npmjs para publish com 2FA
237
- - `DEPLOY_PACKAGE_SECONDARY_TAG` (default: `latest`)
238
- - `DEPLOY_PACKAGE_SECONDARY_ACCESS` (default: `public`) - usado para pacote escopado no npmjs
239
- - `DEPLOY_PACKAGE_SECONDARY_PUBLISH_SKIP_IF_EXISTS` (default: mesmo valor de `DEPLOY_PACKAGE_PUBLISH_SKIP_IF_EXISTS`)
240
- - `DEPLOY_PACKAGE_SECONDARY_TOKEN_KEYS` (opcional) - ordem customizada de fallback de tokens
241
-
242
- Para `npm.pkg.github.com`, prefira token do GitHub (`DEPLOY_GITHUB_TOKEN` ou `GITHUB_TOKEN`); `NPM_TOKEN` comum pode não autenticar no registry do GitHub.
243
- Para `npm.pkg.github.com`, o nome do pacote deve ser escopado com owner existente (`@owner/pacote`), por exemplo `@kaikybrofc/omnizap-system`.
244
- Para `registry.npmjs.org`, use token do npmjs (não token do GitHub). Se sua conta exigir 2FA para publish, use token granular com bypass 2FA habilitado ou informe OTP via `DEPLOY_PACKAGE_SECONDARY_OTP`.
245
-
246
- Exemplo sem restart do PM2:
247
-
248
- ```bash
249
- DEPLOY_RESTART_PM2=0 npm run deploy
250
- ```
251
-
252
- Exemplo com marcação explícita no GitHub:
253
-
254
- ```bash
255
- DEPLOY_GITHUB_NOTIFY=1 DEPLOY_GITHUB_ENVIRONMENT=production npm run deploy
256
- ```
257
-
258
- Exemplo com etapa package completa:
259
-
260
- ```bash
261
- DEPLOY_PACKAGE_STEP=1 DEPLOY_PACKAGE_TEST=1 DEPLOY_PACKAGE_PACK=1 npm run deploy
262
- ```
263
-
264
- Exemplo publicando no GitHub Packages:
265
-
266
- ```bash
267
- DEPLOY_PACKAGE_STEP=1 DEPLOY_PACKAGE_PUBLISH=1 DEPLOY_PACKAGE_TOKEN=seu_token npm run deploy
268
- ```
269
-
270
- Exemplo de dual publish (GitHub Packages + npmjs):
271
-
272
- ```bash
273
- DEPLOY_PACKAGE_STEP=1 \
274
- DEPLOY_PACKAGE_PUBLISH=1 \
275
- DEPLOY_PACKAGE_PUBLISH_SECONDARY=1 \
276
- DEPLOY_PACKAGE_SECONDARY_TOKEN=seu_token_npmjs \
277
- npm run deploy
278
- ```
279
-
280
- Comando único de release (patch + deploy + publish):
281
-
282
- ```bash
283
- npm run release
284
- ```
285
-
286
- `npm run release` executa publish primário + secundário por padrão e valida consistência final de versão.
287
-
288
- Variáveis do fluxo de release (git):
289
-
290
- - `RELEASE_TYPE` (default: `patch`)
291
- - `RELEASE_FORCE_VERSION` (opcional) - força versão exata (ex.: `2.2.0`)
292
- - `RELEASE_PATCH_ROLLOVER_ENABLED` (default: `1`) - rollover automático de patch
293
- - `RELEASE_PATCH_ROLLOVER_AT` (default: `10`) - quando patch atingir este valor, próximo release vira `major.(minor+1).0`
294
- - `RELEASE_GIT_AUTO_COMMIT` (default: `1`) - commit automático se houver alterações pendentes
295
- - `RELEASE_GIT_AUTO_PUSH` (default: `1`) - push automático dos commits gerados
296
- - `RELEASE_GIT_REMOTE` (default: `origin`)
297
- - `RELEASE_GIT_BRANCH` (opcional; vazio usa branch atual)
298
- - `RELEASE_GIT_PRE_COMMIT_MESSAGE` (default: `chore(release): auto-commit before release`)
299
- - `RELEASE_GIT_COMMIT_VERSION` (default: `1`) - commita alteração da versão após sucesso
300
- - `RELEASE_README_SYNC` (default: `1`) - sincroniza bloco dinâmico do README via API antes do commit/tag
301
- - `RELEASE_README_SYNC_REQUIRED` (default: `0`) - se `1`, falha o release quando a sincronização do README falhar
302
- - `RELEASE_README_SYNC_COMMAND` (default: `npm run readme:sync-snapshot`) - comando customizável para sincronização
303
- - `RELEASE_GIT_VERSION_COMMIT_PREFIX` (default: `chore(release): v`)
304
- - `RELEASE_GIT_TAG_CREATE` (default: `1`) - cria tag `vX.Y.Z` no release
305
- - `RELEASE_GIT_TAG_PUSH` (default: `1`) - envia a tag para o remoto
306
- - `RELEASE_GIT_TAG_ANNOTATED` (default: `1`) - usa tag anotada (`git tag -a`)
307
- - `RELEASE_GITHUB_RELEASE` (default: `1`) - cria/atualiza GitHub Release na aba Releases
308
- - `RELEASE_REQUIRE_GITHUB_RELEASE` (default: `1`) - falha se GitHub Release estiver desativado
309
- - `RELEASE_GITHUB_REPO` (opcional; ex.: `kaikybrofc/omnizap-system`)
310
- - `RELEASE_GITHUB_TOKEN` (opcional; fallback: `DEPLOY_GITHUB_TOKEN`/`GITHUB_TOKEN`/`GH_TOKEN`)
311
- - `RELEASE_GITHUB_TAG_PREFIX` (default: `v`) - prefixo da tag (`v2.1.9`)
312
- - `RELEASE_GITHUB_NAME_PREFIX` (default: `v`) - prefixo do nome exibido na release
313
- - `RELEASE_GITHUB_GENERATE_NOTES` (default: `1`) - usa notas automáticas do GitHub
314
- - `RELEASE_GITHUB_RELEASE_INCLUDE_CHANGED_FILES` (default: `1`) - adiciona markdown com arquivos alterados no corpo da release
315
- - `RELEASE_GITHUB_RELEASE_MAX_FILES` (default: `300`) - limite de arquivos listados no markdown
316
- - `RELEASE_GITHUB_PRERELEASE` (default: auto) - vazio detecta `-` na versão como prerelease
317
- - `RELEASE_GITHUB_DRAFT` (default: `0`)
318
- - `RELEASE_GITHUB_TARGET` (opcional; vazio usa `HEAD`)
319
- - `RELEASE_REQUIRE_DUAL_PUBLISH` (default: `1`) - exige publish em GitHub Packages e npmjs
320
- - `RELEASE_VERIFY_UNIFIED_VERSION` (default: `1`) - valida versão final em local + registries + GitHub Release
321
- - `RELEASE_VERIFY_PRIMARY_REGISTRY` (default: `https://npm.pkg.github.com`)
322
- - `RELEASE_VERIFY_SECONDARY_REGISTRY` (default: `https://registry.npmjs.org`)
323
- - `RELEASE_VERIFY_PRIMARY_TOKEN_KEYS` / `RELEASE_VERIFY_SECONDARY_TOKEN_KEYS` - ordem de fallback de tokens para verificação
324
-
325
- Exemplo de rollover automático:
326
-
327
- - `2.1.9` + `npm run release` -> `2.1.10`
328
- - `2.1.10` + `npm run release` -> `2.2.0`
329
-
330
- ## Execução com PM2
331
-
332
- Após conectar o QR uma primeira vez em modo normal:
333
-
334
- ```bash
335
- npm run pm2:prod
336
- ```
337
-
338
- Comandos úteis:
339
-
340
- ```bash
341
- pm2 status
342
- pm2 logs
343
- pm2 restart omnizap-system-production
344
- ```
345
-
346
- > O QR Code não é exibido no fluxo do PM2. Conecte primeiro no modo normal.
347
-
348
- ## Comandos principais
349
-
350
- Use `menu` para ver os comandos por categoria. Exemplos:
351
-
352
- - `<prefix>menu`
353
- - `<prefix>menu figurinhas`
354
- - `<prefix>menu midia`
355
- - `<prefix>menu ia`
356
- - `<prefix>menu stats`
357
- - `<prefix>menuadm`
358
-
359
- Comandos mais usados:
360
-
361
- - `<prefix>sticker` / `<prefix>s`
362
- - `<prefix>stickertext` / `<prefix>st` / `<prefix>stw` / `<prefix>stb`
363
- - `<prefix>toimg` / `<prefix>tovideo`
364
- - `<prefix>play <busca|url>`
365
- - `<prefix>playvid <busca|url>`
366
- - `<prefix>tiktok <url>`
367
- - `<prefix>quote`
368
- - `<prefix>cat`, `<prefix>catimg`, `<prefix>catprompt`
369
- - `<prefix>ranking`, `<prefix>rankingglobal`, `<prefix>semmsg`
370
- - `<prefix>user perfil`
371
-
372
- ## Sticker packs persistentes
373
-
374
- Exemplos de fluxo:
375
-
376
- ```text
377
- <prefix>pack create "Meu Pack"
378
- <prefix>pack add <pack>
379
- <prefix>pack list
380
- <prefix>pack info <pack>
381
- <prefix>pack send <pack>
382
- <prefix>pack publish <pack> <private|public|unlisted>
383
- <prefix>pack delete <pack>
384
- ```
385
-
386
- Notas:
387
-
388
- - Edição de pack é restrita ao dono (`owner_jid`).
389
- - O envio tenta sticker pack nativo e faz fallback automático quando necessário.
390
- - O sistema captura “última figurinha” para simplificar `add` e `setcover`.
391
-
392
- ### Catálogo web de packs
393
-
394
- O servidor HTTP de observabilidade também expõe um catálogo web simples para os packs publicados:
395
-
396
- - Página web: `http://localhost:9102/stickers`
397
- - API: `http://localhost:9102/api/sticker-packs`
398
- - Endpoint de métricas permanece em: `http://localhost:9102/metrics`
399
-
400
- Em produção (instância oficial):
401
-
402
- - Página web: `https://omnizap.shop/stickers/`
403
- - API: `https://omnizap.shop/api/sticker-packs`
404
- - API Docs: `https://omnizap.shop/api-docs/`
405
-
406
- Principais rotas da API:
407
-
408
- - `GET /api/sticker-packs?q=&visibility=public|unlisted|all&limit=&offset=`
409
- - `GET /api/sticker-packs/orphan-stickers?q=&limit=&offset=` (figurinhas salvas sem pack)
410
- - `GET /api/sticker-packs/:packKey`
411
- - `GET /api/sticker-packs/:packKey/stickers/:stickerId.webp`
412
- - `GET /api/sticker-packs/data-files?q=&limit=&offset=` (lista imagens da pasta `data`)
413
- - `GET /data/<caminho-da-imagem>` (acesso direto ao arquivo de imagem)
414
-
415
- ## Suporte a LID/JID
416
-
417
- O WhatsApp pode alternar IDs entre `@lid` e `@s.whatsapp.net`.
418
- O OmniZap resolve isso com um `sender_id` canônico para manter métricas/rankings consistentes.
419
-
420
- - Tabela dedicada: `lid_map`.
421
- - Cache em memória com TTL.
422
- - Reconciliação automática quando o JID real aparece.
423
- - Backfill opcional no startup.
424
-
425
- ## Classificação de imagens (CLIP / MobileCLIP)
426
-
427
- Para categorizar packs e stickers solos (ex.: anime/game/real/cartoon/nsfw), foi adicionado um microserviço Python:
428
-
429
- - Caminho: `ml/clip_classifier`
430
- - Stack: `FastAPI + MobileCLIP (OpenCLIP) + PyTorch`
431
- - Endpoint: `POST /classify` (upload de imagem)
432
-
433
- Documentação e execução:
434
-
435
- ```bash
436
- cd ml/clip_classifier
437
- cat README.md
438
- ```
439
-
440
- ## Observabilidade (Prometheus + Grafana + Loki)
441
-
442
- O projeto inclui `docker-compose.yml` com:
443
-
444
- - Prometheus
445
- - Grafana
446
- - Loki
447
- - Promtail
448
- - MySQL Exporter
449
- - Node Exporter
450
-
451
- Subir stack:
452
-
453
- ```bash
454
- docker compose up -d
455
- ```
456
-
457
- Setup recomendado de métricas MySQL:
458
-
459
- ```bash
460
- sudo mysql < observability/mysql-setup.sql
461
- ```
462
-
463
- Acessos padrão:
464
-
465
- - Grafana: `http://localhost:3003`
466
- - Prometheus: `http://localhost:9090`
467
- - Loki: `http://localhost:3100`
468
- - Métricas do app: `http://localhost:9102/metrics`
469
-
470
- Arquivos úteis:
471
-
472
- - `observability/prometheus.yml`
473
- - `observability/alert-rules.yml`
474
- - `observability/grafana/dashboards/omnizap-overview.json`
475
- - `observability/grafana/dashboards/omnizap-mysql.json`
476
-
477
- ## Troubleshooting
478
-
479
- **QR não aparece no PM2**
480
-
481
- - Inicie com `npm run start`, conecte o QR e depois volte para PM2.
482
- - Se necessário, limpe sessão salva e reconecte.
483
-
484
- **Erro de conexão MySQL**
485
-
486
- - Verifique `DB_HOST`, `DB_USER`, `DB_PASSWORD`, `DB_NAME`.
487
- - Confirme se o usuário possui permissão de leitura/escrita.
488
-
489
- **FFmpeg não encontrado**
490
-
491
- - Instale FFmpeg no sistema ou configure `FFMPEG_PATH`/`FFPROBE_PATH`.
492
-
493
- **Comando `play` falhando**
494
-
495
- - Verifique se o serviço configurado em `YTDLS_BASE_URL`/`YT_DLS_BASE_URL` está ativo.
496
-
497
- **Comando `tiktok` falhando**
498
-
499
- - Verifique se sua API local está ativa em `TIKTOK_EXTRACT_BASE_URL` + `TIKTOK_EXTRACT_PATH` (ex.: `http://127.0.0.1:8000/extract`).
500
-
501
- ## Tecnologias
502
-
503
- - Node.js
504
- - MySQL (`mysql2`)
505
- - Baileys (`@whiskeysockets/baileys`)
506
- - OpenAI SDK
507
- - Axios
508
- - Canvas
509
- - PM2
510
- - Prometheus / Grafana / Loki
511
-
512
- ## Contribuições
112
+ ## Suporte
513
113
 
514
- 1. Faça um fork.
515
- 2. Crie uma branch: `git checkout -b feature/minha-feature`.
516
- 3. Commit: `git commit -m "feat: minha feature"`.
517
- 4. Push: `git push origin feature/minha-feature`.
518
- 5. Abra um Pull Request.
114
+ - Canal principal: https://omnizap.shop/
115
+ - Para problemas de acesso/login, gere um novo link enviando `iniciar` no WhatsApp do bot.
519
116
 
520
- ## Licença
117
+ ## Licenca
521
118
 
522
- Licença MIT. Veja [`LICENSE`](LICENSE).
119
+ Licenca MIT. Consulte o arquivo `LICENSE`.
@@ -223,9 +223,14 @@ function buildAutoPackNoticeText(result, commandPrefix = DEFAULT_COMMAND_PREFIX)
223
223
  return duplicateLines.join('\n');
224
224
  }
225
225
 
226
- const savedLines = [`📦 Figurinha salva automaticamente no pack *${packName}*${countLabel}.\n\n`, `Dica: use *${commandPrefix}pack list* para gerenciar seus packs.`, `Para enviar agora: *${commandPrefix}pack send ${packCommandTarget}*.`];
226
+ const savedLines = [
227
+ `✅ Figurinha adicionada ao pack *${packName}*${countLabel}.`,
228
+ '',
229
+ `📋 Gerencie seus packs com *${commandPrefix}pack list*.`,
230
+ `🚀 Envie agora com *${commandPrefix}pack send ${packCommandTarget}*.`,
231
+ ];
227
232
  if (packWebUrl) {
228
- savedLines.push(`🌐 Abrir no site: ${packWebUrl}`);
233
+ savedLines.push(`🌐 Veja no site: ${packWebUrl}`);
229
234
  } else {
230
235
  savedLines.push(`🔒 Pack privado/não publicado. Gerencie em: ${profileUrl}`);
231
236
  }
@@ -150,9 +150,14 @@ function buildAutoPackNoticeText(result, commandPrefix = DEFAULT_COMMAND_PREFIX)
150
150
  return duplicateLines.join('\n');
151
151
  }
152
152
 
153
- const savedLines = [`📦 Figurinha salva automaticamente no pack *${packName}*${countLabel}.\n\n`, `Dica: use *${commandPrefix}pack list* para gerenciar seus packs.`, `Para enviar agora: *${commandPrefix}pack send ${packCommandTarget}*.`];
153
+ const savedLines = [
154
+ `✅ Figurinha adicionada ao pack *${packName}*${countLabel}.`,
155
+ '',
156
+ `📋 Gerencie seus packs com *${commandPrefix}pack list*.`,
157
+ `🚀 Envie agora com *${commandPrefix}pack send ${packCommandTarget}*.`,
158
+ ];
154
159
  if (packWebUrl) {
155
- savedLines.push(`🌐 Abrir no site: ${packWebUrl}`);
160
+ savedLines.push(`🌐 Veja no site: ${packWebUrl}`);
156
161
  } else {
157
162
  savedLines.push(`🔒 Pack privado/não publicado. Gerencie em: ${profileUrl}`);
158
163
  }