@amatiscorp/disguard 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 +109 -3
- package/dist/AntiSpam.d.ts +17 -5
- package/dist/AntiSpam.d.ts.map +1 -1
- package/dist/AntiSpam.js +103 -18
- package/dist/AntiSpam.js.map +1 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +33 -0
- package/dist/defaults.js.map +1 -1
- package/dist/detectors/files.d.ts +4 -0
- package/dist/detectors/files.d.ts.map +1 -0
- package/dist/detectors/files.js +42 -0
- package/dist/detectors/files.js.map +1 -0
- package/dist/detectors/links.d.ts +2 -0
- package/dist/detectors/links.d.ts.map +1 -1
- package/dist/detectors/links.js +26 -5
- package/dist/detectors/links.js.map +1 -1
- package/dist/detectors/newlines.d.ts +3 -0
- package/dist/detectors/newlines.d.ts.map +1 -0
- package/dist/detectors/newlines.js +25 -0
- package/dist/detectors/newlines.js.map +1 -0
- package/dist/detectors/zalgo.d.ts +3 -0
- package/dist/detectors/zalgo.d.ts.map +1 -0
- package/dist/detectors/zalgo.js +25 -0
- package/dist/detectors/zalgo.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/store/MemoryStore.d.ts +2 -0
- package/dist/store/MemoryStore.d.ts.map +1 -1
- package/dist/store/MemoryStore.js +14 -2
- package/dist/store/MemoryStore.js.map +1 -1
- package/dist/types.d.ts +35 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/normalize.d.ts +2 -0
- package/dist/utils/normalize.d.ts.map +1 -1
- package/dist/utils/normalize.js +8 -0
- package/dist/utils/normalize.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -21,8 +21,49 @@ Detects flood, repeated text, phishing / unwanted links, duplicate images, menti
|
|
|
21
21
|
|
|
22
22
|
# English
|
|
23
23
|
|
|
24
|
+
## What's new in 1.1.0
|
|
25
|
+
|
|
26
|
+
- **Punishment cooldown** — after a strike, Disguard waits `punishment.cooldownMs` (8s by default) before warning / timeout / kick / ban again. Extra spam in that window is deleted quietly. This stops the “4 timeouts in one flood” you saw in 1.0.0.
|
|
27
|
+
- **Per-guild config** — `setGuildConfig(guildId, patch)`, `getGuildConfig`, `clearGuildConfig`.
|
|
28
|
+
- **Custom detectors** — `antispam.use({ type, inspect })`.
|
|
29
|
+
- **Stats** — `getStats()` / `resetStats()`.
|
|
30
|
+
- **New detectors:** dangerous files (`.exe`, `.bat`, …), zalgo / stacked diacritics, newline walls.
|
|
31
|
+
- **Links in embeds** — phishing checks also read embed title, description, fields and footer.
|
|
32
|
+
- `isCoolingDown(guildId, userId)`.
|
|
33
|
+
|
|
34
|
+
```js
|
|
35
|
+
antispam.setGuildConfig("123456789", {
|
|
36
|
+
flood: { maxMessages: 3 },
|
|
37
|
+
links: { blockInvites: true },
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
antispam.use({
|
|
41
|
+
type: "flood",
|
|
42
|
+
inspect({ message, snapshot }) {
|
|
43
|
+
if (message.content.includes("raid-now")) {
|
|
44
|
+
return {
|
|
45
|
+
type: "flood",
|
|
46
|
+
severity: "critical",
|
|
47
|
+
userId: message.author.id,
|
|
48
|
+
guildId: message.guild.id,
|
|
49
|
+
channelId: snapshot.channelId,
|
|
50
|
+
messageId: snapshot.id,
|
|
51
|
+
reason: "Custom raid keyword",
|
|
52
|
+
details: {},
|
|
53
|
+
recommendedActions: ["delete", "timeout"],
|
|
54
|
+
timestamp: snapshot.timestamp,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
console.log(antispam.getStats());
|
|
62
|
+
```
|
|
63
|
+
|
|
24
64
|
## Table of contents
|
|
25
65
|
|
|
66
|
+
- [What's new in 1.1.0](#whats-new-in-110)
|
|
26
67
|
- [Features](#features)
|
|
27
68
|
- [Requirements](#requirements)
|
|
28
69
|
- [Install](#install)
|
|
@@ -51,6 +92,9 @@ Detects flood, repeated text, phishing / unwanted links, duplicate images, menti
|
|
|
51
92
|
| **mention** | `@everyone`, `@here`, too many unique mentions |
|
|
52
93
|
| **caps** | Messages that are mostly uppercase |
|
|
53
94
|
| **emoji** | Too many emojis or stickers in one message |
|
|
95
|
+
| **file** | Dangerous attachments (`.exe`, `.bat`, `.dll`, `.msi`, …) |
|
|
96
|
+
| **zalgo** | Obfuscated / zalgo text (stacked combining marks) |
|
|
97
|
+
| **newline** | Message walls made of empty lines |
|
|
54
98
|
|
|
55
99
|
Also included:
|
|
56
100
|
|
|
@@ -183,7 +227,7 @@ Enable **Message Content Intent** in the [Discord Developer Portal](https://disc
|
|
|
183
227
|
|
|
184
228
|
1. Ignores bots, webhooks, the owner, administrators, and anything in your ignore lists.
|
|
185
229
|
2. Keeps a short **in-memory** history per user and guild (no database).
|
|
186
|
-
3. Runs detectors in this order: flood → duplicates → links → images → mentions → caps → emojis. The first match wins.
|
|
230
|
+
3. Runs detectors in this order: files → flood → duplicates → links → images → mentions → zalgo → newlines → caps → emojis. The first match wins.
|
|
187
231
|
4. Adds one strike (with optional decay) and applies the configured punishment.
|
|
188
232
|
5. Message edits only re-check **links** and **mentions**, so editing `hello` into a phishing URL is still caught without counting as flood.
|
|
189
233
|
|
|
@@ -373,6 +417,28 @@ emojis: {
|
|
|
373
417
|
}
|
|
374
418
|
```
|
|
375
419
|
|
|
420
|
+
### Files, zalgo, newlines
|
|
421
|
+
|
|
422
|
+
```js
|
|
423
|
+
files: {
|
|
424
|
+
enabled: true,
|
|
425
|
+
blockedExtensions: ["exe", "bat", "cmd", "com", "scr", "dll", "msi", "vbs", "ps1", "jar", "apk"],
|
|
426
|
+
severity: "critical",
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
zalgo: {
|
|
430
|
+
enabled: true,
|
|
431
|
+
maxCombining: 20,
|
|
432
|
+
severity: "medium",
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
newlines: {
|
|
436
|
+
enabled: true,
|
|
437
|
+
maxNewlines: 15,
|
|
438
|
+
severity: "low",
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
|
|
376
442
|
### Punishment
|
|
377
443
|
|
|
378
444
|
Kick and ban stay **disabled** on purpose. Turn them on only if you really want that.
|
|
@@ -389,6 +455,8 @@ punishment: {
|
|
|
389
455
|
escalate: true,
|
|
390
456
|
logChannelId: "CHANNEL_ID_OR_NULL",
|
|
391
457
|
strikeDecayMs: 15 * 60_000, // strikes expire after 15 minutes
|
|
458
|
+
cooldownMs: 8_000, // no second timeout/warn during this window
|
|
459
|
+
deleteDuringCooldown: true, // still delete extra spam quietly
|
|
392
460
|
}
|
|
393
461
|
```
|
|
394
462
|
|
|
@@ -460,6 +528,15 @@ antispam.setConfig({ flood: { maxMessages: 8 } }); // deep merge, other keys sta
|
|
|
460
528
|
|
|
461
529
|
antispam.getStrikes(guildId, userId);
|
|
462
530
|
antispam.resetUser(guildId, userId);
|
|
531
|
+
antispam.isCoolingDown(guildId, userId);
|
|
532
|
+
|
|
533
|
+
antispam.setGuildConfig(guildId, { flood: { maxMessages: 3 } });
|
|
534
|
+
antispam.getGuildConfig(guildId);
|
|
535
|
+
antispam.clearGuildConfig(guildId);
|
|
536
|
+
|
|
537
|
+
antispam.use(customDetector);
|
|
538
|
+
antispam.getStats();
|
|
539
|
+
antispam.resetStats();
|
|
463
540
|
|
|
464
541
|
// Analyze only — no punishment, no callbacks
|
|
465
542
|
const incident = await antispam.analyze(message);
|
|
@@ -591,6 +668,9 @@ Wait a few seconds between categories so flood does not eat the next test.
|
|
|
591
668
|
| Mentions | `@everyone`, `@here`, or 7 different users |
|
|
592
669
|
| Caps | `THIS IS A MESSAGE IN ALL CAPS` (16+ letters) |
|
|
593
670
|
| Emojis | 13+ emojis, or 4 stickers |
|
|
671
|
+
| File | Upload a dummy `.exe` or `.bat` |
|
|
672
|
+
| Zalgo | Text with many stacked combining marks |
|
|
673
|
+
| Newlines | A message with more than 15 line breaks |
|
|
594
674
|
| Edit | Send `hello`, then edit it to `Free Nitro https://bit.ly/test` |
|
|
595
675
|
|
|
596
676
|
Watch the terminal: `[detect] flood|duplicate|link|image|mention|caps|emoji`.
|
|
@@ -634,8 +714,19 @@ MIT
|
|
|
634
714
|
|
|
635
715
|
# Español
|
|
636
716
|
|
|
717
|
+
## Novedades de 1.1.0
|
|
718
|
+
|
|
719
|
+
- **Cooldown de castigo** — tras un strike espera `punishment.cooldownMs` (8s por defecto) antes de volver a avisar o timeout. El spam extra de esa ventana se borra en silencio. Así no salen 4 timeouts en el mismo flood.
|
|
720
|
+
- **Config por servidor** — `setGuildConfig`, `getGuildConfig`, `clearGuildConfig`.
|
|
721
|
+
- **Detectores propios** — `antispam.use({ type, inspect })`.
|
|
722
|
+
- **Estadísticas** — `getStats()` / `resetStats()`.
|
|
723
|
+
- **Nuevos detectores:** archivos peligrosos, zalgo, paredes de saltos de línea.
|
|
724
|
+
- **Enlaces en embeds** — también se revisan título, descripción, fields y footer.
|
|
725
|
+
- `isCoolingDown(guildId, userId)`.
|
|
726
|
+
|
|
637
727
|
## Tabla de contenidos
|
|
638
728
|
|
|
729
|
+
- [Novedades de 1.1.0](#novedades-de-110)
|
|
639
730
|
- [Qué es](#qué-es)
|
|
640
731
|
- [Requisitos](#requisitos)
|
|
641
732
|
- [Instalación](#instalación)
|
|
@@ -657,7 +748,7 @@ MIT
|
|
|
657
748
|
|
|
658
749
|
**Disguard** es una librería antispam para bots de discord.js v14. No es un bot: la enchufas a tu `Client` y tú decides umbrales, listas y castigos.
|
|
659
750
|
|
|
660
|
-
Detecta flood, texto repetido, phishing / enlaces no deseados, imágenes repetidas, spam de menciones, mayúsculas y
|
|
751
|
+
Detecta flood, texto repetido, phishing / enlaces no deseados (también en embeds), imágenes repetidas, spam de menciones, mayúsculas, emojis, archivos peligrosos, zalgo y paredes de líneas.
|
|
661
752
|
|
|
662
753
|
## Requisitos
|
|
663
754
|
|
|
@@ -878,6 +969,14 @@ caps: { enabled: true, minLength: 16, maxPercent: 75, severity: "low" },
|
|
|
878
969
|
emojis: { enabled: true, maxEmojis: 12, maxStickers: 3, severity: "low" },
|
|
879
970
|
```
|
|
880
971
|
|
|
972
|
+
### Archivos, zalgo, saltos de línea
|
|
973
|
+
|
|
974
|
+
```js
|
|
975
|
+
files: { enabled: true, blockedExtensions: ["exe", "bat", "cmd", "dll", "msi"], severity: "critical" },
|
|
976
|
+
zalgo: { enabled: true, maxCombining: 20, severity: "medium" },
|
|
977
|
+
newlines: { enabled: true, maxNewlines: 15, severity: "low" },
|
|
978
|
+
```
|
|
979
|
+
|
|
881
980
|
### Castigos
|
|
882
981
|
|
|
883
982
|
Kick y ban van **apagados**. Actívalos solo si lo tienes claro.
|
|
@@ -894,6 +993,8 @@ punishment: {
|
|
|
894
993
|
escalate: true,
|
|
895
994
|
logChannelId: "ID_O_NULL",
|
|
896
995
|
strikeDecayMs: 15 * 60_000,
|
|
996
|
+
cooldownMs: 8_000,
|
|
997
|
+
deleteDuringCooldown: true,
|
|
897
998
|
}
|
|
898
999
|
```
|
|
899
1000
|
|
|
@@ -927,6 +1028,8 @@ antispam.getConfig();
|
|
|
927
1028
|
antispam.setConfig({ flood: { maxMessages: 8 } });
|
|
928
1029
|
antispam.getStrikes(guildId, userId);
|
|
929
1030
|
antispam.resetUser(guildId, userId);
|
|
1031
|
+
antispam.setGuildConfig(guildId, { flood: { maxMessages: 3 } });
|
|
1032
|
+
antispam.getStats();
|
|
930
1033
|
|
|
931
1034
|
const incident = await antispam.analyze(message);
|
|
932
1035
|
const editado = await antispam.analyze(message, { isEdit: true });
|
|
@@ -991,9 +1094,12 @@ Espera unos segundos entre categorías.
|
|
|
991
1094
|
| Menciones | `@everyone`, `@here`, o 7 usuarios |
|
|
992
1095
|
| Caps | `ESTO ES UN MENSAJE TODO EN MAYUSCULAS` |
|
|
993
1096
|
| Emojis | Más de 12 emojis, o 4 stickers |
|
|
1097
|
+
| Archivo | Sube un `.exe` o `.bat` (aunque sea de mentira) |
|
|
1098
|
+
| Zalgo | Texto con muchos diacríticos apilados |
|
|
1099
|
+
| Líneas | Un mensaje con más de 15 enters |
|
|
994
1100
|
| Edición | Manda `hola` y edítalo a `Free Nitro https://bit.ly/test` |
|
|
995
1101
|
|
|
996
|
-
En la terminal: `[detect] flood|duplicate|link|image|mention|caps|emoji`.
|
|
1102
|
+
En la terminal: `[detect] flood|duplicate|link|image|mention|caps|emoji|file|zalgo|newline`.
|
|
997
1103
|
|
|
998
1104
|
Al segundo strike el ejemplo mete timeout de 1 minuto. Los strikes caducan a los 15 minutos, o usa `resetUser`.
|
|
999
1105
|
|
package/dist/AntiSpam.d.ts
CHANGED
|
@@ -1,34 +1,46 @@
|
|
|
1
1
|
import { type Client, type Message } from "discord.js";
|
|
2
2
|
import { MemoryStore } from "./store/MemoryStore";
|
|
3
|
-
import type { AntiSpamOptions, DeepPartial, Incident, ResolvedConfig } from "./types";
|
|
3
|
+
import type { AntiSpamOptions, AntiSpamStats, DeepPartial, Detector, Incident, ResolvedConfig } from "./types";
|
|
4
4
|
export declare class AntiSpam {
|
|
5
5
|
readonly client: Client;
|
|
6
6
|
readonly store: MemoryStore;
|
|
7
7
|
private config;
|
|
8
8
|
private readonly detectors;
|
|
9
9
|
private readonly options;
|
|
10
|
+
private readonly guildConfigs;
|
|
11
|
+
private stats;
|
|
10
12
|
private started;
|
|
11
13
|
private cleanupTimer;
|
|
12
14
|
private readonly onMessage;
|
|
13
15
|
private readonly onEdit;
|
|
14
16
|
constructor(client: Client, options?: AntiSpamOptions);
|
|
15
|
-
/**
|
|
17
|
+
/** Starts listening to `messageCreate` (and `messageUpdate` if enabled). */
|
|
16
18
|
start(): this;
|
|
17
|
-
/**
|
|
19
|
+
/** Stops listening. Call this on shutdown. */
|
|
18
20
|
stop(): this;
|
|
21
|
+
/** Adds a custom detector. It runs after the built-in ones. */
|
|
22
|
+
use(detector: Detector): this;
|
|
19
23
|
getConfig(): ResolvedConfig;
|
|
20
24
|
setConfig(patch: DeepPartial<ResolvedConfig>): ResolvedConfig;
|
|
25
|
+
/** Global defaults + this guild's overrides. */
|
|
26
|
+
getGuildConfig(guildId: string): ResolvedConfig;
|
|
27
|
+
setGuildConfig(guildId: string, patch: DeepPartial<ResolvedConfig>): ResolvedConfig;
|
|
28
|
+
clearGuildConfig(guildId: string): void;
|
|
21
29
|
getStrikes(guildId: string, userId: string): number;
|
|
30
|
+
isCoolingDown(guildId: string, userId: string): boolean;
|
|
22
31
|
resetUser(guildId: string, userId: string): void;
|
|
32
|
+
getStats(): AntiSpamStats;
|
|
33
|
+
resetStats(): void;
|
|
23
34
|
/**
|
|
24
|
-
*
|
|
25
|
-
*
|
|
35
|
+
* Analyzes a message without punishing.
|
|
36
|
+
* Useful for tests or your own sanction pipeline.
|
|
26
37
|
*/
|
|
27
38
|
analyze(message: Message, options?: {
|
|
28
39
|
isEdit?: boolean;
|
|
29
40
|
}): Promise<Incident | null>;
|
|
30
41
|
private handle;
|
|
31
42
|
shouldIgnore(message: Message): boolean;
|
|
43
|
+
private configFor;
|
|
32
44
|
private toSnapshot;
|
|
33
45
|
private maxRetentionMs;
|
|
34
46
|
}
|
package/dist/AntiSpam.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AntiSpam.d.ts","sourceRoot":"","sources":["../src/AntiSpam.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"AntiSpam.d.ts","sourceRoot":"","sources":["../src/AntiSpam.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AAapB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAEV,eAAe,EACf,aAAa,EACb,WAAW,EACX,QAAQ,EAER,QAAQ,EAER,cAAc,EACf,MAAM,SAAS,CAAC;AA4BjB,qBAAa,QAAQ;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,cAAqB;IAEnC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkD;IAC/E,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAA+B;IAEnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IAEF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGrB;gBAEU,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB;IAmBzD,4EAA4E;IAC5E,KAAK,IAAI,IAAI;IAcb,8CAA8C;IAC9C,IAAI,IAAI,IAAI;IAYZ,+DAA+D;IAC/D,GAAG,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAK7B,SAAS,IAAI,cAAc;IAI3B,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,cAAc;IAK7D,gDAAgD;IAChD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc;IAI/C,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,cAAc,CAAC,GAAG,cAAc;IAMnF,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIvC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IASnD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAKvD,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhD,QAAQ,IAAI,aAAa;IAIzB,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;YAwC/E,MAAM;IAkDpB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IA4BvC,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,cAAc;CAUvB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,QAAQ,CAElF"}
|
package/dist/AntiSpam.js
CHANGED
|
@@ -7,19 +7,46 @@ const defaults_1 = require("./defaults");
|
|
|
7
7
|
const caps_1 = require("./detectors/caps");
|
|
8
8
|
const duplicates_1 = require("./detectors/duplicates");
|
|
9
9
|
const emojis_1 = require("./detectors/emojis");
|
|
10
|
+
const files_1 = require("./detectors/files");
|
|
10
11
|
const flood_1 = require("./detectors/flood");
|
|
11
12
|
const images_1 = require("./detectors/images");
|
|
12
13
|
const links_1 = require("./detectors/links");
|
|
13
14
|
const mentions_1 = require("./detectors/mentions");
|
|
15
|
+
const newlines_1 = require("./detectors/newlines");
|
|
16
|
+
const zalgo_1 = require("./detectors/zalgo");
|
|
14
17
|
const enforcement_1 = require("./enforcement");
|
|
15
18
|
const MemoryStore_1 = require("./store/MemoryStore");
|
|
16
19
|
const normalize_1 = require("./utils/normalize");
|
|
20
|
+
const DETECTOR_TYPES = [
|
|
21
|
+
"flood",
|
|
22
|
+
"duplicate",
|
|
23
|
+
"link",
|
|
24
|
+
"image",
|
|
25
|
+
"mention",
|
|
26
|
+
"caps",
|
|
27
|
+
"emoji",
|
|
28
|
+
"file",
|
|
29
|
+
"zalgo",
|
|
30
|
+
"newline",
|
|
31
|
+
];
|
|
32
|
+
const ACTION_TYPES = ["delete", "warn", "timeout", "kick", "ban"];
|
|
33
|
+
function emptyStats() {
|
|
34
|
+
return {
|
|
35
|
+
analyzed: 0,
|
|
36
|
+
incidents: 0,
|
|
37
|
+
suppressed: 0,
|
|
38
|
+
byType: Object.fromEntries(DETECTOR_TYPES.map((type) => [type, 0])),
|
|
39
|
+
actions: Object.fromEntries(ACTION_TYPES.map((type) => [type, 0])),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
17
42
|
class AntiSpam {
|
|
18
43
|
client;
|
|
19
44
|
store = new MemoryStore_1.MemoryStore();
|
|
20
45
|
config;
|
|
21
46
|
detectors;
|
|
22
47
|
options;
|
|
48
|
+
guildConfigs = new Map();
|
|
49
|
+
stats = emptyStats();
|
|
23
50
|
started = false;
|
|
24
51
|
cleanupTimer = null;
|
|
25
52
|
onMessage = (message) => {
|
|
@@ -36,16 +63,19 @@ class AntiSpam {
|
|
|
36
63
|
const { preset, onDetect: _onDetect, onAction: _onAction, onError: _onError, ...configOptions } = options;
|
|
37
64
|
this.config = (0, defaults_1.resolveConfig)(preset, configOptions);
|
|
38
65
|
this.detectors = [
|
|
66
|
+
files_1.fileDetector,
|
|
39
67
|
flood_1.floodDetector,
|
|
40
68
|
duplicates_1.duplicateDetector,
|
|
41
69
|
links_1.linkDetector,
|
|
42
70
|
(0, images_1.createImageDetector)(this.store),
|
|
43
71
|
mentions_1.mentionDetector,
|
|
72
|
+
zalgo_1.zalgoDetector,
|
|
73
|
+
newlines_1.newlineDetector,
|
|
44
74
|
caps_1.capsDetector,
|
|
45
75
|
emojis_1.emojiDetector,
|
|
46
76
|
];
|
|
47
77
|
}
|
|
48
|
-
/**
|
|
78
|
+
/** Starts listening to `messageCreate` (and `messageUpdate` if enabled). */
|
|
49
79
|
start() {
|
|
50
80
|
if (this.started)
|
|
51
81
|
return this;
|
|
@@ -60,7 +90,7 @@ class AntiSpam {
|
|
|
60
90
|
this.started = true;
|
|
61
91
|
return this;
|
|
62
92
|
}
|
|
63
|
-
/**
|
|
93
|
+
/** Stops listening. Call this on shutdown. */
|
|
64
94
|
stop() {
|
|
65
95
|
if (!this.started)
|
|
66
96
|
return this;
|
|
@@ -73,6 +103,11 @@ class AntiSpam {
|
|
|
73
103
|
this.started = false;
|
|
74
104
|
return this;
|
|
75
105
|
}
|
|
106
|
+
/** Adds a custom detector. It runs after the built-in ones. */
|
|
107
|
+
use(detector) {
|
|
108
|
+
this.detectors.push(detector);
|
|
109
|
+
return this;
|
|
110
|
+
}
|
|
76
111
|
getConfig() {
|
|
77
112
|
return structuredClone(this.config);
|
|
78
113
|
}
|
|
@@ -80,26 +115,50 @@ class AntiSpam {
|
|
|
80
115
|
this.config = (0, defaults_1.mergeDeep)(this.config, patch);
|
|
81
116
|
return this.getConfig();
|
|
82
117
|
}
|
|
118
|
+
/** Global defaults + this guild's overrides. */
|
|
119
|
+
getGuildConfig(guildId) {
|
|
120
|
+
return structuredClone(this.configFor(guildId));
|
|
121
|
+
}
|
|
122
|
+
setGuildConfig(guildId, patch) {
|
|
123
|
+
const previous = this.guildConfigs.get(guildId) ?? {};
|
|
124
|
+
this.guildConfigs.set(guildId, (0, defaults_1.mergeDeep)(previous, patch));
|
|
125
|
+
return this.getGuildConfig(guildId);
|
|
126
|
+
}
|
|
127
|
+
clearGuildConfig(guildId) {
|
|
128
|
+
this.guildConfigs.delete(guildId);
|
|
129
|
+
}
|
|
83
130
|
getStrikes(guildId, userId) {
|
|
84
|
-
return this.store.getStrikes(guildId, userId, Date.now(), this.
|
|
131
|
+
return this.store.getStrikes(guildId, userId, Date.now(), this.configFor(guildId).punishment.strikeDecayMs);
|
|
132
|
+
}
|
|
133
|
+
isCoolingDown(guildId, userId) {
|
|
134
|
+
const config = this.configFor(guildId);
|
|
135
|
+
return this.store.isCoolingDown(guildId, userId, Date.now(), config.punishment.cooldownMs);
|
|
85
136
|
}
|
|
86
137
|
resetUser(guildId, userId) {
|
|
87
138
|
this.store.resetUser(guildId, userId);
|
|
88
139
|
}
|
|
140
|
+
getStats() {
|
|
141
|
+
return structuredClone(this.stats);
|
|
142
|
+
}
|
|
143
|
+
resetStats() {
|
|
144
|
+
this.stats = emptyStats();
|
|
145
|
+
}
|
|
89
146
|
/**
|
|
90
|
-
*
|
|
91
|
-
*
|
|
147
|
+
* Analyzes a message without punishing.
|
|
148
|
+
* Useful for tests or your own sanction pipeline.
|
|
92
149
|
*/
|
|
93
150
|
async analyze(message, options = {}) {
|
|
94
151
|
if (this.shouldIgnore(message))
|
|
95
152
|
return null;
|
|
96
153
|
if (!message.guild)
|
|
97
154
|
return null;
|
|
155
|
+
const config = this.configFor(message.guild.id);
|
|
98
156
|
const now = Date.now();
|
|
99
157
|
const snapshot = this.toSnapshot(message, now);
|
|
100
158
|
const history = options.isEdit
|
|
101
|
-
? this.store.getHistory(message.guild.id, message.author.id, now, this.maxRetentionMs())
|
|
102
|
-
: this.store.pushMessage(message.guild.id, message.author.id, snapshot, this.maxRetentionMs());
|
|
159
|
+
? this.store.getHistory(message.guild.id, message.author.id, now, this.maxRetentionMs(config))
|
|
160
|
+
: this.store.pushMessage(message.guild.id, message.author.id, snapshot, this.maxRetentionMs(config));
|
|
161
|
+
this.stats.analyzed += 1;
|
|
103
162
|
const detectors = options.isEdit
|
|
104
163
|
? this.detectors.filter((detector) => detector.type === "link" || detector.type === "mention")
|
|
105
164
|
: this.detectors;
|
|
@@ -109,7 +168,7 @@ class AntiSpam {
|
|
|
109
168
|
message,
|
|
110
169
|
snapshot,
|
|
111
170
|
history,
|
|
112
|
-
config
|
|
171
|
+
config,
|
|
113
172
|
now,
|
|
114
173
|
});
|
|
115
174
|
if (incident)
|
|
@@ -122,17 +181,38 @@ class AntiSpam {
|
|
|
122
181
|
return null;
|
|
123
182
|
}
|
|
124
183
|
async handle(message, isEdit) {
|
|
125
|
-
|
|
184
|
+
const config = message.guild ? this.configFor(message.guild.id) : this.config;
|
|
185
|
+
if (!config.enabled)
|
|
186
|
+
return;
|
|
187
|
+
if (isEdit && !config.checkEdits)
|
|
126
188
|
return;
|
|
127
|
-
if (
|
|
189
|
+
if (this.shouldIgnore(message))
|
|
190
|
+
return;
|
|
191
|
+
if (!message.guild)
|
|
128
192
|
return;
|
|
129
193
|
try {
|
|
194
|
+
if (this.store.isCoolingDown(message.guild.id, message.author.id, Date.now(), config.punishment.cooldownMs)) {
|
|
195
|
+
this.stats.suppressed += 1;
|
|
196
|
+
if (!isEdit) {
|
|
197
|
+
this.store.pushMessage(message.guild.id, message.author.id, this.toSnapshot(message, Date.now()), this.maxRetentionMs(config));
|
|
198
|
+
}
|
|
199
|
+
if (config.punishment.deleteDuringCooldown && !config.dryRun && message.deletable) {
|
|
200
|
+
await message.delete().catch((error) => this.options.onError?.(error, "cooldown-delete"));
|
|
201
|
+
}
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
130
204
|
const incident = await this.analyze(message, { isEdit });
|
|
131
205
|
if (!incident)
|
|
132
206
|
return;
|
|
207
|
+
this.stats.incidents += 1;
|
|
208
|
+
this.stats.byType[incident.type] += 1;
|
|
133
209
|
await this.options.onDetect?.(incident, message);
|
|
134
|
-
const strikes = this.store.addStrike(incident.guildId, incident.userId, Date.now(),
|
|
135
|
-
const result = await (0, enforcement_1.applyPunishment)(message, incident, strikes,
|
|
210
|
+
const strikes = this.store.addStrike(incident.guildId, incident.userId, Date.now(), config.punishment.strikeDecayMs);
|
|
211
|
+
const result = await (0, enforcement_1.applyPunishment)(message, incident, strikes, config);
|
|
212
|
+
this.store.markAction(incident.guildId, incident.userId, Date.now());
|
|
213
|
+
for (const action of result.applied) {
|
|
214
|
+
this.stats.actions[action] += 1;
|
|
215
|
+
}
|
|
136
216
|
await this.options.onAction?.(result);
|
|
137
217
|
}
|
|
138
218
|
catch (error) {
|
|
@@ -140,7 +220,7 @@ class AntiSpam {
|
|
|
140
220
|
}
|
|
141
221
|
}
|
|
142
222
|
shouldIgnore(message) {
|
|
143
|
-
const
|
|
223
|
+
const config = message.guild ? this.configFor(message.guild.id) : this.config;
|
|
144
224
|
if (message.author.bot && config.ignoreBots)
|
|
145
225
|
return true;
|
|
146
226
|
if (message.webhookId && config.ignoreWebhooks)
|
|
@@ -169,6 +249,10 @@ class AntiSpam {
|
|
|
169
249
|
}
|
|
170
250
|
return false;
|
|
171
251
|
}
|
|
252
|
+
configFor(guildId) {
|
|
253
|
+
const patch = this.guildConfigs.get(guildId);
|
|
254
|
+
return patch ? (0, defaults_1.mergeDeep)(this.config, patch) : this.config;
|
|
255
|
+
}
|
|
172
256
|
toSnapshot(message, now) {
|
|
173
257
|
return {
|
|
174
258
|
id: message.id,
|
|
@@ -179,12 +263,13 @@ class AntiSpam {
|
|
|
179
263
|
attachmentHashes: [],
|
|
180
264
|
};
|
|
181
265
|
}
|
|
182
|
-
maxRetentionMs() {
|
|
266
|
+
maxRetentionMs(config = this.config) {
|
|
183
267
|
const windows = [
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
268
|
+
config.flood.windowMs,
|
|
269
|
+
config.duplicates.windowMs,
|
|
270
|
+
config.images.windowMs,
|
|
271
|
+
config.punishment.strikeDecayMs,
|
|
272
|
+
config.punishment.cooldownMs,
|
|
188
273
|
];
|
|
189
274
|
return Math.max(30_000, ...windows);
|
|
190
275
|
}
|
package/dist/AntiSpam.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AntiSpam.js","sourceRoot":"","sources":["../src/AntiSpam.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AntiSpam.js","sourceRoot":"","sources":["../src/AntiSpam.ts"],"names":[],"mappings":"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"}
|
package/dist/defaults.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,cAAc,EACf,MAAM,SAAS,CAAC;AA+LjB,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAuBlE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,UAAU,GAAG,SAAS,EAC9B,OAAO,GAAE,WAAW,CAAC,cAAc,CAAM,GACxC,cAAc,CAGhB;AAED,eAAO,MAAM,cAAc,gBAAO,CAAC"}
|
package/dist/defaults.js
CHANGED
|
@@ -92,6 +92,33 @@ const BASE = {
|
|
|
92
92
|
maxStickers: 3,
|
|
93
93
|
severity: "low",
|
|
94
94
|
},
|
|
95
|
+
files: {
|
|
96
|
+
enabled: true,
|
|
97
|
+
blockedExtensions: [
|
|
98
|
+
"exe",
|
|
99
|
+
"bat",
|
|
100
|
+
"cmd",
|
|
101
|
+
"com",
|
|
102
|
+
"scr",
|
|
103
|
+
"dll",
|
|
104
|
+
"msi",
|
|
105
|
+
"vbs",
|
|
106
|
+
"ps1",
|
|
107
|
+
"jar",
|
|
108
|
+
"apk",
|
|
109
|
+
],
|
|
110
|
+
severity: "critical",
|
|
111
|
+
},
|
|
112
|
+
zalgo: {
|
|
113
|
+
enabled: true,
|
|
114
|
+
maxCombining: 20,
|
|
115
|
+
severity: "medium",
|
|
116
|
+
},
|
|
117
|
+
newlines: {
|
|
118
|
+
enabled: true,
|
|
119
|
+
maxNewlines: 15,
|
|
120
|
+
severity: "low",
|
|
121
|
+
},
|
|
95
122
|
punishment: {
|
|
96
123
|
deleteMessage: true,
|
|
97
124
|
warnUser: true,
|
|
@@ -113,6 +140,8 @@ const BASE = {
|
|
|
113
140
|
escalate: true,
|
|
114
141
|
logChannelId: null,
|
|
115
142
|
strikeDecayMs: 15 * 60_000,
|
|
143
|
+
cooldownMs: 8_000,
|
|
144
|
+
deleteDuringCooldown: true,
|
|
116
145
|
},
|
|
117
146
|
checkEdits: true,
|
|
118
147
|
cleanupIntervalMs: 60_000,
|
|
@@ -125,6 +154,8 @@ const PRESET_OVERRIDES = {
|
|
|
125
154
|
mentions: { maxMentions: 10, blockEveryone: true },
|
|
126
155
|
caps: { enabled: false },
|
|
127
156
|
emojis: { maxEmojis: 20 },
|
|
157
|
+
zalgo: { enabled: false },
|
|
158
|
+
newlines: { maxNewlines: 25 },
|
|
128
159
|
links: {
|
|
129
160
|
blockInvites: false,
|
|
130
161
|
blockShorteners: false,
|
|
@@ -141,6 +172,8 @@ const PRESET_OVERRIDES = {
|
|
|
141
172
|
mentions: { maxMentions: 3 },
|
|
142
173
|
caps: { minLength: 10, maxPercent: 65 },
|
|
143
174
|
emojis: { maxEmojis: 8, maxStickers: 2 },
|
|
175
|
+
zalgo: { maxCombining: 10 },
|
|
176
|
+
newlines: { maxNewlines: 8 },
|
|
144
177
|
links: {
|
|
145
178
|
blockInvites: true,
|
|
146
179
|
blockShorteners: true,
|
package/dist/defaults.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/detectors/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAGlE,eAAO,MAAM,0BAA0B,UAYtC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,QA2B1B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fileDetector = exports.DEFAULT_BLOCKED_EXTENSIONS = void 0;
|
|
4
|
+
const incident_1 = require("./incident");
|
|
5
|
+
exports.DEFAULT_BLOCKED_EXTENSIONS = [
|
|
6
|
+
"exe",
|
|
7
|
+
"bat",
|
|
8
|
+
"cmd",
|
|
9
|
+
"com",
|
|
10
|
+
"scr",
|
|
11
|
+
"dll",
|
|
12
|
+
"msi",
|
|
13
|
+
"vbs",
|
|
14
|
+
"ps1",
|
|
15
|
+
"jar",
|
|
16
|
+
"apk",
|
|
17
|
+
];
|
|
18
|
+
exports.fileDetector = {
|
|
19
|
+
type: "file",
|
|
20
|
+
inspect({ message, snapshot, config }) {
|
|
21
|
+
const rules = config.files;
|
|
22
|
+
if (!rules.enabled || !message.guild || message.attachments.size === 0)
|
|
23
|
+
return null;
|
|
24
|
+
const blocked = new Set(rules.blockedExtensions.map((item) => item.replace(/^\./, "").toLowerCase()));
|
|
25
|
+
for (const attachment of message.attachments.values()) {
|
|
26
|
+
const name = attachment.name ?? "";
|
|
27
|
+
const ext = name.includes(".") ? name.split(".").pop()?.toLowerCase() ?? "" : "";
|
|
28
|
+
if (!ext || !blocked.has(ext))
|
|
29
|
+
continue;
|
|
30
|
+
return (0, incident_1.createIncident)("file", snapshot, {
|
|
31
|
+
userId: message.author.id,
|
|
32
|
+
guildId: message.guild.id,
|
|
33
|
+
severity: rules.severity,
|
|
34
|
+
reason: `Archivo no permitido: .${ext}`,
|
|
35
|
+
details: { name, extension: ext, size: attachment.size },
|
|
36
|
+
recommendedActions: ["delete", "warn", "timeout"],
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/detectors/files.ts"],"names":[],"mappings":";;;AACA,yCAA4C;AAE/B,QAAA,0BAA0B,GAAG;IACxC,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAEW,QAAA,YAAY,GAAa;IACpC,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAiB;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpF,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,KAAK,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAC7E,CAAC;QAEF,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;YACnC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjF,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAExC,OAAO,IAAA,yBAAc,EAAC,MAAM,EAAE,QAAQ,EAAE;gBACtC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;gBACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;gBACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,0BAA0B,GAAG,EAAE;gBACvC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;gBACxD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/detectors/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAUlE,eAAO,MAAM,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/detectors/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAUlE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAa3D;AAED,eAAO,MAAM,YAAY,EAAE,QA6F1B,CAAC"}
|
package/dist/detectors/links.js
CHANGED
|
@@ -1,25 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.linkDetector = void 0;
|
|
4
|
+
exports.collectMessageText = collectMessageText;
|
|
4
5
|
const urls_1 = require("../utils/urls");
|
|
5
6
|
const incident_1 = require("./incident");
|
|
7
|
+
function collectMessageText(message) {
|
|
8
|
+
const parts = [message.content];
|
|
9
|
+
for (const embed of message.embeds) {
|
|
10
|
+
if (embed.url)
|
|
11
|
+
parts.push(embed.url);
|
|
12
|
+
if (embed.title)
|
|
13
|
+
parts.push(embed.title);
|
|
14
|
+
if (embed.description)
|
|
15
|
+
parts.push(embed.description);
|
|
16
|
+
if (embed.footer?.text)
|
|
17
|
+
parts.push(embed.footer.text);
|
|
18
|
+
if (embed.author?.url)
|
|
19
|
+
parts.push(embed.author.url);
|
|
20
|
+
for (const field of embed.fields) {
|
|
21
|
+
parts.push(field.name, field.value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return parts.filter(Boolean).join("\n");
|
|
25
|
+
}
|
|
6
26
|
exports.linkDetector = {
|
|
7
27
|
type: "link",
|
|
8
28
|
inspect({ message, snapshot, config }) {
|
|
9
29
|
const rules = config.links;
|
|
10
30
|
if (!rules.enabled || !message.guild)
|
|
11
31
|
return null;
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
return null;
|
|
32
|
+
const text = collectMessageText(message);
|
|
33
|
+
const urls = (0, urls_1.extractUrls)(text);
|
|
15
34
|
for (const pattern of rules.customPatterns) {
|
|
16
35
|
const regex = new RegExp(pattern, "i");
|
|
17
|
-
if (regex.test(
|
|
36
|
+
if (regex.test(text)) {
|
|
18
37
|
return flag(snapshot, message.author.id, message.guild.id, rules.severity, "El mensaje coincide con un patrón personalizado", {
|
|
19
38
|
pattern,
|
|
20
39
|
});
|
|
21
40
|
}
|
|
22
41
|
}
|
|
42
|
+
if (urls.length === 0)
|
|
43
|
+
return null;
|
|
23
44
|
for (const url of urls) {
|
|
24
45
|
if ((0, urls_1.hostMatchesList)(url.hostname, rules.allowList))
|
|
25
46
|
continue;
|
|
@@ -64,7 +85,7 @@ exports.linkDetector = {
|
|
|
64
85
|
}
|
|
65
86
|
}
|
|
66
87
|
if (rules.detectPhishingKeywords) {
|
|
67
|
-
const keyword = (0, urls_1.messageHasPhishingKeywords)(
|
|
88
|
+
const keyword = (0, urls_1.messageHasPhishingKeywords)(text, rules.extraPhishingKeywords);
|
|
68
89
|
if (keyword) {
|
|
69
90
|
return flag(snapshot, message.author.id, message.guild.id, "critical", `Posible phishing ("${keyword}" + enlace)`, { keyword, urls: urls.map((item) => item.href) });
|
|
70
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/detectors/links.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/detectors/links.ts"],"names":[],"mappings":";;;AAWA,gDAaC;AAtBD,wCAMuB;AACvB,yCAA4C;AAE5C,SAAgB,kBAAkB,CAAC,OAAgB;IACjD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,MAAM,EAAE,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAEY,QAAA,YAAY,GAAa;IACpC,IAAI,EAAE,MAAM;IACZ,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAiB;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAA,kBAAW,EAAC,IAAI,CAAC,CAAC;QAE/B,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,iDAAiD,EAAE;oBAC5H,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,IAAA,sBAAe,EAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;gBAAE,SAAS;YAE7D,IAAI,IAAA,sBAAe,EAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,sBAAsB,GAAG,CAAC,QAAQ,EAAE,EAAE;oBAC/G,GAAG,EAAE,GAAG,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,YAAY,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,oCAAoC,EAAE;oBAC/G,GAAG,EAAE,GAAG,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,eAAe,IAAI,IAAA,kBAAW,EAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACvD,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,+BAA+B,GAAG,CAAC,QAAQ,EAAE,EAAE;oBACxH,GAAG,EAAE,GAAG,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,yBAAyB,EAAE;oBACpG,GAAG,EAAE,GAAG,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,8BAA8B,EAAE;oBACzG,GAAG,EAAE,GAAG,CAAC,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,oBAAoB,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAA,qBAAc,EAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,IAAI,CACT,QAAQ,EACR,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,OAAO,CAAC,KAAK,CAAC,EAAE,EAChB,UAAU,EACV,mBAAmB,KAAK,KAAK,GAAG,CAAC,QAAQ,EAAE,EAC3C,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CACzB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAChD,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvC,OAAO,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,sBAAsB,GAAG,EAAE,EAAE;wBACtG,GAAG,EAAE,GAAG,CAAC,IAAI;qBACd,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,sBAAsB,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAA,iCAA0B,EAAC,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC9E,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,IAAI,CACT,QAAQ,EACR,OAAO,CAAC,MAAM,CAAC,EAAE,EACjB,OAAO,CAAC,KAAK,CAAC,EAAE,EAChB,UAAU,EACV,sBAAsB,OAAO,aAAa,EAC1C,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAC;AAEF,SAAS,IAAI,CACX,QAAmC,EACnC,MAAc,EACd,OAAe,EACf,QAA8B,EAC9B,MAAc,EACd,OAAgC;IAEhC,OAAO,IAAA,yBAAc,EAAC,MAAM,EAAE,QAAQ,EAAE;QACtC,MAAM;QACN,OAAO;QACP,QAAQ;QACR,MAAM;QACN,OAAO;QACP,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC;KAClD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newlines.d.ts","sourceRoot":"","sources":["../../src/detectors/newlines.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAIlE,eAAO,MAAM,eAAe,EAAE,QAkB7B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newlineDetector = void 0;
|
|
4
|
+
const normalize_1 = require("../utils/normalize");
|
|
5
|
+
const incident_1 = require("./incident");
|
|
6
|
+
exports.newlineDetector = {
|
|
7
|
+
type: "newline",
|
|
8
|
+
inspect({ message, snapshot, config }) {
|
|
9
|
+
const rules = config.newlines;
|
|
10
|
+
if (!rules.enabled || !message.guild)
|
|
11
|
+
return null;
|
|
12
|
+
const lines = (0, normalize_1.countNewlines)(message.content);
|
|
13
|
+
if (lines <= rules.maxNewlines)
|
|
14
|
+
return null;
|
|
15
|
+
return (0, incident_1.createIncident)("newline", snapshot, {
|
|
16
|
+
userId: message.author.id,
|
|
17
|
+
guildId: message.guild.id,
|
|
18
|
+
severity: rules.severity,
|
|
19
|
+
reason: `Demasiados saltos de línea (${lines}/${rules.maxNewlines})`,
|
|
20
|
+
details: { newlines: lines },
|
|
21
|
+
recommendedActions: ["delete", "warn"],
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=newlines.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"newlines.js","sourceRoot":"","sources":["../../src/detectors/newlines.ts"],"names":[],"mappings":";;;AACA,kDAAmD;AACnD,yCAA4C;AAE/B,QAAA,eAAe,GAAa;IACvC,IAAI,EAAE,SAAS;IACf,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAiB;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,KAAK,GAAG,IAAA,yBAAa,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,KAAK,IAAI,KAAK,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QAE5C,OAAO,IAAA,yBAAc,EAAC,SAAS,EAAE,QAAQ,EAAE;YACzC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;YACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,+BAA+B,KAAK,IAAI,KAAK,CAAC,WAAW,GAAG;YACpE,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC5B,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zalgo.d.ts","sourceRoot":"","sources":["../../src/detectors/zalgo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAA2B,MAAM,UAAU,CAAC;AAIlE,eAAO,MAAM,aAAa,EAAE,QAkB3B,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.zalgoDetector = void 0;
|
|
4
|
+
const normalize_1 = require("../utils/normalize");
|
|
5
|
+
const incident_1 = require("./incident");
|
|
6
|
+
exports.zalgoDetector = {
|
|
7
|
+
type: "zalgo",
|
|
8
|
+
inspect({ message, snapshot, config }) {
|
|
9
|
+
const rules = config.zalgo;
|
|
10
|
+
if (!rules.enabled || !message.guild)
|
|
11
|
+
return null;
|
|
12
|
+
const combining = (0, normalize_1.countZalgo)(message.content);
|
|
13
|
+
if (combining <= rules.maxCombining)
|
|
14
|
+
return null;
|
|
15
|
+
return (0, incident_1.createIncident)("zalgo", snapshot, {
|
|
16
|
+
userId: message.author.id,
|
|
17
|
+
guildId: message.guild.id,
|
|
18
|
+
severity: rules.severity,
|
|
19
|
+
reason: `Texto ofuscado / zalgo (${combining} marcas combinantes)`,
|
|
20
|
+
details: { combining },
|
|
21
|
+
recommendedActions: ["delete", "warn"],
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=zalgo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zalgo.js","sourceRoot":"","sources":["../../src/detectors/zalgo.ts"],"names":[],"mappings":";;;AACA,kDAAgD;AAChD,yCAA4C;AAE/B,QAAA,aAAa,GAAa;IACrC,IAAI,EAAE,OAAO;IACb,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAiB;QAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,SAAS,GAAG,IAAA,sBAAU,EAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,SAAS,IAAI,KAAK,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QAEjD,OAAO,IAAA,yBAAc,EAAC,OAAO,EAAE,QAAQ,EAAE;YACvC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YACzB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;YACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,2BAA2B,SAAS,sBAAsB;YAClE,OAAO,EAAE,EAAE,SAAS,EAAE;YACtB,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export { AntiSpam, createAntiSpam } from "./AntiSpam";
|
|
2
2
|
export { resolveConfig, DEFAULT_CONFIG, mergeDeep } from "./defaults";
|
|
3
3
|
export { MemoryStore } from "./store/MemoryStore";
|
|
4
|
+
export { DEFAULT_BLOCKED_EXTENSIONS } from "./detectors/files";
|
|
4
5
|
export { DEFAULT_PHISHING_KEYWORDS, DEFAULT_SHORTENERS, OFFICIAL_BRANDS, extractUrls, } from "./utils/urls";
|
|
5
|
-
export { normalizeText } from "./utils/normalize";
|
|
6
|
+
export { normalizeText, countZalgo, countNewlines } from "./utils/normalize";
|
|
6
7
|
export { similarity } from "./utils/similarity";
|
|
7
|
-
export type { ActionResult, ActionType, AntiSpamOptions, CapsConfig, DeepPartial, DetectorType, DuplicateConfig, EmojiConfig, FloodConfig, IgnoreLists, ImageConfig, ImageHashMode, Incident, LinkConfig, MentionConfig, PresetName, PunishmentConfig, ResolvedConfig, Severity, } from "./types";
|
|
8
|
+
export type { ActionResult, ActionType, AntiSpamOptions, AntiSpamStats, CapsConfig, DeepPartial, Detector, DetectorType, DuplicateConfig, EmojiConfig, FileConfig, FloodConfig, IgnoreLists, ImageConfig, ImageHashMode, Incident, LinkConfig, MentionConfig, NewlineConfig, PresetName, PunishmentConfig, ResolvedConfig, Severity, ZalgoConfig, } from "./types";
|
|
8
9
|
//# sourceMappingURL=index.d.ts.map
|
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,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EACL,yBAAyB,EACzB,kBAAkB,EAClB,eAAe,EACf,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,YAAY,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EACf,aAAa,EACb,UAAU,EACV,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,EACV,aAAa,EACb,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,WAAW,GACZ,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.similarity = exports.normalizeText = exports.extractUrls = exports.OFFICIAL_BRANDS = exports.DEFAULT_SHORTENERS = exports.DEFAULT_PHISHING_KEYWORDS = exports.MemoryStore = exports.mergeDeep = exports.DEFAULT_CONFIG = exports.resolveConfig = exports.createAntiSpam = exports.AntiSpam = void 0;
|
|
3
|
+
exports.similarity = exports.countNewlines = exports.countZalgo = exports.normalizeText = exports.extractUrls = exports.OFFICIAL_BRANDS = exports.DEFAULT_SHORTENERS = exports.DEFAULT_PHISHING_KEYWORDS = exports.DEFAULT_BLOCKED_EXTENSIONS = exports.MemoryStore = exports.mergeDeep = exports.DEFAULT_CONFIG = exports.resolveConfig = exports.createAntiSpam = exports.AntiSpam = void 0;
|
|
4
4
|
var AntiSpam_1 = require("./AntiSpam");
|
|
5
5
|
Object.defineProperty(exports, "AntiSpam", { enumerable: true, get: function () { return AntiSpam_1.AntiSpam; } });
|
|
6
6
|
Object.defineProperty(exports, "createAntiSpam", { enumerable: true, get: function () { return AntiSpam_1.createAntiSpam; } });
|
|
@@ -10,6 +10,8 @@ Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: functi
|
|
|
10
10
|
Object.defineProperty(exports, "mergeDeep", { enumerable: true, get: function () { return defaults_1.mergeDeep; } });
|
|
11
11
|
var MemoryStore_1 = require("./store/MemoryStore");
|
|
12
12
|
Object.defineProperty(exports, "MemoryStore", { enumerable: true, get: function () { return MemoryStore_1.MemoryStore; } });
|
|
13
|
+
var files_1 = require("./detectors/files");
|
|
14
|
+
Object.defineProperty(exports, "DEFAULT_BLOCKED_EXTENSIONS", { enumerable: true, get: function () { return files_1.DEFAULT_BLOCKED_EXTENSIONS; } });
|
|
13
15
|
var urls_1 = require("./utils/urls");
|
|
14
16
|
Object.defineProperty(exports, "DEFAULT_PHISHING_KEYWORDS", { enumerable: true, get: function () { return urls_1.DEFAULT_PHISHING_KEYWORDS; } });
|
|
15
17
|
Object.defineProperty(exports, "DEFAULT_SHORTENERS", { enumerable: true, get: function () { return urls_1.DEFAULT_SHORTENERS; } });
|
|
@@ -17,6 +19,8 @@ Object.defineProperty(exports, "OFFICIAL_BRANDS", { enumerable: true, get: funct
|
|
|
17
19
|
Object.defineProperty(exports, "extractUrls", { enumerable: true, get: function () { return urls_1.extractUrls; } });
|
|
18
20
|
var normalize_1 = require("./utils/normalize");
|
|
19
21
|
Object.defineProperty(exports, "normalizeText", { enumerable: true, get: function () { return normalize_1.normalizeText; } });
|
|
22
|
+
Object.defineProperty(exports, "countZalgo", { enumerable: true, get: function () { return normalize_1.countZalgo; } });
|
|
23
|
+
Object.defineProperty(exports, "countNewlines", { enumerable: true, get: function () { return normalize_1.countNewlines; } });
|
|
20
24
|
var similarity_1 = require("./utils/similarity");
|
|
21
25
|
Object.defineProperty(exports, "similarity", { enumerable: true, get: function () { return similarity_1.similarity; } });
|
|
22
26
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAsD;AAA7C,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,uCAAsE;AAA7D,yGAAA,aAAa,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,qGAAA,SAAS,OAAA;AACjD,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,qCAKsB;AAJpB,iHAAA,yBAAyB,OAAA;AACzB,0GAAA,kBAAkB,OAAA;AAClB,uGAAA,eAAe,OAAA;AACf,mGAAA,WAAW,OAAA;AAEb,+
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAsD;AAA7C,oGAAA,QAAQ,OAAA;AAAE,0GAAA,cAAc,OAAA;AACjC,uCAAsE;AAA7D,yGAAA,aAAa,OAAA;AAAE,0GAAA,cAAc,OAAA;AAAE,qGAAA,SAAS,OAAA;AACjD,mDAAkD;AAAzC,0GAAA,WAAW,OAAA;AACpB,2CAA+D;AAAtD,mHAAA,0BAA0B,OAAA;AACnC,qCAKsB;AAJpB,iHAAA,yBAAyB,OAAA;AACzB,0GAAA,kBAAkB,OAAA;AAClB,uGAAA,eAAe,OAAA;AACf,mGAAA,WAAW,OAAA;AAEb,+CAA6E;AAApE,0GAAA,aAAa,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,0GAAA,aAAa,OAAA;AACjD,iDAAgD;AAAvC,wGAAA,UAAU,OAAA"}
|
|
@@ -11,6 +11,8 @@ export declare class MemoryStore {
|
|
|
11
11
|
countDistinctUsersForImage(hash: string, now: number, windowMs: number): number;
|
|
12
12
|
addStrike(guildId: string, userId: string, now: number, decayMs: number): number;
|
|
13
13
|
getStrikes(guildId: string, userId: string, now: number, decayMs: number): number;
|
|
14
|
+
markAction(guildId: string, userId: string, now: number): void;
|
|
15
|
+
isCoolingDown(guildId: string, userId: string, now: number, cooldownMs: number): boolean;
|
|
14
16
|
resetUser(guildId: string, userId: string): void;
|
|
15
17
|
cleanup(now: number, maxAgeMs: number): void;
|
|
16
18
|
private pruneUser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../src/store/MemoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"MemoryStore.d.ts","sourceRoot":"","sources":["../../src/store/MemoryStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAehD,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAIhD,OAAO,CAAC,MAAM;IAUd,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAO5G,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAM7F,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIlE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IASpF,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAU/E,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IAUhF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;IASjF,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAI9D,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAOxF,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiB5C,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -11,7 +11,7 @@ class MemoryStore {
|
|
|
11
11
|
const key = this.userKey(guildId, userId);
|
|
12
12
|
let bucket = this.users.get(key);
|
|
13
13
|
if (!bucket) {
|
|
14
|
-
bucket = { messages: [], strikes: 0, lastStrikeAt: 0 };
|
|
14
|
+
bucket = { messages: [], strikes: 0, lastStrikeAt: 0, lastActionAt: 0 };
|
|
15
15
|
this.users.set(key, bucket);
|
|
16
16
|
}
|
|
17
17
|
return bucket;
|
|
@@ -71,6 +71,17 @@ class MemoryStore {
|
|
|
71
71
|
}
|
|
72
72
|
return bucket.strikes;
|
|
73
73
|
}
|
|
74
|
+
markAction(guildId, userId, now) {
|
|
75
|
+
this.bucket(guildId, userId).lastActionAt = now;
|
|
76
|
+
}
|
|
77
|
+
isCoolingDown(guildId, userId, now, cooldownMs) {
|
|
78
|
+
if (cooldownMs <= 0)
|
|
79
|
+
return false;
|
|
80
|
+
const bucket = this.users.get(this.userKey(guildId, userId));
|
|
81
|
+
if (!bucket || bucket.lastActionAt <= 0)
|
|
82
|
+
return false;
|
|
83
|
+
return now - bucket.lastActionAt < cooldownMs;
|
|
84
|
+
}
|
|
74
85
|
resetUser(guildId, userId) {
|
|
75
86
|
this.users.delete(this.userKey(guildId, userId));
|
|
76
87
|
}
|
|
@@ -78,7 +89,8 @@ class MemoryStore {
|
|
|
78
89
|
for (const [key, bucket] of this.users) {
|
|
79
90
|
this.pruneUser(bucket, now, maxAgeMs);
|
|
80
91
|
const staleStrikes = bucket.lastStrikeAt > 0 && now - bucket.lastStrikeAt > maxAgeMs;
|
|
81
|
-
|
|
92
|
+
const staleAction = bucket.lastActionAt <= 0 || now - bucket.lastActionAt > maxAgeMs;
|
|
93
|
+
if (bucket.messages.length === 0 && (bucket.strikes === 0 || staleStrikes) && staleAction) {
|
|
82
94
|
this.users.delete(key);
|
|
83
95
|
}
|
|
84
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemoryStore.js","sourceRoot":"","sources":["../../src/store/MemoryStore.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"MemoryStore.js","sourceRoot":"","sources":["../../src/store/MemoryStore.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Client, Message } from "discord.js";
|
|
2
|
-
export type DetectorType = "flood" | "duplicate" | "link" | "image" | "mention" | "caps" | "emoji";
|
|
2
|
+
export type DetectorType = "flood" | "duplicate" | "link" | "image" | "mention" | "caps" | "emoji" | "file" | "zalgo" | "newline";
|
|
3
3
|
export type Severity = "low" | "medium" | "high" | "critical";
|
|
4
4
|
export type ActionType = "delete" | "warn" | "timeout" | "kick" | "ban";
|
|
5
5
|
export type ImageHashMode = "meta" | "content";
|
|
@@ -135,6 +135,23 @@ export interface EmojiConfig {
|
|
|
135
135
|
maxStickers: number;
|
|
136
136
|
severity: Severity;
|
|
137
137
|
}
|
|
138
|
+
export interface FileConfig {
|
|
139
|
+
enabled: boolean;
|
|
140
|
+
/** Extensiones bloqueadas, con o sin punto: `exe`, `.bat`. */
|
|
141
|
+
blockedExtensions: string[];
|
|
142
|
+
severity: Severity;
|
|
143
|
+
}
|
|
144
|
+
export interface ZalgoConfig {
|
|
145
|
+
enabled: boolean;
|
|
146
|
+
/** Máximo de marcas combinantes (zalgo / diacríticos apilados). */
|
|
147
|
+
maxCombining: number;
|
|
148
|
+
severity: Severity;
|
|
149
|
+
}
|
|
150
|
+
export interface NewlineConfig {
|
|
151
|
+
enabled: boolean;
|
|
152
|
+
maxNewlines: number;
|
|
153
|
+
severity: Severity;
|
|
154
|
+
}
|
|
138
155
|
export interface TimeoutPunishment {
|
|
139
156
|
enabled: boolean;
|
|
140
157
|
durationMs: number;
|
|
@@ -160,6 +177,13 @@ export interface PunishmentConfig {
|
|
|
160
177
|
logChannelId: string | null;
|
|
161
178
|
/** Los strikes caducan tras este tiempo. 0 = nunca. */
|
|
162
179
|
strikeDecayMs: number;
|
|
180
|
+
/**
|
|
181
|
+
* Tras un castigo, no vuelve a avisar/timeout/kick/ban durante este tiempo.
|
|
182
|
+
* Evita 4 timeouts seguidos en el mismo burst de flood.
|
|
183
|
+
*/
|
|
184
|
+
cooldownMs: number;
|
|
185
|
+
/** Sigue borrando mensajes mientras dura el cooldown. */
|
|
186
|
+
deleteDuringCooldown: boolean;
|
|
163
187
|
}
|
|
164
188
|
export interface ResolvedConfig {
|
|
165
189
|
enabled: boolean;
|
|
@@ -177,12 +201,22 @@ export interface ResolvedConfig {
|
|
|
177
201
|
mentions: MentionConfig;
|
|
178
202
|
caps: CapsConfig;
|
|
179
203
|
emojis: EmojiConfig;
|
|
204
|
+
files: FileConfig;
|
|
205
|
+
zalgo: ZalgoConfig;
|
|
206
|
+
newlines: NewlineConfig;
|
|
180
207
|
punishment: PunishmentConfig;
|
|
181
208
|
/** Revisa también ediciones de mensajes. */
|
|
182
209
|
checkEdits: boolean;
|
|
183
210
|
/** Intervalo de limpieza de memoria. */
|
|
184
211
|
cleanupIntervalMs: number;
|
|
185
212
|
}
|
|
213
|
+
export interface AntiSpamStats {
|
|
214
|
+
analyzed: number;
|
|
215
|
+
incidents: number;
|
|
216
|
+
suppressed: number;
|
|
217
|
+
byType: Record<DetectorType, number>;
|
|
218
|
+
actions: Record<ActionType, number>;
|
|
219
|
+
}
|
|
186
220
|
export interface AntiSpamOptions extends DeepPartial<ResolvedConfig> {
|
|
187
221
|
preset?: PresetName;
|
|
188
222
|
onDetect?: (incident: Incident, message: Message) => void | Promise<void>;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,MAAM,YAAY,GACpB,OAAO,GACP,WAAW,GACX,MAAM,GACN,OAAO,GACP,SAAS,GACT,MAAM,GACN,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,6 @@ export declare function stripZalgo(text: string): string;
|
|
|
2
2
|
export declare function normalizeText(text: string): string;
|
|
3
3
|
export declare function lettersOnly(text: string): string;
|
|
4
4
|
export declare function countEmojis(text: string): number;
|
|
5
|
+
export declare function countZalgo(text: string): number;
|
|
6
|
+
export declare function countNewlines(text: string): number;
|
|
5
7
|
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD"}
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYlD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
package/dist/utils/normalize.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.stripZalgo = stripZalgo;
|
|
|
4
4
|
exports.normalizeText = normalizeText;
|
|
5
5
|
exports.lettersOnly = lettersOnly;
|
|
6
6
|
exports.countEmojis = countEmojis;
|
|
7
|
+
exports.countZalgo = countZalgo;
|
|
8
|
+
exports.countNewlines = countNewlines;
|
|
7
9
|
const ZALGO = /[\u0300-\u036f\u0489\u1ab0-\u1aff\u1dc0-\u1dff\u20d0-\u20ff\ufe20-\ufe2f]/g;
|
|
8
10
|
const INVISIBLE = /[\u200b-\u200f\u202a-\u202e\u2060-\u206f\ufeff]/g;
|
|
9
11
|
const MARKDOWN = /[`*_~|]+/g;
|
|
@@ -32,4 +34,10 @@ function countEmojis(text) {
|
|
|
32
34
|
const unicode = text.match(/\p{Extended_Pictographic}/gu)?.length ?? 0;
|
|
33
35
|
return custom + unicode;
|
|
34
36
|
}
|
|
37
|
+
function countZalgo(text) {
|
|
38
|
+
return text.normalize("NFKD").match(ZALGO)?.length ?? 0;
|
|
39
|
+
}
|
|
40
|
+
function countNewlines(text) {
|
|
41
|
+
return (text.match(/\n/g) ?? []).length;
|
|
42
|
+
}
|
|
35
43
|
//# sourceMappingURL=normalize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":";;AAKA,gCAEC;AAED,sCAYC;AAED,kCAEC;AAED,kCAIC;
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":";;AAKA,gCAEC;AAED,sCAYC;AAED,kCAEC;AAED,kCAIC;AAED,gCAEC;AAED,sCAEC;AAvCD,MAAM,KAAK,GAAG,4EAA4E,CAAC;AAC3F,MAAM,SAAS,GAAG,kDAAkD,CAAC;AACrE,MAAM,QAAQ,GAAG,WAAW,CAAC;AAC7B,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,UAAU,CAAC,IAAI,CAAC;SACpB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;SACpB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,WAAW,EAAE;SACb,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IACvE,OAAO,MAAM,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;AAC1C,CAAC"}
|