From 362437bcd52e6286adb017a5a8deba427264241d Mon Sep 17 00:00:00 2001 From: sarah Date: Mon, 23 Mar 2026 11:03:28 +0100 Subject: [PATCH] Add: leaves event logging for user server departures - Log 'leaves' event when user leaves the server - Shows user info and join date in log embed - Add to available log events and default list Co-Authored-By: Claude Opus 4.6 --- src/commands/utility/log.ts | 1 + src/events/guildMemberRemove.ts | 35 ++++++++++++++++++++++++++++++++- src/structures/Database.ts | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/commands/utility/log.ts b/src/commands/utility/log.ts index e7695f1..7385f54 100644 --- a/src/commands/utility/log.ts +++ b/src/commands/utility/log.ts @@ -6,6 +6,7 @@ const AVAILABLE_EVENTS = [ { value: 'roles', label: 'Rollen', desc: 'Rollenänderungen' }, { value: 'nicks', label: 'Nicknames', desc: 'Nickname-Änderungen' }, { value: 'channels', label: 'Channels', desc: 'Channel erstellt/gelöscht' }, + { value: 'leaves', label: 'Leaves', desc: 'User hat Server verlassen' }, { value: 'warns', label: 'Verwarnungen', desc: 'User verwarnt' }, { value: 'mutes', label: 'Mutes', desc: 'User gemutet' }, { value: 'kicks', label: 'Kicks', desc: 'User gekickt' }, diff --git a/src/events/guildMemberRemove.ts b/src/events/guildMemberRemove.ts index 63bd631..866896c 100644 --- a/src/events/guildMemberRemove.ts +++ b/src/events/guildMemberRemove.ts @@ -1,14 +1,47 @@ import { Events, GuildMember, TextChannel, EmbedBuilder } from 'discord.js'; +async function sendLog(client: any, guildId: string, event: string, embed: EmbedBuilder) { + const DB = client.DB; + const settings: any = DB.get('SELECT log_events FROM guild_settings WHERE guild_id = ?', guildId); + + if (!settings?.log_events) return; + const activeEvents = settings.log_events.split(',').filter(Boolean); + if (!activeEvents.includes(event)) return; + + const logSettings: any = DB.get('SELECT log_channel FROM guild_settings WHERE guild_id = ?', guildId); + if (!logSettings?.log_channel) return; + + const channel = client.guilds.cache.get(guildId)?.channels.cache.get(logSettings.log_channel); + if (!channel || !channel.isTextBased()) return; + + try { + await (channel as any).send({ embeds: [embed] }); + } catch (error) { + console.error(`[LOG] Error sending log (${event}):`, error); + } +} + export default { name: Events.GuildMemberRemove, async execute(member: GuildMember) { const DB = (member.client as any).DB; const guildId = member.guild.id; + // Log the leave event + const embed = new EmbedBuilder() + .setTitle('👋 User hat Server verlassen') + .setColor(0x95a5a6) + .addFields( + { name: 'User', value: `${member.user.tag} (<@${member.id}>)`, inline: true }, + { name: 'Beitritt', value: member.joinedTimestamp ? `` : 'Unbekannt', inline: true } + ) + .setTimestamp(); + + await sendLog(member.client, guildId, 'leaves', embed); + + // Send goodbye message if configured const settings: any = DB.get('SELECT * FROM guild_settings WHERE guild_id = ?', guildId); - // Use custom channel or fall back to Discord's system channel const channelId = settings?.welcome_channel || member.guild.systemChannelId; if (!channelId || !settings?.goodbye_message) { return; diff --git a/src/structures/Database.ts b/src/structures/Database.ts index dad57aa..62c0e3e 100644 --- a/src/structures/Database.ts +++ b/src/structures/Database.ts @@ -117,7 +117,7 @@ export class DB { db.prepare('ALTER TABLE guild_settings ADD COLUMN log_channel TEXT').run(); } if (!columnNames.includes('log_events')) { - db.prepare('ALTER TABLE guild_settings ADD COLUMN log_events TEXT DEFAULT \'messages,roles,nicks,channels,warns,mutes,kicks,bans\'').run(); + db.prepare('ALTER TABLE guild_settings ADD COLUMN log_events TEXT DEFAULT \'messages,roles,nicks,channels,leaves,warns,mutes,kicks,bans\'').run(); } console.log('[DATABASE] Initialization complete.');