Socket
Socket
Sign inDemoInstall

watchcat.js

Package Overview
Dependencies
0
Maintainers
1
Versions
2
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.0.0 to 1.0.1

2

package.json
{
"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
};
};
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc