@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 +79 -482
- package/app/modules/stickerModule/stickerCommand.js +7 -2
- package/app/modules/stickerModule/stickerTextCommand.js +7 -2
- package/app/modules/stickerPackModule/stickerPackCommandHandlers.js +224 -53
- package/app/services/lidMapService.js +83 -4
- package/package.json +1 -1
- package/public/js/apps/createPackApp.js +4 -4
- package/public/js/apps/homeApp.js +4 -5
- package/public/js/apps/loginApp.js +83 -28
- package/public/js/apps/stickersAdminApp.js +1 -1
- package/public/js/apps/stickersApp.js +1 -1
- package/public/js/apps/userApp.js +8 -37
- package/public/login/index.html +17 -11
- package/public/user/index.html +0 -1
- package/server/controllers/stickerCatalog/nonCatalogHandlers.js +1 -26
- package/server/controllers/stickerCatalogController.js +161 -63
- package/server/middleware/cachePolicyHelpers.js +1 -2
- package/server/middleware/rateLimit.js +9 -2
- package/server/routes/indexRouter.js +1 -7
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
|
-
|
|
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
|
-
-
|
|
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
|
-
##
|
|
47
|
+
## Fluxo rapido de packs
|
|
30
48
|
|
|
31
|
-
|
|
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
|
-
|
|
34
|
-
- Markdown: `GET /api/sticker-packs/readme-markdown`
|
|
55
|
+
## Paginas web principais
|
|
35
56
|
|
|
36
|
-
|
|
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
|
-
|
|
39
|
-
npm run readme:sync-snapshot
|
|
40
|
-
```
|
|
61
|
+
## Nao estou vendo meu pack. E agora?
|
|
41
62
|
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
82
|
+
> Atualizado em `2026-03-01T02:48:19.346Z` | cache `1800s`
|
|
58
83
|
|
|
59
|
-
|
|
|
84
|
+
| Metrica | Valor |
|
|
60
85
|
| --------------------- | ------: |
|
|
61
|
-
|
|
|
86
|
+
| Usuarios (lid_map) | 5.516 |
|
|
62
87
|
| Grupos | 116 |
|
|
63
88
|
| Packs | 307 |
|
|
64
|
-
| Stickers | 7.
|
|
65
|
-
| Mensagens registradas |
|
|
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.
|
|
72
|
-
| `figurinha` | 4.
|
|
73
|
-
| `reacao` | 1.
|
|
74
|
-
| `imagem` | 1.
|
|
75
|
-
| `outros` |
|
|
76
|
-
| `video` |
|
|
77
|
-
| `audio` |
|
|
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
|
|
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
|
-
##
|
|
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
|
-
|
|
515
|
-
|
|
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
|
-
##
|
|
117
|
+
## Licenca
|
|
521
118
|
|
|
522
|
-
|
|
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 = [
|
|
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(`🌐
|
|
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 = [
|
|
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(`🌐
|
|
160
|
+
savedLines.push(`🌐 Veja no site: ${packWebUrl}`);
|
|
156
161
|
} else {
|
|
157
162
|
savedLines.push(`🔒 Pack privado/não publicado. Gerencie em: ${profileUrl}`);
|
|
158
163
|
}
|