### Instalar el módulo
```
$ npm install discord-vatron --s
```

----------------------

> Este módulo te facilitará el desarrollo de un bot de Discord, teniendo funciones para hacerlo más fácil

### Crear nueva instancia de un bot
```js
const Discord = require('discord-vatron');
const bot = new Discord.Bot();
```

> Si tienes alguna duda puedes preguntar en el servidor de proyectos:
[https://discord.gg/aMAR32FuTP](https://discord.gg/aMAR32FuTP)

----------------------

## Lista clases

- [Bot](#bot)
- [BotUsuario](#botusuario)
- [Archivo](#archivo)
- [Botón](#boton)
- [Canal](#canal)
- [CanalCategoría](#canalcategoria)
- [CanalTexto](#canaltexto)
- [CanalVoz](#canalvoz)
- [Colección](#coleccion)
- [Embed](#embed)
- [Emoji](#emoji)
- [FilaBotones](#filabotones)
- [Interacción](#interaccion)
- [Menciones](#menciones)
- [Mensaje](#mensaje)
- [Miembro](#miembro)
- [Presencia](#presencia)
- [Role](#role)
- [Servidor](#servidor)
- [Usuario](#usuario)

----------------------

## Clases

## Bot

### Propiedades
- `intents` - Intents que usa
- `servidores` - [Colección](#coleccion) con los [servidores](#servidor) en los que se encuentra el bot
- `canales` - [Colección](#coleccion) con los [canales](#canal) de todos los servidores en los que se encuentra el bot
- `usuarios` - [Colección](#coleccion) con los [usuarios](#usuario) que vee el bot
- `roles` - [Colección](#coleccion) con los [roles](#role) de todos los servidores en los que se encuentra el bot
- `emojis` - [Colección](#coleccion) con los [emojis](#emoji) de todos los servidores en los que se encuentra el bot
- `presencias` - [Colección](#coleccion) con las [presencias](#presencia) de los usuarios que vee el bot
- `canalesMD` - [Colección](#coleccion) con los [canales](#canal) de MD que vee el bot
- `usuario` - [BotUsuario](#botusuario) del bot

### Métodos
`iniciar` - Inicia al bot mediante su token

> Ejemplo: `bot.iniciar('token')`

`obtenerCanal` - Obtiene un canal mediante la ID en caso de que no esté en la colección bot.canales

> Ejemplo: `bot.obtenerCanal('idCanal')`

### Eventos
- `listo` - Se emite cuando el bot está listo, recibe: [BotUsuario](#botusuario)
- `mensaje` - Se emite cuando se envia un nuevo mensaje a un canal de texto, recibe: [Mensaje](#mensaje)
- `mensajeEditado` - Se emite cuando se edita un mensaje, recibe: [MensajeAntiguo](#mensaje) | [MensajeNuevo](#mensaje)
- `mensajeEliminado` - Se emite cuando se elimina un mensaje, recibe: [Mensaje](#mensaje) (si estaba en la colección de mensajes)
- `servidorActualizado` - Se emite cuando se actualiza un servidor, recibe: [ServidorAntiguo](#servidor) | [ServidorNuevo](#servidor)
- `servidorEntrandoMiembro` - Se emite cuando un usuario entra a un servidor, recibe: [Miembro](#miembro)
- `servidorSaliendoMiembro` - Se emite cuando un miembro sale de un servidor, recibe: [Miembro](#miembro)
- `servidorMiembroActualizado` - Se emite cuando un miembro es actualizado, recibe: [MiembroAntiguo](#miembro) | [MiembroNuevo](#miembro)
- `canalActualizado` - Se emite cuando se actualiza un canal, recibe: [CanalAntiguo](#canal) | [CanalNuevo](#canal)
- `canalEliminado` - Se emite cuando se elimina un canal, recibe: [Canal](#canal)
- `servidorEliminado` - Se emite cuando un servidor es eliminado, recibe: [Servidor](#servidor)
- `usuarioActualizado` - Se emite cuando se actualiza un usuario, recibe: [UsuarioAntiguo](#usuario) | [UsuarioNuevo](#usuario)
- `presenciaActualizada` - Se emite cuando se actualiza una presencia, recibe: [PresenciaAntigua](#presencia) | [PresenciaNueva](#presencia)
- `servidorRoleCreado` - Se emite cuando se crea un role en un servidor, recibe: [Role](#role)
- `servidorRoleEliminado` - Se emite cuando se elimina un role en un servidor, recibe: [Role](#role)
- `servidorRoleActualizado` - Se emite cuando se actualiza un role en un servidor, recibe: [RoleAntiguo](#role) | [RoleNuevo](#role)
- `servidorEmojisActualizados` - Se emite cuando se actualizan los emojis del servidor, recibe: [Servidor](#servidor) | [ListaEmojis](#emoji)
- `interaccionCreada` - Se emite cuando se interactua con una interacción, recibe: [Interacción](#interaccion)

## BotUsuario

> Extiende a la clase [Usuario](#usuario)

### Métodos
`estPresencia` - Cambia la presencia actual del bot

> Ejemplo:
```js
bot.usuario.estPresencia({
    estado: 'enLinea | noMolestar | ausente',
    juego: {
        nombre: 'Texto para la presencia',
        tipo: 'JUGANDO | TRANSMITIENDO | ESCUCHANDO | VIENDO'
    }
});
```

## Archivo

### Propiedades
- `anchura` - Anchura del archivo
- `altura` - Altura del archivo
- `tamano` - Tamaño del archivo
- `url` - URL del archivo
- `urlProxy` - URL Proxy del archivo
- `nombre` - Nombre del archivo
- `tipoContenido` - Tipo del contenido del archivo, por ejemplo: **image/png**

## Botón

> new Discord.Boton(boton?)

### Métodos
`estEstilo` - Cambia el estilo del botón; AZUL | GRIS | VERDE | ROJO | URL

> Ejemplo: `boton.estEstilo('estilo')`

`estTexto` - Cambia el texto del botón

> Ejemplo: `boton.estTexto('Click aquí')`

`estEmoji` - Cambia el emoji del botón

> Ejemplo: `boton.estEmoji('👋 | emojiDeServidor')`

`estID` - Cambia la ID del botón (no disponible cuando se usa estilo URL)

> Ejemplo: `boton.estID('id')`

`estDesactivado` - Activa o desactiva el botón

> Ejemplo: `boton.estDesactivado(true|false)`

`estURL` - Cambia la URL del botón (sólo disponible cuando se usa el estilo URL)

> Ejemplo: `boton.estURL('https://discord.gg/aMAR32FuTP')`

## Canal

### Propiedades
- `nombre` - Nombre del canal
- `id` - ID del canal
- `tipo` - Tipo del canal
- `servidor` - [Servidor](#servidor) en el que se encuentra el canal
- `categoria` - [CanalCategoría](#canalcategoria) en el que se encuentra el canal

### Métodos
`eliminar` - Elimina el canal


## CanalCategoría

> Extiende a la clase [Canal](#canal)

### Propiedades
- `canales` - [Colección](#coleccion) con los [canales](#canal) que se encuentran dentro de esa categoría

## CanalTexto

> Extiende a la clase [Canal](#canal)

### Propiedades
- `tema` - Tema del canal
- `nfsw` - Si el canal es NSFW o no
- `tiempoPausa` - El tiempo de pausa entre [mensaje](#mensaje) y [mensaje](#mensaje) en segundos
- `mensajes` - [Colección](#coleccion) con los [mensajes](#mensaje) que se enviaron después de iniciar al bot
- `ultimoMensaje` - Último [mensaje](#mensaje) que se envió al canal, si es que está en la colección de mensajes

### Métodos
`enviar` - Envia un mensaje al canal, devuelve una promesa que al resolverla devuelve el [mensaje](#mensaje)

> Ejemplo

```js
canalTexto.enviar({
    contenido: 'Contenido del mensaje',
    embeds: arrayConEmbeds,
    botones: arrayConBotones,
    filas: arrayConFilasBotones,
    responder: mensaje
});
```

`obtenerMensaje` - Obtiene un [mensaje](#mensaje) del canal en caso de que no esté en la colección de mensajes

> Ejemplo: `canalTexto.obtenerMensaje('idMensaje')`

`crearColectorMensajes` - Crea un colector de mensajes

> Ejemplo
```js
const colector = canalTexto.crearColectorMensajes((msj) => msj.autor.id == mensaje.autor.id, { tiempo: milisegundos });

colector.on('recibido', (mensaje) => {
    // lo que quieras
    // para finalizar: colector.finalizar('razón');
});

colector.on('finalizado', (razon) => {
    console.log(razon);
});
```

`editar` - Edita el canal

> Ejemplo
```js
canalTexto.editar({
    nombre: 'nombre',
    tema: 'tema',
    posicion: num,
    nsfw: true|false,
    categoria: categoria|id
});
```

## CanalVoz

> Extiende a la clase [Canal](#canal)

### Propiedades
- `miembros` - [Colección](#coleccion) de [miembros](#miembro) que se encuentran conectados al canal de voz
- `limiteUsuarios` - Número máximo de miembros que se pueden conectar al canal

### Métodos
`editar` - Edita el canal

> Ejemplo
```js
canalTexto.editar({
    nombre: 'nombre',
    posicion: num,
    categoria: categoria|id,
    limiteUsuarios: num
});
```

## Colección

> Extiende a la clase [Map](https://developer.mozilla.org/es/docs/orphaned/Web/JavaScript/Reference/Global_Objects/Map)

### Métodos
- `map` - Mapea los valores de la colección
- `algunoCumple` - Verifica si algún valor de la colección cumple la condición propuesta en la función
- `todosCumplen` - Verifica si todos los valores de la colección cumplen la condición propuesta en la función
- `encontrar` - Encuentra el primer valor de la colección que cumpla con la condición propuesta en la función
- `filtrar` - Filtra los valores de la colección mediante si cumplen la condición propuesta en la función
- `ordenar` - Ordena los valores de la condición según la función
- `primero` - Obtén el primer valor de la colección
- `ultimo` - Obtén el último valor de la colección
- `aleatorio` - Obtén un valor de la colección aleatorio (si pones un número) devuelve un array con varios
- `claves` - Obtén un array con todas las claves de la colección
- `array` - Obtén un array con todos los valores de la colección

## Embed

> new Discord.Embed(embed?)

### Métodos
`estTitulo` - Establece el título del embed

`estAutor` - Establece el autor en el embed

> Ejemplo
```js
embed.estAutor({
    nombre: 'autor',
    url: 'urlAutor',
    icono: 'urlIcono'
});
```

`estDesc` - Establece la descripción del embed

`estColor` - Establece el color del embed, puedes usar: AZUL | ROJO | VERDE | BLANCO | AGUA | AMARILLO | MORADO | DORADO | NARANJA | GRIS | NEGRO | ALEATORIO

`estImg` - Establece la imagen del embed

> Ejemplo
```js
embed.estImg({
    url: 'urlImagen'
});
```

`estVideo` - Establece el vídeo del embed

> Ejemplo
```js
embed.estVideo({
    url: 'urlVideo'
});
```

`estMarcaTiempo` - Establece la marca de tiempo en el embed

> Ejemplo: `embed.estMarcaTiempo(Date.now()+60000)` (la de dentro de 1 minuto)

`anadirCampo` - Añade un campo al embed

> Ejemplo
```js
embed.anadirCampo({
    titulo: 'título',
    desc: 'descripción',
    enLinea: true|false
});
```

`estUrl` - Establece la URL del embed

> Ejemplo: `embed.estUrl('https://discord.gg/aMAR32FuTP')`

`estMiniatura` - Establece la miniatura del embed

> Ejemplo
```js
embed.estMiniatura({
    url: 'urlImagen'
});
```

`estPie` - Establece el pie del embed

> Ejemplo
```js
embed.estPie({
    texto: 'texto',
    icono: 'urlImagen'
});
```

## Emoji

### Propiedades
- `nombre` - Nombre del emoji
- `id` - ID del emoji
- `animado` - Si es el animado el emoji
- `servidor` - Servidor en el que se encuentra el emoji

### Métodos
`editar` - Edita el emoji

> Ejemplo
```js
emoji.editar({
    nombre: 'nombre'
});
```

`eliminar` - Elimina el emoji

> Ejemplo: `emoji.eliminar()`

## FilaBotones

> new Discord.FilaBotones(...botones?)

### Métodos
`anadirBoton` - Añade un botón a la fila

## Interacción

### Propiedades
`mensaje` - [Mensaje](#mensaje) de la interacción
`servidor` - [Servidor](#servidor) de la interacción
`canal` - [Canal](#canaltexto) de la interacción
`miembro` - [Miembro](#miembro) que ejecuta la interacción
`idBoton` - ID del [botón](#boton) presionado

### Métodos
`responder` - Responde a la interacción

> Ejemplo
```js
interaccion.responder({
    contenido: 'contenido',
    embeds: arrayConEmbeds,
    propio: true|false
});
```

`aplazar` - Aplaza la interacción (no responder nada)

> Ejemplo: `interaccion.aplazar()`

`pensar` - Piensa el resultado de la interacción

> Ejemplo
```js
interaccion.pensar({
    propio: true|false
});
```

## Menciones

> Extiende a la clase [Colección](#coleccion)

### Propiedades
- `usuarios` - [Colección](#coleccion) con los [usuarios](#usuario) mencionados
- `miembros` - [Colección](#coleccion) con los [miembros](#miembro) mencionados
- `roles` - [Colección](#coleccion) con los [roles](#role) mencionados
- `canales` - [Colección](#coleccion) con los [canales](#canal) mencionados

## Mensaje

### Propiedades
- `contenido` - Contenido del mensaje
- `id` - ID del mensaje
- `canal` - [Canal](#canaltexto) del mensaje
- `marcaTiempoEnviado` - Marca de tiempo en el que fue enviado el mensaje
- `marcaTiempoEditado` - Marca de tiempo en el que fue editado el mensaje
- `tts` - Si el mensaje es tts o no
- `everyoneMencionado` - Si está mencionado everyone o no
- `fijado` - Si el mensaje está fijado o no
- `miembro` - [Miembro](#miembro) que escribe el mensaje
- `servidor` - [Servidor](#servidor) en el que escribe el mensaje
- `embeds` - Array con los [embeds](#embeds) del mensaje
- `editable` - Obtén si es editable o no el mensaje
- `url` - URL del mensaje
- `esWebhook` - Verifica si es un webhook el mensaje
- `autor` - [Usuario](#usuario) que escribió el mensaje
- `reacciones` - [Colección](#coleccion) con las reacciones del mensaje
- `menciones` - [Menciones](#menciones) del mensaje
- `archivos` - [Archivos](#archivo) que se encuentran en el mensaje

### Métodos
`eliminar` - Eliminar el mensaje

`editar` - Edita el mensaje

> Ejemplo

```js
mensaje.editar({
    contenido: 'Contenido del mensaje',
    embeds: arrayConEmbeds,
    botones: arrayConBotones,
    filas: arrayConFilasBotones
});
```

`responder` - Responde a un mensaje

> Ejemplo

```js
mensaje.responder({
    contenido: 'texto',
    embeds: arrayConEmbeds,
    botones: arrayConBotones,
    filas: arrayConFilasBotones
});
```

`reaccionar` - Reacciona al mensaje

> Ejemplo: `mensaje.reaccionar('👋 | emojiDelServidor')`

`crearColectorBotones` - Crea un colector de botones (cuando se pulsa algún botón del mensaje)

> Ejemplo
```js
const colector = mensaje.crearColectorBotones((interaccion) => interaccion.miembro.id == mensaje.autor.id, { tiempo: milisegundos });

colector.on('recibido', (interaccion) => {
    // lo que quieras
    // para finalizar: colector.finalizar('razón');
});

colector.on('finalizado', (razon) => {
    console.log(razon);
});
```

## Miembro

### Propiedades
- `usuario` - Miembro en forma de [usuario](#usuario)
- `id` - ID del miembro
- `marcaTiempoUnido` - Marca de tiempo de cuando se unió el miembro
- `servidor` - [Servidor](#servidor) del que es el miembro
- `avatar` - Avatar del miembro
- `roles` - [Colección](#coleccion) con los roles del miembro
- `roleAlto` - [Role](#role) más alto del miembro
- `permisos` - [Colección](#coleccion) con los permisos del miembro
- `canalVoz` - [CanalVoz](#canalvoz) en el que está el miembro

### Métodos
`anadirRole` - Añade un [role](#role) al miembro

> Ejemplo: `miembro.anadirRole('idRole|role')`

`eliminarRole` - Elimina un [role](#role) al miembro

> Ejemplo: `miembro.eliminarRole('idRole|role')`

`urlAvatar` - Obtén la URL del avatar del miembro

> Ejemplo: `miembro.urlAvatar({ tamano: num, defecto: true|false })`

`banear` - Banea al miembro

> Ejemplo: `miembro.banear({ dias: num, razon: 'Razón del baneo' })`

`expulsar` - Expulsa al miembro

> Ejemplo: `miembro.expulsar('Razón del baneo')`

`apodo` - Obtén el apodo del miembro

> Ejemplo: `miembro.apodo(true|false)`

`estApodo` - Establece el apodo del miembro

> Ejemplo: `miembro.estApodo('apodo')`

## Presencia

### Propiedades
- `juego` - Juego al que se está jugando actualmente
- `actividades` - Actividades que se están realizando actualmente
- `usuario` - Usuario de la presencia

## Role

### Propiedades
- `nombre` - Nombre del role
- `id` - ID del role
- `separado` - Separado del resto de roles
- `posicion` - Posición del role
- `administrado` - Role administrado por algún servicio externo
- `mencionable` - Role mencionable o no
- `color` - Color del role
- `servidor` - Servidor del role
- `permisos` - Permisos del role
- `miembros` - Miembros que tienen el role

### Métodos
`eliminar` - Elimina el role

`editar` - Edita el role

> Ejemplo
```js
role.editar({
    nombre: 'nombre',
    color: 'color',
    separado: true|false,
    mencionable: true|false
});
```

## Servidor

### Propiedades
- `nombre` - Nombre del servidor
- `id` - ID del servidor
- `nivelVerificacion` - Nivel de verificación del servidor
- `tiempoAFK` - Tiempo para ser considerado AFK en segundos
- `miembros` - [Colección](#coleccion) con los [miembros](#miembro) del servidor
- `canales` - [Colección](#coleccion) con los [canales](#canal) del servidor
- `emojis` - [Colección](#coleccion) con los [emojis](#emoji) del servidor
- `roles` - [Colección](#coleccion) con los [roles](#role) del servidor
- `region` - Región del servidor
- `salpicadura` - Salpicadura del servidor
- `dueno` - [Miembro](#miembro) que es dueño del servidor
- `yo` - [Miembro](#miembro) referido al bot
- `canalAFK` - [CanalVoz](#canalvoz) para AFK's
- `canalSistema` - [CanalTexto](#canaltexto) del sistema
- `canalReglas` - [CanalTexto](#canaltexto) de reglas

### Métodos
`editar` - Edita el servidor

> Ejemplo
```js
servidor.editar({
    nombre: 'nombre',
    region: 'región',
    nivelVerificacion: num,
    canalAFK: 'idCanal|CanalVoz',
    icono: 'urlIcono',
    salpicadura: 'urlSalpicadura',
    canalSistema: 'idCanal|CanalTexto',
    canalReglas: 'idCanal|CanalTexto'
});
```

`crearRole` - Crea un [role](#role) en el servidor

> Ejemplo
```js
servidor.crearRole({
    nombre: 'nombre',
    color: 'color',
    separado: true|false,
    mencionable: true|false
});
```

`crearCanal` - Crea un [canal](#canal) en el servidor

> Ejemplo
```js
servidor.crearCanal({
    nombre: 'nombre',
    tipo: 'texto|voz|categoría',
    tema: 'tema',
    limiteUsuarios: num,
    tiempoPausa: num,
    categoria: 'idCanal|CanalCategoría',
    nsfw: true|false
});
```

`icono` - Obtén el icono del servidor

> Ejemplo: `servidor.icono(tamaño)`

`desbanear` - Desbanea a un miembro

> Ejemplo: `servidor.desbanear('idMiembro')`

## Usuario

### Propiedades
- `nombre` - Nombre de usuario
- `nombreCompleto` - Nombre de usuario con el #TAG incluido
- `id` - ID del usuario
- `tag` - #TAG del usuario
- `bot` - El usuario es un bot o no
- `sistema` - El usuario es parte del sistema o no
- `avatar` - Avatar del usuario
- `presencia` - [Presencia](#presencia) del usuario
- `banderas` - Banderas que tiene el usuario en su perfil

### Métodos
`enviar` - Envia un mensaje al usuario

> Ejemplo
```js
usuario.enviar({
    contenido: 'texto',
    embeds: arrayConEmbeds,
    botones: arrayConBotones,
    filas: arrayConFilasBotones
});
```

`urlAvatar` - Obtén la URL del avatar del usuario

> Ejemplo: `usuario.urlAvatar(tamaño)`