嘿,我正在使用这个开源机器人,它是响应最快的机器人,用于与我的朋友搞乱并使用 Discord.js
我遇到的问题是,当机器人检测到语音时,它会从头开始播放音频文件。我希望它暂停然后恢复文件,除非它到达结尾。不幸的是我不熟悉 discord.js
如果有人能帮我一把就太好了!
const fs = require('fs'),
{ Client, } = require('discord.js')
const { token, bypass } = require('./config.json')
const client = new Client()
let previousChannel, connection, dispather;
client
.on('ready', () => {
console.log(`Logged in as ${client.user.tag}`)
})
.on('voiceStateUpdate', async (oldState, newState) => {
if (newState.id == client.user.id) return
if (newState.channelID !== null) previousChannel = newState.channelID
if (newState.channelID == null && !bypass.includes(newState.id) && !!previousChannel) {
client.channels.cache.get(previousChannel).leave()
return [previousChannel, dispather] = [null, null];
}
if (bypass.includes(newState.id)) return
let channel = client.channels.cache.get(newState.channelID)
if (!channel) return
return connection = await channel.join()
})
.on('guildMemberSpeaking', async (member, speaking) => {
if (!connection) return
if (bypass.includes(member.user.id)) return
if (!dispather)
dispather = connection.play(fs.createReadStream('./audio.mp3'), {
volume: 1
})
else if (dispather && !speaking.bitfield) {
dispather.destroy()
dispather = undefined
}
})
.on('error', console.log)
.on('warn', console.log)
.login(token)
process.on('unhandledRejection', console.log)
答案 0 :(得分:0)
您可以使用 StreamDispatcher
的 .resume()
和 .pause()
方法。
if (speaking.bitfield) {
dispather.resume();
} else {
dispather.pause();
}
如果您使用的是 Node.js v14.17.0+,可能会出现一些 weird bugs。
<块引用>我也发现 LTS v14.17.0 发生了这种情况
使用 v14.16 修复
您也可能会发现 Discord.js 的 new Voice API implementation 他们正在开发中很有帮助。
<块引用>我们正在努力实现 Discord 的 Voice API 的新实现,该实现具有更好的播放质量并且比我们目前在 Discord.js v12 中支持的更可靠。
新库解决了用户面临的许多问题,作为其中的一部分,我们将在下一个主要版本中放弃对语音的内置支持。