- Moderation: /warn (DM + Mod-Log), /warns (Historie + löschen), /timeout (max 28d), /purge (bulk, 14-Tage-Limit sauber gemeldet); Mod-Log erweitert um Join/Leave und Nick-/Rollen-Änderungen - Auto-Rolle bei Join + Sticky-Roles (Rollen bei Leave gesichert, bei Rejoin wiederhergestellt; managed/@everyone ausgenommen) — Rollen-Tab - Level-System (opt-in): 15-25 XP/Nachricht mit 60s-Cooldown, MEE6-Formel, Level-Up-Announce, Rollen-Belohnungen (Level=RolleID), /rank mit Fortschritt, öffentliche Bestenliste /level; Community-Tab - Tags: /tag mit Autocomplete, Verwaltung im Composer-Tab (/api/tags) - Geplante Posts: einmalig/täglich/wöchentlich, Minuten-Scheduler, DST-sicher über Neuberechnung aus Zeitfeldern; Composer-Tab (/api/scheduled) - Autocomplete-Dispatch im InteractionCreate; alles smoke-getestet Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
46 lines
1.9 KiB
JavaScript
46 lines
1.9 KiB
JavaScript
// /purge — Nachrichten im aktuellen Kanal massenlöschen (max 100, jünger als 14 Tage)
|
||
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, EmbedBuilder } from 'discord.js';
|
||
import { modlogChannelId } from '../../runtime-settings.js';
|
||
|
||
export const data = new SlashCommandBuilder()
|
||
.setName('purge')
|
||
.setDescription('Löscht die letzten N Nachrichten in diesem Kanal')
|
||
.setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages)
|
||
.addIntegerOption((o) =>
|
||
o.setName('anzahl').setDescription('Wie viele? (1–100)').setRequired(true).setMinValue(1).setMaxValue(100)
|
||
);
|
||
|
||
export async function execute(interaction) {
|
||
const count = interaction.options.getInteger('anzahl');
|
||
await interaction.deferReply({ flags: MessageFlags.Ephemeral });
|
||
|
||
let deleted;
|
||
try {
|
||
// true = Nachrichten >14 Tage still überspringen (Discord-API-Limit)
|
||
deleted = await interaction.channel.bulkDelete(count, true);
|
||
} catch {
|
||
await interaction.editReply('❌ Löschen fehlgeschlagen — Bot braucht „Nachrichten verwalten" hier.');
|
||
return;
|
||
}
|
||
|
||
const logChannelId = modlogChannelId();
|
||
if (logChannelId && deleted.size > 0) {
|
||
const channel = await interaction.client.channels.fetch(logChannelId).catch(() => null);
|
||
await channel?.send({
|
||
embeds: [
|
||
new EmbedBuilder()
|
||
.setColor(0xff4d00)
|
||
.setTitle('🧹 Purge')
|
||
.setDescription(
|
||
`**${deleted.size}** Nachrichten in <#${interaction.channelId}> gelöscht von **${interaction.user.username}**`
|
||
)
|
||
.setTimestamp(),
|
||
],
|
||
}).catch(() => {});
|
||
}
|
||
|
||
await interaction.editReply(
|
||
`🧹 **${deleted.size}** Nachrichten gelöscht.${deleted.size < count ? ' (ältere als 14 Tage kann Discord nicht massenlöschen)' : ''}`
|
||
);
|
||
}
|