import { GuildMember, EmbedBuilder } from 'discord.js'; import { EventHandler } from '../utils/types'; import { context } from '../config/context'; import { settingsStore } from '../config/state'; const event: EventHandler = { name: 'guildMemberAdd', execute(member: GuildMember) { if (context.lockdown.isActive(member.guild.id)) { member.kick('Lockdown aktiv - neue Mitglieder werden abgewiesen').catch(() => undefined); context.logging.logMemberJoin(member); return; } Promise.all([context.altAccounts.check(member), context.growth.resolveUsedInvite(member.guild)]) .then(([{ score, reasons }, invite]) => { const suspicious = context.altAccounts.isSuspicious(score); if (suspicious) context.logging.logSuspiciousJoin(member, reasons); context.growth.recordJoin(member.guild.id, member.id, invite, suspicious); }) .catch(() => undefined); const guildConfig = settingsStore.get(member.guild.id); const welcomeCfg = guildConfig?.welcomeConfig || guildConfig?.automodConfig?.welcomeConfig; if (welcomeCfg?.enabled && welcomeCfg.channelId) { const channel = member.guild.channels.cache.get(welcomeCfg.channelId); if (channel && channel.isTextBased()) { const files: any[] = []; const colorVal = parseInt((welcomeCfg.embedColor || '00ff99').replace('#', ''), 16); const embed = new EmbedBuilder() .setTitle(welcomeCfg.embedTitle || 'Willkommen!') .setDescription(welcomeCfg.embedDescription || `${member} ist beigetreten.`) .setColor(isNaN(colorVal) ? 0x00ff99 : colorVal); const footerText = (welcomeCfg.embedFooter || '').trim(); if (footerText) { embed.setFooter({ text: footerText }); } if (welcomeCfg.embedThumbnailData && welcomeCfg.embedThumbnailData.startsWith('data:')) { const [meta, b64] = welcomeCfg.embedThumbnailData.split(','); const ext = meta.includes('gif') ? 'gif' : 'png'; const buf = Buffer.from(b64, 'base64'); const name = `welcome-thumb.${ext}`; files.push({ attachment: buf, name }); embed.setThumbnail(`attachment://${name}`); } else if (welcomeCfg.embedThumbnail) { embed.setThumbnail(welcomeCfg.embedThumbnail); } if (welcomeCfg.embedImageData && welcomeCfg.embedImageData.startsWith('data:')) { const [meta, b64] = welcomeCfg.embedImageData.split(','); const ext = meta.includes('gif') ? 'gif' : 'png'; const buf = Buffer.from(b64, 'base64'); const name = `welcome-image.${ext}`; files.push({ attachment: buf, name }); embed.setImage(`attachment://${name}`); } else if (welcomeCfg.embedImage) { embed.setImage(welcomeCfg.embedImage); } channel.send({ embeds: [embed], files }).catch(() => undefined); } } else if (guildConfig?.welcomeChannelId) { const channel = member.guild.channels.cache.get(guildConfig.welcomeChannelId); if (channel && channel.isTextBased()) { channel.send({ content: `Willkommen ${member}!` }).catch(() => undefined); } } context.logging.logMemberJoin(member); context.stats.refreshGuild(member.guild.id).catch(() => undefined); } }; export default event;