我试图在每次运行命令时生成一个命令来ping一个随机用户,但我似乎遇到了问题。
这是我的代码:
const DiscordCommand = require('../../contracts/DiscordCommand');
class KickCommand extends DiscordCommand {
onCommand(message) {
message.delete();
const userList = message.guild.members.cache.array();
var randomNumber = Math.round(Math.random() * message.guild.memberCount);
var pingPerson = userList[randomNumber];
message.channel.send('<@' + pingPerson.user.id + '>').then((msg) => {
msg.delete({ timeout: 100 });
});
}
}
module.exports = KickCommand;
我得到的错误:
TypeError: Cannot read property 'user' of undefined
问题是,当您使用round()
而不是floor()
时,Math.round(Math.random() * message.guild.memberCount)
可以返回大于上一个索引的数字。
然而;您可以使用Collection#random()
从集合中获得唯一的随机值,而不是创建随机生成器函数。
message.guild.members.cache
返回一个集合,所以您可以这样使用它:
class KickCommand extends DiscordCommand {
onCommand(message) {
message.delete();
const pingPerson = message.guild.members.cache.random();
message.channel.send('<@' + pingPerson.user.id + '>').then((msg) => {
msg.delete({ timeout: 100 });
});
}
}
首先fetch
用户可能也是个好主意:
class KickCommand extends DiscordCommand {
async onCommand(message) {
message.delete();
await message.guild.members.fetch();
const pingPerson = message.guild.members.cache.random();
const msg = await message.channel.send('<@' + pingPerson.user.id + '>');
// msg.delete() doesn't take any parameters in v13, so use setTimeout instead
setTimeout(() => msg.delete(), 100);
}
}
并确保GUILD_MEMBERS
意图已启用。