antispam-discord

Modulo de utilidad para prevenir el spam, este modulo trabaja con discord.js y cuenta con diferentes tipos de deteccion.

Usage no npm install needed!

<script type="module">
  import antispamDiscord from 'https://cdn.skypack.dev/antispam-discord';
</script>

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.
})

Demostracion:

https://youtu.be/tP4AS2opa6g