95 lines
2.5 KiB
JavaScript
95 lines
2.5 KiB
JavaScript
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 };
|