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
相关产品推荐
相关产品推荐

