[英]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);
};
如果您只想删除正在离开的成员,那么这行代码应该可以解决问题,将其添加到您的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.