(Discord.js)如何将所有成员连接到类别的语音通道?

时间:2019-06-12 21:46:43

标签: javascript discord.js commando

因此,我正在执行一个名为“ movedebat”的命令,将与该通道类别的语音通道连接的所有成员移动到专门用于辩论的通道。

为了实现我的目标,我试图获取所有连接的成员的列表,然后使用for(members中的member)循环并移动每个成员。

    let debate_channel = message.guild.channels.find(c => c.id === '497910775512563742');
    let group_of_channels = message.guild.channels.find(c => c.id === '497908108803440653');
    let connected_members = message.guild.channels.filter((c => parentID === group_of_channels.id)&&(c => c.type == 2)).members;
    if(message.member.permissions.has('ADMINISTRATOR')){
        for(connected_member in connected_members){
            console.log(connected_member.id); 
            connected_member.setVoiceChannel(debate_channel)
                .then(() => console.log(`Moved ${connected_member.displayName}`))
                .catch(console.error);
        }
    }

问题在于它根本不起作用。我没有收到任何错误,无论是僵尸机器人本身还是在控制台中都没有。 我唯一得到的是警告DeprecationWarning: Collection#filterArray: use Collection#filter instead,但我在Google上搜索了一下,人们似乎说这并不重要。 我认为问题所在是“让connected_members(...)成员;”一。 我应该提一下,我希望在控制台中看到至少1个成员ID,但没有得到任何ID,这意味着for循环未“执行”。

感谢您阅读我,希望有人能为您提供帮助! ^^

1 个答案:

答案 0 :(得分:0)

  • 声明connected_members时,应在Collection.filter()中使用单个函数。

  • Collection.filter()返回另一个Collection,其中members不是属性。您必须遍历每个频道以获得其成员。

  • for...in“迭代对象的所有非符号可枚举的属性 ”(MDN)。在集合(Map)中,元素不是属性,而是键值对。在这种情况下,您可以改用for...of

if (message.member.permissions.missing('ADMINISTRATOR')) return;

const channels = message.guild.channels.filter(c => c.parentID === '497908108803440653' && c.type === 'voice');

for (const [channelID, channel] of channels) {
  for (const [memberID, member] of channel.members) {
    member.setVoiceChannel('497910775512563742')
      .then(() => console.log(`Moved ${member.user.tag}.`))
      .catch(console.error);
  }
}

旁注:使用Map.get()通过其ID从集合中查找值。