How to Play Audio File Into Channel?
I went ahead an included Nicholas Johnson's Github bot code here, but I made slight modifications.
- He appears to be creating a lock; so I created a
LockableClient
that extends the DiscordClient
. - Never include an authorization token in the code
auth.json
{
"token" : "your-token-here"
}
lockable-client.js
const { Client } = require('discord.js')
/**
* A lockable client that can interact with the Discord API.
* @extends {Client}
*/
class LockableClient extends Client {
constructor(options) {
super(options)
this.locked = false
}
lock() {
this.setLocked(true)
}
unlock() {
this.setLocked(false)
}
setLocked(locked) {
return this.locked = locked
}
isLocked {
return this.locked
}
}
module.exports = LockableClient;
index.js
const auth = require('./auth.json')
const { LockableClient } = require('./lockable-client.js')
const bot = new LockableClient()
bot.on('message', message => {
if (!bot.isLocked() && message.content === 'Gotcha Bitch') {
bot.lock()
var voiceChannel = message.member.voiceChannel
voiceChannel.join().then(connection => {
const dispatcher = connection.playFile('./assets/audio/gab.mp3')
dispatcher.on('end', end => voiceChannel.leave());
}).catch(err => console.log(err))
bot.unlock()
}
})
bot.login(auth.token)
GitHub Project: LINK
In order to do this there are a few things you have to make sure of first.
- Have FFMPEG installed & the environment path set for it in Windows [link]
- Have Microsoft Visual Studio (VS) installed [link]
- Have Node.js installed.[link]
- Have Discord.js installed in VS.
From there the steps are quite simple. After making your project index.js
you will start typing some code. Here are the steps:
- Add the Discord.js dependency to the project;
var Discord = require('discord.js');
- Create out client variable called bot;
var bot = new Discord.Client();
3. Create a Boolean variable to make sure that the system doesn't overload of requests;
var isReady = true;
- Next make the function to intercept the correct message;
bot.on('message', message =>{ENTER CODE HERE});
- Create an if statement to check if the message is correct & if the bot is ready;
if (isReady && message.content === 'MESSAGE'){ENTER CODE HERE}
- Set the bot to unready so that it cannot process events until it finishes;
isReady = false;
- Create a variable for the channel that the message-sender is currently in;
var voiceChannel = message.member.voice.channel;
- Join that channel and keep track of all errors;
voiceChannel.join().then(connection =>{ENTER CODE HERE}).catch(err => console.log(err));
- Create a refrence to and play the audio file;
const dispatcher = connection.play('./audiofile.mp3');
- Slot to wait until the audio file is done playing;
dispatcher.on("end", end => {ENTER CODE HERE});
- Leave channel after audio is done playing;
voiceChannel.leave();
- Login to the application;
bot.login('CLIENT TOKEN HERE');
After you are all finished with this, make sure to check for any un-closed brackets or parentheses. i made this because it took my hours until I finally found a good solution so I just wanted to share it with anybody who is out there looking for something like this.
thanks so much!
One thing I will say to help anyone else, is things like where it says ENTER CODE HERE on step 10, you put the code from step 11 IE:
dispatcher.on("end", end => voiceChannel.leave());
As a complete example, this is how I have used it in my message command IF block:
if (command === "COMMAND") {
var VC = message.member.voiceChannel;
if (!VC)
return message.reply("MESSAGE IF NOT IN A VOICE CHANNEL")
VC.join()
.then(connection => {
const dispatcher = connection.playFile('c:/PAtH/TO/MP3/FILE.MP3');
dispatcher.on("end", end => {VC.leave()});
})
.catch(console.error);
};