Branding-Tab: Name/Farben/Bot-Status/Avatar/Banner + Button-Farben für Rollen-Menüs

- 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>
This commit is contained in:
2026-07-30 00:40:08 +02:00
co-authored by Claude Fable 5
parent db9c7d07c9
commit f7b261c648
27 changed files with 395 additions and 93 deletions
+9 -14
View File
@@ -1,13 +1,8 @@
// Moderation & Kontakt: Modmail (DM ↔ Staff-Thread), Willkommens-Embed, Mod-Log
import { ChannelType, EmbedBuilder, Events } from 'discord.js';
import { saveModmail, modmailByUser, modmailByThread, saveStickyRoles, stickyRolesOf } from '../db.js';
import {
modmailChannelId, welcomeChannelId, modlogChannelId, publicUrl,
autoroleId, stickyRolesEnabled,
} from '../runtime-settings.js';
import { modmailChannelId, welcomeChannelId, modlogChannelId, publicUrl, autoroleId, stickyRolesEnabled, brandColor, brandColor2, brandFooter } from '../runtime-settings.js';
const BRAND_YELLOW = 0xf5c518;
const BRAND_ORANGE = 0xff4d00;
/* ── Modmail ───────────────────────────────────────── */
@@ -36,12 +31,12 @@ async function ensureModmailThread(client, user) {
await thread.send({
embeds: [
new EmbedBuilder()
.setColor(BRAND_YELLOW)
.setColor(brandColor())
.setDescription(
`Neue Modmail-Konversation mit **${user.username}** (<@${user.id}>).\n` +
'Antworten in diesem Thread gehen als DM an den User.'
)
.setFooter({ text: 'D4RKST3R // MODMAIL' }),
.setFooter({ text: brandFooter('MODMAIL') }),
],
});
return thread;
@@ -89,7 +84,7 @@ async function handleMemberAdd(member) {
if (!channel?.isTextBased()) return;
const embed = new EmbedBuilder()
.setColor(BRAND_YELLOW)
.setColor(brandColor())
.setTitle(`👋 Willkommen, ${member.displayName}!`)
.setThumbnail(member.user.displayAvatarURL({ size: 128 }))
.setDescription(
@@ -98,7 +93,7 @@ async function handleMemberAdd(member) {
'🧪 Playtester werden? Schau nach dem Bewerbungs-Post!\n' +
'🐛 Bug gefunden? Einfach `/bug` benutzen.'
)
.setFooter({ text: 'D4RKST3R // COMMUNITY' })
.setFooter({ text: brandFooter('COMMUNITY') })
.setTimestamp();
await channel.send({ content: `<@${member.id}>`, embeds: [embed] });
@@ -183,7 +178,7 @@ export function registerModTools(client) {
if (roleIds.length > 0) saveStickyRoles(member.id, roleIds);
await logToModlog(client, new EmbedBuilder()
.setColor(BRAND_ORANGE)
.setColor(brandColor2())
.setTitle('📤 Member gegangen')
.setDescription(`**${member.user?.username ?? member.id}**${roleIds.length ? ` — Rollen gesichert (${roleIds.length})` : ''}`)
.setTimestamp());
@@ -211,7 +206,7 @@ export function registerModTools(client) {
if (changes.length === 0) return;
await logToModlog(client, new EmbedBuilder()
.setColor(BRAND_YELLOW)
.setColor(brandColor())
.setTitle('👤 Member geändert')
.setDescription(`**${newMember.user?.username ?? newMember.id}**`)
.addFields(changes)
@@ -227,7 +222,7 @@ export function registerModTools(client) {
if (!message.guildId || message.author?.bot) return;
if (message.channelId === modlogChannelId()) return;
await logToModlog(client, new EmbedBuilder()
.setColor(BRAND_ORANGE)
.setColor(brandColor2())
.setTitle('🗑️ Nachricht gelöscht')
.addFields(
{ name: 'User', value: message.author ? `${message.author.username}` : 'unbekannt', inline: true },
@@ -245,7 +240,7 @@ export function registerModTools(client) {
if (!newMessage.guildId || newMessage.author?.bot) return;
if (oldMessage.content === newMessage.content) return; // z. B. nur Embed-Update
await logToModlog(client, new EmbedBuilder()
.setColor(BRAND_YELLOW)
.setColor(brandColor())
.setTitle('✏️ Nachricht bearbeitet')
.addFields(
{ name: 'User', value: newMessage.author?.username ?? 'unbekannt', inline: true },