public static async Task PerformFilterActions(DiscordClient client, DiscordMessage message, Piracystring trigger, FilterAction ignoreFlags = 0, string triggerContext = null, string infraction = null, string warningReason = null) { if (trigger == null) { return; } var severity = ReportSeverity.Low; var completedActions = new List <FilterAction>(); if (trigger.Actions.HasFlag(FilterAction.RemoveContent) && !ignoreFlags.HasFlag(FilterAction.RemoveContent)) { try { DeletedMessagesMonitor.RemovedByBotCache.Set(message.Id, true, DeletedMessagesMonitor.CacheRetainTime); await message.Channel.DeleteMessageAsync(message, $"Removed according to filter '{trigger}'").ConfigureAwait(false); completedActions.Add(FilterAction.RemoveContent); } catch (Exception e) { Config.Log.Warn(e); severity = ReportSeverity.High; } try { var author = client.GetMember(message.Author); Config.Log.Debug($"Removed message from {author.GetMentionWithNickname()} in #{message.Channel.Name}: {message.Content}"); } catch (Exception e) { Config.Log.Warn(e); } } if (trigger.Actions.HasFlag(FilterAction.IssueWarning) && !ignoreFlags.HasFlag(FilterAction.IssueWarning)) { try { await Warnings.AddAsync(client, message, message.Author.Id, message.Author.Username, client.CurrentUser, warningReason ?? "Mention of piracy", message.Content.Sanitize()).ConfigureAwait(false); completedActions.Add(FilterAction.IssueWarning); } catch (Exception e) { Config.Log.Warn(e, $"Couldn't issue warning in #{message.Channel.Name}"); } } if (trigger.Actions.HasFlag(FilterAction.SendMessage) && !ignoreFlags.HasFlag(FilterAction.SendMessage)) { try { var msgContent = trigger.CustomMessage; if (string.IsNullOrEmpty(msgContent)) { var rules = await client.GetChannelAsync(Config.BotRulesChannelId).ConfigureAwait(false); msgContent = $"Please follow the {rules.Mention} and do not discuss piracy on this server. Repeated offence may result in a ban."; } await message.Channel.SendMessageAsync($"{message.Author.Mention} {msgContent}").ConfigureAwait(false); completedActions.Add(FilterAction.SendMessage); } catch (Exception e) { Config.Log.Warn(e, $"Failed to send message in #{message.Channel.Name}"); } } if (trigger.Actions.HasFlag(FilterAction.ShowExplain) && !ignoreFlags.HasFlag(FilterAction.ShowExplain)) { var result = await Explain.LookupTerm(trigger.ExplainTerm).ConfigureAwait(false); await Explain.SendExplanation(result, trigger.ExplainTerm, message).ConfigureAwait(false); } var actionList = ""; foreach (FilterAction fa in Enum.GetValues(typeof(FilterAction))) { if (trigger.Actions.HasFlag(fa) && !ignoreFlags.HasFlag(fa)) { actionList += (completedActions.Contains(fa) ? "✅" : "❌") + " " + fa + ' '; } } try { if (!trigger.Actions.HasFlag(FilterAction.MuteModQueue) && !ignoreFlags.HasFlag(FilterAction.MuteModQueue)) { await client.ReportAsync(infraction ?? "🤬 Content filter hit", message, trigger.String, triggerContext ?? message.Content, severity, actionList).ConfigureAwait(false); } } catch (Exception e) { Config.Log.Error(e, "Failed to report content filter hit"); } }