(Discord.js)从语音通道中选择一个随机用户

时间:2020-01-24 15:56:53

标签: javascript discord.js

我正在尝试为服务器上的语音应用程序创建一个机器人。我希望它具有从语音通道中选择随机用户的命令。我尝试用几种不同的方式来做到这一点,但是它们都没有起作用,请帮忙。

(编辑) 这是我的代码不好

else if (args[0].toLowerCase() === 'pick') {
    const GuildMember = message.guild.members;

    const channels = message.guild.channels.filter(c => c.ID === config.voiceChannel && c.type === 'voice');

    const toCheck = Discord.Collection.array(channels.members);

    message.reply(message.author + ', now pick ' + toCheck.random());
}
message.delete().catch(O_o=>{});

(另一个编辑) 这是我得到“ TypeError:Discord.Collection.array不是函数”的错误

2 个答案:

答案 0 :(得分:1)

您的错误告诉您您没有正确使用Collecion.array()。似乎您正在尝试将其用作构造函数或工厂方法,但这是一个转换器函数。它需要一个现有的集合才能工作。

第二,您的filter方法将返回一个集合。由于您是按ID进行过滤,因此它应该是1的集合,但仍然是集合。集合没有members属性,因此channels.members是未定义的。您需要从集合中提取第一个(也是唯一的)通道。

幸运的是,所有这些都可以通过替换一行来解决。您甚至不需要将其转换为数组,因为VoiceChannel.members也是一个集合,并且Collection拥有自己的随机函数。

const toCheck = channels.first().members;

另一方面,由于您要通过通道的唯一ID对其进行过滤,因此按c.type进行过滤是多余的。除非您配置config.voiceChannel错误,否则它将始终是语音通道。

更新 发布后,我也想到可以用它代替过滤器:

const channel = message.guild.channels.get(config.voiceChannel);

这将按ID返回单个通道,而不是集合,这会更好,因为您无需遍历集合,并且可以简化代码。如果执行此操作,则根本不需要使用上面更改的行,请删除该行并使用以下命令:

message.reply(message.author + ', now pick ' + channel.members.random()); 

答案 1 :(得分:0)

很高兴,感谢您的回答,它帮助我弄清楚了。

对于也想从语音通道中随机挑选一个人的人,下面是可以在命令中输入的代码:

const GuildMember = message.guild.members;

const channel = message.guild.channels.get('voiceChannelID'); //replace voiceChannelID with your voice Channel ID

let toCheck = channel.members;

message.reply('a random person: ' + toCheck.random());