#javascript #node.js #discord #discord.js
#javascript #node.js #Discord #discord.js
Вопрос:
В настоящее время создается проверка, чтобы узнать, принадлежит ли введенный идентификатор пользователю, но похоже, что «member» не существует. Рассматриваемый код:
client.on("message", (msg) => {
if (msg.author.bot) return;
if (msg.content.startsWith(PREFIX)) {
const [CMD_NAME, ...args] = msg.content
.trim()
.substring(PREFIX.length)
.split(/s /);
if (CMD_NAME == "kick") {
if (args.length === 0) return msg.channel.send("Invalid user.");
const member = msg.guild.members.cache.get(args[0]);
if (member) {
member
.kick()
.then((member) => msg.channel.send(`${member} was kicked.`))
.catch((err) => msg.channel.send(`I lack permissions to kick ${member.user}`));
} else {
msg.channel.send("User not found.");
}
}
}
});
Спасибо за помощь.
Комментарии:
1. Звучит как
member
falsey2. Ну, очевидно
cache.get(args[0])
, не возвращает то, что вы ожидаете. Проверьте содержимоеargs[0]
, а также содержимоеmember
в этом месте3. Извлеките элемент. Не полагайтесь на кеш
Ответ №1:
Прежде всего, я бы рекомендовал использовать fetch (https://discord.js.org/#/docs/main/stable/class/GuildMemberManager?scrollTo=fetch ) вместо get, потому что пользователь, возможно, не кэшируется. Для получения пользователя также fetch требуется Snowflake (идентификатор пользователя), но вы, вероятно, вводите не идентификатор пользователя, а скорее упоминание, которое имеет формат ‘<@userid>’ или ‘!@userid’, поэтому его необходимо проанализировать, прежде чем вы сможете вызвать функцию со snowflake.
Но в вашем случае я бы посоветовал просто использовать встроенные функции для упоминаний.
const member = msg.mentions.users.first();
Комментарии:
1. Просто хочу прокомментировать ваше первое утверждение: прежде всего,
.get()
это задокументировано в документе Collection :https://discord.js.org/#/docs/collection/master/class/Collection?scrollTo=get
. Во-вторых, выборка не всегда является самым надежным источником, так как в больших гильдиях это может привести к тайм-ауту вашего бота и может привести к его сбою.2. @Bqre Как выборка 1 пользователя приведет к сбою бота? Да, это приведет к сбою, если вы получите всю гильдию…
3. @Logan Devine В довольно больших гильдиях это возможно. Это не слишком распространено, но мне это приходило в голову один или два раза. С тех пор я больше не рискую, учитывая, что большинство пользователей discord уже кэшированы.
4. @Bqre С последними обновлениями API кэшируется очень мало участников.