Discord.js 使用高级事件处理器时如何为Bot设置自定义状态?
错误原因
- 你当前的事件绑定语法存在错误:
client.on()方法的第三个参数是事件监听的可选配置项,你把状态设置回调放在这个位置不会被执行,对应的代码从未运行 - 状态设置调用时机错误:
client.user.setActivity()必须等Bot完全登录完成、ready事件触发后才能调用,此时client.user才会完成初始化,提前调用会抛出未定义报错
修改方案
1. 修正事件加载器代码
删除加载器里错误插入的状态设置回调,修正后代码如下:
const fs = require('fs'); module.exports = (client, Discord) => { const load_dir = (dirs) => { const eventFiles = fs.readdirSync(`./Natsuki Events/${dirs}`).filter(file => file.endsWith('.js')); for (const file of eventFiles) { const event = require(`../Natsuki Events/${dirs}/${file}`); const eventName = file.split('.')[0]; // 移除第三个无效的回调参数 client.on(eventName, event.bind(null, Discord, client)) } } ['Client', 'Guild'].forEach(e => load_dir(e)); }
2. 修改ready事件文件添加状态设置
你之前的ready事件处理函数没有接收加载器传入的Discord和client参数,导致无法拿到client实例设置状态,修改后代码如下:
module.exports = (Discord, client) => { console.log('Natsuki is online!'); // 状态设置放在ready事件中,保证client.user已初始化 client.user.setActivity("a game with That Penguin Guy", { type: 'PLAYING' }); }
状态设置逻辑本身没有问题,放在ready事件文件中是最合适的方案,能保证调用时客户端已准备就绪。
内容的提问来源于stack exchange,提问作者Pepega Pingu
相关产品推荐
相关产品推荐

