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