Discord JS机器人状态一段时间后消失,setPresence代码位置存疑
Discord.js机器人状态消失的解决办法
问题根源
- setPresence参数格式错误:你当前把
activities和status分成两个对象传入,Discord.js v14+版本的setPresence只接受单个配置对象,这种写法会导致状态设置不生效或后续被Discord重置。 - 仅设置一次状态:机器人和Discord的连接如果出现波动重连,Discord会自动重置机器人状态,只在
ready事件执行一次设置是不够的。 - 客户端创建时调用无效:创建
Discord.Client时,client.user还未初始化,此时调用setPresence根本不会执行,自然看不到状态。
修复方案
1. 修正参数格式并封装复用函数
把状态设置逻辑封装成单独函数,方便在需要时重复调用:
// 封装状态更新函数,先判断client.user是否存在 function updateBotPresence() { if (!client.user) return; client.user.setPresence({ activities: [{ name: `Status Servers`, type: ActivityType.Watching }], status: 'online' }).catch(err => { console.error('更新机器人状态失败:', err); }); } // 在ready事件初始化状态 client.once('ready', () => { console.log('Bot is now online ✅'); setInterval(checkWebsiteAndNotify, 10000); updateBotPresence(); });
2. 监听重连事件,自动恢复状态
当机器人重新连接Discord时,自动重新设置状态:
client.on('reconnecting', () => { updateBotPresence(); });
3. 定期刷新状态(可选)
为了避免Discord主动重置状态,可以每15分钟左右刷新一次:
// 每900000毫秒(15分钟)刷新一次状态 setInterval(updateBotPresence, 900000);
完整代码示例
const { Client, ActivityType } = require('discord.js'); const client = new Client({ intents: ["1793"] }); function updateBotPresence() { if (!client.user) return; client.user.setPresence({ activities: [{ name: `Status Servers`, type: ActivityType.Watching }], status: 'online' }).catch(err => { console.error('更新状态失败:', err); }); } client.once('ready', () => { console.log('Bot is now online ✅'); setInterval(checkWebsiteAndNotify, 10000); updateBotPresence(); }); client.on('reconnecting', () => { updateBotPresence(); }); // 可选:定期刷新状态 setInterval(updateBotPresence, 900000); client.login('你的机器人Token');
内容的提问来源于stack exchange,提问作者Maybe Ange
相关产品推荐
相关产品推荐

