perfiles y listados

Instalación

Para que estos ejemplos funcione, primero debe asegurarse de tener instalados los módulos adecuados. Supongamos que ya tiene discord.js instalado, y vaya directamente a instalar discord-gestor en npmjs.com.

npm install discord-gestor

Estructura básica en discord.js

const dg = require('discord-gestor');
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log('listo');
});
let prefix = "!";
client.on('message', (message) =>{
if(message.author.bot) return; //evitamos que los bots se registren en la base de datos
//usamos el metodo command y los argumentos en arrays (opcional).
const args = message.content.slice(prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
//comienzo de comandos
if(command === 'perfil'){
}
//fin de comandos
});
client.login('Token-BOT');

Obteniendo puntos de experiencia por cada mensaje enviado:

Usamos la función editPuntos() para agregar puntos al usuario por cada mensaje enviado, dentro del evento 'message' de discord.js.

En este ejemplo agregamos 2 puntos por cada mensaje enviado , esa opción puede ser cambiado a su gusto.

dg.perfil.editPuntos(message.author.id, 2, (resp, nNivel) => {
if (resp) { //esta opcion se activa cuando un usuario subio de nivel
message.channel.send('Felicidades subiste al nivel: ' + nNivel);
}
})

Mostrar los datos de un perfil de usuario:

Usamos la función verPerfil() para obtener los datos del usuario solicitado por el comando perfil.

if (command === 'perfil') {
dg.perfil.verPerfil(message.author.id, (datos) => {
const embed = new Discord.RichEmbed()
.setAuthor('Perfil de: ' + message.author.username, message.author.displayAvatarURL)
.setColor(0x00AE86)
.addField('Soy', datos.titulo) //propiedad titulo del usuario.
.addField('Nivel', datos.nivel, true) //propiedad nivel del usuario.
.addField('Puntos', datos.puntos) //propiedad puntos del usuario.
.setDescription('**Info:**\n' + datos.info) //propiedad info del usuario.
message.channel.send(embed)
// Enviamos los datos retornados, en un mensaje de tipo embed
// pero tambien puede usar un mensaje normal o el tipo de mensaje markdown.
})
}

Mostrar los datos estadísticos del perfil de un usuario:

if (command === 'estadisticas') {
dg.perfil.verPerfil(message.author.id, (datos) => {
const embed = new Discord.RichEmbed()
.setAuthor('Estadisticas de: ' + message.author.username, message.author.displayAvatarURL)
.setColor(0x00AE86)
.addField('Nivel', datos.nivel, true)
.addField('Porcentaje', datos.porcNivel+ '%', true) //propiedad porcNivel del usuario
.addField('Exp', datos.sigNivel + ' **(Total: ' + datos.puntos + ')**', true) //propiedad sigNivel del usuario
message.channel.send(embed) // enviamos los datos en un mensaje de tipo embed
})
}

Resultado final de la estructura de un perfil básico:

const dg = require('discord-gestor');
const Discord = require('discord.js');
const client = new Discord.Client();
client.on('ready', () => {
console.log('listo');
});
let prefix = "!";
client.on('message', (message) =>{
if(message.author.bot) return;
dg.perfil.editPuntos(message.author.id, 2, (resp, nNivel) => {
if (resp) {
message.channel.send('Felicidades subiste al nivel: ' + nNivel);
}
});
const args = message.content.slice(prefix.length).trim().split(/ +/g);
const command = args.shift().toLowerCase();
if (command === 'perfil') {
dg.perfil.verPerfil(message.author.id, (datos) => {
const embed = new Discord.RichEmbed()
.setAuthor('Perfil de: ' + message.author.username, message.author.displayAvatarURL)
.setColor(0x00AE86)
.addField('Soy', datos.titulo)
.addField('Nivel', datos.nivel, true)
.addField('Puntos', datos.puntos)
.setDescription('Info:\n' + datos.info)
message.channel.send(embed)
})
}
if (command === 'estadisticas') {
dg.perfil.verPerfil(message.author.id, (datos) => {
const embed = new Discord.RichEmbed()
.setAuthor('Estadisticas de: ' + message.author.username, message.author.displayAvatarURL)
.setColor(0x00AE86)
.addField('Nivel', datos.nivel, true)
.addField('Porcentaje', datos.porcNivel+ '%', true)
.addField('Exp', datos.sigNivel + ' **(Total: ' + datos.puntos + ')**', true)
message.channel.send(embed)
})
}
});
client.login('Token-BOT');

Gestionando los datos de perfil

Editar la propiedad titulo del perfil de un usuario, usando la función editTitulo()

if (command === 'etitulo') {
let texto = args.join(' ');
if (!texto) return message.channel.send('Debe escribir un contenido a editar.');
dg.perfil.editTitulo(message.author.id, texto, (resp) => {
if (resp) { // retorna verdadero si se modifico correctamente los datos.
message.channel.send('El titulo de perfil fue editado correctamente.')
}
}) ;
}

Para editar la propiedad información del perfil de un usuario, use la función editInfo()

Mostrar los datos de reputación del perfil de un usuario, usando la función verReputacion()

if(command === 'reputaciones'){
dg.perfil.verReputacion(message.author.id, (rep) =>{
message.channel.send('Tienes '+ rep.cantidad + ' reputaciones.')
});
}

Editar la propiedad cantidad de reputaciones de un usuario, usando la función editReputacion()

if(command === 'rep'){
//agregamos un variable para obtener al usuario si fue mencionado.
let mencionado = message.mentions.members.first();
//verificamos al mencionado
if (!mencionado) { // si el usuario no fue mencionado
// agregamos 2 puntos mas de reputacion al usuario autor del mensaje.
dg.perfil.editReputacion(message.author.id, 2, () =>{
message.channel.send(message.author.username+ ', tiene 2 puntos mas de reputación.')
})
} else { // si el usuario fue mencionado
//validamos al mencionado
if(mencionado.id === message.author.id) return message.channel.send('Mencione a otro usuario.')
// agremaos 2 puntos mas de reputacion al usuario mencionado por el autor.
dg.perfil.editReputacion(mencionado.id, 2, () => {
message.channel.send(mencionado.user.username + ', tiene 2 puntos mas de reputación, gracias a '+ message.author.username)
})
}
}

Este comando rep con la función editReputacion(), debe tener validaciones como: si el usuario mencionado es igual al autor del mensaje, si el mencionado es un bot, cooldown al usuario con el comando para evitar que sea spameado, entre otros.

Listados de datos (TOP)

Listar a los usuarios con mayor cantidad de puntos o niveles:

Listamos a los usuarios con mayores puntos en el tipo de mensaje embed según la cantidad solicitada.

if(command === 'top'){
let text = args.join(' ');
let cantidad = text; //obtenemos la cantidad a listar
let userv = '';
if (!text) { // si la cantidad a listar no fue enviado, el listado sera de 10 filas.
cantidad = 10
}
let embed = new Discord.RichEmbed()
// listamos a los miembros con mayores puntos, tipo: 'puntos'
dg.perfil.verTop('puntos', cantidad, (lista, i) => {
i++ //opteniendo las posiciones
let user = client.users.get(lista.id); // opteniendo los datos del usuario
// verificamos si el usuario fue encontrado.
if (!user) { // si no fue encontrado.
userv = `${lista.id} no encontrado.`
} else { //si fue encontrado obtenemos el tag del usuario.
userv = user.tag
}
// por cada fila solicitada se agregara un fila nueva del embed con los datos
// encontrados de un usuario.
embed.addField(i +') ' + userv, `Puntos: ${lista.puntos} Nivel: ${lista.nivel}`)
})
// Como usamos 'callback' para retornar los datos por filas
// no tienen un orden de ejecución y en algunos casos puede dar el resultado vacio.
// para evitar ese resultado, usamos setTimeout(), con el tiempo de un segundo
// para que envie la lista ya recargada con los datos en el embed.
setTimeout(() => {
message.channel.send(embed)
}, 1000)
}

Listamos a los usuarios con mayores niveles en el tipo de mensaje markdown según la cantidad solicitada.

// creamos un objeto vacio, fuera del evento 'message'.
let list = [];
if(command === 'mtop'){
let text = args.join(' ');
let cantidad = text; //obtenemos la cantidad a listar
let userv = '';
if (!text) { // si la cantidad a lista no fue enviado, el listado sera de 10 filas.
cantidad = 10
}
// listamos a los miembros con mayores niveles, tipo: 'nivel'
dg.perfil.verTop('nivel', cantidad, (lista, i) => {
i++ //opteniendo las posiciones
let user = client.users.get(lista.id); // opteniendo los datos del usuario
// verificamos si el usuario fue encontrado.
if (!user) { // si no fue encontrado.
userv = `${lista.id} no encontrado.`
} else { //si fue encontrado obtenemos el tag del usuario.
userv = user.tag
}
// por cada fila solicitada se agregara un fila nueva con los datos
// encontrados de un usuario.
list.push('['+i +'] ' + userv+`\n Puntos: ${lista.puntos} Nivel: ${lista.nivel}`)
})
// Como usamos 'callback' para retornar los datos por filas
// no tienen un orden de ejecución y en algunos casos puede dar el resultado vacio.
// para evitar ese resultado, usamos setTimeout(), con el tiempo de un segundo
// para que envie la lista ya recargada con los datos en el objeto list.
setTimeout(() => {
dg.perfil.verPerfil(message.author.id, (datos) =>{
message.channel.send('Lista Top de usuarios\n```fix\n' + list.join('\n') + '\n=========================\n' + message.author.username + ', tienes ' + datos.puntos + ' puntos.\n```')
list = [] // una vez mostrado los datos, borramos para un nuevo uso.
})
}, 1000)
}