Отображение пользователей, которые соответствуют нескольким ролям discord.js

#javascript #discord #discord.js

#javascript #Discord #discord.js

Вопрос:

Я разрабатываю бота, используя discord.js версия 12. Я пытаюсь заставить его отправить личное сообщение автору, показывающее, какие пользователи на сервере имеют введенные пользователем роли. Функция roledisplayCommand потребует от пользователя ввести role различные роли, которые они хотят найти. Он может отображать всех пользователей с определенной ролью, но добавление более 1 роли, похоже, сбивает его с толку. Например, если Spookybot и SpookySeed оба имеют member роль, но только SpookySeed имеет admin роль, если пользователь вводит role member admin , я хочу, чтобы он отображал ТОЛЬКО SpookySeed, поскольку у него обе роли. Как я могу это сделать?

 function roleDisplayCommand(arguments, receivedMessage) {
    if (arguments.length > 0) {
        const roleNames = receivedMessage.content.split(" ").slice(1);

        receivedMessage.author.send(`These users have the ${roleNames.join(" ")} role(s)` )
        
        let users = receivedMessage.guild.members.cache;
        const userList = roleNames.every(
          role => {
            users = users.filter(u => u.roles.cache.some(r => r.name === role))
          })
          receivedMessage.author.send(Array.from(userList.values()).join("n"));
        
    }
     else {
        receivedMessage.channel.send("Unknown command")
    }
}
 

Ответ №1:

Вы должны помещать every() функцию в filter() функцию, а не наоборот.

 const users = receivedMessage.guild.members.cache;
const userList = users.filter((user) =>
 roleNames.every((name) => user.roles.cache.some((role) => role.name === name))
);
 

Это позволит отфильтровать коллекцию до пользователей, которые имеют роли, соответствующие каждому имени в массиве.

Комментарии:

1. Спасибо! Ты даже не представляешь, как это меня возбуждает. Я устал от вашего кода, и он работает лучше, чем вы!

2. Рад, что смог помочь! Обязательно отметьте мой ответ как принятый, если он ответил на ваш вопрос, чтобы в будущем его было легче найти другим людям, столкнувшимся с такой же проблемой.