示例#1
0
        public async Task ListAutoMod(string extension = "")
        {
            var mutualGuilds = (Context.Message.Author as SocketUser).MutualGuilds.ToArray();

            var guildsEmbed = new EmbedBuilder();

            guildsEmbed.WithTitle("Reply with the number corresponding to the guild you want to check the filter info from");

            for (int i = 0; i < mutualGuilds.Length; i++)
            {
                guildsEmbed.AddField($"[{i + 1}] {mutualGuilds[i].Name}", $"ID: {mutualGuilds[i].Id}");
            }
            await ReplyAsync(embed : guildsEmbed.Build());

            SocketGuild guild;
            Predicate <SocketMessage> filter = message => message.Channel == Context.Channel;

            while (true)
            {
                var result = await Interactivity.NextMessageAsync(filter, timeout : TimeSpan.FromMinutes(1));

                if (result.Value?.Content is null or "cancel")
                {
                    await ReplyAsync("You have timed out or canceled");

                    return;
                }
                try
                {
                    guild = mutualGuilds[ushort.Parse(result.Value.Content) - 1];
                    break;
                }
                catch
                {
                    await ReplyAsync("Invalid number, please reply again with a valid number or `cancel`");
                }
            }

            var      settings = guild.LoadFromFile <FilterSettings>(false);
            BadWords badWords = new BadWords(guild);

            var embed = new EmbedBuilder()
                        .WithGuildAsAuthor(guild);
            string message = "";

            bool useExplicit = false;

            extension = extension?.ToLowerInvariant();
            if (extension == "explicit" || extension == "e")
            {
                if (guild.GetUser(Context.Message.Author.Id).CanWarn())
                {
                    useExplicit = true;
                }
                else
                {
                    await ReplyAsync("Are you sure you want to view the explicit filter? Reply with !confirm if you are sure.");

                    var result = await Interactivity.NextMessageAsync(filter, timeout : TimeSpan.FromMinutes(1));

                    if (result.Value?.Content.Equals("!confirm", StringComparison.InvariantCultureIgnoreCase) ?? false)
                    {
                        useExplicit = true;
                    }
                    else
                    {
                        useExplicit = false;
                    }
                }
            }

            if (settings == null)
            {
                embed.AddField("Filter settings", "Are null", true);
            }
            else
            {
                embed.AddField("Warn for posting invite", !settings.invitesAllowed, true);
                if (settings.allowedLinks == null || settings.allowedLinks.Count == 0)
                {
                    embed.AddField("Allowed links", "Links aren't moderated  ", true);
                }
                else
                {
                    message = settings.allowedLinks.ListItems("\n");
                    if (message?.Length is not null or 0)
                    {
                        embed.AddField("Allowed links", message, true);
                    }
                    if (settings.allowedToLink != null && settings.allowedToLink.Count > 0)
                    {
                        message = guild.Roles.Where(
                            role => (role.Permissions.Administrator && !role.IsManaged) || settings.allowedToLink.Contains(role.Id)).Select(role => role.Name).ToArray().ListItems("\n");
                        if (message?.Length is not null or 0)
                        {
                            embed.AddField("Roles that can post links", message, true);
                        }
                    }
                }
                if (settings.allowedCaps > 0)
                {
                    embed.AddField("Allowed caps", $"{settings.allowedCaps}% in msgs more than 5 long", true);
                }
                else
                {
                    embed.AddField("Allowed caps", "Capitalization is not filtered", true);
                }
                string badUniEmojis = settings.badUEmojis?.ListItems("");
                if (!badUniEmojis.IsNullOrEmpty())
                {
                    embed.AddField("Banned Emojis", badUniEmojis, true);
                }
                if (settings.moderateNames)
                {
                    embed.AddField("Name moderation", "True", true);
                }
                if (settings.maxNewLines != null)
                {
                    embed.AddField("Maximum new lines", $"{settings.maxNewLines.Value} new lines", true);
                }
            }
            if (badWords?.all != null && badWords.all.Count > 0 && (useExplicit || badWords.all.Any(word => !string.IsNullOrWhiteSpace(word.Euphemism))))
            {
                List <string> words = new List <string>();
                foreach (List <BadWord> group in badWords.grouped)
                {
                    BadWord first = group.FirstOrDefault();
                    if (first != null)
                    {
                        string word = "";
                        if (useExplicit)
                        {
                            if (group.Count == 1 || group.All(badWord => badWord.Size == first.Size))
                            {
                                word = $"[{first.Size}x] ";
                            }
                            else
                            {
                                var sizes = group.Select(badword => badword.Size);
                                word = $"[{sizes.Min()}-{sizes.Max()}x] ";
                            }
                            if (first.Euphemism?.Length is not null or 0)
                            {
                                word += $"{first.Euphemism} ";
                            }
                            word += $"({group.Select(badWord => $"{badWord.Word}{(badWord.PartOfWord ? "¤" : "")}").ToArray().ListItems(", ")})";
                        }
                        else if (!first.Euphemism.IsNullOrEmpty())
                        {
                            word = first.Euphemism;
                        }
                        if (first.PartOfWord && (!first.Euphemism.IsNullOrEmpty() && !useExplicit))
                        {
                            word += "¤";
                        }
                        words.Add(word);
                    }
                    else
                    {
                        _ = new LogMessage(LogSeverity.Error, "Filter", "Empty badword list in badwords").Log();
                    }
                }
                message = words.ListItems("\n");
                string listName;
                if (useExplicit)
                {
                    listName = "Bad words with euphemisms";
                }
                else
                {
                    listName = "Bad word euphemisms (not an exhaustive list)";
                }
                embed.AddField(listName, message, false);
            }

            await ReplyAsync("The symbol '¤' next to a word means that you can be warned for a word that contains the bad word", embed : embed.Build());
        }
