Javascript Discord.js通过服务器上的所有文本通道进行排序 module.exports={ 名称:“cleartextchats”, 说明: '清除由bot创建的所需数量的文本聊天。用法:cleartextchats', 执行(消息,参数){ var channelAmount=args[0]; log('executing cleartextchats'); 对于(变量i=0;ich.type=='text') .找到( (targetch)=>targetch.topic=='volturnbot'&&targetch.deleted==false ); message.channel.send(`deleting`+textChat.name); textChat.delete(); } }, };

Javascript Discord.js通过服务器上的所有文本通道进行排序 module.exports={ 名称:“cleartextchats”, 说明: '清除由bot创建的所需数量的文本聊天。用法:cleartextchats', 执行(消息,参数){ var channelAmount=args[0]; log('executing cleartextchats'); 对于(变量i=0;ich.type=='text') .找到( (targetch)=>targetch.topic=='volturnbot'&&targetch.deleted==false ); message.channel.send(`deleting`+textChat.name); textChat.delete(); } }, };,javascript,node.js,discord,discord.js,Javascript,Node.js,Discord,Discord.js,for循环不会超过第一个删除的通道。 我认为这是因为缓存不会更新,除非我使用不同的/新的消息,但命令应该从消息运行。我想不出一个方法来实现这一点,将工作的任何数量的渠道 当前,每当my bot创建文本频道时,它都会更新主题以包含“volturnbot”,这样它就可以删除自己的频道而无需类别 我认为这是因为缓存不会更新,除非我使用不同的/新的消息,但命令应该从消息运行 我相信这个假设是正确的。这可能是因为即使在for循环中删除通道后,channel.deleted属性仍然是false,因为可能存在

for循环不会超过第一个删除的通道。 我认为这是因为缓存不会更新,除非我使用不同的/新的消息,但命令应该从消息运行。我想不出一个方法来实现这一点,将工作的任何数量的渠道

当前,每当my bot创建文本频道时,它都会更新主题以包含“volturnbot”,这样它就可以删除自己的频道而无需类别

我认为这是因为缓存不会更新,除非我使用不同的/新的消息,但命令应该从消息运行

我相信这个假设是正确的。这可能是因为即使在for循环中删除通道后,
channel.deleted
属性仍然是
false
,因为可能存在与通道删除相关的轻微延迟。我可以想到两种解决方案:

A) 与使用
for
循环不同,您可以使用
setInterval
作为延迟为1000毫秒左右的循环(可能需要根据工作方式增加或减少延迟)。您需要创建两个新变量:一个用于包含
setInterval
循环,另一个用于跟踪循环的迭代次数。当迭代变量等于channelAmount变量时,即使用
返回clearInterval(intervalVariable)
时,intervalVariable是包含循环的变量。(这是假设超时为缓存提供了足够的时间,以便在删除通道后进行更新)

B) 循环通过缓存的文本通道,而不是每次从缓存中获取一个通道。例如:

var channelAmount = Number(args[0]);
console.log("executing cleartextchats")

var channels = message.guild.channels.cache.filter(ch => ch.deleted == false && ch.type === 'text' && ch.topic && ch.topic.match("volturnbot"));
var iterations = 0;

for (var textChat of channels) {
    iterations++;
    message.channel.send(`deleting ` + textChat.name)
    textChat.delete()

    if (iterations == channelAmount) break;
}

老实说,我更喜欢选项B,我相信选项B在你想要实现的目标方面会更好。您还提到频道主题“包括”短语“volturnbot”,我不确定这是否表明描述可能比“volturnbot”更准确,因此我使用选项B使用
topic.match(“volturnbot”)

因为
guild.channels.cache
返回集合,所以必须使用
.array()
此外,与其查找单个通道然后搜索同一个缓存,不如将所有通道放在一个数组中并循环通过该数组

    var channelAmount = Number(args[0]);
    var textChats = message.guild.channels.cache
        .filter((ch) => ch.type === 'text' && ch.topic === 'volturnbot')
        .array()
        
    for (var i = 0; i <= channelAmount; i++) {
        message.channel.send("deleting " + textChats[i].name)
        //textChats[i].delete()
    }
var channelAmount=Number(args[0]);
var textChats=message.guild.channels.cache
.filter((ch)=>ch.type=='text'&&ch.topic=='volturnbot')
.array()

对于(var i=0;感谢您的回答,我几乎完全放弃了这个问题。但是,match方法似乎给出了一个错误
TypeError:无法在message.guild.channels.cache.filter.ch读取null属性“match”
测试服务器上有一些频道没有主题,我猜它们的主题是equal to null,这会导致此错误。无论我现在使用的是什么排序方法,
主题
值似乎总是未定义或是其他什么东西。`for(let channel of message.guild.channels.cache){if(channel.topic&&channel.topic.includes(“volturnbot”))message.channel.send(channel.name);}``如果它必须通读
通道.topic
它只返回未定义的,这对于任何通道都是一样的。有趣的。我不知道为什么会发生这种情况。我发现堆栈溢出问题也有同样的问题,但它们的答案不是很清楚。如果你最终找到了解决方案,请告诉我,我会更新您可能还想尝试类似于
console.log(channel.topic)
console.log(Object.keys(channel))
以确保我们拥有的通道对象包含“topic”属性。发现
channels.cache
返回一个集合而不是数组,因此必须使用
.array()进行转换
,在另一个答案中修复了它,它可以工作请注意,您需要在
for
循环中检查
i
,而不是
i