Skip to content

Commit f1da20a

Browse files
feat: file filter rule
1 parent eb349d8 commit f1da20a

File tree

8 files changed

+204
-61
lines changed

8 files changed

+204
-61
lines changed

build_src/src/main/typescript/BuildPlugin.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Awaitable, BlazePlugin } from "blazebuild";
22
import CleanTask from "./tasks/CleanTask";
33
import CompileTask from "./tasks/CompileTask";
44
import CompileTypeScriptTask from "./tasks/CompileTypeScriptTask";
5+
import CopyResourcesTask from "./tasks/CopyResourcesTask";
56
import DependenciesTask from "./tasks/DependenciesTask";
67
import LintTask from "./tasks/LintTask";
78
import ProcessCoverageReportsTask from "./tasks/ProcessCoverageReportsTask";
@@ -11,7 +12,7 @@ import TestTask from "./tasks/TestTask";
1112
class BuildPlugin extends BlazePlugin {
1213
public override boot(): Awaitable<void> {
1314
this.blaze.taskManager.named("build", {
14-
dependsOn: ["compile", "lint", "test"],
15+
dependsOn: ["compile", "copyResources", "lint", "test"],
1516
outputs: [this.blaze.projectManager.properties.structure?.buildOutputDirectory ?? ""]
1617
});
1718
}
@@ -25,7 +26,8 @@ class BuildPlugin extends BlazePlugin {
2526
LintTask,
2627
ProcessCoverageReportsTask,
2728
RunTask,
28-
TestTask
29+
TestTask,
30+
CopyResourcesTask
2931
];
3032
}
3133
}

build_src/src/main/typescript/tasks/CompileTask.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
files,
99
type Awaitable
1010
} from "blazebuild";
11+
import { $ } from "bun";
1112
import path from "path";
1213

