public async Task Cleanup(CommandContext ctx, [Description("Discord user to clean up")] DiscordMember discordUser) { var name = discordUser.DisplayName; var newName = UsernameZalgoMonitor.StripZalgo(name, discordUser.Id); if (name == newName) { await ctx.RespondAsync("Failed to remove any extra symbols").ConfigureAwait(false); } else { try { await ctx.Client.UpdateCurrentUserAsync(username : newName).ConfigureAwait(false); await ctx.ReactWithAsync(Config.Reactions.Success, $"Renamed user to {newName}", true).ConfigureAwait(false); } catch (Exception e) { Config.Log.Warn($"Failed to rename user {discordUser.Username}#{discordUser.Discriminator}"); await ctx.ReactWithAsync(Config.Reactions.Failure, $"Failed to rename user to {newName}").ConfigureAwait(false); } } }
public async Task Cleanup(CommandContext ctx, [Description("Discord user to clean up")] DiscordMember discordUser) { var name = discordUser.DisplayName; var newName = UsernameZalgoMonitor.StripZalgo(name, discordUser.Id); if (name == newName) { await ctx.Channel.SendMessageAsync("Failed to remove any extra symbols").ConfigureAwait(false); } else { try { await discordUser.ModifyAsync(m => m.Nickname = new(newName)).ConfigureAwait(false); await ctx.ReactWithAsync(Config.Reactions.Success, $"Renamed user to {newName}", true).ConfigureAwait(false); } catch (Exception) { Config.Log.Warn($"Failed to rename user {discordUser.Username}#{discordUser.Discriminator}"); await ctx.ReactWithAsync(Config.Reactions.Failure, $"Failed to rename user to {newName}").ConfigureAwait(false); } } }
public void StripZalgoTest(string input, string expected) { var stripped = UsernameZalgoMonitor.StripZalgo(input, 0ul); Assert.That(stripped, Is.EqualTo(expected)); }
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); } }