Discord.js将多个用户从语音通道转移到另一个

时间:2020-09-06 19:47:23

标签: javascript node.js discord discord.js

例如,我们有两个名为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);

1 个答案:

答案 0 :(得分:1)

此命令的主要问题是语音通道不容易提及。理想的方法是通过其ID进行提及,但我认为即使这样看起来也不好。

您似乎正在使用Discord.js的v11,因此强烈建议您升级到v12。您肯定会找到更好的支持。

因此,我将尝试涵盖两个版本。 v12适用于其他看到该线程的人。

您的代码存在的问题是,您首先尝试使用错误的语法使用forEach循环进行映射。但是,即使正确,也不会返回任何内容。因此,您将不得不使用.map(member => member)。然后稍后遍历生成的数组到setVoiceChannel。尽管这不是必需的,因为您可以直接使用oldChannel.members.forEach()

此外,我不明白为什么在第3行中您尝试通过GuildChannel对象中的'channelMembers'获取通道,第4行方法是正确的。

v11

您应该先纠正第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));

v12

如果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);
});