(Discord.js)如何让所有成员都连接到一个类别的语音频道?
(Discord.js) How do i get all the members connected to the voice channels of a category?
所以,我正在执行一个名为 "movedebat" 的命令,将连接到频道类别的语音频道的所有成员移动到专用于辩论的频道。
为了实现我的目标,我试图获取所有已连接成员的列表,然后使用 for(member in members) 循环并移动每个成员。
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
,但我用谷歌搜索了一下,人们似乎说这并不重要。
我认为有问题的行是 'let connected_members(...)members;' 行。
我应该提一下,我希望在我的控制台中看到至少 1 个成员 ID,但我没有得到,这意味着 for 循环不是 'executed'.
感谢您阅读我,希望有人能提供帮助! ^^
当你声明connected_members
时,你应该在Collection.filter()
.
[=36中使用一个单一函数=]
Collection.filter()
returns 另一个集合,其中 members
不是 属性。您必须遍历 每个频道 才能获取其成员。
for...in
"iterates over all non-Symbol, enumerable properties of an object" (MDN). In a Collection (Map), the elements aren't properties, but key-value pairs. You can use 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 从集合中查找值。
所以,我正在执行一个名为 "movedebat" 的命令,将连接到频道类别的语音频道的所有成员移动到专用于辩论的频道。
为了实现我的目标,我试图获取所有已连接成员的列表,然后使用 for(member in members) 循环并移动每个成员。
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
,但我用谷歌搜索了一下,人们似乎说这并不重要。
我认为有问题的行是 'let connected_members(...)members;' 行。
我应该提一下,我希望在我的控制台中看到至少 1 个成员 ID,但我没有得到,这意味着 for 循环不是 'executed'.
感谢您阅读我,希望有人能提供帮助! ^^
当你声明
[=36中使用一个单一函数=]connected_members
时,你应该在Collection.filter()
.Collection.filter()
returns 另一个集合,其中members
不是 属性。您必须遍历 每个频道 才能获取其成员。for...in
"iterates over all non-Symbol, enumerable properties of an object" (MDN). In a Collection (Map), the elements aren't properties, but key-value pairs. You can usefor...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 从集合中查找值。