mirror of
https://github.com/LBRYFoundation/lbry-wunderbot.git
synced 2025-08-23 09:37:27 +00:00
139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
const authors = [];
|
|
let warned = [];
|
|
let banned = [];
|
|
let messagelog = [];
|
|
let config = require("config");
|
|
let botlog = config.get("moderation").logchannel;
|
|
let hasPerms = require("../helpers.js").hasPerms;
|
|
let inPrivate = require("../helpers.js").inPrivate;
|
|
let hasExcludedSpamChannels = require("../helpers.js").hasExcludedSpamChannels;
|
|
let hasExcludedSpamUsers = require("../helpers.js").hasExcludedSpamUsers;
|
|
|
|
/**
|
|
* Add simple spam protection to your discord server.
|
|
* @param {Bot} bot - The discord.js CLient/bot
|
|
* @param {object} options - Optional (Custom configuarion options)
|
|
* @return {[type]} [description]
|
|
*/
|
|
|
|
exports.custom = ["antiSpam"];
|
|
|
|
exports.antiSpam = function(bot) {
|
|
const warnBuffer = 5;
|
|
const maxBuffer = 10;
|
|
const interval = 1500;
|
|
const warningMessage =
|
|
", Stop spamming or you will be banned! This is your warning!";
|
|
const banMessage = "has been banned for spamming!";
|
|
const maxDuplicatesWarning = 5;
|
|
const maxDuplicatesBan = 10;
|
|
|
|
bot.on("message", msg => {
|
|
if (
|
|
inPrivate(msg) ||
|
|
hasPerms(msg) ||
|
|
msg.author.bot ||
|
|
hasExcludedSpamChannels(msg) ||
|
|
hasExcludedSpamUsers(msg)
|
|
) {
|
|
return;
|
|
}
|
|
if (msg.author.id != bot.user.id) {
|
|
var now = Math.floor(Date.now());
|
|
authors.push({
|
|
time: now,
|
|
author: msg.author.id
|
|
});
|
|
messagelog.push({
|
|
message: msg.content,
|
|
author: msg.author.id
|
|
});
|
|
|
|
// Check how many times the same message has been sent.
|
|
var msgMatch = 0;
|
|
for (var i = 0; i < messagelog.length; i++) {
|
|
if (
|
|
messagelog[i].message == msg.content &&
|
|
messagelog[i].author == msg.author.id &&
|
|
msg.author.id !== bot.user.id
|
|
) {
|
|
msgMatch++;
|
|
}
|
|
}
|
|
// Check matched count
|
|
if (msgMatch == maxDuplicatesWarning && !warned.includes(msg.author.id)) {
|
|
warn(msg, msg.author.id);
|
|
}
|
|
if (msgMatch == maxDuplicatesBan && !banned.includes(msg.author.id)) {
|
|
ban(msg, msg.author.id);
|
|
}
|
|
|
|
matched = 0;
|
|
|
|
for (var i = 0; i < authors.length; i++) {
|
|
if (authors[i].time > now - interval) {
|
|
matched++;
|
|
if (matched == warnBuffer && !warned.includes(msg.author.id)) {
|
|
warn(msg, msg.author.id);
|
|
} else if (matched == maxBuffer) {
|
|
if (!banned.includes(msg.author.id)) {
|
|
ban(msg, msg.author.id);
|
|
}
|
|
}
|
|
} else if (authors[i].time < now - interval) {
|
|
authors.splice(i);
|
|
warned.splice(warned.indexOf(authors[i]));
|
|
banned.splice(warned.indexOf(authors[i]));
|
|
}
|
|
if (messagelog.length >= 200) {
|
|
messagelog.shift();
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Warn a user
|
|
* @param {Object} msg
|
|
* @param {string} userid userid
|
|
*/
|
|
function warn(msg, userid) {
|
|
warned.push(msg.author.id);
|
|
msg.channel.send(msg.author + " " + warningMessage);
|
|
}
|
|
|
|
/**
|
|
* Ban a user by the user id
|
|
* @param {Object} msg
|
|
* @param {string} userid userid
|
|
* @return {boolean} True or False
|
|
*/
|
|
function ban(msg, userid) {
|
|
for (var i = 0; i < messagelog.length; i++) {
|
|
if (messagelog[i].author == msg.author.id) {
|
|
messagelog.splice(i);
|
|
}
|
|
}
|
|
|
|
banned.push(msg.author.id);
|
|
|
|
var user = msg.channel.guild.members.find(
|
|
member => member.user.id === msg.author.id
|
|
);
|
|
if (user) {
|
|
user
|
|
.ban()
|
|
.then(member => {
|
|
msg.channel.send(msg.author + " " + banMessage);
|
|
bot.channels.get(botlog).send(msg.author + " " + banMessage);
|
|
return true;
|
|
})
|
|
.catch(() => {
|
|
msg.channel.send(
|
|
"insufficient permission to kick " + msg.author + " for spamming."
|
|
);
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
};
|