@botgate/botgate-stats-reporter 1.0.0 → 1.1.0
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 +34 -671
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,708 +1,71 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @botgate/botgate-stats-reporter
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@botgate/stats-reporter)
|
|
4
|
-
[](https://www.typescriptlang.org/)
|
|
3
|
+
[](https://www.npmjs.com/package/@botgate/botgate-stats-reporter)
|
|
4
|
+
[](https://github.com/nathan-lucca/botgate-stats-reporter/blob/main/LICENSE)
|
|
6
5
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## ✨ Funcionalidades
|
|
10
|
-
|
|
11
|
-
- ✅ **Envio automático** de estatísticas (servidores, usuários, shards)
|
|
12
|
-
- ⏰ **Intervalo configurável** de atualização
|
|
13
|
-
- 🔄 **Retry automático** em caso de falha
|
|
14
|
-
- 🔐 **Verificação de API key**
|
|
15
|
-
- 📝 **Logs detalhados** (modo debug)
|
|
16
|
-
- 🎯 **TypeScript completo** com tipos exportados
|
|
17
|
-
- 🚀 **Fácil integração** com Discord.js
|
|
18
|
-
- 💪 **Robusto e confiável**
|
|
6
|
+
O módulo oficial do **BotGate** para simplificar a integração de bots Discord com a nossa plataforma. Automatize o envio de estatísticas, monitore votos e gerencie o plano do seu bot com facilidade.
|
|
19
7
|
|
|
20
8
|
## 📦 Instalação
|
|
21
9
|
|
|
22
10
|
```bash
|
|
23
|
-
npm install @botgate/stats-reporter
|
|
11
|
+
npm install @botgate/botgate-stats-reporter
|
|
24
12
|
```
|
|
25
13
|
|
|
26
|
-
|
|
14
|
+
## 🚀 Como usar
|
|
27
15
|
|
|
28
|
-
|
|
29
|
-
yarn add @botgate/stats-reporter
|
|
30
|
-
```
|
|
16
|
+
A biblioteca foi projetada para ser "configure e esqueça". Ela gerencia automaticamente o intervalo de postagem com base no seu plano (Tier).
|
|
31
17
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
### JavaScript
|
|
18
|
+
### Exemplo com Discord.js
|
|
35
19
|
|
|
36
20
|
```javascript
|
|
37
|
-
const { Client, GatewayIntentBits } = require("discord.js");
|
|
38
|
-
const { BotGateReporter } = require("@botgate/stats-reporter");
|
|
39
|
-
|
|
40
|
-
const client = new Client({
|
|
41
|
-
intents: [GatewayIntentBits.Guilds],
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
const reporter = new BotGateReporter({
|
|
45
|
-
botId: "YOUR_BOT_ID",
|
|
46
|
-
apiKey: "YOUR_API_KEY",
|
|
47
|
-
debug: true, // Opcional
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
client.once("ready", () => {
|
|
51
|
-
console.log(`Bot logado como ${client.user.tag}`);
|
|
52
|
-
reporter.start(client);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
client.login("YOUR_BOT_TOKEN");
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### TypeScript
|
|
59
|
-
|
|
60
|
-
```typescript
|
|
61
21
|
import { Client, GatewayIntentBits } from "discord.js";
|
|
62
|
-
import { BotGateReporter } from "@botgate/stats-reporter";
|
|
22
|
+
import { BotGateReporter } from "@botgate/botgate-stats-reporter";
|
|
63
23
|
|
|
64
24
|
const client = new Client({
|
|
65
25
|
intents: [GatewayIntentBits.Guilds],
|
|
66
26
|
});
|
|
67
27
|
|
|
68
28
|
const reporter = new BotGateReporter({
|
|
69
|
-
botId: "
|
|
70
|
-
apiKey: "
|
|
71
|
-
debug: true, // Opcional
|
|
29
|
+
botId: "SEU_BOT_ID",
|
|
30
|
+
apiKey: "SUA_API_KEY",
|
|
72
31
|
});
|
|
73
32
|
|
|
74
33
|
client.once("ready", () => {
|
|
75
34
|
console.log(`Bot logado como ${client.user.tag}`);
|
|
76
|
-
reporter.start(client);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
client.login("YOUR_BOT_TOKEN");
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## 📖 Documentação Completa
|
|
83
|
-
|
|
84
|
-
### Configuração
|
|
85
|
-
|
|
86
|
-
```typescript
|
|
87
|
-
interface BotGateConfig {
|
|
88
|
-
// Obrigatório
|
|
89
|
-
botId: string; // ID do bot no Discord
|
|
90
|
-
apiKey: string; // API key do BotGate
|
|
91
|
-
|
|
92
|
-
// Opcional
|
|
93
|
-
debug?: boolean; // Ativar logs (padrão: false)
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Métodos Principais
|
|
98
|
-
|
|
99
|
-
#### `start(client: Client): void`
|
|
100
|
-
|
|
101
|
-
Inicia o reporter e começa a enviar estatísticas automaticamente.
|
|
102
|
-
|
|
103
|
-
```javascript
|
|
104
|
-
reporter.start(client);
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
#### `stop(): void`
|
|
108
|
-
|
|
109
|
-
Para o reporter e cancela atualizações automáticas.
|
|
110
|
-
|
|
111
|
-
```javascript
|
|
112
|
-
reporter.stop();
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
#### `sendStats(): Promise<BotGateResponse>`
|
|
116
|
-
|
|
117
|
-
Envia estatísticas manualmente (sem aguardar o intervalo).
|
|
118
|
-
|
|
119
|
-
```javascript
|
|
120
|
-
try {
|
|
121
|
-
const response = await reporter.sendStats();
|
|
122
|
-
console.log("Stats enviadas:", response);
|
|
123
|
-
} catch (error) {
|
|
124
|
-
console.error("Erro:", error);
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
#### `verifyApiKey(): Promise<boolean>`
|
|
129
|
-
|
|
130
|
-
Verifica se a API key é válida.
|
|
131
|
-
|
|
132
|
-
```javascript
|
|
133
|
-
const isValid = await reporter.verifyApiKey();
|
|
134
|
-
if (isValid) {
|
|
135
|
-
console.log("API key válida!");
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
#### `getBotInfo(): Promise<BotInfo>`
|
|
140
|
-
|
|
141
|
-
Obtém informações do bot no BotGate.
|
|
142
|
-
|
|
143
|
-
```javascript
|
|
144
|
-
const botInfo = await reporter.getBotInfo();
|
|
145
|
-
console.log("Nome:", botInfo.name);
|
|
146
|
-
console.log("Votos:", botInfo.stats.votes);
|
|
147
|
-
console.log("Avaliação:", botInfo.stats.rating);
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
#### `getConfig(): Readonly<Required<BotGateConfig>>`
|
|
151
|
-
|
|
152
|
-
Retorna a configuração atual.
|
|
153
|
-
|
|
154
|
-
```javascript
|
|
155
|
-
const config = reporter.getConfig();
|
|
156
|
-
console.log("Intervalo:", config.updateInterval);
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
#### `isActive(): boolean`
|
|
160
|
-
|
|
161
|
-
Verifica se o reporter está ativo.
|
|
162
|
-
|
|
163
|
-
```javascript
|
|
164
|
-
if (reporter.isActive()) {
|
|
165
|
-
console.log("Reporter está rodando");
|
|
166
|
-
}
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
#### `getFailedAttempts(): number`
|
|
170
|
-
|
|
171
|
-
Retorna o número de tentativas falhadas consecutivas.
|
|
172
|
-
|
|
173
|
-
```javascript
|
|
174
|
-
const failures = reporter.getFailedAttempts();
|
|
175
|
-
console.log("Falhas consecutivas:", failures);
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
#### `refreshTier(): Promise<boolean>`
|
|
179
|
-
|
|
180
|
-
Atualiza o tier e intervalo de atualização consultando a API.
|
|
181
|
-
|
|
182
|
-
**Use este método após fazer upgrade do tier** para aplicar o novo intervalo sem reiniciar o bot.
|
|
183
|
-
|
|
184
|
-
```javascript
|
|
185
|
-
// Após fazer upgrade para Premium no site
|
|
186
|
-
await reporter.refreshTier();
|
|
187
|
-
// O intervalo será automaticamente ajustado (ex: 30min → 5min)
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
> **💡 Dica**: Quando você faz upgrade do tier (Free → Premium → Business), chame `refreshTier()` para que o reporter comece a enviar stats com o novo intervalo imediatamente!
|
|
191
|
-
|
|
192
|
-
## 🔑 Obtendo sua API Key
|
|
193
|
-
|
|
194
|
-
1. Acesse [BotGate](https://botgate.com)
|
|
195
|
-
2. Faça login com sua conta Discord
|
|
196
|
-
3. Vá para o painel do seu bot
|
|
197
|
-
4. Copie sua API key na seção "Configurações"
|
|
198
|
-
|
|
199
|
-
⚠️ **Importante**: Nunca compartilhe sua API key publicamente!
|
|
200
|
-
|
|
201
|
-
## 📊 Estatísticas Enviadas
|
|
202
35
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
- **Número de servidores** (`serverCount`)
|
|
206
|
-
- **Número total de usuários** (`userCount`)
|
|
207
|
-
- **Número de shards** (`shardCount`)
|
|
208
|
-
- **Timestamp** do envio
|
|
209
|
-
|
|
210
|
-
## 🔄 Retry Automático
|
|
211
|
-
|
|
212
|
-
O reporter tenta enviar as estatísticas até 3 vezes (configurável) em caso de falha:
|
|
213
|
-
|
|
214
|
-
```javascript
|
|
215
|
-
const reporter = new BotGateReporter({
|
|
216
|
-
botId: "YOUR_BOT_ID",
|
|
217
|
-
apiKey: "YOUR_API_KEY",
|
|
218
|
-
retryAttempts: 3, // Tentar 3 vezes
|
|
219
|
-
retryDelay: 5000, // Aguardar 5s entre tentativas
|
|
220
|
-
});
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
## 🐛 Debug
|
|
224
|
-
|
|
225
|
-
Ative o modo debug para ver logs detalhados:
|
|
226
|
-
|
|
227
|
-
```javascript
|
|
228
|
-
const reporter = new BotGateReporter({
|
|
229
|
-
botId: "YOUR_BOT_ID",
|
|
230
|
-
apiKey: "YOUR_API_KEY",
|
|
231
|
-
debug: true, // ✅ Ativar logs
|
|
232
|
-
});
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
Exemplo de logs:
|
|
236
|
-
|
|
237
|
-
```
|
|
238
|
-
[BotGate Reporter] [2026-01-18T14:30:00.000Z] ✅ BotGate Reporter initialized
|
|
239
|
-
[BotGate Reporter] [2026-01-18T14:30:05.000Z] 🤖 Bot ready: MyBot#1234
|
|
240
|
-
[BotGate Reporter] [2026-01-18T14:30:06.000Z] 📤 Stats sent successfully (attempt 1)
|
|
241
|
-
{
|
|
242
|
-
"servers": 1250,
|
|
243
|
-
"users": 50000,
|
|
244
|
-
"shards": 1
|
|
245
|
-
}
|
|
246
|
-
[BotGate Reporter] [2026-01-18T14:30:06.000Z] ⏰ Auto-update enabled (every 30 minutes)
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
## 🛡️ Tratamento de Erros
|
|
250
|
-
|
|
251
|
-
O reporter lida automaticamente com erros comuns:
|
|
252
|
-
|
|
253
|
-
```javascript
|
|
254
|
-
client.once("ready", async () => {
|
|
36
|
+
// Inicia o monitoramento automático de estatísticas e heartbeats
|
|
255
37
|
reporter.start(client);
|
|
256
|
-
|
|
257
|
-
// Verificar se a API key é válida
|
|
258
|
-
const isValid = await reporter.verifyApiKey();
|
|
259
|
-
if (!isValid) {
|
|
260
|
-
console.error("❌ API key inválida!");
|
|
261
|
-
process.exit(1);
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
## 🔧 Exemplos Avançados
|
|
267
|
-
|
|
268
|
-
### Envio Manual em Eventos
|
|
269
|
-
|
|
270
|
-
```javascript
|
|
271
|
-
client.on("guildCreate", async (guild) => {
|
|
272
|
-
console.log(`➕ Entrou no servidor: ${guild.name}`);
|
|
273
|
-
|
|
274
|
-
// Enviar stats imediatamente
|
|
275
|
-
await reporter.sendStats();
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
client.on("guildDelete", async (guild) => {
|
|
279
|
-
console.log(`➖ Saiu do servidor: ${guild.name}`);
|
|
280
|
-
|
|
281
|
-
// Enviar stats imediatamente
|
|
282
|
-
await reporter.sendStats();
|
|
283
|
-
});
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### Atualizar Tier Após Upgrade
|
|
287
|
-
|
|
288
|
-
```javascript
|
|
289
|
-
// Comando para atualizar o tier após fazer upgrade no site
|
|
290
|
-
client.on("messageCreate", async (message) => {
|
|
291
|
-
if (
|
|
292
|
-
message.content === "!refresh-tier" &&
|
|
293
|
-
message.author.id === "SEU_USER_ID"
|
|
294
|
-
) {
|
|
295
|
-
message.reply("🔄 Atualizando tier...");
|
|
296
|
-
|
|
297
|
-
const success = await reporter.refreshTier();
|
|
298
|
-
|
|
299
|
-
if (success) {
|
|
300
|
-
message.reply("✅ Tier atualizado! Novo intervalo aplicado.");
|
|
301
|
-
} else {
|
|
302
|
-
message.reply("❌ Erro ao atualizar tier.");
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
});
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### Graceful Shutdown
|
|
309
|
-
|
|
310
|
-
```javascript
|
|
311
|
-
process.on("SIGINT", () => {
|
|
312
|
-
console.log("🛑 Encerrando...");
|
|
313
|
-
reporter.stop();
|
|
314
|
-
client.destroy();
|
|
315
|
-
process.exit(0);
|
|
316
38
|
});
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
### Monitoramento de Falhas
|
|
320
|
-
|
|
321
|
-
```javascript
|
|
322
|
-
setInterval(() => {
|
|
323
|
-
const failures = reporter.getFailedAttempts();
|
|
324
|
-
if (failures > 5) {
|
|
325
|
-
console.error(`⚠️ Muitas falhas consecutivas: ${failures}`);
|
|
326
|
-
// Enviar alerta, etc.
|
|
327
|
-
}
|
|
328
|
-
}, 60000); // Verificar a cada minuto
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
## 🌐 API Endpoints Completos
|
|
332
|
-
|
|
333
|
-
O reporter se comunica com a API v1 do BotGate. Todos os endpoints requerem autenticação via API key no header `Authorization: Bearer <api_key>`.
|
|
334
|
-
|
|
335
|
-
### 📤 POST `/api/v1/bots/stats`
|
|
336
|
-
|
|
337
|
-
Envia estatísticas do bot (servidores, usuários, shards).
|
|
338
|
-
|
|
339
|
-
**Request Body:**
|
|
340
39
|
|
|
341
|
-
|
|
342
|
-
{
|
|
343
|
-
"botId": "123456789012345678",
|
|
344
|
-
"serverCount": 1250,
|
|
345
|
-
"userCount": 50000,
|
|
346
|
-
"shardCount": 1,
|
|
347
|
-
"timestamp": 1705678901234
|
|
348
|
-
}
|
|
40
|
+
client.login("SEU_TOKEN_DISCORD");
|
|
349
41
|
```
|
|
350
42
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
```json
|
|
354
|
-
{
|
|
355
|
-
"success": true,
|
|
356
|
-
"message": "Stats updated successfully",
|
|
357
|
-
"data": {
|
|
358
|
-
"botId": "123456789012345678",
|
|
359
|
-
"botName": "MyBot",
|
|
360
|
-
"serverCount": 1250,
|
|
361
|
-
"userCount": 50000,
|
|
362
|
-
"shardCount": 1,
|
|
363
|
-
"updatedAt": "2026-01-19T07:00:00.000Z"
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### ✅ GET `/api/v1/verify`
|
|
369
|
-
|
|
370
|
-
Verifica se a API key é válida e retorna informações do tier.
|
|
371
|
-
|
|
372
|
-
**Response:**
|
|
373
|
-
|
|
374
|
-
```json
|
|
375
|
-
{
|
|
376
|
-
"success": true,
|
|
377
|
-
"message": "API key is valid",
|
|
378
|
-
"data": {
|
|
379
|
-
"botId": "123456789012345678",
|
|
380
|
-
"botName": "MyBot",
|
|
381
|
-
"tier": {
|
|
382
|
-
"name": "free",
|
|
383
|
-
"apiCallsUsed": 150,
|
|
384
|
-
"apiCallsLimit": 1000,
|
|
385
|
-
"updateInterval": "30 minutes",
|
|
386
|
-
"analyticsLevel": "basic",
|
|
387
|
-
"historyDays": 7,
|
|
388
|
-
"features": {
|
|
389
|
-
"customWebhooks": false,
|
|
390
|
-
"prioritySupport": false,
|
|
391
|
-
"badge": "none"
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
```
|
|
397
|
-
|
|
398
|
-
### 🤖 GET `/api/v1/bots/:botId`
|
|
399
|
-
|
|
400
|
-
Obtém informações completas do bot.
|
|
401
|
-
|
|
402
|
-
**Response:**
|
|
403
|
-
|
|
404
|
-
```json
|
|
405
|
-
{
|
|
406
|
-
"success": true,
|
|
407
|
-
"data": {
|
|
408
|
-
"id": "123456789012345678",
|
|
409
|
-
"name": "MyBot",
|
|
410
|
-
"avatar": "...",
|
|
411
|
-
"shortDescription": "Um bot incrível!",
|
|
412
|
-
"stats": {
|
|
413
|
-
"servers": 1250,
|
|
414
|
-
"users": 50000,
|
|
415
|
-
"shards": 1,
|
|
416
|
-
"rating": 4.8,
|
|
417
|
-
"reviews": 42
|
|
418
|
-
},
|
|
419
|
-
"owner": {
|
|
420
|
-
"id": "987654321098765432",
|
|
421
|
-
"username": "DevName"
|
|
422
|
-
},
|
|
423
|
-
"categories": [...],
|
|
424
|
-
"features": [...],
|
|
425
|
-
"commands": [...]
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### 🗳️ GET `/api/v1/bots/:botId/votes`
|
|
431
|
-
|
|
432
|
-
Retorna informações detalhadas sobre votos.
|
|
433
|
-
|
|
434
|
-
**Query Parameters:**
|
|
435
|
-
|
|
436
|
-
- `limit` - Número de últimos votantes (padrão: 10, máx: 50)
|
|
437
|
-
|
|
438
|
-
**Response:**
|
|
439
|
-
|
|
440
|
-
```json
|
|
441
|
-
{
|
|
442
|
-
"success": true,
|
|
443
|
-
"data": {
|
|
444
|
-
"botId": "123456789012345678",
|
|
445
|
-
"botName": "MyBot",
|
|
446
|
-
"total": 5420,
|
|
447
|
-
"monthly": 342,
|
|
448
|
-
"weekly": 87,
|
|
449
|
-
"today": 12,
|
|
450
|
-
"recentVoters": [...],
|
|
451
|
-
"monthlyHistory": [...]
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
```
|
|
455
|
-
|
|
456
|
-
### 📊 GET `/api/v1/bots/:botId/analytics`
|
|
457
|
-
|
|
458
|
-
Retorna métricas e analytics detalhadas (requer tier Free ou superior).
|
|
459
|
-
|
|
460
|
-
**Response:**
|
|
461
|
-
|
|
462
|
-
```json
|
|
463
|
-
{
|
|
464
|
-
"success": true,
|
|
465
|
-
"data": {
|
|
466
|
-
"botId": "123456789012345678",
|
|
467
|
-
"botName": "MyBot",
|
|
468
|
-
"growth": {
|
|
469
|
-
"servers": {
|
|
470
|
-
"current": 1250,
|
|
471
|
-
"today": 15,
|
|
472
|
-
"week": 120,
|
|
473
|
-
"month": 450,
|
|
474
|
-
"percentageChange": {
|
|
475
|
-
"daily": "1.2",
|
|
476
|
-
"weekly": "10.6",
|
|
477
|
-
"monthly": "56.3"
|
|
478
|
-
}
|
|
479
|
-
},
|
|
480
|
-
"votes": {...}
|
|
481
|
-
},
|
|
482
|
-
"engagement": {
|
|
483
|
-
"votesPerDay": 12.5,
|
|
484
|
-
"reviewsPerWeek": 2.3,
|
|
485
|
-
"averageRating": 4.8
|
|
486
|
-
},
|
|
487
|
-
"trends": {
|
|
488
|
-
"peakDays": ["Saturday", "Sunday", "Friday"],
|
|
489
|
-
"dailyVotesLast7Days": [...]
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
```
|
|
494
|
-
|
|
495
|
-
### 📈 GET `/api/v1/bots/:botId/stats/history`
|
|
496
|
-
|
|
497
|
-
Retorna histórico de estatísticas para gráficos.
|
|
498
|
-
|
|
499
|
-
**Query Parameters:**
|
|
500
|
-
|
|
501
|
-
- `period` - Período: 'daily', 'weekly', 'monthly', 'all' (padrão: 'all')
|
|
502
|
-
|
|
503
|
-
**Response:**
|
|
504
|
-
|
|
505
|
-
```json
|
|
506
|
-
{
|
|
507
|
-
"success": true,
|
|
508
|
-
"data": {
|
|
509
|
-
"botId": "123456789012345678",
|
|
510
|
-
"botName": "MyBot",
|
|
511
|
-
"daily": [
|
|
512
|
-
{
|
|
513
|
-
"date": "2026-01-19",
|
|
514
|
-
"servers": 1250,
|
|
515
|
-
"votes": 5420,
|
|
516
|
-
"rating": "4.80"
|
|
517
|
-
}
|
|
518
|
-
],
|
|
519
|
-
"weekly": [...],
|
|
520
|
-
"monthly": [...]
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
### 📋 GET `/api/v1/usage`
|
|
526
|
-
|
|
527
|
-
Retorna informações sobre o uso atual da API.
|
|
528
|
-
|
|
529
|
-
**Response:**
|
|
530
|
-
|
|
531
|
-
```json
|
|
532
|
-
{
|
|
533
|
-
"success": true,
|
|
534
|
-
"data": {
|
|
535
|
-
"bot": {
|
|
536
|
-
"id": "123456789012345678",
|
|
537
|
-
"name": "MyBot"
|
|
538
|
-
},
|
|
539
|
-
"tier": {
|
|
540
|
-
"name": "free",
|
|
541
|
-
"displayName": "Free",
|
|
542
|
-
"features": {...}
|
|
543
|
-
},
|
|
544
|
-
"usage": {
|
|
545
|
-
"apiCalls": {
|
|
546
|
-
"used": 150,
|
|
547
|
-
"limit": 1000,
|
|
548
|
-
"remaining": 850,
|
|
549
|
-
"percentage": 15.0,
|
|
550
|
-
"status": "healthy",
|
|
551
|
-
"message": "Uso normal"
|
|
552
|
-
},
|
|
553
|
-
"reset": {
|
|
554
|
-
"at": "2026-02-01T00:00:00.000Z",
|
|
555
|
-
"inDays": 13,
|
|
556
|
-
"inHours": 312
|
|
557
|
-
}
|
|
558
|
-
},
|
|
559
|
-
"updates": {
|
|
560
|
-
"interval": "30 minutes",
|
|
561
|
-
"lastUpdate": "2026-01-19T03:20:00.000Z",
|
|
562
|
-
"nextUpdateAllowedAt": "2026-01-19T03:50:00.000Z",
|
|
563
|
-
"minutesUntilNextUpdate": 25,
|
|
564
|
-
"canUpdateNow": false
|
|
565
|
-
},
|
|
566
|
-
"statistics": {
|
|
567
|
-
"avgCallsPerDay": 12.5,
|
|
568
|
-
"estimatedDaysRemaining": 68,
|
|
569
|
-
"usageHistory": [...]
|
|
570
|
-
},
|
|
571
|
-
"upgrade": null
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
## 💎 Tiers e Limites
|
|
577
|
-
|
|
578
|
-
O BotGate oferece 3 tiers com diferentes limites e recursos:
|
|
579
|
-
|
|
580
|
-
### 🆓 Free Tier
|
|
581
|
-
|
|
582
|
-
- ✅ **1,500 chamadas de API/mês**
|
|
583
|
-
- ⏰ **Intervalo mínimo de atualização: 30 minutos**
|
|
584
|
-
- 📊 Analytics **básicas**
|
|
585
|
-
- 📅 Histórico de **7 dias**
|
|
586
|
-
- 🎯 Perfeito para começar!
|
|
587
|
-
|
|
588
|
-
### ⭐ Premium Tier ($9.99/mês)
|
|
589
|
-
|
|
590
|
-
- ✅ **10,000 chamadas de API/mês** (6.6x mais)
|
|
591
|
-
- ⏰ **Intervalo mínimo de atualização: 5 minutos** (6x mais rápido)
|
|
592
|
-
- 📊 Analytics **avançadas**
|
|
593
|
-
- 📅 Histórico de **90 dias**
|
|
594
|
-
- 🎨 Badge **Premium**
|
|
595
|
-
- 🔔 Webhooks customizados
|
|
596
|
-
- 💬 Suporte prioritário
|
|
597
|
-
|
|
598
|
-
### 🚀 Business Tier ($29.99/mês)
|
|
599
|
-
|
|
600
|
-
- ✅ **100,000 chamadas de API/mês** (66x mais)
|
|
601
|
-
- ⏰ **Intervalo mínimo de atualização: 1 minuto** (30x mais rápido)
|
|
602
|
-
- 📊 Analytics **enterprise**
|
|
603
|
-
- 📅 Histórico de **365 dias**
|
|
604
|
-
- 👑 Badge **Verified**
|
|
605
|
-
- 🎯 Domínio customizado
|
|
606
|
-
- 🚫 Sem anúncios
|
|
607
|
-
- 🔔 Webhooks customizados
|
|
608
|
-
- 💬 Suporte prioritário 24/7
|
|
609
|
-
|
|
610
|
-
> **💡 Ajuste Automático de Intervalo:**
|
|
611
|
-
>
|
|
612
|
-
> O reporter **detecta automaticamente** o seu tier ao iniciar e ajusta o intervalo de atualização:
|
|
613
|
-
>
|
|
614
|
-
> - 🆓 **Free**: Envia stats a cada **30 minutos**
|
|
615
|
-
> - ⭐ **Premium**: Envia stats a cada **5 minutos** (6x mais rápido!)
|
|
616
|
-
> - 🚀 **Business**: Envia stats a cada **1 minuto** (30x mais rápido!)
|
|
617
|
-
>
|
|
618
|
-
> **Após fazer upgrade**, você tem 2 opções:
|
|
619
|
-
>
|
|
620
|
-
> 1. **Reiniciar o bot** - O novo intervalo será aplicado automaticamente
|
|
621
|
-
> 2. **Chamar `reporter.refreshTier()`** - Atualiza sem reiniciar (recomendado!)
|
|
622
|
-
|
|
623
|
-
### 📊 Comparação de Limites
|
|
624
|
-
|
|
625
|
-
| Recurso | Free | Premium | Business |
|
|
626
|
-
| ---------------- | ---------- | ----------- | ---------- |
|
|
627
|
-
| Chamadas API/mês | 1,500 | 10,000 | 100,000 |
|
|
628
|
-
| Intervalo mínimo | 30 min | 5 min | 1 min |
|
|
629
|
-
| Analytics | Básicas | Avançadas | Enterprise |
|
|
630
|
-
| Histórico | 7 dias | 90 dias | 365 dias |
|
|
631
|
-
| Webhooks | ❌ | ✅ | ✅ |
|
|
632
|
-
| Domínio custom | ❌ | ❌ | ✅ |
|
|
633
|
-
| Badge | Nenhum | Premium | Verified |
|
|
634
|
-
| Suporte | Comunidade | Prioritário | 24/7 |
|
|
635
|
-
|
|
636
|
-
## 🔒 Rate Limiting
|
|
637
|
-
|
|
638
|
-
A API implementa rate limiting baseado no tier:
|
|
639
|
-
|
|
640
|
-
- **Free**: 1,500 chamadas/mês, reset no dia 1º de cada mês
|
|
641
|
-
- **Premium**: 10,000 chamadas/mês
|
|
642
|
-
- **Business**: 100,000 chamadas/mês
|
|
643
|
-
|
|
644
|
-
Quando o limite é atingido, a API retorna:
|
|
645
|
-
|
|
646
|
-
```json
|
|
647
|
-
{
|
|
648
|
-
"success": false,
|
|
649
|
-
"error": "API limit exceeded",
|
|
650
|
-
"message": "You have reached your monthly limit of 1500 API calls",
|
|
651
|
-
"currentUsage": 1500,
|
|
652
|
-
"limit": 1500,
|
|
653
|
-
"resetIn": "13 days",
|
|
654
|
-
"resetAt": "2026-02-01T00:00:00.000Z",
|
|
655
|
-
"upgrade": {
|
|
656
|
-
"message": "Upgrade to Premium for 10,000 calls/month",
|
|
657
|
-
"url": "https://botgate.com/pricing"
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
```
|
|
661
|
-
|
|
662
|
-
## 📝 Tipos TypeScript
|
|
663
|
-
|
|
664
|
-
Todos os tipos estão exportados e disponíveis:
|
|
665
|
-
|
|
666
|
-
```typescript
|
|
667
|
-
import {
|
|
668
|
-
BotGateReporter,
|
|
669
|
-
BotGateConfig,
|
|
670
|
-
BotStats,
|
|
671
|
-
BotGateResponse,
|
|
672
|
-
BotInfo,
|
|
673
|
-
createReporter,
|
|
674
|
-
} from "@botgate/stats-reporter";
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
## 🤝 Contribuindo
|
|
678
|
-
|
|
679
|
-
Contribuições são bem-vindas! Por favor:
|
|
680
|
-
|
|
681
|
-
1. Fork o repositório
|
|
682
|
-
2. Crie uma branch para sua feature (`git checkout -b feature/MinhaFeature`)
|
|
683
|
-
3. Commit suas mudanças (`git commit -m 'Adiciona MinhaFeature'`)
|
|
684
|
-
4. Push para a branch (`git push origin feature/MinhaFeature`)
|
|
685
|
-
5. Abra um Pull Request
|
|
686
|
-
|
|
687
|
-
## 🔗 Links
|
|
43
|
+
## 🛠️ Métodos Principais
|
|
688
44
|
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
45
|
+
| Método | Descrição |
|
|
46
|
+
| :--------------------------------- | :--------------------------------------------------------------- |
|
|
47
|
+
| `start(client)` | Inicia o loop automático de estatísticas e heartbeats. |
|
|
48
|
+
| `stop()` | Interrompe todos os processos em segundo plano. |
|
|
49
|
+
| `getBotInfo()` | Obtém dados completos do perfil do bot e do plano atual. |
|
|
50
|
+
| `getBotVotes(botId?, limit?)` | Consulta os últimos eleitores e estatísticas de votação. |
|
|
51
|
+
| `getApiUsage()` | Verifica o consumo mensal da sua cota de API. |
|
|
52
|
+
| `getStatsHistory(botId?, period?)` | Retorna o histórico de crescimento para gráficos. |
|
|
53
|
+
| `sendHeartbeat()` | Envia um sinal de vida manual (Exclusivo para o plano Business). |
|
|
693
54
|
|
|
694
|
-
##
|
|
55
|
+
## 🧠 Sincronização Inteligente
|
|
695
56
|
|
|
696
|
-
|
|
57
|
+
O `@botgate/botgate-stats-reporter` é reativo. Se você fizer um upgrade de plano no painel do BotGate, o bot detectará os novos limites na próxima comunicação com o servidor e ajustará o intervalo de postagem automaticamente, sem precisar reiniciar o processo.
|
|
697
58
|
|
|
698
|
-
-
|
|
699
|
-
-
|
|
700
|
-
-
|
|
59
|
+
- **Upgrade (Hot-Swap)**: Acelera o intervalo de envio conforme o novo Tier.
|
|
60
|
+
- **Grace Period**: Tolerância de segurança para evitar erros 429 por latência de rede.
|
|
61
|
+
- **Resiliência**: Tratamento automático de erros e tentativas de reenvio em caso de falhas temporárias.
|
|
701
62
|
|
|
702
|
-
##
|
|
63
|
+
## 🔗 Links Úteis
|
|
703
64
|
|
|
704
|
-
|
|
65
|
+
- [Documentação Oficial](https://docs-botgate.vercel.app/)
|
|
66
|
+
- [Painel do Desenvolvedor](https://botgate-site.vercel.app/settings)
|
|
67
|
+
- [Suporte no Discord](https://www.discord.gg/xK4r9HqKKf)
|
|
705
68
|
|
|
706
|
-
|
|
69
|
+
## 📄 Licença
|
|
707
70
|
|
|
708
|
-
|
|
71
|
+
Distribuído sob a licença MIT. Veja `LICENSE` para mais informações.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAqBpC,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmBD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAkB;gBAOzB,MAAM,EAAE,aAAa;IAiC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAkB3B,IAAI,IAAI,IAAI;IAcN,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAarC,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAOzC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBhC,UAAU,CACrB,KAAK,GAAE,MAA0B,GAChC,OAAO,CAAC,eAAe,CAAC;IAad,WAAW,CACtB,KAAK,GAAE,MAA0B,EACjC,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,eAAe,CAAC;IAWd,eAAe,CAC1B,KAAK,GAAE,MAA0B,GAChC,OAAO,CAAC,eAAe,CAAC;IASd,eAAe,CAC1B,KAAK,GAAE,MAA0B,EACjC,MAAM,GAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAa,GACrD,OAAO,CAAC,eAAe,CAAC;IAYd,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;YActC,OAAO;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAqBpC,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,CAAC;IAGd,MAAM,EAAE,MAAM,CAAC;IAGf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmBD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,mBAAmB,CAA+B;IAC1D,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,WAAW,CAAkB;gBAOzB,MAAM,EAAE,aAAa;IAiC1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAkB3B,IAAI,IAAI,IAAI;IAcN,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAarC,aAAa,IAAI,OAAO,CAAC,eAAe,CAAC;IAOzC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAmBhC,UAAU,CACrB,KAAK,GAAE,MAA0B,GAChC,OAAO,CAAC,eAAe,CAAC;IAad,WAAW,CACtB,KAAK,GAAE,MAA0B,EACjC,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,eAAe,CAAC;IAWd,eAAe,CAC1B,KAAK,GAAE,MAA0B,GAChC,OAAO,CAAC,eAAe,CAAC;IASd,eAAe,CAC1B,KAAK,GAAE,MAA0B,EACjC,MAAM,GAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAa,GACrD,OAAO,CAAC,eAAe,CAAC;IAYd,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;YActC,OAAO;IAkBrB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;YAmBT,YAAY;YAwCZ,aAAa;IA6C3B,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,WAAW;CAMpB;AAED,eAAe,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,7 @@ export class BotGateReporter {
|
|
|
58
58
|
if (!this.client?.isReady()) {
|
|
59
59
|
throw new Error("[BotGate Reporter] Discord client is not ready");
|
|
60
60
|
}
|
|
61
|
-
const stats = this.collectStats();
|
|
61
|
+
const stats = await this.collectStats();
|
|
62
62
|
return await this.postWithRetry("/api/v1/bots/stats", stats);
|
|
63
63
|
}
|
|
64
64
|
async sendHeartbeat() {
|
|
@@ -107,8 +107,15 @@ export class BotGateReporter {
|
|
|
107
107
|
}
|
|
108
108
|
async onReady() {
|
|
109
109
|
this.log(`🤖 Bot ready: ${this.client?.user?.tag}`);
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
const isLeader = !this.client?.shard || this.client.shard.ids[0] === 0;
|
|
111
|
+
if (isLeader) {
|
|
112
|
+
this.log("⭐ Shard Leader detected. Handling global reporting.");
|
|
113
|
+
await this.verifyApiKey();
|
|
114
|
+
await this.sendStats();
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
this.log(`ℹ️ Shard #${this.client?.shard?.ids[0]} initialized. Skipping reporting (Leader task).`);
|
|
118
|
+
}
|
|
112
119
|
}
|
|
113
120
|
setupAutoUpdate() {
|
|
114
121
|
if (this.statsIntervalId)
|
|
@@ -129,13 +136,33 @@ export class BotGateReporter {
|
|
|
129
136
|
this.heartbeatIntervalId = null;
|
|
130
137
|
}
|
|
131
138
|
}
|
|
132
|
-
collectStats() {
|
|
133
|
-
|
|
139
|
+
async collectStats() {
|
|
140
|
+
if (!this.client)
|
|
141
|
+
throw new Error("Client not initialized");
|
|
142
|
+
if (!this.client.shard) {
|
|
143
|
+
const guilds = this.client.guilds.cache;
|
|
144
|
+
return {
|
|
145
|
+
botId: this.config.botId,
|
|
146
|
+
serverCount: guilds.size,
|
|
147
|
+
userCount: guilds.reduce((acc, g) => acc + (g.memberCount || 0), 0),
|
|
148
|
+
shardCount: 1,
|
|
149
|
+
timestamp: Date.now(),
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
this.log("📡 Collecting stats from all shards via broadcastEval...");
|
|
153
|
+
const results = (await this.client.shard.broadcastEval((c) => {
|
|
154
|
+
return {
|
|
155
|
+
guilds: c.guilds.cache.size,
|
|
156
|
+
users: c.guilds.cache.reduce((acc, g) => acc + (g.memberCount || 0), 0),
|
|
157
|
+
};
|
|
158
|
+
}));
|
|
159
|
+
const totalGuilds = results.reduce((acc, res) => acc + res.guilds, 0);
|
|
160
|
+
const totalUsers = results.reduce((acc, res) => acc + res.users, 0);
|
|
134
161
|
return {
|
|
135
162
|
botId: this.config.botId,
|
|
136
|
-
serverCount:
|
|
137
|
-
userCount:
|
|
138
|
-
shardCount: this.client.shard
|
|
163
|
+
serverCount: totalGuilds,
|
|
164
|
+
userCount: totalUsers,
|
|
165
|
+
shardCount: this.client.shard.count,
|
|
139
166
|
timestamp: Date.now(),
|
|
140
167
|
};
|
|
141
168
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAoC,MAAM,OAAO,CAAC;AAqEzD,MAAM,OAAO,eAAe;IAe1B,YAAY,MAAqB;QAdzB,WAAM,GAAkB,IAAI,CAAC;QAG7B,oBAAe,GAA0B,IAAI,CAAC;QAC9C,wBAAmB,GAA0B,IAAI,CAAC;QAClD,cAAS,GAAY,KAAK,CAAC;QAC3B,mBAAc,GAAW,CAAC,CAAC;QAC3B,gBAAW,GAAW,MAAM,CAAC;QAQnC,IAAI,CAAC,MAAM,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,MAAM;YAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAE3D,IAAI,CAAC,MAAM,GAAG;YACZ,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,sDAAsD;YAC9D,cAAc,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;YAC9B,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;YAC5B,aAAa,EAAE,CAAC;YAChB,UAAU,EAAE,IAAI;SACjB,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC3B,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC7C,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,sCAAsC,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG;aACzE;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3E,CAAC;IAOM,KAAK,CAAC,MAAc;QACzB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAE3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAEtB,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACrB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClC,CAAC;IAKM,IAAI;QACT,IAAI,IAAI,CAAC,eAAe;YAAE,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,IAAI,IAAI,CAAC,mBAAmB;YAAE,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAEtE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClC,CAAC;IAKM,KAAK,CAAC,SAAS;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED