【问题标题】:Getting GuildMember Object with user ID Discord.js v13使用用户 ID Discord.js v13 获取 GuildMember 对象
【发布时间】:2021-11-03 09:59:52
【问题描述】:

总的来说,我对 discord.js 和 Javascript 还很陌生。在这里,我创建了一个简单的 userinfo 命令,它获取用户的数据并将其整齐地嵌入,如下所示。您还可以看到该命令要求作者/mod 提及用户以获取结果嵌入,但我想通过成员的不和谐用户 ID 获得相同的结果。 我试过message.mentions.users.first() || message.guild.member.length(args[0]),但这会产生很多问题。所以基本上我如何通过不和谐 ID 使用相同的命令/代码。

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: [embed] })


},
}

【问题讨论】:

    标签: javascript discord.js


    【解决方案1】:

    这是我正在使用的代码,可以通过用户 id、用户名或用户标签找到。

    let user = message.mentions.users.first()||null;
    if (!user && 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】:

      你可以试试

      
          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;
      }
      
      

      这适用于 ID,因为您可以在 .get() 函数中传递雪花。

      【讨论】:

      • 我试过了,似乎也不起作用,因此整个代码崩溃了!它会在 displayavatarurl 和几乎所有内容中引发错误
      • 你能把错误发过来吗?
      • 如果我使用它会抛出这个错误我之前尝试过 .setThumbnail(user.displayAvatarURL({ dynamic: true })) TypeError: user.displayAvatarURL is not a function
      • 那是因为 displayAvatarURL() 是用户而不是 GuildMember 的函数,在这种情况下你必须做message.guild.members.cache.get(`${args[0]`).user;
      • 是的,我做了那行不通,它抛出了同样的错误
      【解决方案3】:

      如果你想 100% 确定你会找到用户,如果他存在于服务器中可以这样做:

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

      【讨论】:

      • 如果我使用它会抛出这个错误我之前尝试过 .setThumbnail(user.displayAvatarURL({ dynamic: true })) TypeError: user.displayAvatarURL is not a function
      • 我知道您的错误是什么,您可以在定义用户的位置下方添加if (!user) return message.channel.send("User not found!")
      • 如何修复哈哈用户肯定在公会@Newbie...也许
      • @JacyHarrington 您仍然可以进行该检查,但是是的,问题有所不同,并且与找到合适的用户无关。 displayAvatarURL 是 User 上的函数,而不是 GuildMember。你可以做.setThumbnail(user.user.displayAvatarURL({ dynamic: true }))
      【解决方案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

      正如其他人所展示的,您可以通过在服务器中查找 id 来做到这一点

      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 },
          )
      

      【讨论】:

      • 我知道用户存在我要问的是如何使用!whois 736651621584601148这样的用户ID运行代码
      • @JacyHarrington 你可以使用message.mentions.members.first() || message.guild.members.cache.get(args[0]) 这会起作用,我也在答案中添加了这个
      • .get() 没有返回你不能使用 Promise.prototype.then() 的承诺
      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 2021-02-10
      • 2021-05-01
      • 2022-01-04
      • 2018-08-21
      • 2020-07-05
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多