discord.js中如何通过数组实现机器人shuffle随机轮换活动状态
问题根因
你的代码存在两个致命逻辑错误,导致随机轮换完全失效:
- 定时器内创建的
aa数组长度恒为1,Math.floor(Math.random() * aa.length)的计算结果永远是0,不存在多选项随机的可能 - 直接访问
array.type属于语法错误:array是存储所有状态条目的外层数组,并非单个状态对象,直接读取.type属性无法获取你预先存的各条状态值 - 额外注意:Discord 接口要求活动类型必须是固定枚举值(
PLAYING/STREAMING/LISTENING/WATCHING/COMPETING),你原数组里存的ejx1这类值不符合接口规范,需要调整配置结构。
可直接运行的修正代码
// 自定义状态配置,type字段填Discord支持的合法活动类型,message填对外展示的状态文本 const statusList = [ { type: 'PLAYING', message: 'ejx1' }, { type: 'PLAYING', message: 'ejx3' }, { type: 'LISTENING', message: 'ejx2' }, { type: 'WATCHING', message: 'ejx4' } ] // 等机器人登录完成后再启动轮换逻辑 client.on('ready', () => { console.log(`登录成功:${client.user.tag}`) // 启动时立刻设置一次状态,无需等10秒间隔 updateRandomPresence() // 每10秒触发一次状态更新 setInterval(updateRandomPresence, 10000) }) function updateRandomPresence() { // 直接在状态列表范围内生成随机索引,覆盖所有条目 const randomIndex = Math.floor(Math.random() * statusList.length) const target = statusList[randomIndex] client.user.setActivity(target.message, { type: target.type }) }
可选优化:无重复shuffle轮换
如果需要避免连续抽到同一个状态、实现所有条目打乱后依次轮换、轮完再重新打乱的效果,可以用下面的实现替换更新逻辑:
// 初始化时先打乱一次状态列表 let shuffledStatus = [...statusList].sort(() => Math.random() - 0.5) let pointer = 0 function updateShufflePresence() { // 所有条目轮完后重新打乱 if (pointer >= shuffledStatus.length) { shuffledStatus = [...statusList].sort(() => Math.random() - 0.5) pointer = 0 } const target = shuffledStatus[pointer] client.user.setActivity(target.message, { type: target.type }) pointer++ }
注意:必须在
ready事件触发后再调用状态更新接口,否则会因为机器人未完成登录抛出接口错误。
内容的提问来源于stack exchange,提问作者TheGloriesVe
相关产品推荐
相关产品推荐

