Discord Player
![patreonBadge](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.herokuapp.com%2FAndroz2091%2Fpledges&style=for-the-badge)
Note: this module uses recent discordjs features and requires discord.js version 12.
Discord Player is a powerful Node.js module that allows you to easily implement music commands. Everything is customizable, and everything is done to simplify your work without limiting you!
Installation
npm install --save discord-player
Install opusscript or node-opus:
npm install --save opusscript
Install FFMPEG and you're done!
Player
const Discord = require("discord.js"),
client = new Discord.Client(),
settings = {
prefix: "!",
token: "Your Discord Token"
};
const { Player } = require("discord-player");
const player = new Player(client, "YOUTUBE API KEY");
client.player = player;
client.on("ready", () => {
console.log("I'm ready !");
});
client.login(settings.token);
You can pass a third parameter when instantiating the class Player: the options object:
options.leaveOnEnd: whether the bot should leave the voice channel when there is no more song in the queue.
options.leaveOnStop: whether the bot should leave the voice channel when the stop()
function is used.
Features Overview
You need to init the guild queue using the play() function, then you are able to manage the queue using the following functions:
client.player.play(voiceChannel, songName);
client.player.addToQueue(guildID, songName);
client.player.clearQueue(guildID);
client.player.getQueue(guildID);
client.player.skip(guildID);
client.player.pause(guildID);
client.player.resume(guildID);
client.player.stop(guildID);
client.player.isPlaying(guildID);
Event messages
client.player.getQueue(guildID)
.on('end', () => {
message.channel.send('There is no more music in the queue!');
})
.on('songChanged', (oldSong, newSong) => {
message.channel.send(`Now playing ${newSong.name}...`);
});
Examples
Play
To play a song, use the client.player.play()
function.
Usage:
client.player.play(voiceChannel, songName);
Example:
client.on('message', async (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'play'){
let song = await client.player.play(message.member.voice.channel, args[0])
message.channel.send(`Currently playing ${song.name}!`);
}
Pause
To pause the current song, use the client.player.pause()
function.
Usage:
client.player.pause(guildID);
Example:
client.on('message', async (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'pause'){
let song = await client.player.pause(message.guild.id);
message.channel.send(`${song.name} paused!`);
}
});
Resume
To resume the current song, use the client.player.resume()
function.
Usage:
client.player.resume(guildID);
Example:
client.on('message', async (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'resume'){
let song = await client.player.resume(message.guild.id);
message.channel.send(`${song.name} resumed!`);
}
});
Stop
To stop the music, use the client.player.stop()
function.
Usage:
client.player.stop(guildID);
Example:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'stop'){
client.player.stop(message.guild.id);
message.channel.send('Music stopped!');
}
});
SetVolume
To update the volume, use the client.player.setVolume()
function.
Usage:
client.player.setVolume(guildID, percent);
Example:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'setvolume'){
client.player.setVolume(message.guild.id, parseInt(args[0]));
message.channel.send(`Volume set to ${args[0]} !`);
}
});
AddToQueue
To add a song to the queue, use the client.player.addToQueue()
function.
Usage:
client.player.addToQueue(guildID, songName);
Example:
In this example, you will see how to add a song to the queue if one is already playing.
client.on('message', async (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'play'){
let aSongIsAlreadyPlaying = client.player.isPlaying(message.guild.id);
if(aSongIsAlreadyPlaying){
let song = await client.player.addToQueue(message.guild.id, args[0]);
message.channel.send(`${song.name} added to queue!`);
} else {
let song = await client.player.play(message.member.voice.channel, args[0]);
message.channel.send(`Currently playing ${song.name}!`);
}
}
});
ClearQueue
To clear the queue, use the client.player.clearQueue()
function.
Usage:
client.player.clearQueue(guildID);
Example:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'clear-queue'){
client.player.clearQueue(message.guild.id);
message.channel.send('Queue cleared!');
}
});
GetQueue
To get the server queue, use the client.player.getQueue()
function.
Usage:
client.player.getQueue(guildID);
Example:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'queue'){
let queue = await client.player.getQueue(message.guild.id);
message.channel.send('Server queue:\n'+(queue.songs.map((song, i) => {
return `${i === 0 ? 'Current' : `#${i+1}`} - ${song.name} | ${song.author}`
}).join('\n')));
}
});
Skip
To skip the current song, use the client.player.skip()
function.
Usage:
client.player.skip(guildID);
Example:
client.on('message', async (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'skip'){
let song = await client.player.skip(message.guild.id);
message.channel.send(`${song} skipped!`);
}
});
Info Messages
You can send a message when the queue ends or when the song changes:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'play'){
let song = await client.player.play(message.member.voice.channel, args[0]);
song.queue.on('end', () => {
message.channel.send('The queue is empty, please add new songs!');
});
song.queue.on('songChanged', (oldSong, newSong) => {
message.channel.send(`Now playing ${newSong}...`);
});
}
Handle errors
There are 2 main errors that you can handle like this:
client.on('message', (message) => {
const args = message.content.slice(settings.prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if(command === 'play'){
client.player.play(message.member.voice.channel, args[0]).then((song) => {
message.channel.send(`Currently playing ${song.name}!`);
}).catch(() => {
message.channel.send(`No song found for ${args[0]}`);
});
}
if(command === 'queue'){
let playing = client.player.isPlaying(message.guild.id);
if(!playing) return message.channel.send(':x: No songs currently playing!');
client.player.getQueue(message.guild.id);
}
});