@fsvreddit/bot-bouncer-evaluation 0.7.40

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.
Files changed (83) hide show
  1. package/README.md +1 -0
  2. package/dist/allEvaluators.d.ts +16 -0
  3. package/dist/allEvaluators.js +72 -0
  4. package/dist/constants.d.ts +3 -0
  5. package/dist/constants.js +6 -0
  6. package/dist/extendedDevvit.d.ts +36 -0
  7. package/dist/extendedDevvit.js +66 -0
  8. package/dist/index.d.ts +4 -0
  9. package/dist/index.js +23 -0
  10. package/dist/userEvaluation/EvaluateBadDisplayname.d.ts +18 -0
  11. package/dist/userEvaluation/EvaluateBadDisplayname.js +81 -0
  12. package/dist/userEvaluation/EvaluateBadDisplaynameDefinedHandles.d.ts +16 -0
  13. package/dist/userEvaluation/EvaluateBadDisplaynameDefinedHandles.js +89 -0
  14. package/dist/userEvaluation/EvaluateBadUsername.d.ts +16 -0
  15. package/dist/userEvaluation/EvaluateBadUsername.js +75 -0
  16. package/dist/userEvaluation/EvaluateBioText.d.ts +18 -0
  17. package/dist/userEvaluation/EvaluateBioText.js +96 -0
  18. package/dist/userEvaluation/EvaluateBioTextDefinedHandles.d.ts +16 -0
  19. package/dist/userEvaluation/EvaluateBioTextDefinedHandles.js +99 -0
  20. package/dist/userEvaluation/EvaluateBotGroupAdvanced.d.ts +124 -0
  21. package/dist/userEvaluation/EvaluateBotGroupAdvanced.js +1360 -0
  22. package/dist/userEvaluation/EvaluateBotGroupAdvancedInternal.d.ts +6 -0
  23. package/dist/userEvaluation/EvaluateBotGroupAdvancedInternal.js +13 -0
  24. package/dist/userEvaluation/EvaluateBotGroupSubmitters.d.ts +8 -0
  25. package/dist/userEvaluation/EvaluateBotGroupSubmitters.js +23 -0
  26. package/dist/userEvaluation/EvaluateCommentPhrase.d.ts +16 -0
  27. package/dist/userEvaluation/EvaluateCommentPhrase.js +86 -0
  28. package/dist/userEvaluation/EvaluateDomainSharer.d.ts +18 -0
  29. package/dist/userEvaluation/EvaluateDomainSharer.js +138 -0
  30. package/dist/userEvaluation/EvaluateFirstCommentEmDash.d.ts +17 -0
  31. package/dist/userEvaluation/EvaluateFirstCommentEmDash.js +103 -0
  32. package/dist/userEvaluation/EvaluateFirstPostWithSelfComment.d.ts +14 -0
  33. package/dist/userEvaluation/EvaluateFirstPostWithSelfComment.js +53 -0
  34. package/dist/userEvaluation/EvaluateInconsistentAgeBot.d.ts +17 -0
  35. package/dist/userEvaluation/EvaluateInconsistentAgeBot.js +91 -0
  36. package/dist/userEvaluation/EvaluateInconsistentGenderBot.d.ts +17 -0
  37. package/dist/userEvaluation/EvaluateInconsistentGenderBot.js +99 -0
  38. package/dist/userEvaluation/EvaluateLinkReuse.d.ts +17 -0
  39. package/dist/userEvaluation/EvaluateLinkReuse.js +159 -0
  40. package/dist/userEvaluation/EvaluateMixedBot.d.ts +15 -0
  41. package/dist/userEvaluation/EvaluateMixedBot.js +82 -0
  42. package/dist/userEvaluation/EvaluateObfuscatedBioKeywords.d.ts +16 -0
  43. package/dist/userEvaluation/EvaluateObfuscatedBioKeywords.js +79 -0
  44. package/dist/userEvaluation/EvaluatePinnedPostTitle.d.ts +15 -0
  45. package/dist/userEvaluation/EvaluatePinnedPostTitle.js +77 -0
  46. package/dist/userEvaluation/EvaluatePostTitle.d.ts +16 -0
  47. package/dist/userEvaluation/EvaluatePostTitle.js +91 -0
  48. package/dist/userEvaluation/EvaluatePostTitleDefinedHandles.d.ts +15 -0
  49. package/dist/userEvaluation/EvaluatePostTitleDefinedHandles.js +109 -0
  50. package/dist/userEvaluation/EvaluatePostTitleMulti.d.ts +16 -0
  51. package/dist/userEvaluation/EvaluatePostTitleMulti.js +88 -0
  52. package/dist/userEvaluation/EvaluateRapidFireBot.d.ts +13 -0
  53. package/dist/userEvaluation/EvaluateRapidFireBot.js +48 -0
  54. package/dist/userEvaluation/EvaluateRepostBot.d.ts +19 -0
  55. package/dist/userEvaluation/EvaluateRepostBot.js +167 -0
  56. package/dist/userEvaluation/EvaluateSelfComment.d.ts +16 -0
  57. package/dist/userEvaluation/EvaluateSelfComment.js +74 -0
  58. package/dist/userEvaluation/EvaluateSocialLinks.d.ts +16 -0
  59. package/dist/userEvaluation/EvaluateSocialLinks.js +101 -0
  60. package/dist/userEvaluation/EvaluateSuspiciousFirstPost.d.ts +15 -0
  61. package/dist/userEvaluation/EvaluateSuspiciousFirstPost.js +68 -0
  62. package/dist/userEvaluation/EvaluateTGGroup.d.ts +16 -0
  63. package/dist/userEvaluation/EvaluateTGGroup.js +73 -0
  64. package/dist/userEvaluation/EvaluateTextInNsfwImages.d.ts +14 -0
  65. package/dist/userEvaluation/EvaluateTextInNsfwImages.js +169 -0
  66. package/dist/userEvaluation/EvaluateTitleCopyBot.d.ts +13 -0
  67. package/dist/userEvaluation/EvaluateTitleCopyBot.js +74 -0
  68. package/dist/userEvaluation/EvaluateWarmupBot.d.ts +15 -0
  69. package/dist/userEvaluation/EvaluateWarmupBot.js +89 -0
  70. package/dist/userEvaluation/EvaluateWorldTraveller.d.ts +18 -0
  71. package/dist/userEvaluation/EvaluateWorldTraveller.js +79 -0
  72. package/dist/userEvaluation/UserEvaluatorBase.d.ts +67 -0
  73. package/dist/userEvaluation/UserEvaluatorBase.js +109 -0
  74. package/dist/userEvaluation/evaluatorHelpers.d.ts +3 -0
  75. package/dist/userEvaluation/evaluatorHelpers.js +25 -0
  76. package/dist/userEvaluation/index.d.ts +26 -0
  77. package/dist/userEvaluation/index.js +42 -0
  78. package/dist/utility.d.ts +34 -0
  79. package/dist/utility.js +164 -0
  80. package/eslint.config.mjs +3 -0
  81. package/package.json +50 -0
  82. package/tsconfig.build.json +14 -0
  83. package/tsconfig.json +23 -0
