Discord.js v13中如何从channelDelete事件获取操作人
解决Discord.js中频道删除事件无法获取操作人的问题
先看你代码里的几个核心问题,这些是导致你拿不到操作人或者逻辑失效的原因:
- 拼写错误:
requier应该写成require,这会直接导致模块导入失败 - 事件监听方式错误:
channelDelete是Discord.js客户端的事件,不是REST事件,应该用bot.on('channelDelete', ...)而非bot.rest.on - 未处理审计日志为空的边界情况:如果服务器审计日志没记录到删除操作,
fetchedLogs.entries.first()会返回undefined,直接解构executor和target会抛出错误 - 缺少首次删除的Map初始化逻辑:用户第一次删除频道时,
usersMap里没有对应ID,你的代码会直接跳过计数逻辑 - 时间计算逻辑错误:你用
channel.createdTimestamp - lastDelete.createdTimestamp是两个频道的创建时间差,应该用当前时间减去上次删除的时间来判断是否在限制周期内 - 封禁操作缺少必要参数:
executor.ban()需要指定权限和理由,否则可能因权限不足或参数缺失失败
下面是修正后的完整代码:
const { AuditLogEvent } = require('discord.js') const usersMap = new Map(); const LIMIT = 3; const TIMES = 10000; // 10秒 bot.on('channelDelete', async channel => { // 只处理指定服务器 if (channel.guild.id !== "940990129307263046") return; try { const fetchedLogs = await channel.guild.fetchAuditLogs({ limit: 1, type: AuditLogEvent.ChannelDelete, }); const deletionLog = fetchedLogs.entries.first(); // 检查是否获取到有效日志 if (!deletionLog) return; const { executor, target } = deletionLog; // 确认日志中的目标是当前删除的频道 if (target.id !== channel.id) return; if (usersMap.has(executor.id)) { const userData = usersMap.get(executor.id); const { lastDeleteTime, deleteCount } = userData; const now = Date.now(); // 如果超过时间窗口,重置计数 if (now - lastDeleteTime > TIMES) { usersMap.set(executor.id, { lastDeleteTime: now, deleteCount: 1 }); } else { const newCount = deleteCount + 1; // 达到限制则封禁 if (newCount === LIMIT) { await executor.ban({ reason: '短时间内删除频道次数过多', deleteMessageSeconds: 0 }).catch(err => console.error('封禁失败:', err)); usersMap.delete(executor.id); } else { usersMap.set(executor.id, { lastDeleteTime: now, deleteCount: newCount }); } } } else { // 首次删除,初始化Map数据 usersMap.set(executor.id, { lastDeleteTime: Date.now(), deleteCount: 1 }); } } catch (err) { console.error('获取审计日志失败:', err); } });
额外说明几个关键点:
- 增加了
try/catch捕获异步操作的错误,避免因权限不足(比如机器人没有查看审计日志的权限)导致程序崩溃 - 增加了
target.id !== channel.id的校验,确保审计日志的目标就是当前触发事件的频道,避免误判 - 封禁操作添加了
reason和deleteMessageSeconds参数,同时捕获可能的错误 - 用
Date.now()来计算时间差,逻辑更准确
内容的提问来源于stack exchange,提问作者Bohdan
相关产品推荐
相关产品推荐

