@amatiscorp/disguard 1.0.0 → 1.2.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 +223 -3
- package/dist/AntiSpam.d.ts +22 -5
- package/dist/AntiSpam.d.ts.map +1 -1
- package/dist/AntiSpam.js +154 -21
- package/dist/AntiSpam.js.map +1 -1
- package/dist/defaults.d.ts.map +1 -1
- package/dist/defaults.js +65 -2
- package/dist/defaults.js.map +1 -1
- package/dist/detectors/accounts.d.ts +3 -0
- package/dist/detectors/accounts.d.ts.map +1 -0
- package/dist/detectors/accounts.js +37 -0
- package/dist/detectors/accounts.js.map +1 -0
- package/dist/detectors/duplicates.d.ts.map +1 -1
- package/dist/detectors/duplicates.js +5 -1
- package/dist/detectors/duplicates.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/flood.d.ts.map +1 -1
- package/dist/detectors/flood.js +7 -1
- package/dist/detectors/flood.js.map +1 -1
- package/dist/detectors/images.d.ts +1 -0
- package/dist/detectors/images.d.ts.map +1 -1
- package/dist/detectors/images.js +19 -3
- package/dist/detectors/images.js.map +1 -1
- package/dist/detectors/length.d.ts +3 -0
- package/dist/detectors/length.d.ts.map +1 -0
- package/dist/detectors/length.js +23 -0
- package/dist/detectors/length.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 +29 -5
- package/dist/detectors/links.js.map +1 -1
- package/dist/detectors/mentions.d.ts.map +1 -1
- package/dist/detectors/mentions.js +19 -0
- package/dist/detectors/mentions.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/enforcement.d.ts +1 -0
- package/dist/enforcement.d.ts.map +1 -1
- package/dist/enforcement.js +30 -9
- package/dist/enforcement.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +14 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +35 -0
- package/dist/locale.js.map +1 -0
- 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 +82 -13
- 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/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.timeoutDuration = exports.resolveWarnMessage = exports.LOG_LABELS = exports.WARN_TEMPLATES = 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; } });
|
|
@@ -8,8 +8,16 @@ var defaults_1 = require("./defaults");
|
|
|
8
8
|
Object.defineProperty(exports, "resolveConfig", { enumerable: true, get: function () { return defaults_1.resolveConfig; } });
|
|
9
9
|
Object.defineProperty(exports, "DEFAULT_CONFIG", { enumerable: true, get: function () { return defaults_1.DEFAULT_CONFIG; } });
|
|
10
10
|
Object.defineProperty(exports, "mergeDeep", { enumerable: true, get: function () { return defaults_1.mergeDeep; } });
|
|
11
|
+
var locale_1 = require("./locale");
|
|
12
|
+
Object.defineProperty(exports, "WARN_TEMPLATES", { enumerable: true, get: function () { return locale_1.WARN_TEMPLATES; } });
|
|
13
|
+
Object.defineProperty(exports, "LOG_LABELS", { enumerable: true, get: function () { return locale_1.LOG_LABELS; } });
|
|
14
|
+
Object.defineProperty(exports, "resolveWarnMessage", { enumerable: true, get: function () { return locale_1.resolveWarnMessage; } });
|
|
15
|
+
var enforcement_1 = require("./enforcement");
|
|
16
|
+
Object.defineProperty(exports, "timeoutDuration", { enumerable: true, get: function () { return enforcement_1.timeoutDuration; } });
|
|
11
17
|
var MemoryStore_1 = require("./store/MemoryStore");
|
|
12
18
|
Object.defineProperty(exports, "MemoryStore", { enumerable: true, get: function () { return MemoryStore_1.MemoryStore; } });
|
|
19
|
+
var files_1 = require("./detectors/files");
|
|
20
|
+
Object.defineProperty(exports, "DEFAULT_BLOCKED_EXTENSIONS", { enumerable: true, get: function () { return files_1.DEFAULT_BLOCKED_EXTENSIONS; } });
|
|
13
21
|
var urls_1 = require("./utils/urls");
|
|
14
22
|
Object.defineProperty(exports, "DEFAULT_PHISHING_KEYWORDS", { enumerable: true, get: function () { return urls_1.DEFAULT_PHISHING_KEYWORDS; } });
|
|
15
23
|
Object.defineProperty(exports, "DEFAULT_SHORTENERS", { enumerable: true, get: function () { return urls_1.DEFAULT_SHORTENERS; } });
|
|
@@ -17,6 +25,8 @@ Object.defineProperty(exports, "OFFICIAL_BRANDS", { enumerable: true, get: funct
|
|
|
17
25
|
Object.defineProperty(exports, "extractUrls", { enumerable: true, get: function () { return urls_1.extractUrls; } });
|
|
18
26
|
var normalize_1 = require("./utils/normalize");
|
|
19
27
|
Object.defineProperty(exports, "normalizeText", { enumerable: true, get: function () { return normalize_1.normalizeText; } });
|
|
28
|
+
Object.defineProperty(exports, "countZalgo", { enumerable: true, get: function () { return normalize_1.countZalgo; } });
|
|
29
|
+
Object.defineProperty(exports, "countNewlines", { enumerable: true, get: function () { return normalize_1.countNewlines; } });
|
|
20
30
|
var similarity_1 = require("./utils/similarity");
|
|
21
31
|
Object.defineProperty(exports, "similarity", { enumerable: true, get: function () { return similarity_1.similarity; } });
|
|
22
32
|
//# 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,mCAA0E;AAAjE,wGAAA,cAAc,OAAA;AAAE,oGAAA,UAAU,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AACvD,6CAAgD;AAAvC,8GAAA,eAAe,OAAA;AACxB,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"}
|
package/dist/locale.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type Locale = "en" | "es";
|
|
2
|
+
export declare const WARN_TEMPLATES: Record<Locale, string>;
|
|
3
|
+
export declare const LOG_LABELS: Record<Locale, {
|
|
4
|
+
title: (type: string) => string;
|
|
5
|
+
user: string;
|
|
6
|
+
channel: string;
|
|
7
|
+
severity: string;
|
|
8
|
+
strikes: string;
|
|
9
|
+
actions: string;
|
|
10
|
+
message: string;
|
|
11
|
+
none: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function resolveWarnMessage(locale: Locale, custom: string): string;
|
|
14
|
+
//# sourceMappingURL=locale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAGjD,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;IACtC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,CAqBA,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAGzE"}
|
package/dist/locale.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LOG_LABELS = exports.WARN_TEMPLATES = void 0;
|
|
4
|
+
exports.resolveWarnMessage = resolveWarnMessage;
|
|
5
|
+
exports.WARN_TEMPLATES = {
|
|
6
|
+
en: "{user}, your message was blocked: {reason}. Strikes: {strikes}.",
|
|
7
|
+
es: "{user}, tu mensaje se ha bloqueado: {reason}. Strikes: {strikes}.",
|
|
8
|
+
};
|
|
9
|
+
exports.LOG_LABELS = {
|
|
10
|
+
en: {
|
|
11
|
+
title: (type) => `Disguard · ${type}`,
|
|
12
|
+
user: "User",
|
|
13
|
+
channel: "Channel",
|
|
14
|
+
severity: "Severity",
|
|
15
|
+
strikes: "Strikes",
|
|
16
|
+
actions: "Actions",
|
|
17
|
+
message: "Message",
|
|
18
|
+
none: "none",
|
|
19
|
+
},
|
|
20
|
+
es: {
|
|
21
|
+
title: (type) => `Disguard · ${type}`,
|
|
22
|
+
user: "Usuario",
|
|
23
|
+
channel: "Canal",
|
|
24
|
+
severity: "Severidad",
|
|
25
|
+
strikes: "Strikes",
|
|
26
|
+
actions: "Acciones",
|
|
27
|
+
message: "Mensaje",
|
|
28
|
+
none: "ninguna",
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
function resolveWarnMessage(locale, custom) {
|
|
32
|
+
const trimmed = custom.trim();
|
|
33
|
+
return trimmed.length > 0 ? custom : exports.WARN_TEMPLATES[locale];
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":";;;AAuCA,gDAGC;AAxCY,QAAA,cAAc,GAA2B;IACpD,EAAE,EAAE,iEAAiE;IACrE,EAAE,EAAE,mEAAmE;CACxE,CAAC;AAEW,QAAA,UAAU,GASlB;IACH,EAAE,EAAE;QACF,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,IAAI,EAAE;QACrC,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,UAAU;QACpB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;KACb;IACD,EAAE,EAAE;QACF,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,IAAI,EAAE;QACrC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,UAAU;QACnB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;KAChB;CACF,CAAC;AAEF,SAAgB,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAc,CAAC,MAAM,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -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,7 @@
|
|
|
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" | "account" | "length";
|
|
3
|
+
export type Locale = "en" | "es";
|
|
4
|
+
export type TimeoutScale = "none" | "linear" | "exponential";
|
|
3
5
|
export type Severity = "low" | "medium" | "high" | "critical";
|
|
4
6
|
export type ActionType = "delete" | "warn" | "timeout" | "kick" | "ban";
|
|
5
7
|
export type ImageHashMode = "meta" | "content";
|
|
@@ -45,25 +47,19 @@ export interface IgnoreLists {
|
|
|
45
47
|
guilds: string[];
|
|
46
48
|
}
|
|
47
49
|
export interface FloodConfig {
|
|
48
|
-
/** Activa el detector de flood (muchos mensajes en poco tiempo). */
|
|
49
50
|
enabled: boolean;
|
|
50
|
-
/** Máximo de mensajes permitidos dentro de la ventana. */
|
|
51
51
|
maxMessages: number;
|
|
52
|
-
/** Ventana deslizante en milisegundos. */
|
|
53
52
|
windowMs: number;
|
|
53
|
+
/** If true, only counts messages in the same channel. */
|
|
54
|
+
sameChannelOnly: boolean;
|
|
54
55
|
severity: Severity;
|
|
55
56
|
}
|
|
56
57
|
export interface DuplicateConfig {
|
|
57
|
-
/** Activa el detector de texto repetido. */
|
|
58
58
|
enabled: boolean;
|
|
59
|
-
/** Veces que se puede repetir el mismo (o muy similar) mensaje. */
|
|
60
59
|
maxRepeats: number;
|
|
61
60
|
windowMs: number;
|
|
62
|
-
/**
|
|
63
|
-
* Umbral 0-1. 1 = solo coincidencia exacta.
|
|
64
|
-
* 0.85 detecta variaciones leves ("hola!!" vs "hola!").
|
|
65
|
-
*/
|
|
66
61
|
similarity: number;
|
|
62
|
+
sameChannelOnly: boolean;
|
|
67
63
|
severity: Severity;
|
|
68
64
|
}
|
|
69
65
|
export interface LinkConfig {
|
|
@@ -90,6 +86,10 @@ export interface LinkConfig {
|
|
|
90
86
|
customPatterns: string[];
|
|
91
87
|
/** Palabras extra que, junto a un enlace, se consideran phishing. */
|
|
92
88
|
extraPhishingKeywords: string[];
|
|
89
|
+
/** Max URLs in one message. 0 = unlimited. */
|
|
90
|
+
maxLinks: number;
|
|
91
|
+
/** Also scan embed title/description/fields. */
|
|
92
|
+
scanEmbeds: boolean;
|
|
93
93
|
severity: Severity;
|
|
94
94
|
}
|
|
95
95
|
export interface ImageConfig {
|
|
@@ -113,6 +113,10 @@ export interface ImageConfig {
|
|
|
113
113
|
* (raid / copypasta visual). 0 = desactivado.
|
|
114
114
|
*/
|
|
115
115
|
crossUserThreshold: number;
|
|
116
|
+
/** MIME types to skip, e.g. `["image/gif"]`. */
|
|
117
|
+
skipContentTypes: string[];
|
|
118
|
+
/** Max image attachments per message. 0 = unlimited. */
|
|
119
|
+
maxAttachments: number;
|
|
116
120
|
severity: Severity;
|
|
117
121
|
}
|
|
118
122
|
export interface MentionConfig {
|
|
@@ -120,6 +124,8 @@ export interface MentionConfig {
|
|
|
120
124
|
maxMentions: number;
|
|
121
125
|
blockEveryone: boolean;
|
|
122
126
|
blockHere: boolean;
|
|
127
|
+
/** Same user mentioned this many times in one message. 0 = off. */
|
|
128
|
+
maxRepeatsOfSame: number;
|
|
123
129
|
severity: Severity;
|
|
124
130
|
}
|
|
125
131
|
export interface CapsConfig {
|
|
@@ -135,10 +141,44 @@ export interface EmojiConfig {
|
|
|
135
141
|
maxStickers: number;
|
|
136
142
|
severity: Severity;
|
|
137
143
|
}
|
|
144
|
+
export interface FileConfig {
|
|
145
|
+
enabled: boolean;
|
|
146
|
+
/** Extensiones bloqueadas, con o sin punto: `exe`, `.bat`. */
|
|
147
|
+
blockedExtensions: string[];
|
|
148
|
+
severity: Severity;
|
|
149
|
+
}
|
|
150
|
+
export interface ZalgoConfig {
|
|
151
|
+
enabled: boolean;
|
|
152
|
+
/** Máximo de marcas combinantes (zalgo / diacríticos apilados). */
|
|
153
|
+
maxCombining: number;
|
|
154
|
+
severity: Severity;
|
|
155
|
+
}
|
|
156
|
+
export interface NewlineConfig {
|
|
157
|
+
enabled: boolean;
|
|
158
|
+
maxNewlines: number;
|
|
159
|
+
severity: Severity;
|
|
160
|
+
}
|
|
161
|
+
export interface AccountConfig {
|
|
162
|
+
enabled: boolean;
|
|
163
|
+
/** Accounts younger than this many days are flagged. */
|
|
164
|
+
minAgeDays: number;
|
|
165
|
+
/** Flag users still using the default Discord avatar. */
|
|
166
|
+
blockDefaultAvatar: boolean;
|
|
167
|
+
severity: Severity;
|
|
168
|
+
}
|
|
169
|
+
export interface LengthConfig {
|
|
170
|
+
enabled: boolean;
|
|
171
|
+
maxCharacters: number;
|
|
172
|
+
severity: Severity;
|
|
173
|
+
}
|
|
138
174
|
export interface TimeoutPunishment {
|
|
139
175
|
enabled: boolean;
|
|
140
176
|
durationMs: number;
|
|
141
177
|
minStrikes: number;
|
|
178
|
+
/** `linear` = base * strikes, `exponential` = base * 2^(strikes-1). */
|
|
179
|
+
scale: TimeoutScale;
|
|
180
|
+
/** Cap for scaled timeouts (Discord max is 28 days). */
|
|
181
|
+
maxDurationMs: number;
|
|
142
182
|
}
|
|
143
183
|
export interface BooleanPunishment {
|
|
144
184
|
enabled: boolean;
|
|
@@ -160,15 +200,28 @@ export interface PunishmentConfig {
|
|
|
160
200
|
logChannelId: string | null;
|
|
161
201
|
/** Los strikes caducan tras este tiempo. 0 = nunca. */
|
|
162
202
|
strikeDecayMs: number;
|
|
203
|
+
/**
|
|
204
|
+
* Tras un castigo, no vuelve a avisar/timeout/kick/ban durante este tiempo.
|
|
205
|
+
* Evita 4 timeouts seguidos en el mismo burst de flood.
|
|
206
|
+
*/
|
|
207
|
+
cooldownMs: number;
|
|
208
|
+
deleteDuringCooldown: boolean;
|
|
209
|
+
/** Send the warning as an embed instead of plain text. */
|
|
210
|
+
warnAsEmbed: boolean;
|
|
163
211
|
}
|
|
164
212
|
export interface ResolvedConfig {
|
|
165
213
|
enabled: boolean;
|
|
166
214
|
dryRun: boolean;
|
|
215
|
+
locale: Locale;
|
|
167
216
|
ignoreBots: boolean;
|
|
168
217
|
ignoreWebhooks: boolean;
|
|
169
218
|
ignoreOwner: boolean;
|
|
170
|
-
/** Ignora miembros con permiso Administrator. */
|
|
171
219
|
ignoreAdministrators: boolean;
|
|
220
|
+
/**
|
|
221
|
+
* Extra permission names that skip checks, e.g. `["ManageMessages", "ModerateMembers"]`.
|
|
222
|
+
* Uses discord.js `PermissionFlagsBits` keys.
|
|
223
|
+
*/
|
|
224
|
+
ignorePermissions: string[];
|
|
172
225
|
ignored: IgnoreLists;
|
|
173
226
|
flood: FloodConfig;
|
|
174
227
|
duplicates: DuplicateConfig;
|
|
@@ -177,11 +230,27 @@ export interface ResolvedConfig {
|
|
|
177
230
|
mentions: MentionConfig;
|
|
178
231
|
caps: CapsConfig;
|
|
179
232
|
emojis: EmojiConfig;
|
|
233
|
+
files: FileConfig;
|
|
234
|
+
zalgo: ZalgoConfig;
|
|
235
|
+
newlines: NewlineConfig;
|
|
236
|
+
accounts: AccountConfig;
|
|
237
|
+
length: LengthConfig;
|
|
180
238
|
punishment: PunishmentConfig;
|
|
181
|
-
/** Revisa también ediciones de mensajes. */
|
|
182
239
|
checkEdits: boolean;
|
|
183
|
-
/** Intervalo de limpieza de memoria. */
|
|
184
240
|
cleanupIntervalMs: number;
|
|
241
|
+
/** Skip these detectors even if their `enabled` flag is true. */
|
|
242
|
+
disabledDetectors: DetectorType[];
|
|
243
|
+
/** Custom run order. Empty = built-in order. */
|
|
244
|
+
detectorOrder: DetectorType[];
|
|
245
|
+
/** Per-channel patches keyed by channel snowflake. */
|
|
246
|
+
channelOverrides: Record<string, DeepPartial<ResolvedConfig>>;
|
|
247
|
+
}
|
|
248
|
+
export interface AntiSpamStats {
|
|
249
|
+
analyzed: number;
|
|
250
|
+
incidents: number;
|
|
251
|
+
suppressed: number;
|
|
252
|
+
byType: Record<DetectorType, number>;
|
|
253
|
+
actions: Record<ActionType, number>;
|
|
185
254
|
}
|
|
186
255
|
export interface AntiSpamOptions extends DeepPartial<ResolvedConfig> {
|
|
187
256
|
preset?: PresetName;
|
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"}
|