const authors = []; var warned = []; var banned = []; var messagelog = []; let hasPerms = require('../helpers.js').hasPerms; /** * 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 I'll whack your head off."; const banMessage = "has been banned for spamming, anyone else?"; const maxDuplicatesWarning = 4; const maxDuplicatesBan = 7; bot.on('message', msg => { if(hasPerms(msg) == true || msg.author.id == "372832162572926987" || msg.author.id == "363343989442609152" || msg.channel.id == "363044275363119105" || msg.channel.id == "363044260938776576" || msg.channel.id == "363086719391629326") { 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); return true; }).catch(() => { msg.channel.send("insufficient permission to kick " + msg.author + " for spamming."); return false; }); } } }