@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.
- package/README.md +82 -483
- package/app/controllers/messageController.js +473 -255
- package/app/modules/analyticsModule/messageAnalysisEventRepository.js +83 -0
- package/app/modules/stickerModule/stickerCommand.js +7 -2
- package/app/modules/stickerModule/stickerTextCommand.js +7 -2
- package/app/modules/stickerPackModule/stickerDomainEventConsumerRuntime.js +1 -3
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +224 -53
- package/app/observability/metrics.js +6 -3
- package/app/services/googleWebLinkService.js +77 -0
- package/app/services/lidMapService.js +83 -4
- package/database/index.js +2 -0
- package/database/migrations/20260301_0028_message_analysis_event.sql +32 -0
- package/database/migrations/20260301_0029_admin_action_audit.sql +16 -0
- package/package.json +1 -1
- package/public/index.html +12 -8
- package/public/js/apps/createPackApp.js +4 -4
- package/public/js/apps/homeApp.js +78 -34
- package/public/js/apps/loginApp.js +245 -35
- package/public/js/apps/stickersAdminApp.js +4 -10
- package/public/js/apps/stickersApp.js +1 -1
- package/public/js/apps/userApp.js +956 -55
- package/public/js/apps/userProfileApp.js +244 -0
- package/public/login/index.html +437 -101
- package/public/termos-de-uso/index.html +1 -1
- package/public/user/index.html +2 -181
- package/public/user/systemadm/index.html +774 -0
- package/server/controllers/stickerCatalog/nonCatalogHandlers.js +183 -0
- package/server/controllers/stickerCatalogController.js +1289 -368
- package/server/controllers/systemAdminController.js +141 -0
- package/server/controllers/userController.js +87 -0
- package/server/http/httpServer.js +72 -32
- package/server/middleware/cachePolicy.js +24 -0
- package/server/middleware/cachePolicyHelpers.js +1 -0
- package/server/middleware/rateLimit.js +89 -0
- package/server/middleware/requestLogger.js +16 -0
- package/server/middleware/requireAdminAuth.js +42 -0
- package/server/middleware/securityHeaders.js +6 -0
- package/server/routes/admin/systemAdminRouter.js +56 -0
- package/server/routes/health/healthRouter.js +41 -0
- package/server/routes/indexRouter.js +197 -0
- package/server/routes/metrics/metricsRouter.js +13 -0
- package/server/routes/stickerCatalog/catalogHandlers/catalogAdminHttp.js +44 -0
- package/server/routes/stickerCatalog/stickerApiRouter.js +84 -0
- package/server/routes/stickerCatalog/stickerDataRouter.js +140 -0
- package/server/routes/stickerCatalog/stickerSiteRouter.js +43 -0
- package/server/routes/user/userRouter.js +56 -0
- package/server/utils/safePath.js +26 -0
- package/server/routes/metricsRoute.js +0 -7
- 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
|
-
|
|
4
|
-

|
|
5
|
-

|
|
6
|
-

|
|
7
|
-

|
|
8
|
-

|
|
9
|
-

|
|
3
|
+
# OmniZap System
|
|
10
4
|
|
|
11
|
-
|
|
5
|
+
Plataforma de automacao para WhatsApp com foco em figurinhas, packs, catalogo web e comandos inteligentes.
|
|
12
6
|
|
|
13
|
-
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
116
|
-
npm install
|
|
117
|
-
```
|
|
17
|
+
## Como comecar (usuario final)
|
|
118
18
|
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
33
|
+
## Comandos mais usados no WhatsApp
|
|
345
34
|
|
|
346
|
-
|
|
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
|
-
-
|
|
351
|
-
-
|
|
352
|
-
-
|
|
353
|
-
-
|
|
354
|
-
-
|
|
355
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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
|
-
|
|
55
|
+
## Paginas web principais
|
|
385
56
|
|
|
386
|
-
-
|
|
387
|
-
-
|
|
388
|
-
-
|
|
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
|
-
|
|
61
|
+
## Nao estou vendo meu pack. E agora?
|
|
391
62
|
|
|
392
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
401
|
-
- API: `https://omnizap.shop/api/sticker-packs`
|
|
402
|
-
- API Docs: `https://omnizap.shop/api-docs/`
|
|
74
|
+
## Snapshot dinamico do sistema
|
|
403
75
|
|
|
404
|
-
|
|
76
|
+
Este bloco pode ser atualizado automaticamente pela API (`/api/sticker-packs/readme-markdown`).
|
|
405
77
|
|
|
406
|
-
|
|
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
|
-
|
|
80
|
+
### Snapshot do Sistema
|
|
488
81
|
|
|
489
|
-
|
|
82
|
+
> Atualizado em `2026-03-01T02:48:19.346Z` | cache `1800s`
|
|
490
83
|
|
|
491
|
-
|
|
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
|
-
|
|
92
|
+
#### Tipos de mensagem mais usados (amostra: 25.000)
|
|
494
93
|
|
|
495
|
-
|
|
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
|
-
|
|
105
|
+
<details><summary>Comandos disponiveis (62)</summary>
|
|
498
106
|
|
|
499
|
-
|
|
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
|
-
|
|
502
|
-
|
|
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
|
-
##
|
|
112
|
+
## Suporte
|
|
511
113
|
|
|
512
|
-
|
|
513
|
-
|
|
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
|
-
##
|
|
117
|
+
## Licenca
|
|
519
118
|
|
|
520
|
-
|
|
119
|
+
Licenca MIT. Consulte o arquivo `LICENSE`.
|