@@ -0,0 +1,16 @@
1
+ import { Post } from "@devvit/public-api";
2
+ import { CommentCreate } from "@devvit/protos";
3
+ import { EvaluatorRegex, UserEvaluatorBase, ValidationIssue } from "./UserEvaluatorBase.js";
4
+ import { UserExtended } from "@fsvreddit/fsv-devvit-helpers";
5
+ export declare class EvaluateBioTextDefinedHandles extends UserEvaluatorBase {
6
+ name: string;
7
+ shortname: string;
8
+ banContentThreshold: number;
9
+ private getHandles;
10
+ preEvaluateComment(event: CommentCreate): boolean;
11
+ validateVariables(): ValidationIssue[];
12
+ gatherRegexes(): EvaluatorRegex[];
13
+ preEvaluatePost(_: Post): boolean;
14
+ preEvaluateUser(user: UserExtended): boolean;
15
+ evaluate(user: UserExtended): boolean;
16
+ }
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvaluateBioTextDefinedHandles = void 0;
4
+ const UserEvaluatorBase_js_1 = require("./UserEvaluatorBase.js");
5
+ const lodash_1 = require("lodash");
6
+ const regjsparser_1 = require("regjsparser");
7
+ class EvaluateBioTextDefinedHandles extends UserEvaluatorBase_js_1.UserEvaluatorBase {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = "Bio Text Defined Handle Bot";
11
+ this.shortname = "biotextdefinedhandles";
12
+ this.banContentThreshold = 0;
13
+ }
14
+ getHandles() {
15
+ const definedHandles = this.getModuleVariable("substitutions", "definedhandles", "");
16
+ if (!definedHandles) {
17
+ return [];
18
+ }
19
+ const parsed = (0, regjsparser_1.parse)(definedHandles, "u");
20
+ if (parsed.type !== "disjunction") {
21
+ return [];
22
+ }
23
+ return parsed.body.map(part => part.raw);
24
+ }
25
+ preEvaluateComment(event) {
26
+ const problematicBioText = this.gatherRegexes().map(r => r.regex);
27
+ return problematicBioText.some(bioText => event.author?.description && new RegExp(bioText, "u").test(event.author.description));
28
+ }
29
+ validateVariables() {
30
+ const results = [];
31
+ let regexes;
32
+ try {
33
+ regexes = this.gatherRegexes().map(r => r.regex);
34
+ }
35
+ catch (error) {
36
+ const message = error instanceof Error ? error.message : "Unknown error";
37
+ results.push({ severity: "error", message: `Invalid defined handles list: ${message}` });
38
+ return results;
39
+ }
40
+ for (const regexVal of regexes) {
41
+ let regex;
42
+ try {
43
+ regex = new RegExp(regexVal);
44
+ }
45
+ catch {
46
+ results.push({ severity: "error", message: `Invalid regex in biotextdefinedhandles: ${regexVal}` });
47
+ continue;
48
+ }
49
+ if (regex.test("")) {
50
+ results.push({ severity: "error", message: `Bio Text Defined Handles regex is too greedy: ${regexVal}` });
51
+ }
52
+ }
53
+ return results;
54
+ }
55
+ gatherRegexes() {
56
+ const prefix = this.getVariable("prefix", "");
57
+ const suffix = this.getVariable("suffix", "");
58
+ const handles = this.getHandles();
59
+ return (0, lodash_1.uniq)(handles.map(handle => ({
60
+ evaluatorName: this.name,
61
+ regex: `${prefix}${handle}${suffix}`,
62
+ flags: "u",
63
+ })));
64
+ }
65
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
66
+ preEvaluatePost(_) {
67
+ return this.getHandles().length > 0;
68
+ }
69
+ preEvaluateUser(user) {
70
+ if (!user.userDescription) {
71
+ return false;
72
+ }
73
+ const regexes = this.gatherRegexes().map(r => r.regex);
74
+ if (regexes.length === 0) {
75
+ return false;
76
+ }
77
+ if (user.commentKarma > 2000 && user.linkKarma > 2000) {
78
+ return false;
79
+ }
80
+ return regexes.some(bioText => user.userDescription && new RegExp(bioText, "u").test(user.userDescription));
81
+ }
82
+ evaluate(user) {
83
+ if (!user.userDescription) {
84
+ return false;
85
+ }
86
+ const regexes = this.gatherRegexes().map(r => r.regex);
87
+ if (regexes.length === 0) {
88
+ return false;
89
+ }
90
+ const bannableBioTextFound = regexes.filter(bio => user.userDescription && new RegExp(bio, "u").test(user.userDescription));
91
+ if (bannableBioTextFound.length === 0) {
92
+ return false;
93
+ }
94
+ this.canAutoBan = true;
95
+ this.addHitReason(`Bio text matched regexes: ${bannableBioTextFound.map(bio => `\`${bio}\``).join(", ")}`);
96
+ return user.nsfw || this.getPosts().some(post => post.isNsfw());
97
+ }
98
+ }
99
+ exports.EvaluateBioTextDefinedHandles = EvaluateBioTextDefinedHandles;
@@ -0,0 +1,124 @@
1
+ import { Comment, Post, TriggerContext, UserSocialLink } from "@devvit/public-api";
2
+ import { CommentCreate } from "@devvit/protos";
3
+ import { EvaluatorRegex, UserEvaluatorBase, ValidationIssue } from "./UserEvaluatorBase.js";
4
+ import { UserExtended } from "@fsvreddit/fsv-devvit-helpers";
5
+ interface AgeRange {
6
+ dateFrom: string;
7
+ dateTo?: string;
8
+ }
9
+ interface AgeInDays {
10
+ maxAgeInDays?: number;
11
+ minAgeInDays?: number;
12
+ maxAgeInMinutes?: number;
13
+ minAgeInMinutes?: number;
14
+ }
15
+ type AgeCriteria = AgeRange | AgeInDays;
16
+ interface NotCondition {
17
+ not: CriteriaGroup;
18
+ }
19
+ interface EveryCondition {
20
+ every: CriteriaGroup[];
21
+ }
22
+ interface SomeCondition {
23
+ some: CriteriaGroup[];
24
+ }
25
+ interface BaseItemCondition {
26
+ matchesNeeded?: number;
27
+ distinctSubsNeeded?: number;
28
+ age?: AgeCriteria;
29
+ edited?: boolean;
30
+ subredditName?: string[];
31
+ notSubredditName?: string[];
32
+ bodyRegex?: string[];
33
+ minBodyLength?: number;
34
+ maxBodyLength?: number;
35
+ minParaCount?: number;
36
+ maxParaCount?: number;
37
+ minKarma?: number;
38
+ maxKarma?: number;
39
+ }
40
+ interface PostCondition extends BaseItemCondition {
41
+ type: "post";
42
+ pinned?: boolean;
43
+ titleRegex?: string[];
44
+ nsfw?: boolean;
45
+ urlRegex?: string[];
46
+ domain?: string[];
47
+ isCrossPost?: boolean;
48
+ }
49
+ interface CommentCondition extends BaseItemCondition {
50
+ type: "comment";
51
+ postId?: string[];
52
+ isTopLevel?: boolean;
53
+ isCommentOnOwnPost?: boolean;
54
+ postAuthorNameRegex?: string[];
55
+ postTitleRegex?: string[];
56
+ postBodyRegex?: string[];
57
+ postUrlRegex?: string[];
58
+ postCreatedAtAge?: AgeCriteria;
59
+ }
60
+ type CriteriaGroup = NotCondition | EveryCondition | SomeCondition | PostCondition | CommentCondition;
61
+ interface BotGroup {
62
+ name: string;
63
+ submitterName?: string | string[];
64
+ descriptionForAI?: string;
65
+ usernameRegex?: string[];
66
+ matchesDefaultUsernameRegex?: boolean;
67
+ maxCommentKarma?: number;
68
+ maxLinkKarma?: number;
69
+ minCommentKarma?: number;
70
+ minLinkKarma?: number;
71
+ age?: AgeCriteria;
72
+ nsfw?: boolean;
73
+ bioRegex?: string[];
74
+ displayNameRegex?: string[];
75
+ socialLinkRegex?: string[];
76
+ socialLinkTitleRegex?: string[];
77
+ hasNoSocialLinks?: boolean;
78
+ hasVerifiedEmail?: boolean;
79
+ hasRedditPremium?: boolean;
80
+ isSubredditModerator?: boolean;
81
+ hasMoreThanOneCommentOnPosts?: boolean;
82
+ criteria?: CriteriaGroup;
83
+ }
84
+ export declare class EvaluateBotGroupAdvanced extends UserEvaluatorBase {
85
+ name: string;
86
+ shortname: string;
87
+ banContentThreshold: number;
88
+ private verboseLogging;
89
+ private redis;
90
+ allowNewFeatures: boolean;
91
+ private evaluationError;
92
+ constructor(context: TriggerContext, history: (Post | Comment)[], socialLinks: UserSocialLink[] | undefined, variables: Record<string, unknown>);
93
+ private anyRegexMatches;
94
+ getBotGroups(): BotGroup[];
95
+ validateVariables(): ValidationIssue[];
96
+ private uniqueMatchReasons;
97
+ private getCriteriaGroupRegexes;
98
+ private getBotGroupRegexes;
99
+ gatherRegexes(): EvaluatorRegex[];
100
+ getSubGroups(): string[] | undefined;
101
+ private matchesAgeCriteria;
102
+ private anySubredditMatches;
103
+ private postOrCommentMatchesCondition;
104
+ collectCommentConditionsForPreEvalation(criteria: CriteriaGroup): CommentCondition[];
105
+ collectNegatedCommentConditionsForPreEvaluation(criteria: CriteriaGroup): CommentCondition[];
106
+ preEvaluateComment(comment: CommentCreate): Promise<boolean>;
107
+ private postMatchesCondition;
108
+ private cachedPostProperties;
109
+ private postPropertiesStatistics;
110
+ private getPostProperties;
111
+ private commentMatchesCondition;
112
+ private collectPostConditionsForPreEvalation;
113
+ private collectNegatedPostConditionsForPreEvaluation;
114
+ preEvaluatePost(post: Post): Promise<boolean>;
115
+ private accountMatchesSocialLinkCriteria;
116
+ private accountMatchesGroup;
117
+ preEvaluateUser(user: UserExtended): Promise<boolean>;
118
+ private historyMatchesCriteriaGroup;
119
+ private logEvaluationTime;
120
+ private submitterName;
121
+ setSubmitterName(submitterName: string): void;
122
+ evaluate(user: UserExtended): Promise<boolean>;
123
+ }
124
+ export {};