// Checks a message for spam private Task CheckForSpamAsync(SocketUserMessage message, out bool result) { // Set default to not spam result = false; // Check if bot if (message.Author.IsBot) { result = true; } // Check blacklist and greylist and optedout if (Blacklist.ContainsKey(message.Author.Id) || Greylist.Contains(message.Author.Id) || OptedOut.ContainsKey(message.Author.Id)) { result = true; } // Check if command if (message.Content.StartsWith("!") || message.Content.StartsWith("$") || message.Content.StartsWith(".") || message.Content.StartsWith("^")) { if (logLevel >= 4) { Log("Filter", "{0} Command ignored", message.Author); } result = true; } // Check user created time try { if (DateTimeOffset.Now.ToUnixTimeMilliseconds() - message.Author.CreatedAt.ToUnixTimeMilliseconds() < accountAge * 60 * 60 * 1000) { if (logLevel >= 4) { Log("Filter", "Account age filter triggered: {0} - {1} = {2} < {3}", DateTimeOffset.Now.ToUnixTimeMilliseconds(), message.Author.CreatedAt.ToUnixTimeMilliseconds(), DateTimeOffset.Now.ToUnixTimeMilliseconds() - message.Author.CreatedAt.ToUnixTimeMilliseconds(), accountAge * 60 * 60 * 1000); } result = true; } } catch { } // Check minimum number of spaces if (message.Content.Count(char.IsWhiteSpace) < 3) { if (logLevel >= 4) { Log("Filter", "{0} Less than 3 spaces", message.Author); } result = true; } // Check if message doesn't contain any alphanumeric if (new Regex("[^a-zA-Z0-9]").Replace(message.Content, "").Length < 14) { if (logLevel >= 4) { Log("Filter", "{0} Not enough alphanumeric", message.Author); } result = true; } // Check that message contains at least 1 lowercase letter if (!message.Content.Any(char.IsLower)) { if (logLevel >= 4) { Log("Filter", "{0} No lower case letters", message.Author); } result = true; } // Check ignored word list foreach (string ignore in wordFilter) { if (message.Content.ToLower().Contains(ignore)) { if (logLevel >= 4) { Log("Filter", "{0} Ignored word found", message.Author); } result = true; break; } } // Check that last message was different if (!UserMessages.ContainsKey(message.Author.Id)) { UserMessages[message.Author.Id] = new UserMessage(message); } else if (UserMessages[message.Author.Id].Content == message.Content) { if (logLevel >= 4) { Log("Filter", "{0} Last message same as current one", message.Author); } result = true; } // Check exiled nickname list try { foreach (string ignore in ignoredNicknames) { if ((message.Author as SocketGuildUser).Nickname.ToLower().Contains(ignore)) { if (logLevel >= 4) { Log("Filter", "{0} Nickname contains blacklisted term", message.Author); } result = true; break; } } } catch { } // Check that user has at least one required role (if applicable) if (requiredRoles.Count > 0) { var user = message.Author as SocketGuildUser; bool HasRole = false; foreach (string Role in requiredRoles) { var role = (user as IGuildUser).Guild.Roles.FirstOrDefault(x => x.Name.ToLower() == Role); if (user.Roles.Contains(role)) { HasRole = true; break; } } if (!HasRole) { if (logLevel >= 4) { Log("Filter", "{0} No required role", message.Author); } result = true; } } // Completed UserMessages[message.Author.Id] = new UserMessage(message); return(Task.CompletedTask); }