Implement leave announcement for banned members and enhance moderation notifications

- Added a `leaveAnnounceBan` field to the `WelcomeConfig` model, allowing for optional announcements in the leave channel when a member is banned.
- Updated the leave handling logic to check for bans and send a notice in the leave channel if the `leaveAnnounceBan` toggle is enabled.
- Enhanced moderation actions (kick and ban) to notify the affected user via DM with the reason for the action.
- Introduced a new `notifyModerationTargetDm` function to streamline DM notifications for moderation actions.
- Updated the WebUI to include a toggle for the `leaveAnnounceBan` feature, improving user configurability.
- Improved localization for new messages related to moderation notifications and leave announcements in both English and German.
- Documented changes in phase tracking to reflect the new leave announcement feature and moderation notification enhancements.
This commit is contained in:
TheOnlyMace
2026-07-25 17:50:18 +02:00
parent 03bb406d82
commit e2bab9cceb
16 changed files with 198 additions and 5 deletions

View File

@@ -2,7 +2,7 @@ import { TextChannel, type ButtonInteraction } from 'discord.js';
import { type Locale, t, tf } from '@nexumi/shared';
import type { BotContext } from '../../types.js';
import { assertBannableForConfirm } from '../../hierarchy.js';
import { createCase, scheduleTempBanExpire } from './service.js';
import { createCase, notifyModerationTargetDm, scheduleTempBanExpire } from './service.js';
import { tryParseDuration } from './duration.js';
type BanPayload = {
@@ -55,6 +55,18 @@ export async function executeBan(
await interaction.deferUpdate();
const targetUser = await context.client.users.fetch(payload.userId).catch(() => null);
if (targetUser) {
await notifyModerationTargetDm({
user: targetUser,
guildName: guild.name,
reason: payload.reason,
locale,
action: 'ban',
duration: payload.duration
});
}
await guild.members.ban(payload.userId, { reason: payload.reason });
const modCase = await createCase(context, {
guildId: guild.id,