From 8604e5591ddab6bb20077e46a2f3a7d443c2f3e4 Mon Sep 17 00:00:00 2001 From: vibe-bot Date: Sun, 10 Aug 2025 23:18:43 +0200 Subject: [PATCH] feat(entrance-exit): Bot joint dem Nutzer nach (Entrance) und spielt Sound; Exit-Sound beim Verlassen; ?entrance/?exit nutzen Discord-User statt Namen --- server/src/index.ts | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/server/src/index.ts b/server/src/index.ts index f0de27d..52b5e97 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -240,8 +240,8 @@ async function handleCommand(message: Message, content: string) { 'Available commands\n' + '?help - zeigt diese Hilfe\n' + '?list - listet alle Audio-Dateien (mp3/wav)\n' + - '?entrance - setze deinen Entrance-Sound\n' + - '?exit - setze deinen Exit-Sound (optional)\n' + '?entrance - setze deinen Entrance-Sound\n' + + '?exit - setze deinen Exit-Sound (optional)\n' ); return; } @@ -253,8 +253,8 @@ async function handleCommand(message: Message, content: string) { return; } if (cmd === '?entrance') { - const [, userName, fileName] = parts; - if (!userName || !fileName) { await reply('Verwendung: ?entrance '); return; } + const [, fileName] = parts; + if (!fileName) { await reply('Verwendung: ?entrance '); return; } const lower = fileName.toLowerCase(); if (!(lower.endsWith('.mp3') || lower.endsWith('.wav'))) { await reply('Nur .mp3 oder .wav Dateien sind erlaubt'); return; } const resolve = (() => { @@ -271,8 +271,8 @@ async function handleCommand(message: Message, content: string) { await reply(`Entrance-Sound gesetzt: ${resolve}`); return; } if (cmd === '?exit') { - const [, userName, fileName] = parts; - if (!userName || !fileName) { await reply('Verwendung: ?exit '); return; } + const [, fileName] = parts; + if (!fileName) { await reply('Verwendung: ?exit '); return; } const lower = fileName.toLowerCase(); if (!(lower.endsWith('.mp3') || lower.endsWith('.wav'))) { await reply('Nur .mp3 oder .wav Dateien sind erlaubt'); return; } const resolve = (() => { @@ -381,30 +381,32 @@ client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceS const before = oldState.channelId; const after = newState.channelId; - // Bot muss bereits im Ziel-Channel sein, sonst nichts tun - const connection = getVoiceConnection(guildId); - const botChannelId = connection?.joinConfig?.channelId; - - if (!before && after && botChannelId && botChannelId === after) { - // User joined bot channel → Entrance + // Entrance: Nutzer joint einem Channel + if (!before && after) { const mapping = persistedState.entranceSounds ?? {}; const file = mapping[userId]; if (file) { const rel = file.replace(/\\/g, '/'); const abs = path.join(SOUNDS_DIR, rel); if (fs.existsSync(abs)) { - await playFilePath(guildId, after, abs, undefined, rel); + try { + // Dem Channel beitreten und Sound spielen + await playFilePath(guildId, after, abs, undefined, rel); + } catch (e) { console.warn('Entrance play error', e); } } } - } else if (before && !after && botChannelId && botChannelId === before) { - // User left bot channel → Exit + } + // Exit: Nutzer verlässt einen Channel – spiele im vorherigen Channel + if (before && !after) { const mapping = persistedState.exitSounds ?? {}; const file = mapping[userId]; if (file) { const rel = file.replace(/\\/g, '/'); const abs = path.join(SOUNDS_DIR, rel); if (fs.existsSync(abs)) { - await playFilePath(guildId, before, abs, undefined, rel); + try { + await playFilePath(guildId, before, abs, undefined, rel); + } catch (e) { console.warn('Exit play error', e); } } } }