Skip to content

Commit eb349d8

Browse files
feat: welcomer service
1 parent c100ace commit eb349d8

File tree

4 files changed

+324
-200
lines changed

4 files changed

+324
-200
lines changed

TODO.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
- Reply and thread based AI chat conversation support. Storing messages in database, disk (JSON) or caching the last 100 messages in memory to send them to the AI model. Reply context will be limited to the reply and thread context will be limited to thread.
1414
- Log infraction ~~creation~~/edition/deletion when using `-infraction` commands
1515
- Better cache management (especially for permission managers and command overwrites)
16+
- `@file` directive
1617

1718
## 9.x
1819

src/main/typescript/core/DiscordKernel.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,10 @@ class DiscordKernel extends Kernel {
8484
"@services/ChannelLockManager",
8585
"@services/ReactionRoleService",
8686
"@services/AFKService",
87-
"@services/AuthService",
87+
"@services/AutoRoleService",
8888
"@services/DirectiveParsingService",
89+
"@services/WelcomerService",
90+
"@services/AuthService",
8991
"@services/SnippetManagerService",
9092
"@services/TranslationService",
9193
"@root/framework/typescript/api/APIServer"

src/main/typescript/schemas/GuildConfigSchema.ts

Lines changed: 35 additions & 199 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,40 @@ export const GuildConfigSchema = z.object({
238238
.optional(),
239239
reason: z.string().optional()
240240
})
241+
.optional(),
242+
auto_role: z
243+
.object({
244+
enabled: z.boolean().optional().default(false),
245+
roles: z.array(zSnowflake).default([]),
246+
ignore_bots: z.boolean().optional().default(true)
247+
})
248+
.optional(),
249+
welcomer: z
250+
.object({
251+
enabled: z.boolean().default(false),
252+
custom_message: z.string().optional(),
253+
randomize: z.boolean().optional().default(false),
254+
mention: z.boolean().optional().default(false),
255+
say_hi_button: z
256+
.object({
257+
enabled: z.boolean().optional().default(false),
258+
label: z.string().optional().default("Say Hi"),
259+
emoji: z.string().optional().default("👋"),
260+
reply: z.string().optional().default(":acc: said hi to you!"),
261+
expire_after: z
262+
.number()
263+
.int()
264+
.min(5_000)
265+
.max(10 * 60_000)
266+
.default(5 * 60_000)
267+
.nullable()
268+
})
269+
.optional(),
270+
delete_after: z.number().int().optional(),
271+
channel: zSnowflake,
272+
force_embeds: z.boolean().default(true),
273+
forced_embed_color: z.number().int().optional()
274+
})
241275
.optional()
242276
/*
243277
message_reporting: z
@@ -267,84 +301,6 @@ export const GuildConfigSchema = z.object({
267301
.default({})
268302
})
269303
.optional(),
270-
message_filter: z
271-
.object({
272-
enabled: z.boolean().default(false),
273-
send_logs: z
274-
.boolean()
275-
.or(
276-
z.object({
277-
blocked_words: z.boolean().default(false),
278-
blocked_tokens: z.boolean().default(false),
279-
blocked_messages: z.boolean().default(false)
280-
})
281-
)
282-
.default(false),
283-
delete_message: z
284-
.boolean()
285-
.or(
286-
z.object({
287-
blocked_words: z.boolean().default(false),
288-
blocked_tokens: z.boolean().default(false),
289-
blocked_messages: z.boolean().default(false)
290-
})
291-
)
292-
.default(false),
293-
data: z
294-
.object({
295-
blocked_words: z.array(z.string()).optional().default([]),
296-
blocked_tokens: z.array(z.string()).optional().default([]),
297-
blocked_messages: z.array(z.string()).optional().default([])
298-
})
299-
.default({})
300-
})
301-
.optional(),
302-
antispam: z
303-
.object({
304-
enabled: z.boolean().optional().default(false),
305-
limit: z.number().int().default(-1).optional(),
306-
timeframe: z.number().int().default(-1).optional(),
307-
mute_duration: z.number().int().default(-1).optional(),
308-
similar_messages: z
309-
.object({
310-
max: z.number().int().default(-1).optional(),
311-
channels: z.array(zSnowflake).or(z.boolean()).default(false).optional(),
312-
timeframe: z.number().int().min(0).optional()
313-
})
314-
.optional(),
315-
action: z
316-
.union([
317-
z.literal("verbal_warn"),
318-
z.literal("warn"),
319-
z.literal("warn"),
320-
z.literal("mute"),
321-
z.literal("mute_clear"),
322-
z.literal("auto")
323-
])
324-
.optional(),
325-
disabled_channels: z.array(zSnowflake).default([])
326-
})
327-
.optional(),
328-
antiraid: z
329-
.object({
330-
enabled: z.boolean().optional().default(false),
331-
max_joins: z.number().int().default(-1).optional(),
332-
timeframe: z.number().int().default(-1).optional(),
333-
action: z
334-
.union([
335-
z.literal("auto"),
336-
z.literal("lock"),
337-
z.literal("antijoin"),
338-
z.literal("lock_and_antijoin"),
339-
z.literal("none")
340-
])
341-
.optional(),
342-
send_log: z.boolean().optional().default(true),
343-
channels: z.array(zSnowflake).default([]),
344-
channel_mode: z.literal("exclude").or(z.literal("include")).default("exclude"),
345-
ignore_private_channels: z.boolean().optional().default(true)
346-
})
347-
.optional(),
348304
welcomer: z
349305
.object({
350306
enabled: z.boolean().optional().default(false),
@@ -380,76 +336,13 @@ export const GuildConfigSchema = z.object({
380336
.or(z.string().startsWith("#"))
381337
})
382338
.optional(),
383-
profile_filter: z
384-
.object({
385-
enabled: z.boolean().optional().default(false),
386-
scan: z
387-
.array(z.literal("status").or(z.literal("nickname")).or(z.literal("username")))
388-
.default([]),
389-
actions: z
390-
.object({
391-
status: z
392-
.literal("mute")
393-
.or(z.literal("warn"))
394-
.or(z.literal("none"))
395-
.default("none"),
396-
nickname: z
397-
.literal("mute")
398-
.or(z.literal("warn"))
399-
.or(z.literal("none"))
400-
.default("none"),
401-
username: z
402-
.literal("mute")
403-
.or(z.literal("warn"))
404-
.or(z.literal("none"))
405-
.default("none")
406-
})
407-
.default({})
408-
.optional(),
409-
inherit_from_message_filter: z
410-
.object({
411-
tokens: z.boolean().optional().default(false),
412-
words: z.boolean().optional().default(false)
413-
})
414-
.default({})
415-
.optional(),
416-
tokens: z.array(z.string()).default([]).optional(),
417-
words: z.array(z.string()).default([]).optional()
418-
})
419-
.optional(),
420-
autorole: z
421-
.object({
422-
enabled: z.boolean().optional().default(false),
423-
roles: z.array(zSnowflake).default([]),
424-
ignore_bots: z.boolean().optional().default(true)
425-
})
426-
.optional(),
427-
428-
create_boost_role: z
429-
.object({
430-
create_roles_after: zSnowflake.optional()
431-
})
432-
.optional(),
433-
disabled_commands: z
434-
.object({
435-
guild: z.array(z.string()).default([]),
436-
channels: z.record(zSnowflake, z.array(z.string()).default([])).default({})
437-
})
438-
.optional(),
439339
file_filter: z
440340
.object({
441341
enabled: z.boolean().optional().default(false),
442342
disabled_channels: z.array(zSnowflake).default([]),
443343
blocked_hashes: z.record(z.string(), z.string().nullable()).default({})
444344
})
445345
.optional(),
446-
message_rules: z
447-
.object({
448-
enabled: z.boolean().default(false),
449-
rules: z.array(MessageRuleSchema).default([]),
450-
global_disabled_channels: z.array(zSnowflake).default([])
451-
})
452-
.optional(),
453346
auto_triggers: z
454347
.object({
455348
enabled: z.boolean().default(false),
@@ -486,64 +379,7 @@ export const GuildConfigSchema = z.object({
486379
reminder_content: z.string().min(1).optional(),
487380
on_bump_content: z.string().min(1).optional()
488381
})
489-
.optional(),
490-
verification: z
491-
.object({
492-
enabled: z.boolean().default(false).optional(),
493-
parameters: z.object({
494-
age_less_than: z
495-
.number()
496-
.int()
497-
.default(1000 * 60 * 60 * 24 * 3)
498-
.optional(), // 3 days
499-
no_avatar: z.boolean().optional(),
500-
always: z.boolean().optional()
501-
}),
502-
unverified_roles: z.array(zSnowflake).default([]),
503-
verified_roles: z.array(zSnowflake).default([]),
504-
action_on_fail: z
505-
.union([
506-
z.object({
507-
type: z.literal("ban")
508-
}),
509-
z.object({
510-
type: z.literal("kick")
511-
}),
512-
z.object({
513-
type: z.literal("mute")
514-
}),
515-
z.object({
516-
type: z.literal("role"),
517-
mode: z.enum(["give", "take"]),
518-
roles: z.array(zSnowflake)
519-
})
520-
])
521-
.optional(),
522-
max_attempts: z
523-
.number()
524-
.int()
525-
.default(0)
526-
.describe("Set this to 0 to allow every attempt"),
527-
max_time: z
528-
.number()
529-
.int()
530-
.default(1000 * 60 * 60 * 2)
531-
.describe("Set this to 0 to disable time checks"),
532-
logging: z
533-
.object({
534-
enabled: z.boolean(),
535-
channel: zSnowflake.optional()
536-
})
537-
.default({
538-
enabled: true
539-
})
540-
})
541-
.optional(),
542-
statistics: z
543-
.object({
544-
enabled: z.boolean().default(false)
545-
})
546-
.optional() */
382+
.optional(), */
547383
});
548384

549385
export type GuildConfig = z.infer<typeof GuildConfigSchema>;

0 commit comments

Comments
 (0)