示例#2
0
    public async Task Report()
    {
        try
        {
            var socketContext = Context as SocketCommandContext;
            var guildsEmbed   = new EmbedBuilder();
            guildsEmbed.WithTitle("Reply with the number next to the guild you want to make the report in");
            var mutualGuilds = socketContext.User.MutualGuilds.ToArray();
            for (int i = 0; i < mutualGuilds.Length; i++)
            {
                guildsEmbed.AddField($"[{i + 1}] {mutualGuilds[i].Name} discord", mutualGuilds[i].Id);
            }
            await ReplyAsync(embed : guildsEmbed.Build());

            SocketGuild guild;
            while (true)
            {
                var result = await Interactivity.NextMessageAsync(timeout : TimeSpan.FromMinutes(1));

                var message = result.Value;
                if (message == null || message.Content == "cancel")
                {
                    await ReplyAsync("You have timed out or canceled");

                    return;
                }
                try
                {
                    guild = mutualGuilds[ushort.Parse(message.Content) - 1];
                    break;
                }
                catch
                {
                    await ReplyAsync("Invalid number, please reply again with a valid number or ``cancel``");
                }
            }

            ReportSettings settings = guild.LoadFromFile <ReportSettings>(false);
            if (settings?.channelID == null || guild.GetChannel(settings.channelID ?? 0) == null)
            {
                await ReplyAsync("This guild does not currently have reporting set up, command canceled");

                return;
            }
            SocketGuildUser gUser = guild.GetUser(Context.Message.Author.Id);
            if (settings.requiredRole != null && !(gUser.RoleIDs().Contains(settings.requiredRole.Value) || gUser.GuildPermissions.Administrator))
            {
                await ReplyAsync("You are missing required role for reporting");

                return;
            }

            if (settings.cooldown != null)
            {
                int messageAmount = 100;
                var messages      = await Context.Channel.GetMessagesAsync(messageAmount).Flatten().ToListAsync();

                messages.OrderBy(msg => msg.CreatedAt);
                while (messages.Last().CreatedAt.Offset > settings.cooldown.Value)
                {
                    _              = ReplyAsync("Downloading more messages");
                    messageAmount += 100;
                    messages       = await Context.Channel.GetMessagesAsync(messageAmount).Flatten().ToListAsync();

                    messages.OrderBy(msg => msg.Timestamp.Offset);
                }
                foreach (IMessage message in messages)
                {
                    TimeSpan timeAgo = message.GetTimeAgo();
                    if (message.Author.IsBot && message.Content == "Report has been sent")
                    {
                        if (timeAgo > settings.cooldown.Value)
                        {
                            break;
                        }
                        else
                        {
                            await ReplyAsync($"You need to wait the full {settings.cooldown.Value.Humanize()}, {timeAgo.Humanize()} have passed from {message.GetJumpUrl()}");

                            return;
                        }
                    }
                }
            }

            await ReplyAsync("Please reply with what you want to report");

            var reportMsg = await Interactivity.NextMessageAsync(timeout : TimeSpan.FromMinutes(5));

            if (!reportMsg.IsSuccess)
            {
                await ReplyAsync("Report aborted");

                return;
            }

            var embed = new EmbedBuilder();
            embed.WithAuthor(Context.Message.Author);
            embed.WithTitle("Report");
            embed.WithDescription(reportMsg.Value.Content);
            embed.WithFooter("User ID: " + Context.Message.Author.Id);
            embed.WithCurrentTimestamp();
            string links = "";
            if (reportMsg.Value.Attachments?.Count is not null or 0)
            {
                links = reportMsg.Value.Attachments.Select(attachment => attachment.ProxyUrl).ListItems(" ");
            }
            var channel = guild.GetTextChannel(settings.channelID.Value);
            await channel.SendMessageAsync(embed : embed.Build());

            if (!string.IsNullOrEmpty(links))
            {
                await channel.SendMessageAsync("The message above had these attachments: " + links);
            }

            await ReplyAsync("Report has been sent");
        }
        catch (Exception e)
        {
            ReplyAsync("Error: " + e);
        }
    }
        public async Task DMUserWarnsAsync(UserRef userRef = null, int amount = 50)
        {
            if (amount < 1)
            {
                await ReplyAsync("Why would you want to see that many infractions?");

                return;
            }

            var mutualGuilds = (await Context.Message.Author.GetMutualGuildsAsync(Context.Client)).ToArray();

            if (userRef == null)
            {
                userRef = new UserRef(Context.Message.Author);
            }

            var guildsEmbed = new EmbedBuilder();

            guildsEmbed.WithTitle("Reply with the number next to the guild you want to check the infractions from");

            for (int i = 0; i < mutualGuilds.Length; i++)
            {
                guildsEmbed.AddField($"[{i + 1}] {mutualGuilds[i].Name}", mutualGuilds[i].Id);
            }
            await ReplyAsync(embed : guildsEmbed.Build());

            IGuild guild;
            Predicate <SocketMessage> filter = message => message.Channel == Context.Channel;

            while (true)
            {
                var result  = await Interactivity.NextMessageAsync(filter, timeout : TimeSpan.FromMinutes(1));;
                var message = result.Value;
                if (message == null || message.Content == "cancel")
                {
                    await ReplyAsync("You have timed out or canceled");

                    return;
                }
                try
                {
                    guild = mutualGuilds[ushort.Parse(message.Content) - 1];
                    break;
                }
                catch
                {
                    await ReplyAsync("Invalid number, please reply again with a valid number or ``cancel``");
                }
            }

            List <Infraction> infractions = userRef.LoadInfractions(guild, false);

            if (infractions?.Count is null or 0)
            {
                string message = $"{userRef.Mention()} has no infractions";
                if (userRef.User == null)
                {
                    message += " or doesn't exist";
                }
                await ReplyAsync(message);

                return;
            }
            userRef = userRef with {
                GuildUser = await guild.GetUserAsync(userRef.ID)
            };
            await ReplyAsync($"Here are {userRef.Mention()}'s {((amount < infractions.Count) ? $"last {amount} out of " : "")}{"infraction".ToQuantity(infractions.Count)}",
                             embed : infractions.GetEmbed(userRef, guild, amount: amount));
        }