How to Play Audio File Into Channel?

I went ahead an included Nicholas Johnson's Github bot code here, but I made slight modifications.

  1. He appears to be creating a lock; so I created a LockableClient that extends the Discord Client.
  2. 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.

  1. Have FFMPEG installed & the environment path set for it in Windows [link]
  2. Have Microsoft Visual Studio (VS) installed [link]
  3. Have Node.js installed.[link]
  4. 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:

  1. Add the Discord.js dependency to the project;

var Discord = require('discord.js');

  1. 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;

  1. Next make the function to intercept the correct message;

bot.on('message', message =>{ENTER CODE HERE});

  1. Create an if statement to check if the message is correct & if the bot is ready;

if (isReady && message.content === 'MESSAGE'){ENTER CODE HERE}

  1. Set the bot to unready so that it cannot process events until it finishes;

isReady = false;

  1. Create a variable for the channel that the message-sender is currently in;

var voiceChannel = message.member.voice.channel;

  1. Join that channel and keep track of all errors;

voiceChannel.join().then(connection =>{ENTER CODE HERE}).catch(err => console.log(err));

  1. Create a refrence to and play the audio file;

const dispatcher = connection.play('./audiofile.mp3');

  1. Slot to wait until the audio file is done playing;

dispatcher.on("end", end => {ENTER CODE HERE});

  1. Leave channel after audio is done playing;

voiceChannel.leave();

  1. 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);
};