fix(entrance-exit): Log-Ausgaben + robustes Rejoin auf Ziel-Channel vor Playback; ignore self-events

This commit is contained in:
vibe-bot 2025-08-10 23:35:58 +02:00
parent 0fc533bbd5
commit 6206087362

View file

@ -209,6 +209,26 @@ async function playFilePath(guildId: string, channelId: string, filePath: string
state.connection = await ensureConnectionReady(connection, channelId, guildId, guild); state.connection = await ensureConnectionReady(connection, channelId, guildId, guild);
attachVoiceLifecycle(state, guild); attachVoiceLifecycle(state, guild);
} }
// Wenn der Bot in einer anderen ChannelId ist, sauber rüberwechseln
try {
const current = getVoiceConnection(guildId);
if (current && current.joinConfig?.channelId !== channelId) {
current.destroy();
const connection = joinVoiceChannel({
channelId,
guildId,
adapterCreator: guild.voiceAdapterCreator as any,
selfMute: false,
selfDeaf: false
});
const player = state.player ?? createAudioPlayer({ behaviors: { noSubscriber: NoSubscriberBehavior.Play } });
connection.subscribe(player);
state = { connection, player, guildId, channelId, currentVolume: state.currentVolume ?? getPersistedVolume(guildId) };
guildAudioState.set(guildId, state);
state.connection = await ensureConnectionReady(connection, channelId, guildId, guild);
attachVoiceLifecycle(state, guild);
}
} catch {}
const useVolume = typeof volume === 'number' && Number.isFinite(volume) const useVolume = typeof volume === 'number' && Number.isFinite(volume)
? Math.max(0, Math.min(1, volume)) ? Math.max(0, Math.min(1, volume))
: (state.currentVolume ?? 1); : (state.currentVolume ?? 1);
@ -375,13 +395,16 @@ client.once(Events.ClientReady, () => {
// Voice State Updates: Entrance/Exit // Voice State Updates: Entrance/Exit
client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceState) => { client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceState) => {
try { try {
const userId = newState.member?.user?.id || oldState.member?.user?.id; const userId = (newState.id || oldState.id) as string;
if (!userId) return; if (!userId) return;
// Eigene Events ignorieren
if (userId === client.user?.id) return;
const guildId = (newState.guild?.id || oldState.guild?.id) as string; const guildId = (newState.guild?.id || oldState.guild?.id) as string;
if (!guildId) return; if (!guildId) return;
const before = oldState.channelId; const before = oldState.channelId;
const after = newState.channelId; const after = newState.channelId;
console.log(`${new Date().toISOString()} | VoiceStateUpdate user=${userId} before=${before ?? '-'} after=${after ?? '-'}`);
// Entrance: Nutzer joint einem Channel // Entrance: Nutzer joint einem Channel
if (!before && after) { if (!before && after) {
@ -394,6 +417,7 @@ client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceS
try { try {
// Dem Channel beitreten und Sound spielen // Dem Channel beitreten und Sound spielen
await playFilePath(guildId, after, abs, undefined, rel); await playFilePath(guildId, after, abs, undefined, rel);
console.log(`${new Date().toISOString()} | Entrance played for ${userId}: ${rel}`);
} catch (e) { console.warn('Entrance play error', e); } } catch (e) { console.warn('Entrance play error', e); }
} }
} }
@ -408,6 +432,7 @@ client.on(Events.VoiceStateUpdate, async (oldState: VoiceState, newState: VoiceS
if (fs.existsSync(abs)) { if (fs.existsSync(abs)) {
try { try {
await playFilePath(guildId, before, abs, undefined, rel); await playFilePath(guildId, before, abs, undefined, rel);
console.log(`${new Date().toISOString()} | Exit played for ${userId}: ${rel}`);
} catch (e) { console.warn('Exit play error', e); } } catch (e) { console.warn('Exit play error', e); }
} }
} }