我正在尝试为朋友制作一个 Discord 机器人。机器人的目的是为特定语音频道的任何成员添加角色,并在他们离开频道时将其删除。代码如下:
client.on('voiceStateUpdate', (oldMember, newMember) => {
// définition des constantes
const testChannel = newMember.guild.channels.cache.find(c => c.name === '? 1h de travail');
const role = newMember.guild.roles.cache.find(r => r.name === 'test');
// détection
if (newMember.channelID === testChannel.id) {
// Triggered when the user joined the channel we tested for
if (!newMember.member.roles.cache.has(role))
newMember.member.roles.add(role);
// Add the role to the user if they don't already have it
}
else if (oldMember.member.roles.cache.has(role))
oldMember.member.roles.remove(role);
}
});
当我使用 npm run dev
启动机器人然后加入语音频道时,我收到此错误:
/home/archie/Documents/my-bot/index.js:13
const testChannel = newMember.guild.channels.cache.find(c => c.name === '? 1h de travail');
^
TypeError: Cannot read property 'find' of undefined
at Client.<anonymous> (/home/archie/Documents/my-bot/index.js:13:56)
at Client.emit (node:events:379:20)
at VoiceStateUpdateHandler.handle (/home/archie/Documents/my-bot/node_modules/discord.js/src/client/websocket/packets/handlers/VoiceStateUpdate.js:40:16)
at WebSocketPacketManager.handle (/home/archie/Documents/my-bot/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:108:65)
at WebSocketConnection.onPacket (/home/archie/Documents/my-bot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:336:35)
at WebSocketConnection.onMessage (/home/archie/Documents/my-bot/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:299:17)
at WebSocket.onMessage (/home/archie/Documents/my-bot/node_modules/ws/lib/event-target.js:120:16)
at WebSocket.emit (node:events:379:20)
at Receiver.receiverOnMessage (/home/archie/Documents/my-bot/node_modules/ws/lib/websocket.js:789:20)
at Receiver.emit (node:events:379:20)
[nodemon] app crashed - waiting for file changes before starting...
我不明白,非常感谢您的帮助。
答案 0 :(得分:0)
看起来您正在使用 discord.js v11 和为 v12 编写的代码。在旧版本中,guild.channels
是一个集合,而不是一个管理器,因此它没有 cache
属性。这就是它是 undefined
的原因,也是您不能在其上使用 .find
的原因。
您需要做的就是将您的 discord.js 更新到最新版本。
PS:如果您使用的是 discord.js v12,client.voiceStateUpdate
事件将返回 oldState
和 newState
,而不是 oldMember
和 newMember
。因此,它返回更新前后成员的 VoiceState
,而不是成员本身。