const { createAudioPlayer, createAudioResource, AudioPlayerStatus, joinVoiceChannel } = require('@discordjs/voice'); const fs = require('fs'); const queueMap = new Map(); const playerMap = new Map(); const currentTrackMap = new Map(); function addToQueue(guildId, filePath) { if (!queueMap.has(guildId)) { queueMap.set(guildId, []); } queueMap.get(guildId).push(filePath); } function getQueue(guildId) { return queueMap.get(guildId) || []; } function getCurrentTrack(guildId) { return currentTrackMap.get(guildId) || null; } function playNextInQueue(guildId, voiceChannel) { const queue = getQueue(guildId); if (queue.length === 0) return false; const currentTrack = getCurrentTrack(guildId); if (currentTrack) return false; const connection = joinVoiceChannel({ channelId: voiceChannel.id, guildId: guildId, adapterCreator: voiceChannel.guild.voiceAdapterCreator, }); const audioPlayer = createAudioPlayer(); playerMap.set(guildId, audioPlayer); const filePath = queue.shift(); currentTrackMap.set(guildId, filePath); if (!fs.existsSync(filePath)) { console.error('Audio file not found:', filePath); return false; } const resource = createAudioResource(filePath); audioPlayer.play(resource); connection.subscribe(audioPlayer); audioPlayer.on(AudioPlayerStatus.Idle, () => { currentTrackMap.delete(guildId); if (queue.length > 0) { playNextInQueue(guildId, voiceChannel); } else { connection.destroy(); } fs.unlink(filePath, (err) => { if (err) console.error('Error deleting file:', filePath, err); }); }); audioPlayer.on('error', (err) => { console.error('AudioPlayer error:', err); currentTrackMap.delete(guildId); connection.destroy(); }); return true; } function skipTrack(guildId) { const player = playerMap.get(guildId); const queue = getQueue(guildId); const currentTrack = getCurrentTrack(guildId); if (currentTrack || queue.length > 0) { if (player) { player.stop(); } if (queue.length > 0) { currentTrackMap.set(guildId, queue.shift()); } else { currentTrackMap.delete(guildId); } } else { console.error('There are no tracks to skip!'); } } module.exports = { addToQueue, getQueue, getCurrentTrack, playNextInQueue, skipTrack };