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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 08:24:20