discord.js中threadUpdate事件:更新类型与操作方排查
解决discord.js threadUpdate事件的锁定/归档捕获与操作方区分问题
一、精准捕获锁定/归档状态变化事件
threadUpdate事件会传入更新前后的两个线程对象(oldThread 和 newThread),你需要对比两者的locked和archived属性,仅当这两个属性发生变化时才执行后续逻辑,忽略重命名等无关更新:
client.on('threadUpdate', async (oldThread, newThread) => { // 判断锁定或归档状态是否发生变化 const lockStateChanged = oldThread.locked !== newThread.locked; const archiveStateChanged = oldThread.archived !== newThread.archived; // 非目标事件直接返回 if (!lockStateChanged && !archiveStateChanged) return; // 此处编写你的业务逻辑 });
二、区分手动操作与自动归档
通过服务器审计日志可以精准判断操作触发方:自动归档/锁定的执行者是Discord官方系统账号,手动操作则是普通用户或机器人。具体实现如下:
client.on('threadUpdate', async (oldThread, newThread) => { const lockStateChanged = oldThread.locked !== newThread.locked; const archiveStateChanged = oldThread.archived !== newThread.archived; if (!lockStateChanged && !archiveStateChanged) return; try { // 获取最新的线程更新审计日志 const auditLogs = await newThread.guild.fetchAuditLogs({ type: 'THREAD_UPDATE', limit: 1 }); const latestLogEntry = auditLogs.entries.first(); if (!latestLogEntry) return; // Discord系统用户ID(若不匹配可手动触发自动归档后打印executor信息确认) const discordSystemUserId = '936929561302675456'; const isAutoOperation = latestLogEntry.executor?.id === discordSystemUserId; // 输出结果示例 if (archiveStateChanged) { console.log(`线程「${newThread.name}」被${isAutoOperation ? '自动归档' : '手动归档'}`); } if (lockStateChanged) { console.log(`线程「${newThread.name}」被${isAutoOperation ? '系统锁定' : '手动锁定'}`); } } catch (err) { console.error('获取审计日志失败:', err); } });
注意事项
- 机器人需要拥有
VIEW_AUDIT_LOG服务器权限,否则无法获取审计日志。 - 若系统用户ID不匹配,可手动触发一次自动归档,然后打印
latestLogEntry.executor的完整信息来获取正确ID。 - 审计日志查询需在事件触发后立即执行,避免后续操作覆盖目标记录。
内容的提问来源于stack exchange,提问作者Namu
相关产品推荐
相关产品推荐

