如何将音频文件播放到频道?

时间:2017-01-11 00:24:56

标签: javascript bots discord discord.js

如何播放Discord机器人的音频文件?需要播放本地文件,使用JS,并且在发送某个消息时,它将加入键入消息的用户,并将该文件播放到该频道。

6 个答案:

答案 0 :(得分:13)

GitHub项目:LINK

为了做到这一点,你必须首先确定一些事项。

  1. 安装了FFMPEG&在Windows [link]
  2. 中为其设置的环境路径
  3. 安装了Microsoft Visual Studio(VS)[link]
  4. 安装了Node.js. [link]
  5. 在VS中安装了Discord.js. [link]
  6. 从那里开始步骤非常简单。完成项目index.js后,您将开始输入一些代码。以下是步骤:

    1. 将Discord.js依赖项添加到项目中;

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

    2. 创建名为 bot 的客户端变量;

      var bot = new Discord.Client();

    3. 创建一个布尔变量,以确保系统不会超载请求;

      var isReady = true;

    4. 接下来让函数截取正确的消息;

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

    5. 创建 if语句以检查消息是否正确&如果机器人准备就绪;

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

    6. 将机器人设置为未准备好,以便在完成之前无法处理事件;

      isReady = false;

    7. 为邮件发件人当前所在的频道创建变量;

      var voiceChannel = message.member.voiceChannel;

    8. 加入该频道并跟踪所有错误;

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

    9. 创建一个参考并播放音频文件;

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

    10. 等待音频文件播放完毕的插槽;

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

    11. 音频播放后离开频道;

      voiceChannel.leave();

    12. 登录该应用程序;

      bot.login('CLIENT TOKEN HERE');

    13. 完成所有操作后,请务必检查是否有未关闭的括号或括号。我这样做是因为我花了几个小时才终于找到了一个好的解决方案所以我只是想与那些寻找类似内容的人分享。

答案 1 :(得分:2)

非常感谢!

我要说的一件事是帮助其他人,就像在步骤10中输入代码的地方一样,你把步骤11中的代码放在IE中:

dispatcher.on("end", end => voiceChannel.leave());

作为一个完整的例子,这就是我在消息命令IF块中使用它的方法:

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

答案 2 :(得分:2)

不需要Visual Studio膨胀..过度杀伤..您只需要node.js和通过npm的依赖项即可。

答案 3 :(得分:2)

这是一个半旧的线程,但我将在这里添加代码,希望能帮助某人并节省他们的时间。我花了很长时间才弄清楚这一点,但 dispatcher.on('end') 对我不起作用。我认为在 discord.js 的更高版本中,他们将其从 end 更改为 finish

var voiceChannel = msg.member.voice.channel;
    voiceChannel.join()
        .then(connection => {
            const dispatcher = connection.play(fileName);
            dispatcher.on("finish", end => {
                voiceChannel.leave();
                deleteFile(fileName);
            });
        })
        .catch(console.error);

请注意,fileName 是一个字符串路径,例如:fileName = "/example.mp3"。希望这可以帮助那里的人:)

答案 4 :(得分:0)

我在这里继续了尼古拉斯·约翰逊(Nicholas Johnson)的Github bot code,但是我做了一些修改。

  1. 他似乎正在制造锁;因此我创建了一个LockableClient来扩展Discord Client
  2. 绝对不要在代码中包含授权令牌

auth.js

{
  "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.js')
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)

答案 5 :(得分:0)

更新:如果要检测音频是否已停止,则必须订阅speaking事件。

voiceChannel
    .join()
    .then((connection) => {
        const dispatcher = connection.play("./audio_files/file.mp3");

        dispatcher.on("speaking", (speaking) => {
            if (!speaking) {
                voiceChannel.leave();
            }
        });
    })