private static void Client_OnMessageReceived(DiscordSocketClient client, MessageEventArgs args) { if (!string.IsNullOrEmpty(args.Message.Content)) { var messages = Messages[args.Message.Guild.Id]; messages.RemoveAll(m => m.SentAt < DateTime.UtcNow - MessageExpiration); messages.Add(args.Message); if (messages.Count >= MaxMessages && messages.Select(x => x.Content).Distinct().Count() == 1) { Console.WriteLine("Raid detected"); var msgsCopy = new List <DiscordMessage>(messages); messages.Clear(); foreach (var msg in msgsCopy) { BanQueue.Enqueue(msg.Author.Member); } // if we're on a bot account, we can delete messages from multiple users much faster than we can ban them. let's keep the chat clean :) if (client.User.Type == DiscordUserType.Bot) { foreach (var group in msgsCopy.GroupBy(m => m.Channel.Id)) { client.DeleteMessages(group.Key, group.Select(m => m.Id).ToList()); } } } } }
private static void Client_OnMessageReceived(DiscordSocketClient client, MessageEventArgs args) { if (!string.IsNullOrEmpty(args.Message.Content)) { var messages = Messages[args.Message.Guild.Id]; messages.RemoveAll(m => m.SentAt < DateTime.UtcNow - MessageExpiration); messages.Add(args.Message); if (messages.Count >= MaxMessages && messages.Select(x => x.Content).Distinct().Count() == 1) { Console.WriteLine("Raid detected"); var msgsCopy = new List <DiscordMessage>(messages); messages.Clear(); foreach (var msg in msgsCopy) { BanQueue.Enqueue(msg.Author.Member); } if (client.User.Type == DiscordUserType.Bot) { foreach (var group in msgsCopy.GroupBy(m => m.Channel.Id)) { client.DeleteMessages(group.Key, group.Select(m => m.Id).ToList()); } } else { // we have to go the slow route :( foreach (var msg in msgsCopy) { msg.Delete(); } } } } }