Discord.js Userinfo 命令 TypeError:无法读取 null 的属性“角色”

时间:2021-06-10 15:47:21

标签: discord discord.js

我很抱歉,我真的不喜欢寻求帮助,但我找不到解决方案。

我正在为我的机器人创建一个 userinfo 命令,到目前为止一切顺利,但我想从不在执行命令的服务器上的用户那里获取信息,但他在机器人所在的另一台服务器上,当我使用一个函数来收集头寸时,我得到一个错误,所以我希望,如果用户不在机器人服务器上,他会返回给我另一个嵌入,只包含帐户 ID、名称和创建日期信息.

  async run({ message, args, prefix, author }, t) {
    moment.locale("pt-BR");

    try {
      const user = 
        this.client.users.cache.get(args[0]) ||
          message.mentions.members.first() ||
          message.author;

      const flags = [];
      this.Flags(user, flags);

      const roles = [];
      this.Roles(user, roles, message);

      let presence;
      if (!user.presence.activities.length) presence = "Não está jogando nada";
      else presence = user.presence.activities.join(", ");

      const device = this.Device(user);
      const joined = `${moment(user.joinedAt).format("L")} ( ${moment(
        user.joinedAt
      )
        .startOf("day")
        .fromNow()} )`;
      const created = `${moment(
        this.client.users.cache.get(user.id).createdAt
      ).format("L")} ( ${moment(this.client.users.cache.get(user.id).createdAt)
        .startOf("day")
        .fromNow()} )`;

      const USERINFO = new ClientEmbed(author)
        .setTitle(flags + ` ${user.username}`)
        .addFields(
          { name: "<:richPresence:843144574234394655>┆**Status:**", value: `\`\`\`diff\n- ${presence}\`\`\`` },
          { name: "**Nome do Usuário:**", value: user.tag, inline: true },
          {
            name: "**Nickname no Servidor:**",
            value: !!user.nickname ? user.nickname : "Nenhum Nickname",
            inline: true,
          },
          { name: "**ID do Usuário:**", 
            value: user.id,
            inline: true
          },
          { name: "**Conta Criada:**", value: created, inline: true },

          { name: "**Entrada no Servidor:**", value: joined, inline: true },
          {
            name: "**Dispositivo:**",
            value: String(device).replace("null", "Nenhum"),
            inline: true,
          },
          {
            name: `**Cargos no Servidor**`,
            value: roles,
          }
        )
        .setThumbnail(user.displayAvatarURL({ dynamic: true }))
        .setFooter(
          `Comando solicitado por ${message.author.tag}`,
          message.author.displayAvatarURL({ dynamic: true })
        );

      message.quote(USERINFO);
    } catch (err) {
      console.log(`ERRO NO COMANDO USERINFO\nERROR: ${err}`);
    }
  }

2 个答案:

答案 0 :(得分:0)

您可以使用 Guild.member(User) 从输入的用户处获取 GuildMembernull

如果结果为 null,则该用户不存在于服务器中。

const user = 
  this.client.users.cache.get(args[0]) ||
  message.mentions.members.first() ||
  message.author;

// you should also probably check that the command is run in a guild channel

const guildMember = message.guild.member(user);

if (guildMember) {
  // include roles in embed
} else {
  // don't include roles in embed
}

答案 1 :(得分:0)

我相信您的问题是您将帐户信息作为 User 属性获取。

问题在于公会成员和用户不同。公会成员,保存特定服务器中用户的附加信息,例如角色。

当前您从这个变量中获取配置文件信息:

const user = 
this.client.users.cache.get(args[0]) || // This is a user property
message.mentions.members.first() || // This is a member propery
message.author; // This is a user property

这样做的问题是,它有时会返回一个用户,而该用户的数据中没有存储任何角色。

这是一个可能的修复:

 // We need to make sure they run this in a server so we can access the roles
if (!message.guild) return message.channel.send("This command must be ran in a server")

// This will always return a guild member
const user = 
    message.guild.members.cache.get(args[0]) ||
    message.mentions.members.first() ||
    message.member;

您可以在 discord.js 文档中阅读有关 UserMember 的内容