DEV Community

Cover image for Discord.JS: Datos de Usuarios
Douglas Lovera for Somos Devs

Posted on • Updated on

Discord.JS: Datos de Usuarios

Datos de usuarios

En este post hablaremos de cómo manejar los datos de usuarios que la API de Discord nos da.

¿Qué y cuáles son los datos de usuarios?

Estos son las cosas como el avatar, el nickname, discriminante, ID, etc.

Obtener estos datos son útiles para banear miembros de un servidor, determinar el dueño del bot (tú), o simplemente responder un mensaje con el nombre del usuario.

Pasted image 20210301184707

En el siguiente ejemplo práctico crearemos un comando que le muestre la siguiente información de su perfil a través de un embed:

  • Nombre de usuario en discord.
  • Avatar.
  • Fecha de creación de la cuenta.
  • Estado de actividad.
  • Nickname dentro del servidor.
  • Roles adquiridos en el servidor.
  • ID.

Obteniendo los datos

Para que nuestro bot pueda enviar toda la información, tenemos que pasarle el usuario al que va a recorrer los datos. En este caso, estaremos trabajando con los datos del usuario que envía el comando (al final del post haremos uno más completo según a quién se @mencione).

Para hacer esto, crearemos una variable para acortarnos un poco la escritura:

const user = message.author;
const member = message.member;
Enter fullscreen mode Exit fullscreen mode

¿Por qué hay dos variables?
Pues, puede ser un poco complicado entenderlo de primeras, pero explicándolo resumidamente es que member solo sirve para los datos del usuario dentro del servidor, mientras que user es para datos del usuario en todo discord.

Creando el embed

Vamos a guardar nuestro embed en una constante para que sea fácil de entender cuando leamos el código:

const embed = new Discord.MessageEmbed()
// llenando los datos
Enter fullscreen mode Exit fullscreen mode

Llenando los datos

Ahora que podemos enviar los datos más fácil, explicaré cada línea con un comentario dentro del siguiente código:

// El username del miembro como "autor" del embed más el avatar
.setAuthor('Username: ' + user.tag, user.avatarURL())
// Mostraremos el avatar del usuario en el thumbnail del embed
.setThumbnail(user.avatarURL())
// La fecha de creación de la cuenta como toLocaleDateString()
.addField('Creación de la cuenta', user.createdAt.toLocaleDateString(), true)
// El estado de actividad del usuario
.addField('Estado', user.presence.status, true)
// Si el usuario NO tiene un nickname dentro del servidor, pone "No tiene"
.addField('Apodo', member.nickname ? member.nickname : 'No tiene', true)
// Hacemos un mapeo de los roles del usuario y los separamos por nombres
.addField('Roles', 
          message.member.roles.cache.map(rol => '`' + rol.name + '`').join(', ')
         )
.setFooter('ID: ' + user.id)
Enter fullscreen mode Exit fullscreen mode

Enviar el embed

Y después de todo esto, enviamos el embed al canal con:

// Todo el código de arriba ^
message.channel.send({embed});
Enter fullscreen mode Exit fullscreen mode

Código final

const user = message.author;
const member = message.member;

const embed = new Discord.MessageEmbed()

    .setAuthor('Username: ' + user.tag, user.avatarURL())
    .setThumbnail(user.avatarURL())
    .addField('Creación de la cuenta', user.createdAt.toLocaleDateString(), true)
    .addField('Estado', user.presence.status, true)
    .addField('Apodo', member.nickname ? member.nickname : 'No tiene', true)
    .addField('Roles', 
        message.member.roles.cache.map(rol => '`' + rol.name + '`').join(', ')
    )
    .setFooter('ID: ' + user.id)

message.channel.send({embed});
Enter fullscreen mode Exit fullscreen mode

Final

Muchas gracias por leer este post, espero que te haya sido de ayuda. Recuerda que puedes seguirnos en instagram.

Happy Coding!

Discussion (11)

Collapse
albertord profile image
rgu3zgz • Edited on

