Получение объекта члена Гильдии с идентификатором пользователя Discord.js v13

#javascript #discord.js

Вопрос:

Я довольно новичок в discord.js и Javascript в целом. Здесь я создал простую команду userinfo, которая извлекает данные пользователя и аккуратно вставляет их, как вы можете видеть ниже. Вы также можете видеть, что команда требует, чтобы автор/мод упомянул пользователя, чтобы получить результат, но я хочу получить тот же результат по идентификатору пользователя discord участника. Я пытался message.mentions.users.first() || message.guild.member.length(args[0]) , но это создает много проблем. Итак, в принципе, как мне использовать одну и ту же команду/код по идентификатору discord.

 const moment = require('moment');
const Discord = require('discord.js');
const { MessageEmbed } = require('discord.js')
module.exports = {
description: 'whois',
run: async (client, message, args) => {
    const user = message.mentions.users.first()

        const embed = new MessageEmbed()
            .setTitle(`**PASSION ISLAND MODERATIONS**`)
            .setColor('#ffc0cb')
            .setThumbnail(user.displayAvatarURL({ dynamic: true }))
            .addField('Username', user.username)
            .addField('User Id', user.id)
            .addField('Account Type', `${user.bot ? 'Bot' : 'Human'}`)
            .addField(`Roles`, `${message.member.roles.cache.size}`)
            .addField(`Joined At`, `${moment.utc(message.member.joinedAt).format('ddd, MMM Do, YYYY, h:mm a')}`)
            .addField(`created At`, `${moment.utc(message.member.createdAt).format('ddd, MMM Do, YYYY, h:mm a')}`)
            .setTimestamp()
            .setFooter(`Requested by ${message.author.username}`)
                 message.channel.send({ embeds:  })


},
}
 

Ответ №1:

Это код, который я использую, который можно найти по идентификатору пользователя, имени пользователя или тегу пользователя.

 let user = message.mentions.users.first()||null;
if (!user amp;amp; args.length > 0) {
   let input = args.join(' ')
   let temp = message.guild.members.cache.get(input) || message.guild.members.cache.find(mem => mem.user.username === input) || mmessage.guild.members.cache.find(mem => mem.user.discriminator === input) || null  
   if (temp) user = temp.user;
}
 

Ответ №2:

Если вы хотите быть на 100% уверены, что найдете пользователя, если он существует на сервере, можете это сделать:

 message.mentions.users.first() || message.guild.members.fetch(args[0])
 

Комментарии:

1. Это выдает эту ошибку, если я использую это, я пробовал это раньше .setThumbnail(user.displayAvatarURL({ динамический: true })) Ошибка типа: user.displayAvatarURL не является функцией

2. Я вижу, в чем ваша ошибка, можете ли вы добавить это if (!user) return message.channel.send("User not found!") ниже, где вы определяете пользователя

3. Как это исправить, ха-ха, пользователь определенно в гильдии @Новичок… может быть

4. @JacyHarrington Вы все еще можете получить эту проверку, но да, проблема в другом и не связана с поиском нужного пользователя. displayAvatarURL-это функция пользователя, а не члена Гильдии. Вы можете сделать .setThumbnail(user.user.displayAvatarURL({ dynamic: true }))

Ответ №3:

Вы можете попробовать использовать

 
    let user; 
    if(message.mentions.members.first()) {
     user = message.mentions.members.first()
     } else { 
let x = await message.guild.members.cache.get(`${args[0]}`)
user = x.user;
}

 

Это будет хорошо работать с идентификаторами, так как вы можете передать снежинку внутри .get() функции.

Комментарии:

1. Я тоже пробовал, но, похоже, это не работает, из-за этого весь код вылетает! он выдает ошибки в displayavatarurl и почти во всем

2. Не могли бы вы отправить сообщение об ошибке?

3. Это выдает эту ошибку, если я использую это, я пробовал это раньше .setThumbnail(user.displayAvatarURL({ динамический: true })) Ошибка типа: user.displayAvatarURL не является функцией

4. Это потому, что displayAvatarURL () — это функция пользователя, а не члена гильдии, которую вы должны выполнять message.guild.members.cache.get(`${args[0]`).user; в этом случае

5. да, я сделал это, но это не работает, это выдает ту же самую точную ошибку

Ответ №4:

Вы можете попробовать использовать

 message.mentions.members.first().then((m) => {
    if (!m) {
        // code
    }
})
// or do this
const member = await message.mentions.members.first();
if (!member) {
    // Code
}
 

или измените members на users

как показали другие люди, вы можете сделать это, найдя идентификатор на сервере следующим образом

 message.guild.members.cache.get(args[0]);
// This will return null if it doesnt exist so you can do this
const member = await message.guild.members.cache.get(args[0]);
if (!member) {
    // code
}
 

Вы можете объединить их оба, чтобы проверить это и убедиться, что участник существует таким образом

 const member = await message.mentions.members.first() || message.guild.members.cache.get(args[0]);
if (!member) {
    // Code
}
 

надеюсь, это помогло

ПРИМЕЧАНИЕ : Я вижу, что вы используете несколько .addField() , которые вы можете использовать .addFields() для оптимизации своего кода, как это

 const embed = new MessageEmbed()
    .addFields(
        { name: 'name', value: 'the description', inline: true || false },
        { name: 'name', value: 'the description', inline: true || false },
    )
 

Комментарии:

1. Я знаю, что пользователь существует, я спрашиваю, как мне запустить код с идентификатором пользователя, например !whois 736651621584601148

2. @JacyHarrington Вы можете использовать message.mentions.members.first() || message.guild.members.cache.get(args[0]) это будет работать, я также добавил это в ответ

3. .get() не возвращает обещание, которое вы не можете использовать Promise.prototype.then() на нем