我正在创建一个角色反应机器人,我希望如果一个成员已经单击一个反应并单击另一个,它会删除前一个反应和与之关联的角色,并为他提供与最后一个单击的角色相对应的角色(有15种反应),我正在编写类似于以下代码:
free
是否有一种更简便快捷的方法来完成我想做的事情,而无需为每个角色创建let msg = reaction.message;
let msgGuild = msg.guild;
let userGuild = msgGuild.members.cache.get(user.id);
let userRole = userGuild.roles;
if(reaction.message.channel.id === "764148072498200589") {
if(reaction.emoji.name === "RedRoleID") {
if(userRole.cache.has("BaseRoleID")) {
userRole.remove("BaseRoleID");
userRole.add("RedRoleID");
} else if(userRole.cache.has("OrangeRoleID")) {
userRole.remove("OrangeRoleID");
userRole.add("RedRoleID");
}
};
};
?
答案 0 :(得分:0)
我认为您可以将所有表情符号名称组成一个数组,然后使用Array.prototype.forEach
检查所有这些表情符号。
let { emoji, message, message: { guild, channel }} = reaction;
let { roles } = guild.member(user.id);
const emojis = ['BaseRoleID', 'RedRoleID', 'OrangeRoleID', 'etc'];
if (channel.id === '764148072498200589') {
emojis.forEach((id) => (roles.cache.has(id) ? roles.remove(id) : id));
roles.add(emoji.name);
}
编辑:我的错误,我以为您已将表情符号命名为相应的角色ID。如果您不想这样做,可以使用以下替代方法:
let { emoji, message, message: { guild, channel }} = reaction;
let { roles } = guild.member(user.id);
const emojis = [
{ emote: 'EmojiID', role: 'RoleID' },
'continue this pattern for all roles and emotes'
];
if (channel.id === '764148072498200589') {
emojis.forEach(({ emote, role }) => {
if (roles.cache.has(role))
return roles.remove(role)
if (emoji.id === emote) roles.add(role)
});
};