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