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"); } }
public static async Task OnError(CommandErrorEventArgs e) { if (e.Context.User.IsBotSafeCheck()) { return; } if (!(e.Exception is CommandNotFoundException cnfe)) { Config.Log.Error(e.Exception); return; } if (string.IsNullOrEmpty(cnfe.CommandName)) { return; } if (e.Context.Prefix != Config.CommandPrefix && e.Context.Prefix != Config.AutoRemoveCommandPrefix && (e.Context.Message.Content?.EndsWith("?") ?? false) && e.Context.CommandsNext.RegisteredCommands.TryGetValue("8ball", out var cmd)) { var updatedContext = e.Context.CommandsNext.CreateContext( e.Context.Message, e.Context.Prefix, cmd, e.Context.Message.Content.Substring(e.Context.Prefix.Length).Trim() ); try { await cmd.ExecuteAsync(updatedContext).ConfigureAwait(false); } catch { } return; } if (cnfe.CommandName.Length < 3) { return; } #if !DEBUG if (e.Context.User.IsSmartlisted(e.Context.Client, e.Context.Guild)) { return; } #endif var pos = e.Context.Message?.Content?.IndexOf(cnfe.CommandName) ?? -1; if (pos < 0) { return; } var gameTitle = e.Context.Message.Content.Substring(pos).TrimEager().Trim(40); if (string.IsNullOrEmpty(gameTitle) || char.IsPunctuation(gameTitle[0])) { return; } var term = gameTitle.ToLowerInvariant(); var(explanation, fuzzyMatch, score) = await Explain.LookupTerm(term).ConfigureAwait(false); if (score > 0.5 && explanation != null) { if (!string.IsNullOrEmpty(fuzzyMatch)) { var fuzzyNotice = $"Showing explanation for `{fuzzyMatch}`:"; #if DEBUG fuzzyNotice = $"Showing explanation for `{fuzzyMatch}` ({score:0.######}):"; #endif await e.Context.RespondAsync(fuzzyNotice).ConfigureAwait(false); } StatsStorage.ExplainStatCache.TryGetValue(explanation.Keyword, out int stat); StatsStorage.ExplainStatCache.Set(explanation.Keyword, ++stat, StatsStorage.CacheTime); await e.Context.Channel.SendMessageAsync(explanation.Text, explanation.Attachment, explanation.AttachmentFilename).ConfigureAwait(false); return; } gameTitle = CompatList.FixGameTitleSearch(gameTitle); var productCodes = ProductCodeLookup.GetProductIds(gameTitle); if (productCodes.Any()) { await ProductCodeLookup.LookupAndPostProductCodeEmbedAsync(e.Context.Client, e.Context.Message, productCodes).ConfigureAwait(false); return; } var(productCode, titleInfo) = await IsTheGamePlayableHandler.LookupGameAsync(e.Context.Channel, e.Context.Message, gameTitle).ConfigureAwait(false); if (titleInfo != null) { var thumbUrl = await e.Context.Client.GetThumbnailUrlAsync(productCode).ConfigureAwait(false); var embed = titleInfo.AsEmbed(productCode, thumbnailUrl: thumbUrl); await ProductCodeLookup.FixAfrikaAsync(e.Context.Client, e.Context.Message, embed).ConfigureAwait(false); await e.Context.Channel.SendMessageAsync(embed : embed).ConfigureAwait(false); return; } var ch = await e.Context.GetChannelForSpamAsync().ConfigureAwait(false); await ch.SendMessageAsync( $"I am not sure what you wanted me to do, please use one of the following commands:\n" + $"`{Config.CommandPrefix}c {term.Sanitize(replaceBackTicks: true)}` to check the game status\n" + $"`{Config.CommandPrefix}explain list` to look at the list of available explanations\n" + $"`{Config.CommandPrefix}help` to look at available bot commands\n" ).ConfigureAwait(false); }