README
antispam-discord es un modulo que te permitira detectar diferentes tipos de spam, puede detectar el flood, mensajes con caracteres duplicados, invitaciones y menciones de usuarios y roles masivamente (proximamente mas) antispam-discord trabaja a travez de advertencias(puntos), esto quiere decir que cada tipo de deteccion puede obtener un puntaje especifico, estos puntos se iran sumando cada vez que un usuario es detectado por el antispam, tambien puedes especificar el maximo numero de advertencias(puntos).
Actualizacion:
- Se arreglo el readme.
Instalacion:
npm install antispam-discord --save
Ejemplo del requerimiento del package:
const Antispam = require('antispam-discord');
Metodos:
antispam-discord unicamente tiene un metodo llamado verificar, este metodo debe ser agregado en el evento message de tu bot.
verificar recibe dos parametros, el primer parametro seria el mensaje que se emite en el evento message y el segundo parametro es un objeto con las opciones que especificaras en el antispam.
Este metodo te regresara una promesa con un objeto que mantiene los datos del usuario que haya sido detectado por el antispam, de lo contrario regresara false.
El objeto(segundo parametro) del metodo verificar contiene 7 propiedades:
- max_advertencias
- flood_puntos
- mencion_puntos
- invitaciones
- invite_puntos
- usuarios
- canales
max_advertencias:
Aqui deberas de poner el maximo numero de advertencias al que podra llegar un usuario.
flood_puntos:
Aqui deberas de poner los puntos que se sumara cuando un usuario sea detectado haciendo flood.
mencion_puntos:
Aqui deberas de poner los puntos que se sumara cuando un usuario sea detectado haciendo menciones de usuario y roles masivamente.
invitaciones:
Aqui deberas de poner true si quieres que se detecten links de invitacion, de lo contrario false.
invite_puntos:
Aqui deberas de poner los puntos que se sumara cuando un usuario es detectado enviando links de invitacion, para que esto funcione debes de tener la propiedad invitaciones en true.
usuarios:
Aqui deberas de poner un array(lista) con las ID's de los usuarios que no quieres que sean detectados por este sistema antispam, de lo contrario solo dejalo vacio []
canales:
Aqui deberas de poner un array(lista) con las ID's de los canales donde quieres que no se detecte el spam, de lo contrario solo dejalo vacio []
ejemplo1:
const Antispam = require('antispam-discord');
const Discord = require('discord.js');
const client = new Discord.Client();
client.on("message", async message => {
if(message.channel.type == "dm") return;
let datos = await Antispam.verificar(message, {
max_advertencias: 10,
flood_puntos: 1,
mencion_puntos: 5,
invitaciones: true,
invite_puntos: 5,
usuarios: ["292092693377712128"],
canales: []
})
//codigo que veremos a continuacion
})
ejemplo2 usando una base de datos simple:
const Antispam = require('antispam-discord');
const Discord = require('discord.js');
const fs = require('fs');
const client = new Discord.Client();
client.on("message", async message => {
if(message.channel.type == "dm") return;
let ant_guild = JSON.parse(fs.readFileSync('./antispam.json', 'utf8')); //leemos la base de datos
let guildusers = []
let guildcanales = []
if(ant_guild[message.guild.id]) { //si el servidor tiene una base de datos
guildusers = ant_guild[message.guild.id].users //obtenemos a los usuarios
guildcanales = ant_guild[message.guild.id].channels //obtenemos los canales
}
let datos = await Antispam.verificar(message, {
max_advertencias: 10,
flood_puntos: 1,
mencion_puntos: 5,
invitaciones: true,
invite_puntos: 5,
usuarios: guildusers,
canales: guildcanales
})
//codigo que veremos a continuacion
})
Propiedades de retorno
Como se menciono anteriormente, el metodo verificar retorna un objeto con los datos en caso de que el usuario haya sido detectado por el sistema antispam, de lo contrario solo retornara false.
La estructura del objeto de rotorno es la siguiente:
{
duplicado: true, //de lo contrario false
mencion: [object], //de lo contrario false
flood: [object], //de lo contrario false
invitacion: [object] //de lo contrario false
}
duplicado:
Esta deteccion no aumenta puntos.
Esta propiedad sera true en caso de que el mensaje del usuario contenga multiples caracteres iguales, de lo contrario regresara false.
Ejemplo:
{
duplicado: true,
mencion: false,
flood: false,
invitacion: false
}
mencion:
Esta deteccion se emitira cuando el usuario hace 5 menciones o mas.
Esta propiedad regresara un objeto cuando el usuario haya mencionado a usuarios y roles masivamente, de lo contrario regresara false.
El objeto contiene 3 propiedades:
- cantidad
- advertencias
- detectado
cantidad:
Aqui se mostrara la cantidad de menciones que hizo el usuario.
advertencias:
Aqui se mostrara el puntaje actual del usuario y el puntaje maximo(max_advertencias), exp: 5/10
detectado:
Esto sera true en caso de que el usuario haya llegado o sobrepasado el limite de advertencias que especificaste en max_advertencias, de lo contrario regresara false.
Ejemplo:
{
duplicado: false,
mencion: {
cantidad: 7,
advertencias: "5/10",
detectado: false
}
flood: false,
invitacion: false
}
flood:
Esta deteccion se emitira cuando el usuario haya enviado 4 mensajes o mas con un intervalo de tiempo entre 0 a 1.7 segundos.
Esta propiedad regresara un objecto cuando el usuario haya sido detectado haciendo flood, de lo contrario regresara false.
El objeto contiene 4 propiedades:
- tiempo
- cantidad
- advertencias
- detectado
tiempo:
Aqui se mostrara el tiempo exacto del flood exp: 0.7s.
cantidad:
Aqui se mostrara la cantidad de mensajes que envio en el flood.
advertencias:
Aqui se mostrara el puntaje actual del usuario y el puntaje maximo(max_advertencias), exp: 6/10
detectado:
Esto sera true en caso de que el usuario haya llegado o sobrepasado el limite de advertencias que especificaste en max_advertencias, de lo contrario regresara false.
Ejemplo:
{
duplicado: false,
mencion: false,
flood: {
tiempo: "0.7s",
cantidad: 4,
advertencias: "6/10",
detectado: false
}
invitacion: false
}
invitacion:
Esta deteccion se emitira cuando el usuario haya enviado un link de invitacion.
Esta propiedad regresara un objeto cuando el usuario haya sido detectado enviando un link de invitacion, de lo contrario regresara false.
El objeto contiene 5 propiedades:
- servidor
- advertencias
- id
- url
- detectado
servidor:
Aqui se mostrara el nombre del servidor de la invitacion, de lo contrario regresara invalido.
advertencias:
Aqui se mostrara el puntaje actual del usuario y el puntaje maximo(max_advertencias), exp: 11/10
id:
Aqui se mostrara el id del servidor de la invitacion, de lo contrario regresara invalido.
url:
Aqui se mostrara el link de invitacion.
detectado:
Esto sera true en caso de que el usuario haya llegado o sobrepasado el limite de advertencias que especificaste en max_advertencias, de lo contrario regresara false.
Ejemplo:
{
duplicado: false,
mencion: false,
flood: false,
invitacion: {
servidor: "Servidor de prueba",
advertencias: "11/10",
id: "536229184251494134",
url: "https://discord.gg/HQUXjT",
detectado: true
}
}
Ejemplo usando el Antispam y sus propiedades, ustedes pueden hacerlo a su manera:
const Antispam = require('antispam-discord');
const Discord = require('discord.js');
const client = new Discord.Client();
client.on("message", async message => {
if(message.channel.type == "dm") return;
let datos = await Antispam.verificar(message, {
max_advertencias: 10,
flood_puntos: 1,
mencion_puntos: 5,
invitaciones: true,
invite_puntos: 5,
usuarios: [],
canales: []
})
let warnembed = new Discord.RichEmbed()
let mutedembed = new Discord.RichEmbed()
warnembed.setColor("#ff5f00")
warnembed.setAuthor(message.author.tag, message.author.displayAvatarURL)
mutedembed.setColor("#cc0000")
mutedembed.setAuthor(message.author.tag, message.author.displayAvatarURL)
if(datos) { //si el usuario fue detectado
let muted_rol = message.guild.roles.find(r => r.name == "muted") //obtenemos el rol muted
if(datos.duplicado) { //en caso de que la deteccion de caracteres duplicados sea verdadera
message.delete() //eliminamos el mensaje
warnembed.setDescription(`**${message.author.tag}** envio un mensaje en ${message.channel} que contenia multiples caracteres iguales.\n**Mensaje:**\n${message.content.length < 1000 ? message.content : message.content.slice(0, 500)+".."}`)
return client.channels.get("CANAL_ID").send(warnembed)
}
else if(datos.mencion) { //en caso de que la deteccion de menciones sea verdadera
message.delete() //eliminamos el mensaje
let cantidad = datos.mencion.cantidad //obtenemos la cantidad de menciones
let advertencias = datos.mencion.advertencias //obtenemos la cantidad de advertencias actuales
let detectado = datos.mencion.detectado //obtenemos el valor
warnembed.setDescription(`**${message.author.tag}** hizo ${cantidad} menciones en el canal ${message.channel}.\n**Advertencias:** ${advertencias}\n**Mensaje:**\n${message.content.length < 1000 ? message.content : message.content.slice(0, 500)+".."}`)
client.channels.get("CANAL_ID").send(warnembed)
if(detectado) { //verificamos si el usuario llego al limite de advertencias
if(!muted_rol) return;
message.member.addRole(muted_rol.id) //le agregamos el rol muted
mutedembed.setDescription(`**__SPAMMER DETECTADO__**\n**${message.author.tag}** llego al limite de advertencias: **${advertencias}**\nSe ejecuto la prevencion.`)
client.channels.get("CANAL_ID").send(mutedembed)
}
return;
}
else if(datos.flood) { //en caso de que la deteccion de flood sea verdadera
let tiempo = datos.flood.tiempo //obtenemos el tiempo
let cantidad = datos.flood.cantidad //obtenemos la cantidad de mensajes
let advertencias = datos.flood.advertencias //obtenemos la cantidad de advertencias actuales
let detectado = datos.flood.detectado //obtenemos el valor
warnembed.setDescription(`**${message.author.tag}** envio **${cantidad}** mensajes en ${message.channel} con un tiempo de ${tiempo}.\n**Advertencias:** ${advertencias}`)
client.channels.get("CANAL_ID").send(warnembed)
if(detectado) { //verificamos si el usuario llego al limite de advertencias
if(!muted_rol) return;
message.member.addRole(muted_rol.id) //le agregamos el rol muted
mutedembed.setDescription(`**__SPAMMER DETECTADO__**\n**${message.author.tag}** llego al limite de advertencias: **${advertencias}**\nSe ejecuto la prevencion.`)
client.channels.get("CANAL_ID").send(mutedembed)
}
return
}
else if(datos.invitacion) { //en caso de que la deteccion de invitaciones sea verdadera
message.delete(); //eliminamos el mensaje de la invitacion
let link = datos.invitacion.url //obtenemos el url
let servidor = datos.invitacion.servidor //obtenemos el nombre del servidor
let serverid = datos.invitacion.id //obtenemos el id del servidor
let advertencias = datos.invitacion.advertencias //obtenemos la cantidad de advertencias actuales
let detectado = datos.invitacion.detectado //obtenemos el valor
warnembed.setDescription(`**${message.author.tag}** envio una invitacion en el canal ${message.channel}\n**Link:** ${link}\n**Servidor:** ${servidor}\n**ID del servidor:** ${serverid}.\n**Advertencias:** ${advertencias}`)
client.channels.get("CANAL_ID").send(warnembed)
if(detectado) { //verificamos si el usuario llego al limite de advertencias
if(!muted_rol) return;
message.member.addRole(muted_rol.id) //le agregamos el rol muted
mutedembed.setDescription(`**__SPAMMER DETECTADO__**\n**${message.author.tag}** llego al limite de advertencias: **${advertencias}**\nSe ejecuto la prevencion.`)
client.channels.get("CANAL_ID").send(mutedembed)
}
return
}
}
if(message.author.bot) return; //esto irá al final de todo el codigo de deteccion del spam ya que los bots tambien pueden hacer spam.
//tu codigo restante, comandos, etc.
})