forked from Michael-J-Scofield/discord-anti-spam
-
Notifications
You must be signed in to change notification settings - Fork 0
/
anti_spam.js
117 lines (105 loc) · 3.54 KB
/
anti_spam.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
const authors = [];
var warned = [];
var banned = [];
var messagelog = [];
/**
* 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]
*/
module.exports = function (bot, options) {
// Set options
const warnBuffer = (options && options.prefix) || 3;
const maxBuffer = (options && options.prefix) || 5;
const interval = (options && options.interval) || 1000;
const warningMessage = (options && options.warningMessage) || "stop spamming or I'll whack your head off.";
const banMessage = (options && options.banMessage) || "has been banned for spamming, anyone else?";
const maxDuplicatesWarning = (options && options.duplicates || 7);
const maxDuplicatesBan = (options && options.duplicates || 10);
const deleteMessagesAfterBanForPastDays = (options && options.deleteMessagesAfterBanForPastDays || 7);
bot.on('message', msg => {
//Always return with an bot.....
if(msg.author.bot) 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(deleteMessagesAfterBanForPastDays).then((member) => {
msg.channel.send(msg.author + " " +banMessage);
return true;
}).catch(() => {
msg.channel.send("insufficient permission to kick " + msg.author + " for spamming.");
return false;
});
}
}
}