From 19bf146e4a601e903d9f17c14dccfcdd53fc8747 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Tue, 8 Nov 2016 22:22:39 +0100 Subject: [PATCH] AntiRaid/Antispam now log to .logserver instead of guild owner DM --- .../Modules/Administration/Administration.cs | 8 +- .../Commands/AntiRaidCommands.cs | 86 +++++++++---------- .../Administration/Commands/LogCommand.cs | 55 +++++++++--- 3 files changed, 89 insertions(+), 60 deletions(-) diff --git a/src/NadekoBot/Modules/Administration/Administration.cs b/src/NadekoBot/Modules/Administration/Administration.cs index d7f72186..912d457d 100644 --- a/src/NadekoBot/Modules/Administration/Administration.cs +++ b/src/NadekoBot/Modules/Administration/Administration.cs @@ -88,8 +88,12 @@ namespace NadekoBot.Modules.Administration foreach (var toOverwrite in guild.GetTextChannels()) { - await toOverwrite.AddPermissionOverwriteAsync(muteRole, new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny)) - .ConfigureAwait(false); + try + { + await toOverwrite.AddPermissionOverwriteAsync(muteRole, new OverwritePermissions(sendMessages: PermValue.Deny, attachFiles: PermValue.Deny)) + .ConfigureAwait(false); + } + catch { } await Task.Delay(200).ConfigureAwait(false); } } diff --git a/src/NadekoBot/Modules/Administration/Commands/AntiRaidCommands.cs b/src/NadekoBot/Modules/Administration/Commands/AntiRaidCommands.cs index 2550a94d..07d3b775 100644 --- a/src/NadekoBot/Modules/Administration/Commands/AntiRaidCommands.cs +++ b/src/NadekoBot/Modules/Administration/Commands/AntiRaidCommands.cs @@ -114,9 +114,9 @@ namespace NadekoBot.Modules.Administration { if (spamSettings.UserStats.TryRemove(msg.Author.Id, out stats)) { - var log = await PunishUser((IGuildUser)msg.Author, spamSettings.Action, spamSettings.MuteRole, ProtectionType.Spamming) + await PunishUsers(spamSettings.Action, spamSettings.MuteRole, ProtectionType.Spamming, (IGuildUser)msg.Author) .ConfigureAwait(false); - await channel.Guild.SendMessageToOwnerAsync(log).ConfigureAwait(false); } + } } } catch { } @@ -142,16 +142,11 @@ namespace NadekoBot.Modules.Administration if (settings.UsersCount >= settings.UserThreshold) { - var users = settings.RaidUsers.ToList(); + var users = settings.RaidUsers.ToArray(); settings.RaidUsers.Clear(); - string msg = ""; - foreach (var gu in users) - { - msg += await PunishUser(gu, settings.Action, settings.MuteRole, ProtectionType.Raiding).ConfigureAwait(false); - } - try { await usr.Guild.SendMessageToOwnerAsync(msg).ConfigureAwait(false); } catch { } - } + await PunishUsers(settings.Action, settings.MuteRole, ProtectionType.Raiding, users).ConfigureAwait(false); + } await Task.Delay(1000 * settings.Seconds).ConfigureAwait(false); settings.RaidUsers.TryRemove(usr); @@ -161,50 +156,49 @@ namespace NadekoBot.Modules.Administration return Task.CompletedTask; }; } - - private async Task PunishUser(IGuildUser gu, PunishmentAction action, IRole muteRole, ProtectionType pt) + + private async Task PunishUsers(PunishmentAction action, IRole muteRole, ProtectionType pt, params IGuildUser[] gus) { - switch (action) + foreach (var gu in gus) { - case PunishmentAction.Mute: - try - { - await gu.AddRolesAsync(muteRole); - return $"{Format.Bold(gu.ToString())} was **MUTED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n"; - } - catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); } - break; - case PunishmentAction.Kick: - try - { - await gu.Guild.AddBanAsync(gu, 7); + switch (action) + { + case PunishmentAction.Mute: try { - await gu.Guild.RemoveBanAsync(gu); + await gu.AddRolesAsync(muteRole); } - catch + catch (Exception ex) { _log.Warn(ex, "I can't apply punishement"); } + break; + case PunishmentAction.Kick: + try { - await gu.Guild.RemoveBanAsync(gu); - // try it twice, really don't want to ban user if - // only kick has been specified as the punishement + await gu.Guild.AddBanAsync(gu, 7); + try + { + await gu.Guild.RemoveBanAsync(gu); + } + catch + { + await gu.Guild.RemoveBanAsync(gu); + // try it twice, really don't want to ban user if + // only kick has been specified as the punishement + } } - return $"{Format.Bold(gu.ToString())} was **KICKED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n"; - - } - catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } - break; - case PunishmentAction.Ban: - try - { - await gu.Guild.AddBanAsync(gu, 7); - return $"{Format.Bold(gu.ToString())} was **BANNED** due to `{pt}` protection on **{gu.Guild.Name}** server.\n"; - } - catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } - break; - default: - break; + catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } + break; + case PunishmentAction.Ban: + try + { + await gu.Guild.AddBanAsync(gu, 7); + } + catch (Exception ex) { _log.Warn(ex, "I can't apply punishment"); } + break; + default: + break; + } } - return String.Empty; + await LogCommands.TriggeredAntiProtection(gus, action, pt).ConfigureAwait(false); } diff --git a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs index 23aa8e7c..a366baef 100644 --- a/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs +++ b/src/NadekoBot/Modules/Administration/Commands/LogCommand.cs @@ -22,21 +22,20 @@ namespace NadekoBot.Modules.Administration [Group] public class LogCommands { - private ShardedDiscordClient _client { get; } - private Logger _log { get; } + private static ShardedDiscordClient _client { get; } + private static Logger _log { get; } - private string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; + private static string prettyCurrentTime => $"【{DateTime.Now:HH:mm:ss}】"; - public ConcurrentDictionary GuildLogSettings { get; } + public static ConcurrentDictionary GuildLogSettings { get; } - private ConcurrentDictionary> UserPresenceUpdates { get; } = new ConcurrentDictionary>(); - private Timer t; + private static ConcurrentDictionary> UserPresenceUpdates { get; } = new ConcurrentDictionary>(); + private static Timer timerReference { get; } private IGoogleApiService _google { get; } - public LogCommands(ShardedDiscordClient client, IGoogleApiService google) + static LogCommands() { - _client = client; - _google = google; + _client = NadekoBot.Client; _log = LogManager.GetCurrentClassLogger(); using (var uow = DbHandler.UnitOfWork()) @@ -45,7 +44,7 @@ namespace NadekoBot.Modules.Administration .ToDictionary(g => g.GuildId, g => g.LogSetting)); } - t = new Timer(async (state) => + timerReference = new Timer(async (state) => { try { @@ -63,8 +62,10 @@ namespace NadekoBot.Modules.Administration _log.Warn(ex); } }, null, TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(10)); - + } + public LogCommands(ShardedDiscordClient client) + { //_client.MessageReceived += _client_MessageReceived; _client.MessageUpdated += _client_MessageUpdated; _client.MessageDeleted += _client_MessageDeleted; @@ -81,6 +82,36 @@ namespace NadekoBot.Modules.Administration _client.ChannelUpdated += _client_ChannelUpdated; } + public static async Task TriggeredAntiProtection(IGuildUser[] users, PunishmentAction action, ProtectionType protection) + { + if (users.Length == 0) + return; + + LogSetting logSetting; + if (!GuildLogSettings.TryGetValue(users.First().Guild.Id, out logSetting) + || !logSetting.IsLogging) + return; + ITextChannel logChannel; + if ((logChannel = TryGetLogChannel(users.First().Guild, logSetting)) == null) + return; + + var punishment = ""; + if (action == PunishmentAction.Mute) + { + punishment = "MUTED"; + } + else if (action == PunishmentAction.Kick) + { + punishment = "KICKED"; + } + else if (action == PunishmentAction.Ban) + { + punishment = "BANNED"; + } + await logChannel.SendMessageAsync(String.Join("\n",users.Select(user=>$"{Format.Bold(user.ToString())} was **{punishment}** due to `{protection}` protection on **{user.Guild.Name}** server."))) + .ConfigureAwait(false); + } + private Task _client_UserUpdated(IGuildUser before, IGuildUser after) { LogSetting logSetting; @@ -461,7 +492,7 @@ namespace NadekoBot.Modules.Administration // } private enum LogChannelType { Text, Voice, UserPresence }; - private ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text) + private static ITextChannel TryGetLogChannel(IGuild guild, LogSetting logSetting, LogChannelType logChannelType = LogChannelType.Text) { ulong id = 0; switch (logChannelType)