首页 > 解决方案 > 更新角色一次只允许一个用户

问题描述

目前,用户可以选择该部分中给出的尽可能多的角色,但是,我希望能够按照以下方式做一些事情: (roleA OR roleB) AND (roleC OR roleD) AND roleE 等

以上所有内容都是通过检查他们已经提交的反应来触发的,如果新的选择与当前的选择相矛盾,则将其删除。

用户可以通过对指定消息做出反应来将反应角色应用于自己。根据是否做出某个选择,它能够添加/删除另一个角色,即

你今年多大?- 18-24 - 25-30 - 31+

什么是你的性别?- 男 - 女

你在哪个大陆?- IDK,我用完了 - 虚假问题 - 填补空白。

如果用户单击 25-30,但随后意识到他们是 24,然后单击它,我希望删除先前的反应和角色,而无需手动干预。不仅有 1 个选项可用,因此也希望有多个选项可用。

bot.on("raw", event =>{
    console.log(event);
    const eventName = event.t;
    if(eventName === 'MESSAGE_REACTION_ADD')
    {
        if(event.d.message_id === '<REMOVED ID>')
        {
            var reactionChannel = bot.channels.get(event.d.channel_id);
            if(reactionChannel.messages.has(event.d.message_id))
                return;
            else {
                reactionChannel.fetchMessage(event.d.message_id)
                .then(msg => {
                    var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
                    var user = bot.users.get(event.d.user_id);
                    bot.emit('messageReactionAdd', msgReaction, user);
                 })
                .catch(err => console.log(err));
            }
        }
    }
    else if (eventName === 'MESSAGE_REACTION_REMOVE')
    {
        if(event.d.message_id === '<REMOVED ID>')
        {
            var reactionChannel = bot.channels.get(event.d.channel_id);
            if(reactionChannel.messages.has(event.d.message_id))
                return;
            else{
                reactionChannel.fetchMessage(event.d.message_id)
                .then(msg => {
                    var msgReaction = msg.reactions.get(event.d.emoji.name + ":" + event.d.emoji.id);
                    var user = bot.users.get(event.d.user_id);
                    bot.emit('messageReactionRemove', msgReaction, user);
                 })
                .catch(err => console.log(err));
            }
        }
    }
});

bot.on('messageReactionAdd', (messageReaction, user) => {
    var roleName = messageReaction.emoji.name;
    var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());



    if(role)
    {
        var member = messageReaction.message.guild.members.find(member => member.id === user.id);

        if(member)
        {
            member.addRole(role.id);
            console.log('Success. Added role.');
        }
    }
});

bot.on('messageReactionRemove', (messageReaction, user) => {
    var roleName = messageReaction.emoji.name;
    var role = messageReaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());

    if(role)
    {
        var member = messageReaction.message.guild.members.find(member => member.id === user.id);
        if(member)
        {
            member.removeRole(role.id);
            console.log('Success. Removed role.');
        }
    }
});```

标签: javascriptnode.jsdiscorddiscord.js

解决方案


在您的messageReactionAdd事件中,您可以尝试找到与特定选择对应的用户应用的反应或角色。如果有,那就意味着他们已经选择了那个答案。然后,您可以在将新角色添加到用户之前删除它们。如果没有,代码应该照常继续。

bot.on('messageReactionAdd', async (messageReaction, user) => { // async needed for 'await'
  const name = messageReaction.emoji.name.toLowerCase();
  const message = messageReaction.message;

  const role = message.guild.roles.find(role => role.name.toLowerCase() === name);
  const member = message.guild.member(user);

  if (!role || !member) return;

  const emojis = message.reactions.map(emoji => emoji.name);

  const conflictingReaction = message.reactions.find(reaction => reaction.users.get(user.id) && emojis.includes(reaction.emoji.name));
  const conflictingRole = member.roles.find(role => emojis.includes(role.name.toLowerCase());

  try {
    if (conflictingReaction || conflictingRole) {
      await conflictingReaction.remove(user);
      await member.removeRole(conflictingRole);
    }

    await member.addRole(role);

    console.log('Success.');
  } catch(err) {
    console.error(err);
  }
});

推荐阅读