簡體   English   中英

Discord.js 對服務器上的所有文本頻道進行排序

[英]Discord.js Sorting through all text channels on a server

module.exports = {
 name: 'cleartextchats',
 description:
  'clears desired amount of text chats created by the bot. usage: cleartextchats <amount>',
 execute(message, args) {
  var channelAmount = args[0];
  console.log('executing cleartextchats');
  for (var i = 0; i < channelAmount; i++) {
   var textChat = message.guild.channels.cache
    .filter((ch) => ch.type === 'text')
    .find(
     (targetch) => targetch.topic == 'volturnbot' && targetch.deleted == false
    );
   message.channel.send(`deleting ` + textChat.name);
   textChat.delete();
  }
 },
};

for 循環不會越過第一個刪除的通道。 我認為這是因為除非我使用不同的/新消息,否則緩存不會更新,但該命令應該從消息運行。 我想不出一種方法來實現這一點,它適用於任何數量的頻道。

目前,每當我的機器人創建文本頻道時,它都會更新主題以包含“volturnbot”,以便它可以刪除沒有類別的自己的頻道。

我認為這是因為除非我使用不同的/新消息,否則緩存不會更新,但該命令應該從消息運行。

我相信這個假設是正確的。 這可能是因為即使在 for 循環中刪除頻道后, channel.deleted屬性仍然為false ,因為頻道刪除可能會產生輕微的延遲。 我能想到的解決方案有兩種:

A) 代替使用for循環,您也許可以使用setInterval作為延遲為 1000 毫秒左右的循環(可能必須根據工作情況增加或減少)。 您需要創建兩個新變量:一個用於包含setInterval循環,另一個用於跟蹤循環發生了多少次迭代。 當迭代變量等於 channelAmount 變量時,即使用return 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()
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM