使用用户 ID Discord.js v13 获取 GuildMember 对象

Posted

技术标签:

【中文标题】使用用户 ID Discord.js v13 获取 GuildMember 对象【英文标题】:Getting GuildMember Object with user ID Discord.js v13 【发布时间】: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] )


,

【问题讨论】:

【参考方案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() 的承诺

以上是关于使用用户 ID Discord.js v13 获取 GuildMember 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息发送到指定的频道 - Discord.js v13 TypeScript

discord.js v13 成员存在未定义

如何将斜杠命令隐藏到特定用户或频道 Discord.js v13

Discord.js V13:如何编辑交互的消息对象?

Discord.js v13 机器人显示未定义而不是表情符号

斜杠命令处理程序中的 Discord.js v13 TypeError