javascript - 更新角色一次仅允许用户使用一个角色

标签 javascript node.js discord discord.js

目前,用户可以选择本节中给出的尽可能多的 Angular 色,但是,我希望能够执行以下操作: ( Angular 色A或 Angular 色B)AND( Angular 色C或 Angular 色D)AND Angular 色E等

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

用户可以通过对指定消息使用react来为自己应用 react Angular 色。根据是否做出特定选择,它能够添加/删除另一个 Angular 色,即

你几岁了? - 18-24 - 25-30 - 31+

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

你在哪个洲? - IDK,我已经用完了 - 虚假问题 - 填充空间。

如果用户点击 25-30,但随后意识到自己是 24,并点击该按钮,我希望删除先前的 react 和 Angular 色,而无需手动干预。 不仅有 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.');
        }
    }
});```

最佳答案

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

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);
  }
});

关于javascript - 更新角色一次仅允许用户使用一个角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56702391/

相关文章:

javascript - 使用请求动画帧绘制超出最大调用堆栈?

javascript - Phonegap 2.5.0 地理定位不适用于 android 4.0.4

node.js - 如何解决 amqplib Channel#consume 奇怪的签名?

python - 如何创建一个新的私有(private)文本 channel 并向其中添加 2 个人?

javascript - 如何检查特定用户是否具有角色?不和谐的js

javascript - 防止div重叠

javascript - 如何区分数字和特殊字符?

javascript - "TypeError: this._subscribe is not a function"在简单 Node 模块中尝试 RxJS 时

node.js - Sails.js Same Model 多对多关联

xml - 尝试通过 Azure AD B2C 自定义策略登录时,Discord api 返回 401 未经授权