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()); }
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)); }