Discord.js v13使用presenceUpdate事件报'activities'为null TypeError如何解决
报错修复与功能实现方案
报错根因
- Discord.js v13的
presenceUpdate事件返回的两个参数为旧Presence实例、新Presence实例,当用户无历史在线状态缓存时,旧Presence会返回null,直接访问null下的activities属性就会触发该类型错误。 - 使用可选链操作符提前判空即可避免该问题,同时需要注意客户端初始化时必须开启
GUILD_PRESENCES、GUILDS、GUILD_MEMBERS网关权限,否则无法正常接收presenceUpdate事件。
适配开播触发身份组分配的修正代码
const client = require('../index') client.on('presenceUpdate', function(oldPresence, newPresence) { // 过滤机器人、无服务器信息的异常情况 if (newPresence.user?.bot || !newPresence.guild) return; const guild = newPresence.guild; const streamingRole = guild.roles.cache.find(role => role.name === 'Fazendo Live'); // 对应身份组不存在时直接返回避免后续报错 if (!streamingRole) return; // 判断是否处于开播状态,开播对应activity类型为STREAMING const oldStreaming = oldPresence?.activities ? oldPresence.activities.find(activity => activity.type === 'STREAMING') : false; const newStreaming = newPresence.activities ? newPresence.activities.find(activity => activity.type === 'STREAMING') : false; // 用户开始开播,添加对应身份组 if (!oldStreaming && newStreaming) { newPresence.member.roles.add(streamingRole) .then(() => console.log(`${streamingRole.name} added to ${newPresence.user.tag}.`)) .catch(console.error); } // 用户结束开播,移除对应身份组 else if (oldStreaming && !newStreaming) { newPresence.member.roles.remove(streamingRole) .then(() => console.log(`${streamingRole.name} removed from ${newPresence.user.tag}.`)) .catch(console.error); } });
可选调整说明
- 若需要测试游戏启动触发的逻辑,只需把上述代码中
activity.type的判断值从STREAMING改回PLAYING即可。 - 可以在开头的判断逻辑中按需加入移动端过滤、状态变更过滤的规则。
内容的提问来源于stack exchange,提问作者Otávio Quirino
相关产品推荐
相关产品推荐

