public async Task Members(CommandContext ctx)
            {
                if (!await CheckLock.WaitAsync(0).ConfigureAwait(false))
                {
                    await ctx.Channel.SendMessageAsync("Another check is already in progress").ConfigureAwait(false);

                    return;
                }

                try
                {
                    await ctx.ReactWithAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);

                    var members = GetMembers(ctx.Client);
                    await using var compressedResult = Config.MemoryStreamManager.GetStream();
                    await using var memoryStream     = Config.MemoryStreamManager.GetStream();
                    await using var writer           = new StreamWriter(memoryStream, new UTF8Encoding(false), 4096, true);
                    foreach (var member in members)
                    {
                        await writer.WriteLineAsync($"{member.Username}\t{member.Nickname}\t{member.JoinedAt:O}\t{(string.Join(',', member.Roles.Select(r => r.Name)))}").ConfigureAwait(false);
                    }
                    await writer.FlushAsync().ConfigureAwait(false);

                    memoryStream.Seek(0, SeekOrigin.Begin);
                    if (memoryStream.Length <= Config.AttachmentSizeLimit)
                    {
                        await ctx.Channel.SendMessageAsync(new DiscordMessageBuilder().WithFile("names.txt", memoryStream)).ConfigureAwait(false);

                        return;
                    }

                    await using var gzip = new GZipStream(compressedResult, CompressionLevel.Optimal, true);
                    await memoryStream.CopyToAsync(gzip).ConfigureAwait(false);

                    await gzip.FlushAsync().ConfigureAwait(false);

                    compressedResult.Seek(0, SeekOrigin.Begin);
                    if (compressedResult.Length <= Config.AttachmentSizeLimit)
                    {
                        await ctx.Channel.SendMessageAsync(new DiscordMessageBuilder().WithFile("names.txt.gz", compressedResult)).ConfigureAwait(false);
                    }
                    else
                    {
                        await ctx.Channel.SendMessageAsync($"Dump is too large: {compressedResult.Length} bytes").ConfigureAwait(false);
                    }
                }
                catch (Exception e)
                {
                    Config.Log.Warn(e, "Failed to dump guild members");
                    await ctx.ReactWithAsync(Config.Reactions.Failure, "Failed to dump guild members").ConfigureAwait(false);
                }
                finally
                {
                    CheckLock.Release();
                    await ctx.RemoveReactionAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);
                }
            }
Exemple #2
0
            public async Task Zalgo(CommandContext ctx)
            {
                if (!await CheckLock.WaitAsync(0).ConfigureAwait(false))
                {
                    await ctx.RespondAsync("Another check is already in progress").ConfigureAwait(false);

                    return;
                }

                try
                {
                    await ctx.ReactWithAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);

                    var result       = new StringBuilder("List of users who do not meet Rule #7 requirements:").AppendLine();
                    var headerLength = result.Length;
                    var members      = GetMembers(ctx.Client);
                    foreach (var member in members)
                    {
                        if (UsernameZalgoMonitor.NeedsRename(member.DisplayName))
                        {
                            result.AppendLine($"{member.Mention} please change your nickname according to Rule #7");
                        }
                    }
                    if (result.Length == headerLength)
                    {
                        result.AppendLine("No naughty users 🎉");
                    }
                    await ctx.SendAutosplitMessageAsync(result, blockStart : "", blockEnd : "").ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    var msg = "Failed to check display names for zalgo for all guild members";
                    Config.Log.Warn(e, msg);
                    await ctx.ReactWithAsync(Config.Reactions.Failure, msg).ConfigureAwait(false);
                }
                finally
                {
                    CheckLock.Release();
                    await ctx.RemoveReactionAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);
                }
            }
            public async Task Zalgo(CommandContext ctx)
            {
                if (!await CheckLock.WaitAsync(0).ConfigureAwait(false))
                {
                    await ctx.Channel.SendMessageAsync("Another check is already in progress").ConfigureAwait(false);

                    return;
                }

                try
                {
                    await ctx.ReactWithAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);

                    var result       = new StringBuilder("List of users who do not meet Rule #7 requirements:").AppendLine();
                    var headerLength = result.Length;
                    var members      = GetMembers(ctx.Client);
                    foreach (var member in members)
                    {
                        try
                        {
                            var displayName = member.DisplayName;
                            if (!UsernameZalgoMonitor.NeedsRename(displayName))
                            {
                                continue;
                            }

                            var nickname = UsernameZalgoMonitor.StripZalgo(displayName, member.Username, member.Id).Sanitize();
                            try
                            {
                                await member.ModifyAsync(m => m.Nickname = nickname).ConfigureAwait(false);

                                result.AppendLine($"{member.Mention} have been automatically renamed from {displayName} to {nickname} according Rule #7");
                            }
                            catch (Exception e)
                            {
                                Config.Log.Warn(e, $"Failed to rename member {member.GetUsernameWithNickname()}");
                                result.AppendLine($"{member.Mention} please change your nickname according to Rule #7 (suggestion: {nickname})");
                            }
                        }
                        catch (Exception e)
                        {
                            Config.Log.Warn(e, $"Failed to audit username for {member.Id}");
                        }
                    }
                    if (result.Length == headerLength)
                    {
                        result.AppendLine("No naughty users 🎉");
                    }
                    await ctx.SendAutosplitMessageAsync(result, blockStart : "", blockEnd : "").ConfigureAwait(false);
                }
                catch (Exception e)
                {
                    var msg = "Failed to check display names for zalgo for all guild members";
                    Config.Log.Warn(e, msg);
                    await ctx.ReactWithAsync(Config.Reactions.Failure, msg).ConfigureAwait(false);
                }
                finally
                {
                    CheckLock.Release();
                    await ctx.RemoveReactionAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);
                }
            }