javascript - (Discord.js) 从语音 channel 中随机选择一个用户

标签 javascript discord.js

我正在尝试为我的服务器制作一个用于语音应用程序的机器人。我希望它有一个从语音 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/

相关文章:

javascript - 有没有办法通过用户提示输入来解决数学问题

javascript - 在discord.js中设置用户的昵称

javascript - 错误 : ENOENT: no such file or directory, 扫描目录 './commands/'

javascript - 我如何使用discord.js@everyone?

javascript - 为什么当我将某些内容插入 JSON 数组时没有任何反应?

Javascript/D3 --- 标签的条件格式

javascript - 在 PHP 代码中使用 JavaScript 访问动态创建元素的值

javascript - window.onload 包含图像

javascript - Jquery Cycle Slider - 快速点击打破 slider

javascript - 未处理的PromiseRejectionWarning : TypeError: Cannot read property 'add' of undefined (Discord Bot)