我正在尝试为我的服务器制作一个用于语音应用程序的机器人。我希望它有一个从语音 channel 中随机选择用户的命令。我尝试了几种不同的方法,但都没有成功,请帮忙。
(编辑) 这是我不太漂亮的代码
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 不是函数”
最佳答案
您的错误告诉您没有正确使用Collecion.array()。看起来好像您试图将它用作构造函数或工厂方法,但它是一个转换器函数。它需要现有的集合才能工作。
其次,您的filter方法将返回一个集合。由于你是按ID过滤的,所以它应该是1的集合,但仍然是一个集合。集合没有 Members 属性,因此 channels.members
未定义。您需要从集合中提取第一个(也是唯一的) channel 。
幸运的是,所有这些都可以通过替换一行来处理。您甚至不需要将其转换为数组,因为 VoiceChannel.members也是一个集合,并且 Collection有自己的随机函数。
const toCheck = channels.first().members;
另一方面,因为您是通过 channel 的唯一 ID 来过滤 channel ,所以通过 c.type 进行过滤是多余的。除非您错误配置 config.voiceChannel,否则它将始终是语音 channel 。
更新 发帖后我还想到您可以使用它来代替过滤器:
const channel = message.guild.channels.get(config.voiceChannel);
这会按 ID 返回单个 channel ,而不是集合,效果更好,因为您无需迭代集合,并且它简化了代码。如果您这样做,则根本不需要使用上面更改的行,请删除该行并使用以下内容:
message.reply(message.author + ', now pick ' + channel.members.random());
关于javascript - (Discord.js) 从语音 channel 中随机选择一个用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59899856/