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

How to Play Audio File Into Channel?

如何播放来自 Discord 机器人的音频文件?需要播放本地文件,在JS中,发送某条消息后,它会加入输入消息的用户,并将文件播放到该频道。

GitHub 项目:LINK

要做到这一点,您必须首先确定几件事。

  1. 已安装 FFMPEG 并在 Windows [link]
  2. 中为其设置了环境路径
  3. 安装了 Microsoft Visual Studio (VS) [link]
  4. 已安装 Node.js。[link]
  5. 在 VS 中安装了 Discord.js。

从那里开始,步骤非常简单。完成项目 index.js 后,您将开始输入一些代码。以下是步骤:

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

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

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

var bot = new Discord.Client(); 3. 创建一个布尔变量以确保系统不会超载请求;

var isReady = true;

  1. 接下来编写拦截正确消息的函数;

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

  1. 创建 if 语句 以检查消息是否正确以及机器人是否准备就绪;

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

  1. 将机器人设置为未就绪,以便它在完成之前无法处理事件;

isReady = false;

  1. 为消息发送者当前所在的频道创建一个变量;

var voiceChannel = message.member.voice.channel;

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

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

  1. 创建对音频文件的引用并播放;

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

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

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

  1. 音频播放完毕后离开频道;

voiceChannel.leave();

  1. 登录应用程序;

bot.login('CLIENT TOKEN HERE');

全部完成后,请务必检查是否有任何未闭合的括号或圆括号。我做这个是因为我花了很多时间才终于找到一个好的解决方案,所以我只想与任何正在寻找类似东西的人分享它。

非常感谢!

我要说的一件事是为了帮助其他人,比如在第 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);
};

我继续将 Nicholas Johnson 的 Github bot code 包含在此处,但我做了一些细微的修改。

  1. 他似乎在创建一把锁;所以我创建了一个扩展 Discord Client.
  2. LockableClient
  3. 永远不要在代码中包含授权令牌

auth.json

{
  "token" : "your-token-here"
}

可锁定-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)

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

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

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

这是一个半旧的线程,但我将在此处添加代码,希望能帮助人们解决问题并节省他们的时间。我花了很长时间才弄清楚这一点,但 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"。希望这可以帮助那里的人 :)