例如,我们有两个名为A和B的语音通道,而通道A有4个用户。我希望这4个用户进入频道B,但是我有一些问题如何指向他们(我是说放手)。
命令用法示例:+vmove channelid channelid
let args1 = args[1];
let args2 = args[2];
let oldChannel = message.guild.channelMembers.get(args1);
let newChannel = message.guild.channels.get(args2);
let kullanicilar = message.guild.channels.get(args1).members.forEach(member);
if (typeof args[0] == "undefined");
return;
message.channel.send("Please provide a channelname.");
if (!oldChannel)
return message.channel
.send({ embed: { description: `Kanal Belirtmedin` } })
.then((msg) => msg.delete(10000));
if (!newChannel)
return message.channel
.send({ embed: { description: `Nereye taşınacağını belirtmedin` } })
.then((msg) => msg.delete(10000));
if (!kullanicilar)
return message.channel
.send({ embed: { description: `Sesli odada kimse bulunmuyor.` } })
.then((msg) => msg.delete(10000));
kullanicilar
.setVoiceChannel(`${newChannel}`)
.then(() =>
message.channel.send(`${kullanicilar} <#${newChannel}> adlı kanala taşındı`)
)
.catch(console.error);
答案 0 :(得分:1)
此命令的主要问题是语音通道不容易提及。理想的方法是通过其ID进行提及,但我认为即使这样看起来也不好。
您似乎正在使用Discord.js的v11,因此强烈建议您升级到v12。您肯定会找到更好的支持。
因此,我将尝试涵盖两个版本。 v12适用于其他看到该线程的人。
您的代码存在的问题是,您首先尝试使用错误的语法使用forEach循环进行映射。但是,即使正确,也不会返回任何内容。因此,您将不得不使用.map(member => member)
。然后稍后遍历生成的数组到setVoiceChannel。尽管这不是必需的,因为您可以直接使用oldChannel.members.forEach()
。
此外,我不明白为什么在第3行中您尝试通过GuildChannel对象中的'channelMembers'获取通道,第4行方法是正确的。
您应该先纠正第3行的错误。
// change this
let oldChannel = message.guild.channelMembers.get(args1);
let newChannel = message.guild.channels.get(args2);
// to this
let oldChannel = message.guild.channels.get(args1);
let newChannel = message.guild.channels.get(args2);
如果您想按名称获取频道,这是我的版本:
const originChannelName = args[1];
const destinationChannelName = args[2];
let originChannel;
let destinationChannel;
message.guild.channels.forEach(channel => {
if(channel.name === originChannelName) originChannel = channel;
if(channel.name === destinationChannelName) destinationChannel = channel;
});
// You can handle your exceptions here
(请注意,这将要求名称完全相同,并且频道名称不能包含空格。)
现在您已经拥有了两个渠道。您可以遍历原始通道的成员并将其通道设置为目标通道。
originChannel.members.forEach(member => {
member.setVoiceChannel(destinationChannel);
});
最终命令应如下所示:
// Variables Declarations
const originChannelName = args[0];
const destinationChannelName = args[1];
let originChannel;
let destinationChannel;
message.guild.channels.forEach(channel => {
if(channel.name === originChannelName) originChannel = channel;
if(channel.name === destinationChannelName) destinationChannel = channel;
});
// Exceptions
if(originChannel === undefined) {
return message.channel.send({
embed: {
description: 'Origin channel not found!'
}
}).then(message => message.delete(10000));
}
if(destinationChannel === undefined) {
return message.channel.send({
embed: {
description: 'Destination channel not found!'
}
}).then(message => message.delete(10000));
}
if(originChannel.members.size < 1) {
return message.channel.send({
embed: {
description: 'There is no member in the origin channel!'
}
}).then(message => message.delete(10000));
}
// Set voice channel
originChannel.members.forEach(member => {
member.setVoiceChannel(destinationChannel);
});
// Give some feedback
message.channel.send({
embed: {
description: `${originChannel.members.size} people moved from ${originChannel.toString()} to ${destinationChannel.toString()}!`
}
}).then(message => message.delete(10000));
如果Discord.js是v12,则情况会有所变化。 “ message.guild.channels”现在为GuildChannelManager,并且通道位于其缓存中,因此其中没有.get()方法。
.get()现在在其缓存(这是一个集合)中。因此,考虑args [1]和args [2]是通道ID,只需添加'.cache'。第3行和第4行应该可以解决问题。
// changes this
let oldChannel = message.guild.channels.get(args[1]);
let newChannel = message.guild.channels.get(args[2]);
// to this
let oldChannel = message.guild.channels.cache.get(args1);
let newChannel = message.guild.channels.cache.get(args2);
VoiceState现在是一个分离的对象,因此,现在,不是直接从成员中调用.setVoiceChannel(),而是必须通过其语音状态对象来设置成员的语音状态。
originChannel.members.forEach(member => {
member.voice.setChannel(destinationChannel);
});