You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 03:51:20