watchcat.js
Advanced tools
Comparing version 1.0.0 to 1.0.1
{ | ||
"name": "watchcat.js", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"description": "A powerful NPM module for automoderation and spam prevention in Discord servers.", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
@@ -5,2 +5,17 @@ # Watchcat - Discord Auto-Moderation | ||
## Changelog | ||
### Versión: **1.0.1** | ||
1. **Optimización Asincrónica** | ||
* El método `checkSpam()` ahora es asincrónico (async), mejorando el rendimiento y la velocidad de respuesta del Watchcat ante mensajes no deseados. | ||
2. **Baneo con Eliminación Automática** | ||
* Los baneos por spam y mensajes duplicados ahora incluyen una duración para eliminar automáticamente los mensajes ofensivos, manteniendo el servidor limpio sin intervención manual. | ||
3. **Opción de Desactivar Baneos** | ||
* Se ha agregado una nueva propiedad `disableBan`. Por defecto viene en **true**, es decir, no baneará a los usuarios. | ||
4. **Optimización de Caché** | ||
* El Watchcat ahora aprovecha la caché para realizar baneos y eliminar mensajes, reduciendo la carga en el servidor y mejorando la velocidad de ejecución. | ||
5. **Mejoras en el Seguimiento de Spam** | ||
* Se han realizado mejoras en el seguimiento de spam, lo que aumenta la precisión y eficiencia en la detección de comportamientos no deseados. | ||
## Métodos y Características | ||
@@ -12,3 +27,3 @@ | ||
* **Detección de Spam:** Con la función de seguimiento de spam, Watchcat puede imponer una sanción automática a los miembros que envíen mensajes repetitivos en un corto período de tiempo. | ||
* `checkSpam(userId, guild)`: Realiza un seguimiento de los mensajes enviados por un usuario y aplica una sanción de ban si supera el número máximo de mensajes permitidos en el tiempo establecido. | ||
* `checkSpam(userId, guild, message)`: Realiza un seguimiento de los mensajes enviados por un usuario y aplica una sanción de ban si supera el número máximo de mensajes permitidos en el tiempo establecido. | ||
@@ -39,2 +54,4 @@ * **Mensajes Duplicados:** Watchcat rastrea los mensajes duplicados y aplica acciones de moderación a los miembros que repitan el mismo mensaje varias veces. | ||
* **NEW!** `disableBan`: Permite habilitar o deshabilitar el baneo automático. Valor predeterminado: **true** (desactivado). | ||
## Modo de Uso | ||
@@ -46,3 +63,3 @@ | ||
```js | ||
const Watchcat = require('watchcat.js'); | ||
const { Watchcat } = require('watchcat.js'); | ||
``` | ||
@@ -61,2 +78,3 @@ | ||
linkBanReason: 'Sending links', | ||
disableBan: false | ||
}); | ||
@@ -69,3 +87,3 @@ ``` | ||
autoModeration.checkMessage(message); | ||
autoModeration.checkSpam(message.author.id, message.guild); | ||
autoModeration.checkSpam(message.author.id, message.guild, message); | ||
autoModeration.duplicateMessageFilter(message); | ||
@@ -99,3 +117,3 @@ autoModeration.antiLink(message); | ||
client.on('messageCreate', (message) => { | ||
autoModeration.checkSpam(message.author.id, message.guild); | ||
autoModeration.checkSpam(message.author.id, message.guild, message); | ||
}); | ||
@@ -102,0 +120,0 @@ ``` |
@@ -16,2 +16,4 @@ class Watchcat { | ||
this.linkBanReason = options.linkBanReason || 'Sending links'; | ||
this.disableBan = typeof options.disableBan === 'boolean' ? options.disableBan : true; | ||
} | ||
@@ -21,3 +23,3 @@ | ||
if (this.filterWords.some(word => message.content.toLowerCase().includes(word))) { | ||
message.delete().catch(console.error); | ||
message.delete().catch(() => {}); | ||
return true; | ||
@@ -28,3 +30,3 @@ } | ||
checkSpam(userId, guild) { | ||
async checkSpam(userId, guild, message) { | ||
if (!this.spamTracker.has(userId)) { | ||
@@ -40,7 +42,15 @@ this.spamTracker.set(userId, []); | ||
const recentMessages = messages.filter(timestamp => timestamp > timeFrameStart); | ||
this.spamTracker.set(userId, recentMessages); | ||
if (recentMessages.length >= this.maxMessages) { | ||
guild.members.ban(userId, { reason: this.spamBanReason }).catch(console.error); | ||
this.spamTracker.delete(userId); | ||
return true; | ||
const isSpamming = recentMessages.length > this.maxMessages; | ||
if (isSpamming) { | ||
if (this.disableBan) { | ||
message.delete().catch(() => {}); | ||
return true; | ||
} else { | ||
await guild.members.cache.get(userId).ban({ deleteMessageSeconds: 60 * 60 * 24 * 7, reason: this.spamBanReason }).catch(console.error); | ||
this.spamTracker.delete(userId); | ||
return true; | ||
} | ||
} | ||
@@ -53,2 +63,5 @@ | ||
} | ||
if (messages.length === 0) { | ||
this.spamTracker.set(userId, messages); | ||
} | ||
}, this.timeFrame * 1000); | ||
@@ -59,17 +72,35 @@ | ||
duplicateMessageFilter(message) { | ||
async duplicateMessageFilter(message) { | ||
if (!this.duplicateMessages.has(message.author.id)) { | ||
this.duplicateMessages.set(message.author.id, []); | ||
this.duplicateMessages.set(message.author.id, { messages: [], timer: null }); | ||
} | ||
const messages = this.duplicateMessages.get(message.author.id); | ||
const userData = this.duplicateMessages.get(message.author.id); | ||
const { messages, timer } = userData; | ||
const isDuplicate = messages.filter(msg => msg === message.content).length > 1; | ||
if (isDuplicate) { | ||
if (this.disableBan) { | ||
message.delete().catch(() => { }); | ||
return true; | ||
} else { | ||
await message.guild.members.cache.get(message.author.id).ban({ deleteMessageDays: 7, reason: this.duplicateMsgBanReason }).catch(console.error); | ||
clearTimeout(timer); | ||
this.duplicateMessages.delete(message.author.id); | ||
return true; | ||
} | ||
} | ||
messages.push(message.content); | ||
if (messages.length >= this.duplicateMsgMax) { | ||
message.member.ban({ reason: this.duplicateMsgBanReason }).catch(console.error); | ||
this.duplicateMessages.delete(message.author.id); | ||
return true; | ||
if (messages.length > this.duplicateMsgMax) { | ||
const deletedMessage = messages.shift(); | ||
if (deletedMessage === message.content) { | ||
clearTimeout(timer); | ||
this.duplicateMessages.delete(message.author.id); | ||
} | ||
} | ||
setTimeout(() => { | ||
userData.timer = setTimeout(() => { | ||
const index = messages.indexOf(message.content); | ||
@@ -79,2 +110,5 @@ if (index !== -1) { | ||
} | ||
if (messages.length === 0) { | ||
this.duplicateMessages.delete(message.author.id); | ||
} | ||
}, this.duplicateMsgTime * 1000); | ||
@@ -87,4 +121,6 @@ | ||
if (message.content.match(/https?:\/\/\S+/i)) { | ||
message.delete().catch(console.error); | ||
message.member.ban({ reason: this.linkBanReason }).catch(console.error); | ||
message.delete().catch(() => {}); | ||
if (!this.disableBan) { | ||
message.member.ban({ deleteMessageSeconds: 60 * 60 * 24 * 7, reason: this.linkBanReason }).catch(console.error); | ||
} | ||
return true; | ||
@@ -98,2 +134,2 @@ } | ||
Watchcat | ||
}; | ||
}; |
12843
103
143