1314
@Task({
@@ -16,7 +17,18 @@ import path from "path";
1617
})
1718
class CompileTask extends AbstractTask {
1819
@TaskAction
19-
protected override async run(): Promise<void> {}
20+
protected override async run(): Promise<void> {
21+
const buildOutputDirectory =
22+
this.blaze.projectManager.properties.structure?.buildOutputDirectory;
23+
24+
if (!buildOutputDirectory) {
25+
throw new Error("buildOutputDirectory is not defined in project properties");
26+
}
27+
28+
await $`mv ${buildOutputDirectory}/out/src ${buildOutputDirectory}/out.tmp`;
29+
await $`rm -rf ${buildOutputDirectory}/out`;
30+
await $`mv ${buildOutputDirectory}/out.tmp ${buildOutputDirectory}/out`;
31+
}
2032

2133
@TaskDependencyGenerator
2234
protected override async dependencies() {
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import {
2+
AbstractTask,
3+
Task,
4+
TaskAction,
5+
TaskInputGenerator,
6+
TaskOutputGenerator
7+
} from "blazebuild";
8+
import { $ } from "bun";
9+
10+
@Task({
11+
description: "Copies the resources",
12+
group: "Build"
13+
})
14+
class CopyResourcesTask extends AbstractTask {
15+
@TaskAction
16+
protected override async run(): Promise<void> {
17+
const sourcesRootDirectory =
18+
this.blaze.projectManager.properties.structure?.sourcesRootDirectory;
19+
const buildOutputDirectory =
20+
this.blaze.projectManager.properties.structure?.buildOutputDirectory;
21+
const modules = this.blaze.projectManager.properties.structure?.sourceModules;
22+
23+
if (!buildOutputDirectory) {
24+
throw new Error("buildOutputDirectory is not defined in project properties");
25+
}
26+
27+
if (!modules) {
28+
throw new Error("sourceModules is not defined in project properties");
29+
}
30+
31+
if (!sourcesRootDirectory) {
32+
throw new Error("sourcesRootDirectory is not defined in project properties");
33+
}
34+
35+
for (const module of modules) {
36+
await $`cp -r ${sourcesRootDirectory}/${module}/resources ${buildOutputDirectory}/out/${module}/resources`;
37+
}
38+
}
39+
40+
@TaskOutputGenerator
41+
protected override generateOutput() {
42+
const sourcesRootDirectory =
43+
this.blaze.projectManager.properties.structure?.sourcesRootDirectory;
44+
const buildOutputDirectory =
45+
this.blaze.projectManager.properties.structure?.buildOutputDirectory;
46+
const modules = this.blaze.projectManager.properties.structure?.sourceModules;
47+
48+
if (!buildOutputDirectory) {
49+
throw new Error("buildOutputDirectory is not defined in project properties");
50+
}
51+
52+
if (!modules) {
53+
throw new Error("sourceModules is not defined in project properties");
54+
}
55+
56+
return modules.map(module => `${buildOutputDirectory}/out/${module}/resources`);
57+
}
58+
59+
@TaskInputGenerator
60+
protected override generateInput() {
61+
const sourcesRootDirectory =
62+
this.blaze.projectManager.properties.structure?.sourcesRootDirectory;
63+
const modules = this.blaze.projectManager.properties.structure?.sourceModules;
64+
65+
if (!modules) {
66+
throw new Error("sourceModules is not defined in project properties");
67+
}
68+
69+
if (!sourcesRootDirectory) {
70+
throw new Error("sourcesRootDirectory is not defined in project properties");
71+
}
72+
73+
return modules.map(module => `${sourcesRootDirectory}/${module}/resources`);
74+
}
75+
}
76+
77+
export default CopyResourcesTask;

src/framework/typescript/import/ClassLoader.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ class ClassLoader {
9292
return this.modules;
9393
}
9494

95-
const srcDir = path.resolve(this.application.projectRootPath, "src");
95+
const srcDir = path.resolve(
96+
this.application.projectRootPath,
97+
process.isBun ? "src" : "out"
98+
);
9699
const modules = await readdir(srcDir);
97100

98101
for (const module of modules) {
@@ -116,7 +119,13 @@ class ClassLoader {
116119
const modules = module ? [module] : await this.loadModules();
117120

118121
for (const moduleName of modules) {
119-
const filePath = path.join(this.application.projectRootPath, "src", moduleName, "resources/", name);
122+
const filePath = path.join(
123+
this.application.projectRootPath,
124+
process.isBun ? "src" : "out",
125+
moduleName,
126+
"resources/",
127+
name
128+
);
120129
const file = File.of(filePath);
121130

122131
if (!file.exists) {

src/main/typescript/automod/RuleModerationService.ts

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { Inject } from "@framework/container/Inject";
2+
import { GatewayEventListener } from "@framework/events/GatewayEventListener";
23
import { Name } from "@framework/services/Name";
34
import { Service } from "@framework/services/Service";
45
import { HasEventListeners } from "@framework/types/HasEventListeners";
56
import { LogEventType } from "@main/schemas/LoggingSchema";
67
import { GuildMember, Message, Snowflake, TextChannel } from "discord.js";
78
import { MessageAutoModServiceContract } from "../contracts/MessageAutoModServiceContract";
89
import {
9-
type default as ModerationRuleHandlerContract,
10-
MessageRuleScope
10+
MessageRuleScope,
11+
type default as ModerationRuleHandlerContract
1112
} from "../contracts/ModerationRuleHandlerContract";
1213
import { MessageRuleType } from "../schemas/MessageRuleSchema";
1314
import ModerationRuleHandler from "../security/ModerationRuleHandler";
@@ -16,7 +17,6 @@ import type ConfigurationManager from "../services/ConfigurationManager";
1617
import type ModerationActionService from "../services/ModerationActionService";
1718
import type PermissionManagerService from "../services/PermissionManagerService";
1819
import { safeMemberFetch } from "../utils/fetch";
19-
import { GatewayEventListener } from "@framework/events/GatewayEventListener";
2020

2121
@Name("ruleModerationService")
2222
class RuleModerationService
@@ -93,27 +93,33 @@ class RuleModerationService
9393

9494
@GatewayEventListener("guildMemberUpdate")
9595
public async onGuildMemberUpdate(oldMember: GuildMember, newMember: GuildMember) {
96-
if (oldMember.nickname === newMember.nickname &&
96+
if (
97+
oldMember.nickname === newMember.nickname &&
9798
oldMember.user.displayName === newMember.user.displayName &&
9899
oldMember.user.username === newMember.user.username &&
99100
oldMember.presence === newMember.presence
100101
) {
101102
return;
102103
}
103104

104-
presence:
105-
if (oldMember.presence && newMember.presence) {
105+
presence: if (oldMember.presence && newMember.presence) {
106106
for (let index = 0; index < oldMember.presence.activities.length; index++) {
107107
const oldActivity = oldMember.presence.activities[index];
108108
const newActivity = newMember.presence.activities[index];
109109

110-
if (oldActivity?.name !== newActivity?.name || oldActivity?.state !== newActivity?.state || oldActivity?.details !== newActivity?.details) {
110+
if (
111+
oldActivity?.name !== newActivity?.name ||
112+
oldActivity?.state !== newActivity?.state ||
113+
oldActivity?.details !== newActivity?.details
114+
) {
111115
break presence;
112116
}
113117
}
114118
}
115119

116-
this.application.logger.debug(`Checking member profile ${newMember.user.id} in guild ${newMember.guild.id}`);
120+
this.application.logger.debug(
121+
`Checking member profile ${newMember.user.id} in guild ${newMember.guild.id}`
122+
);
117123
await this.moderateMemberOrMessage({
118124
member: newMember,
119125
guildId: newMember.guild.id,
@@ -153,7 +159,7 @@ class RuleModerationService
153159
}
154160

155161
if (message) {
156-
let fetchedMember;
162+
let fetchedMember: GuildMember | null = member;
157163

158164
if (!member) {
159165
fetchedMember = await safeMemberFetch(message.guild!, message.author.id);
@@ -183,8 +189,9 @@ class RuleModerationService
183189
if (
184190
scopes !== undefined &&
185191
options.scopes !== undefined &&
186-
scopes?.[rule.type]?.find((scope: MessageRuleScope) => options.scopes?.includes(scope)) ===
187-
undefined
192+
scopes?.[rule.type]?.find((scope: MessageRuleScope) =>
193+
options.scopes?.includes(scope)
194+
) === undefined
188195
) {
189196
continue;
190197
}

src/main/typescript/schemas/GuildConfigSchema.ts

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -301,48 +301,6 @@ export const GuildConfigSchema = z.object({
301301
.default({})
302302
})
303303
.optional(),
304-
welcomer: z
305-
.object({
306-
enabled: z.boolean().optional().default(false),
307-
custom_message: z.string().optional(),
308-
randomize: z.boolean().optional().default(false),
309-
mention: z.boolean().optional().default(false),
310-
say_hi_button: z.boolean().optional().default(false),
311-
say_hi_label: z.string().min(1).optional(),
312-
say_hi_emoji: z.string().optional().default("default"),
313-
say_hi_reply: z.string().optional(),
314-
say_hi_expire_after: z
315-
.number()
316-
.int()
317-
.min(5_000)
318-
.max(10 * 60_000)
319-
.default(5 * 60_000)
320-
.nullable(),
321-
delete_messages: z
322-
.number()
323-
.int()
324-
.min(5_000)
325-
.max(10 * 60_000)
326-
.nullable()
327-
.default(null),
328-
channel: zSnowflake,
329-
embed: z.boolean().optional().default(true),
330-
color: z
331-
.number()
332-
.int()
333-
.min(0x000000)
334-
.max(0xffffff)
335-
.default(0x007bff)
336-
.or(z.string().startsWith("#"))
337-
})
338-
.optional(),
339-
file_filter: z
340-
.object({
341-
enabled: z.boolean().optional().default(false),
342-
disabled_channels: z.array(zSnowflake).default([]),
343-
blocked_hashes: z.record(z.string(), z.string().nullable()).default({})
344-
})
345-
.optional(),
346304
auto_triggers: z
347305
.object({
348306
enabled: z.boolean().default(false),

src/main/typescript/schemas/MessageRuleSchema.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,13 @@ export const WordFilter = z.object({
157157
normalize: z.boolean().default(true)
158158
});
159159

160+
export const FileFilter = z.object({
161+
...Common,
162+
type: z.literal("file_filter"),
163+
hashes: z.record(z.string(), z.string().nullable()).default({}),
164+
check_mime_types: z.boolean().default(false)
165+
});
166+
160167
export const ProfileFilter = z.object({
161168
...Common,
162169
type: z.literal("profile_filter"),
@@ -179,7 +186,8 @@ export const MessageRuleSchema = z.union([
179186
URLCrawlRule,
180187
NSFWFilter,
181188
WordFilter,
182-
ProfileFilter
189+
ProfileFilter,
190+
FileFilter
183191
]);
184192

185193
export type MessageRuleType = z.infer<typeof MessageRuleSchema>;

0 commit comments

Comments
 (0)