Hola buenas, estuve probando el código para el bot y al querer mencionar a un usuario me pone los roles del creador del discord, el código es este:
client.on("message", (message) => {
if (message.content.startsWith(prefix + "userinfo")) {

const usuarioMencionado = message.mentions.users.first();
Enter fullscreen mode Exit fullscreen mode

if(!usuarioMencionado) {

const user = message.author;
const member = message.member;

const embed = new Discord.MessageEmbed()

.setAuthor('Nombre: ' + user.tag, user.avatarURL())
.setThumbnail(user.avatarURL())
.addField('Creación de la cuenta', user.createdAt.toLocaleDateString(), true)
.addField('Estado', user.presence.status, true)
.addField('Apodo', member.nickname ? member.nickname : 'No tiene', true)
.addField('Roles', message.member.roles.cache.map(rol => '`' + rol.name + '`').join(', '))
.setFooter('ID: ' + user.id)

message.channel.send({embed: embed});
Enter fullscreen mode Exit fullscreen mode

} else {

const miembroMencionado = message.mentions.members.first();

const embed = new Discord.MessageEmbed()

.setAuthor('Nombre: ' + usuarioMencionado.tag, usuarioMencionado.avatarURL())
.setThumbnail(usuarioMencionado.avatarURL())
.addField('Creación de la cuenta', usuarioMencionado.createdAt.toLocaleDateString(), true)
.addField('Estado', usuarioMencionado.presence.status, true)
.addField('Apodo', miembroMencionado.nickname ? miembroMencionado.nickname : 'No tiene', true)
.addField('Roles', message.member.roles.cache.map(rol => '`' + rol.name + '`').join(', '))
.setFooter('ID: ' + usuarioMencionado.id)

message.channel.send({embed: embed});
Enter fullscreen mode Exit fullscreen mode

}
}
});
Y si cambio en el segundo condicional el member de los roles por miembroMencionado me crashea el bot y se cierra, si alguien me ayuda estaria perfecto.

Collapse
doulovera profile image
Douglas Lovera Author

Hola! Gracias por comentar 💬
En el embed del usuario mencionado, tienes que cambiar esta línea:

.addField('Roles', message.member.roles.cache.map(rol => '`' + rol.name + '`').join(', '))
Enter fullscreen mode Exit fullscreen mode

Por esta 👇

.addField('Roles', miembroMencionado.roles.cache.map(rol => '`' + rol.name + '`').join(', '))
Enter fullscreen mode Exit fullscreen mode

Y listo 🤗

Collapse
crysiv4n profile image
Crysiv4n

hola, una cosa, si yo por ejemplo quiero ver la información de otra persona y no la mía, cual seria el codigo??

Collapse
doulovera profile image
Douglas Lovera Author

Hola! Gracias por preguntar 🤗.
Si lo que buscas es que se puedan visualizar tu información como la de otro usuario que menciones, tendrías que utilizar él método de discord.js message.mentions.user.first() condicionales con if...else. Algo así:

const usuarioMencionado = message.mentions.users.first();

// Si no hay una mención, muestra la información del autor del mensaje
if(!usuarioMencionado) {
  // Aquí va el mismo código del post de arriba 
} else {
  /*
  Acá va el mismo código, pero tienes que cambiar
  las variables de "user" a "usuarioMencionado"
  E.g.: 
  usuarioMencionado.username
  */
}
Enter fullscreen mode Exit fullscreen mode

Espero te sirva 😄

Collapse
crysiv4n profile image
Crysiv4n

Gracias pero también necesito definir el member para poder saber estadísticas del servidor, no? :3

Thread Thread
doulovera profile image
Douglas Lovera Author

Sí! En ese caso, al condicional de abajo agrégale esta variable:

const miembroMencionado = message.mentions.members.first();
Enter fullscreen mode Exit fullscreen mode

y reemplazas los "member" por esta variable ☝️

Collapse
mrpantalones profile image
MrPantalones

Hola ¿me podrías ayudar con algo? Yo quisiera crear un bot tipo InviteLogger.
O sea, un bot que te cuente las invites, un comando para ver las invites de un comando ETC. Y me pregunto como sería en este caso. El mensaje sería: "(Usuario) se unió y fue agregado por: (Usuario que lo invitó)" ¿Cómo defino a ambos usuarios?
Gracias de antemano <3

Collapse
octavio_campeon profile image
Octavio campeon

hola muy buenas. solo era para pedir si tienen un codigo que al usarlo me retorne la ids y nombres de los servidores en donde se encuentra mi bot. si son tan amables

Collapse
doulovera profile image
Douglas Lovera Author

Hola! Para obtener la lista de servidores es fácil:

// Hay que obtenerlo con la propiedad "cache"
const getServers = client.guilds.cache;
// Mapeas la lista con ".map"
const mapServerList = getServers.map(server => server.name);
// Unes todos los nombres y los separas por comas
const serverList = mapServerList.join(", ")
Enter fullscreen mode Exit fullscreen mode

Me comentas qué tal 😊

Collapse
octavio_campeon profile image
Octavio campeon

Muchisimas gracias

Collapse
tobiasfacello profile image
Tobías Facello

Muy buen post! El único problema que tuve fue con el user.presence.status por alguna razón no me dejaba mostrarlo, pero lo demás todo excelente!