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

discord.js中判断频道创建是否达指定时长实现自动删除

Discord临时频道到期自动删除判断方案

核心判断条件实现

你已经提前计算出了频道的到期删除时间戳res + destruct,只需要对比当前时间戳与到期时间戳的大小即可,判断逻辑如下:

// 当前时间毫秒戳 >= 预设的到期时间戳,说明已经达到指定存活时长
if (Date.now() >= date) {
  // 此处放删除频道、删库的逻辑
}

Date.now()会直接返回当前UTC时间的毫秒级时间戳,和你从Mongoose的Date字段通过getTime()取到的创建时间戳单位完全一致,不需要额外做格式转换。

现有代码逻辑修正

你当前写的轮询逻辑还有几个会导致功能失效的问题,需要一并调整:

  • 变量引用错误:循环中单条记录的变量是value,取频道ID时不能用外层的全量数据data,要改成value.Channel
  • 空值判断错误:Mongoose的find()方法在无匹配数据时会返回空数组,不会返回null,原来的if (!data && !data.length)判断永远不会触发空数组的返回逻辑,要改成if (!data.length) return
  • 异步遍历错误:forEach无法正常配合async/await执行异步逻辑,会导致数据库操作、频道删除操作顺序混乱,建议替换成for...of循环遍历记录
  • 缺少存在性校验:如果频道已经被手动删除,直接调用channel.delete()会抛出异常中断轮询,删除前需要先判断频道实例是否存在

修正后的完整轮询代码

setInterval(async () => {
  const tempChannelList = await hSchema.find();
  if (!tempChannelList.length) return;

  for (const record of tempChannelList) {
    const premiumUser = await uSchema.findOne({ User: record.UserID });
    // 会员用户跳过自动删除逻辑
    if (premiumUser) continue;

    const createTimestamp = record.Time.getTime();
    const maxLiveTime = ms('1m');
    const expireTimestamp = createTimestamp + maxLiveTime;

    if (Date.now() >= expireTimestamp) {
      const targetChannel = client.channels.cache.get(record.Channel);
      if (targetChannel) {
        await targetChannel.delete('临时频道达到存活时长自动清理');
      }
      // 清理对应数据库记录
      await record.deleteOne();
    }
  }
}, ms('10 seconds'));

补充说明:如果后续要给不同等级的会员设置不同的频道存活时长,只需要在查到userData后根据会员等级动态给maxLiveTime赋值即可,判断逻辑不需要改动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:18:24