Discord.js的ready事件中能否访问message.guild.name设置Bot服务器昵称
问题原因分析
ready事件触发时没有消息交互上下文,不存在message对象,bot.Message.guild.name属于无效调用,自然无法执行。- 你调用的
bot.user.setUsername()是修改Bot的全局用户名,全局用户名全局唯一,无法实现每个服务器显示不同名称的需求,你需要修改的是Bot在对应服务器内的独立昵称。
正确实现方案
你只需要在ready事件中遍历Bot已加入的所有服务器,逐个修改自身在对应服务器的昵称即可,同时要补充错误捕获处理权限不足的场景。另外建议额外监听guildCreate事件,实现Bot新加入服务器时自动修改昵称。
修正后的完整代码
bot.on('ready', async () => { console.log('|| MaRa Utilities, Console') console.log(` Logged in as "#${bot.user.discriminator}"`) console.log(`\nBot "#${bot.user.discriminator}" has been loaded successfully...\n`) console.log(`The Prefix Is: ${PREFIX}`) console.log(`Bot "#${bot.user.discriminator}" Is in ${bot.guilds.cache.size} guild/s\n`) console.log(`|| Logs/Errors:`) db.get("Prefix").then(value => {if(value != PREFIX){ console.log('A Dev has changed the "PREFIX" on startup.') db.set("Prefix", PREFIX); }}) db.get("BotAuthorID").then(value => {if(value != BotAuthorID){ console.log('A Dev has changed the "BotAuthorID" on startup.') db.set("BotAuthorID", BotAuthorID); }}) db.get("TOKEN").then(value => {if(value != TOKEN){ console.log('A Dev has changed the "TOKEN" on startup.') db.set("TOKEN", TOKEN); }}) bot.user.setActivity(`DM For Help!`) // 遍历所有已加入服务器修改昵称 for (const guild of bot.guilds.cache.values()) { try { // 获取bot在当前服务器的成员对象 const botMember = await guild.members.fetch(bot.user.id) // 修改昵称 await botMember.setNickname(`${guild.name} Utilities`) } catch (err) { // 权限不足/服务器未开启昵称功能等异常处理 console.log(`无法修改在服务器 ${guild.name} 的昵称: ${err.message}`) } } }) // 新增:新加入服务器时自动修改昵称 bot.on('guildCreate', async (guild) => { try { const botMember = await guild.members.fetch(bot.user.id) await botMember.setNickname(`${guild.name} Utilities`) } catch (err) { console.log(`新加入服务器 ${guild.name} 时修改昵称失败: ${err.message}`) } })
注意事项
- 确保Bot在对应服务器拥有
更改昵称权限,否则会修改失败 - 不要频繁触发昵称修改操作,避免触发Discord的接口速率限制
内容的提问来源于stack exchange,提问作者MaRa Games
相关产品推荐
相关产品推荐

