- Alle Embeds nutzen jetzt brandName/brandColor/brandColor2/brandFooter aus den Settings (Codemod über 20 Module) — Farbe & Name serverweit per Klick änderbar - Bot-Status (Presence): Typ (Spielt/Schaut/Hört/Status) + Text, sofort angewendet; Server-Monitor nutzt die Presence nur noch, wenn kein eigener Status gesetzt ist - Avatar-/Banner-Upload direkt aufs Bot-Profil (Base64, 8-MB-Limit, Discord-Rate-Limit sauber gemeldet) - Env-Verlagerung: GITEA_API_TOKEN (write-only Setting) und DISCORD_GUILD_ID jetzt auch über den Brand-Tab pflegbar — weniger Redeploys - Rollen-Menüs: Button-Farbe pro Eintrag wählbar (Grau/Blau/Grün/Rot) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
46 lines
1.9 KiB
JavaScript
46 lines
1.9 KiB
JavaScript
// /warns — Verwarnungs-Historie eines Members einsehen / Eintrag löschen (Moderatoren)
|
|
import { SlashCommandBuilder, PermissionFlagsBits, MessageFlags, EmbedBuilder } from 'discord.js';
|
|
import { warnsOf, deleteWarn } from '../../db.js';
|
|
import { brandColor } from '../../runtime-settings.js';
|
|
|
|
export const data = new SlashCommandBuilder()
|
|
.setName('warns')
|
|
.setDescription('Verwarnungen eines Members anzeigen (oder eine löschen)')
|
|
.setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers)
|
|
.addUserOption((o) => o.setName('member').setDescription('Wessen Verwarnungen?').setRequired(true))
|
|
.addIntegerOption((o) => o.setName('loeschen').setDescription('Optional: Verwarnungs-ID entfernen'));
|
|
|
|
export async function execute(interaction) {
|
|
const user = interaction.options.getUser('member');
|
|
const removeId = interaction.options.getInteger('loeschen');
|
|
|
|
if (removeId) {
|
|
const removed = deleteWarn(removeId);
|
|
await interaction.reply({
|
|
content: removed ? `🗑️ Verwarnung #${removeId} entfernt.` : `❌ Verwarnung #${removeId} nicht gefunden.`,
|
|
flags: MessageFlags.Ephemeral,
|
|
});
|
|
return;
|
|
}
|
|
|
|
const warns = warnsOf(user.id);
|
|
if (warns.length === 0) {
|
|
await interaction.reply({ content: `✅ **${user.username}** hat keine Verwarnungen.`, flags: MessageFlags.Ephemeral });
|
|
return;
|
|
}
|
|
|
|
const lines = warns
|
|
.slice(-15)
|
|
.map((w) => `\`#${w.id}\` ${w.created_at.slice(0, 10)} — ${w.reason} *(${w.moderator ?? '—'})*`);
|
|
await interaction.reply({
|
|
embeds: [
|
|
new EmbedBuilder()
|
|
.setColor(brandColor())
|
|
.setTitle(`⚠️ Verwarnungen: ${user.username} (${warns.length})`)
|
|
.setDescription(lines.join('\n'))
|
|
.setFooter({ text: 'Löschen: /warns member:<user> loeschen:<ID>' }),
|
|
],
|
|
flags: MessageFlags.Ephemeral,
|
|
});
|
|
}
|