@stone-wpp/ofc 1.0.6 → 1.0.7

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.
@@ -1,203 +0,0 @@
1
- # groupProtection — proteção de grupos na Stone WPP
2
-
3
- A API nativa `sock.groupProtection(jid, options)` usa a recepção da própria Stone e
4
- não modifica o protocolo de criptografia. Detecta rajadas de mensagens de pagamento
5
- e flood, observa falhas de descriptografia, recibos de retry e solicitações PDO de
6
- recuperação. **Nenhuma dessas observações é garantia de ataque ou de mensagem recuperada.**
7
-
8
- ## 1. Ativar sem risco
9
-
10
- ```js
11
- await sock.groupProtection(grupoJid, {
12
- enabled: true,
13
- mode: 'alert',
14
- observeInvisible: true,
15
- observeReceipts: true
16
- })
17
-
18
- sock.ev.on('group-protection.alert', alerta => {
19
- console.log(alerta.jid, alerta.reason, alerta.severity, alerta.verified)
20
- })
21
- ```
22
-
23
- O modo `alert` não apaga conteúdo e não remove pessoas. Use-o em um grupo próprio
24
- para calibrar os limites antes de optar por moderação automática.
25
-
26
- ## 2. Moderação automática e imunidade
27
-
28
- ```js
29
- await sock.groupProtection(grupoJid, {
30
- enabled: true,
31
- mode: 'protect',
32
- paymentBurst: 3,
33
- messageBurst: 14,
34
- windowMs: 8000,
35
- lockMs: 12000,
36
- editNotice: true,
37
- immunity: [donoJid, moderadorJid]
38
- })
39
- ```
40
-
41
- | Opção | Significado |
42
- | --- | --- |
43
- | `mode: 'alert'` | Só registra alertas (padrão) |
44
- | `mode: 'delete'` | Tenta excluir a mensagem de rajada verificada |
45
- | `mode: 'remove'` | Tenta excluir e remover participante |
46
- | `mode: 'protect'` | Tenta fechar temporariamente, excluir e remover |
47
- | `paymentBurst` | Número de mensagens de pagamento por remetente na janela (2–30) |
48
- | `messageBurst` | Número de mensagens por remetente na janela (3–100) |
49
- | `windowMs` | Janela de observação em milissegundos (1.000–60.000) |
50
- | `lockMs` | Intervalo de fechamento do grupo (3.000–120.000 ms) |
51
- | `immunity` | Até 200 JIDs que jamais serão removidos automaticamente |
52
- | `editNotice` | Edita **somente avisos enviados pelo bot**, nunca mensagens de terceiros |
53
- | `observeReceipts` | Observa recibos de retry (padrão: true) |
54
- | `receiptBurst` | Volume que gera alerta leve de recibos (3–50) |
55
- | `historyLimit` | Registros recentes mantidos por grupo (20–500) |
56
-
57
- O bot precisa ser administrador. Pessoas sem identidade confirmada, administradores
58
- e JIDs imunes não são expulsos. **PN e LID são tipos diferentes de identificador**:
59
- inclua as formas conhecidas na imunidade se aplicável. Rajadas de mensagens legítimas
60
- podem parecer ataques; ajuste os limites conforme o grupo.
61
-
62
- ## 3. Recibos ocultos e PDO já existente
63
-
64
- A Stone já possui `requestPlaceholderResend`, retry e PDO. A proteção acrescenta
65
- **telemetria passiva** ao caminho nativo, sem duplicar solicitações:
66
-
67
- ```js
68
- sock.ev.on('group-protection.pdo-observed', ({ jid, messageId, status }) => {
69
- console.log('PDO do grupo:', jid, messageId, status)
70
- })
71
-
72
- sock.ev.on('group-protection.alert', alerta => {
73
- if (alerta.reason === 'receipt-suspected') {
74
- console.log('Rajada de retry observada — sem expulsão automática')
75
- }
76
- })
77
- ```
78
-
79
- `group-protection.receipt` é o evento bruto com `remoteJid`, `participant`,
80
- `messageId` e `type: 'retry'`. `group-protection.pdo` informa eventos nativos
81
- `requested`, `resolved` ou `timeout`; `group-protection.pdo-observed`
82
- exibe apenas os PDO dos grupos ativados. Recebimentos de retry e falhas de
83
- descriptografia são **sinais técnicos**, não prova de intenção maliciosa.
84
- Um pedido PDO pode falhar, expirar ou retornar sem recuperar o conteúdo.
85
-
86
- ## 4. Salvar configurações e consultar histórico
87
-
88
- Use `createStoneStore` com JSON ou SQLite. O armazenamento é **opcional** e
89
- precisa ser informado explicitamente. Exemplo:
90
-
91
- ```js
92
- import { createStoneStore } from '@stone-wpp/ofc'
93
-
94
- const store = await createStoneStore({ type: 'json', path: './dados/protecao.json' })
95
- await sock.groupProtection(grupoJid, {
96
- enabled: true,
97
- mode: 'alert',
98
- store,
99
- immunity: [donoJid],
100
- historyLimit: 100
101
- })
102
-
103
- // Após reiniciar o bot, com o mesmo store:
104
- await sock.groupProtection(grupoJid, { restore: true, store })
105
-
106
- // Consultar últimos 30 registros, sem dados de mensagens:
107
- const status = await sock.groupProtection(grupoJid, { getHistory: true, limit: 30 })
108
- console.log(status.history)
109
-
110
- // Desativar e salvar o estado desligado:
111
- await sock.groupProtection(grupoJid, { enabled: false, store })
112
- ```
113
-
114
- O histórico salva somente grupo, participante, tipo de alerta/ação, situação de
115
- moderação e horário. Não armazena automaticamente texto de mensagens, ciphertext
116
- ou chaves da sessão. A proteção só restaura grupos que o seu aplicativo indicar;
117
- o store **não inicia sessões nem descobre todos os grupos sozinho**.
118
-
119
- ## 5. Até três monitores complementares com reconexão
120
-
121
- `monitors` aceita sockets Stone já criados. Para **recriação automática**
122
- de um monitor após queda temporária use `monitorFactories`: a função factory
123
- deve criar o socket autenticado e carregar/persistir sua própria sessão.
124
-
125
- ```js
126
- await sock.groupProtection(grupoJid, {
127
- enabled: true,
128
- mode: 'alert',
129
- monitorFactories: [
130
- async ({ attempt }) => criarMonitorComSessaoSalva('auxiliar1', attempt),
131
- async ({ attempt }) => criarMonitorComSessaoSalva('auxiliar2', attempt)
132
- ],
133
- monitorReconnectMs: 3000
134
- })
135
-
136
- sock.ev.on('group-protection.monitor', ({ index, status, error }) => {
137
- console.log('Monitor:', index, status, error || '')
138
- })
139
- ```
140
-
141
- ### Pareamento autorizado de um monitor novo
142
-
143
- Se a sessão auxiliar ainda não foi vinculada, é possível solicitar um código
144
- **somente quando o titular configurar explicitamente** o número e callback.
145
- A Stone informa o código; o proprietário confirma no aplicativo WhatsApp.
146
-
147
- ```js
148
- import makeStone, { useMultiFileAuthState } from '@stone-wpp/ofc'
149
-
150
- async function criarMonitor() {
151
- const { state, saveCreds } = await useMultiFileAuthState('./sessao-monitor-1')
152
- const monitor = makeStone({ auth: state })
153
- monitor.ev.on('creds.update', saveCreds)
154
- return monitor
155
- }
156
- await sock.groupProtection(grupoJid, {
157
- enabled: true,
158
- mode: 'alert',
159
- monitorFactories: [{
160
- create: criarMonitor,
161
- phoneNumber: '5511999999999', // use seu número com DDI
162
- onPairingCode({ code }) {
163
- console.log('Vincule no WhatsApp do titular:', code)
164
- }
165
- }]
166
- })
167
- ```
168
-
169
- Não há pareamento sem o usuário confirmar o código no telefone.
170
- Cada monitor precisa de pasta de credenciais distinta. Se houver logout,
171
- a reconexão para, evitando tentativas silenciosas.
172
-
173
- A função `criarMonitorComSessaoSalva` é criada **pela sua aplicação**;
174
- ela não é uma exportação da Stone. Ela deve utilizar suas próprias credenciais
175
- de WhatsApp, do mesmo modo que você cria a sessão principal. Cada número
176
- auxiliar precisa ser autenticado **com autorização do proprietário** e
177
- participar do grupo. Não há pareamento silencioso: em caso de logout (401),
178
- a proteção não tenta conectar novamente sem novo vínculo.
179
-
180
- `monitors` e `monitorFactories` juntos aceitam **até três** sessões adicionais.
181
- A Stone deduplica IDs recebidos de mais de uma sessão e observa apenas os
182
- grupos em que o monitor foi configurado. Uma mensagem omitida pelo WhatsApp
183
- para todas as sessões continua invisível.
184
-
185
- ## 6. Status, erros e testes
186
-
187
- ```js
188
- const state = await sock.groupProtection(grupoJid)
189
- console.log(state.enabled, state.mode, state.monitorCount)
190
- console.log(state.alerts, state.actions)
191
- ```
192
-
193
- Eventos de acompanhamento:
194
- - `group-protection.alert` — motivo, gravidade, evidência limitada e origem.
195
- - `group-protection.action` — tentativa e resultado da moderação.
196
- - `group-protection.monitor` — monitor conectado, erro ou logout.
197
- - `group-protection.pdo-observed` — telemetria de recuperação de placeholder.
198
-
199
- Testes locais: `npm test`. Ative inicialmente `mode: 'alert'` em grupos controlados,
200
- verifique casos normais (pagamento legítimo, perda de conexão, um participante
201
- muito ativo) e só depois considere `delete`, `remove` ou `protect`.
202
- A proteção não falsifica mensagens atribuídas a terceiros, não garante
203
- detectar todos os bypasses e não substitui as regras oficiais do WhatsApp.