繁体   English   中英

如何无误地检查Discord.js中是否存在用户?

[英]How to check the existence of a user in Discord.js without errors?

解释

我正在开发一个用户验证机器人。 在要求中,我需要删除用户对特定消息的反应,但删除反应 discord.js 会触发messageReactionRemove事件并导致执行另一个 function 以将角色设置为用户。

问题/错误

问题发生在用户离开服务器时,discord.js 删除了反应但又触发了另一个事件messageReactionRemove并且我的机器人因名为“Uknow Member”的错误而崩溃

代码

用户离开服务器时的监听器:

// All this code works fine :)

client.on("guildMemberRemove", async (member) => {
 warn(`El usuario ${member.user.username} abandono el servidor`);

 try {
   const channel = await client.channels.fetch(CHANNELS.VERIFICATION_CHANNEL);
   const message = await channel.messages.fetch(
     MESSAGES.BOT_VERIFICATION_MESSAGE_ID
   );

   message.reactions.cache.map((reaction) => {

     // After removing the reaction, discord.js fires the event "messageReactionRemove"
     reaction.users.remove(member.user.id);
   });
 } catch (err) {
   console.error(err);
 }
});

当用户从消息中删除反应时的监听器:

  if (!user.bot) {
    try {
      const channelId = reaction.message.channelId;
      const messageId = reaction.message.id;
      const emojiName = reaction.emoji.name;
      const userExists = await getMember(user.id); // <-- This explodes in an error

      if (!userExists) {
        warn(`El usuario ${user.username} no existe en el servidor`);
        return;
      }

      if (
        channelId === CHANNELS.VERIFICATION_CHANNEL &&
        messageId === MESSAGES.BOT_VERIFICATION_MESSAGE_ID &&
        emojiName === EMOJIS.VERIFICATION_EMOJI
      ) {
        addTownLoyalRoleToNewUsers(reaction, user);
      }
      // other messages validations ...

    } catch (err) {
      error(err.message, err);
    }
  }

添加验证角色的代码:

const addTownLoyalRoleToNewUsers = async (reaction, user) => {
  const member = await reaction.message.guild.members.fetch(user.id); // <-- This also blows up in an error
  const townRoyalUsersLength = await getUsersLengthByRole(
    ROLES.TOW_LOYAL_ROLE_ID
  );

  if (townRoyalUsersLength <= MAX_LENGTH_TOW_LOYAL_USERS) {
    member.roles.add(ROLES.TOW_LOYAL_ROLE_ID);
  } else {
    member.roles.add(ROLES.VERIFIED_ROLE_ID);
  }

  const otherRoles = ROLES.AFTER_VERIFICATION();
  if (otherRoles.length) member.roles.add(otherRoles);
};

错误图片用户离开服务器时出错discord.js 错误 1

有趣的是,当用户离开时, guildMemberRemove事件仍然拥有不存在的用户discord.js 错误 2

如果您只想删除正在离开的成员,那么这行代码应该可以解决问题,将其添加到您的guildMemberRemove事件中

client.channels.cache.get('ChannelIdWithMessage').messages.fetch('MessageIdToRemoveReactionsFrom').then((message) => {
message.reactions.cache.filter(reaction => reaction.users.remove(member.user.id))
})

discord.js 有 2 个部分,您应该知道,有 Discord API,这是这些错误的来源,然后是对象,这使得与 Discord API 的交互更容易。

我假设您的getMember() function 尝试通过 ID ( guild.members.fetch(id) ) 从 API 获取成员。 注意用户不是“不存在的”,它是GuildMember object 只是来自事件的数据,但您无法在 API 中与它交互。您似乎期望getMember() function 返回一个虚假值,如 null 或未定义,如果找不到该成员。 相反,它会收到 404 并拒绝。

相反,使用这样的.catch()

const userExists = await getMember(user.id).catch(() => null); // null if rejected

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM