feat(ai-moderation): reset offensive nickname instead of deleting message
When the ONLY violation is offensive_username (message content clean): - Message is NOT deleted (nickname-only violation bypasses auto-delete) - Member's server nickname is reset to default username via setNickname(null) (Discord shows the global username again) - Action 'reset_nickname' logged to moderation_actions; cooldown 10min per guild:user (LRU) so repeated messages by same member don't hammer the Discord PATCH - Config: AUTO_NICKNAME_RESET_ENABLED / AUTO_NICKNAME_RESET_COOLDOWN_MS
This commit is contained in:
@@ -253,6 +253,19 @@ export const configSchema = z
|
||||
.default(false),
|
||||
AUTO_DELETE_LOG_CHANNEL_ID: z.string().default(""),
|
||||
|
||||
// ── Nickname Reset (offensive_username enforcement) ────────────────
|
||||
// When the only violation is the member's server nickname, reset the
|
||||
// nickname to the default username instead of deleting the message.
|
||||
AUTO_NICKNAME_RESET_ENABLED: z
|
||||
.string()
|
||||
.optional()
|
||||
.transform((v) => v === "true")
|
||||
.default(true),
|
||||
AUTO_NICKNAME_RESET_COOLDOWN_MS: z.coerce
|
||||
.number()
|
||||
.positive()
|
||||
.default(10 * 60 * 1000),
|
||||
|
||||
// ── Retention ───────────────────────────────────────────────────────
|
||||
RETENTION_MESSAGES_DAYS: z.coerce.number().int().min(0).default(0),
|
||||
RETENTION_ATTACHMENTS_DAYS: z.coerce.number().int().min(0).default(0),
|
||||
|
||||
@@ -615,6 +615,7 @@ export const pgModerationActionsTable = pgTable(
|
||||
"warn_user",
|
||||
"kick_user",
|
||||
"ban_user",
|
||||
"reset_nickname",
|
||||
],
|
||||
}).notNull(),
|
||||
reason: pgText("reason"),
|
||||
|
||||
@@ -198,7 +198,8 @@ export type ModerationActionType =
|
||||
| "mute_user"
|
||||
| "warn_user"
|
||||
| "kick_user"
|
||||
| "ban_user";
|
||||
| "ban_user"
|
||||
| "reset_nickname";
|
||||
|
||||
export interface ModerationAction {
|
||||
id: string;
|
||||
|
||||
Reference in New Issue
Block a user