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

Discord.js的presenceUpdate监听状态分配角色功能无报错不生效

问题修复方案
  • 首先检查Discord开发者后台的网关意图配置
    你需要在Discord开发者平台的机器人设置页,开启Presence Intent和Server Members Intent两个权限开关,Discord.js v12及以上版本默认不会接收状态更新事件,未开启对应意图时presenceUpdate事件完全不会触发,自然不会有任何运行反应。
    同时要确认机器人在服务器内的角色排序高于你要分配的目标角色,且机器人拥有管理角色权限。
  • 修复代码内的逻辑错误
    原有代码存在三个逻辑漏洞:
    1. 错误读取用户状态数据:不应该从member.user.presence读取缓存数据,直接用事件返回的newPresence即可拿到最新的实时状态数据
    2. 未过滤自定义状态类型:activities包含游戏、直播、自定义状态等多种类型,只有type为4的才是用户设置的自定义状态
    3. 未判断state字段是否存在:用户自定义状态可能没有文本内容,直接调用includes会抛出异常,你未做错误捕获自然看不到报错日志
  • 修复后完整代码
client.on('presenceUpdate', async (oldPresence, newPresence) => {
    // 过滤机器人自身的状态更新
    if (newPresence.member.user.bot) return;
    // 校验目标角色是否存在
    const role = newPresence.guild.roles.cache.get('726517660279373986');
    if (!role) return console.log('未找到目标角色,请检查角色ID是否正确');

    const member = newPresence.member;
    // 提取用户的自定义状态
    const customActivity = newPresence.activities.find(act => act.type === 4);
    const hasInviteLink = customActivity?.state?.includes('.gg/') ?? false;

    try {
        if (hasInviteLink) {
            // 避免重复添加角色
            if (!member.roles.cache.has(role.id)) {
                await member.roles.add(role);
            }
        } else {
            // 符合移除条件才移除角色
            if (member.roles.cache.has(role.id)) {
                await member.roles.remove(role);
            }
        }
    } catch (err) {
        console.log('角色操作失败:', err);
    }
});

内容的提问来源于stack exchange,提问作者vanessa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:45:03