Actualmente tiene problemas para extraer a todos los miembros que tienen un rol determinado. Actualmente puedo obtener una lista de nombres, pero solo aquellos que están almacenados en caché actualmente. Si dejo mi bot funcionando durante unas horas, extraerá más, pero nunca extraerá a todos los miembros que tienen ese rol. He leído algunas cosas diferentes sobre el uso del comando .fetch() pero aún no tengo dados.
const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES, Intents.FLAGS.GUILD_MEMBERS ] }); msg.channel.send('exporting all members with delcared role'); msg.guild.roles.fetch('guildId');//cache roles i think? let role = msg.guild.roles.cache.find(r => r.name === 'Sysadmins'); msg.guild.members.fetch('roleId');//cache members i think? let list = msg.guild.roles.cache.get(roleID).members.map(m => m.nickname) console.log(role); console.log(list);La consola.log(); devuelve mi apodo como se esperaba, pero solo el mío y sé que hay al menos otros 10 con este rol.
Otras preguntas similares que ya he intentado:
@DanLop, su respuesta junto con @MrMythical y algunas otras preguntas de desbordamiento de pila me ayudaron a resolver esta. Pude usar las funciones asíncronas correctamente para extraer todos los datos que necesito a continuación, es lo que terminé.
Solución:
client.on('messageCreate', async msg => { //TODO here }); let list = client.guilds.cache.get(tempGuildId); try { await list.members.fetch(); let role1 = list.roles.cache.get(roleId).members.map(m => m.displayName); console.log(role1); } catch (err) { console.error(err); }Es cercano, pero mucho más simple, con 3 líneas.
await msg.guild.members.fetch() // fetch all members and cache them const role = msg.guild.roles.cache.get("id") // get role from cache by ID (roles are always cached) const list = role.members.map(m => m.nickname) // map members by nicknameDado que le está dando al método fetch() un argumento String, solo se buscará el usuario que coincida con ese String, más como un get() . Además, el método fetch() devuelve una Promesa, lo que significa que se debe esperar al método para recibir los datos.
Tu método fetch() debería verse así:
await msg.guild.members.fetch();De esta manera, le dice a Node.js que debe esperar hasta que reciba los datos prometidos antes de continuar.