Обновлять роли, разрешив пользователю только одну роль - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время пользователь может выбирать как можно больше ролей, указанных в разделе, однако я хотел бы иметь возможность сделать что-то вроде: (роль A ИЛИ роль B) И (роль C ИЛИ рольD) И рольE и т. Д.

Все вышеперечисленное предназначено для запуска путем проверки того, какие реакции они уже отправили, и удаления их, если новый выбор противоречит текущему.

Пользователи могут применять к себе роли реакции, реагируя на указанное сообщение. В зависимости от того, сделан ли определенный выбор, он может быть добавлен / удален из другой роли, т.е.

Сколько тебе лет? - 18-24 - 25-30 - 31 +

Какой у вас пол? - Мужчина - женский

На каком континенте вы находитесь? - ИДК, у меня кончились - поддельные вопросы - заполнить пробел.

Если пользователь щелкает 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.');
        }
    }
});```

1 Ответ

1 голос
/ 23 июня 2019

В вашем 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);
  }
});
...