コード例 #1
0
        public async Task ZalgoAuditTestAsync()
        {
            var samplePath = @"C:/Users/13xforever/Downloads/names.txt";
            var resultPath = Path.Combine(Path.GetDirectoryName(samplePath), "zalgo.txt");

            var names = await File.ReadAllLinesAsync(samplePath, Encoding.UTF8);

            await using var r = File.Open(resultPath, FileMode.Create, FileAccess.Write, FileShare.Read);
            await using var w = new StreamWriter(r, new UTF8Encoding(false));
            foreach (var line in names)
            {
                var user    = UserInfo.Parse(line);
                var isZalgo = UsernameZalgoMonitor.NeedsRename(user.DisplayName);
                if (isZalgo)
                {
                    await w.WriteLineAsync(user.DisplayName).ConfigureAwait(false);
                }
            }
        }
コード例 #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(1);
                    await ctx.RemoveReactionAsync(Config.Reactions.PleaseWait).ConfigureAwait(false);
                }
            }
コード例 #3
0
        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);
                }
            }
        }
コード例 #4
0
        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);
                }
            }
        }
コード例 #5
0
        public void StripZalgoTest(string input, string expected)
        {
            var stripped = UsernameZalgoMonitor.StripZalgo(input, 0ul);

            Assert.That(stripped, Is.EqualTo(expected));
        }
コード例 #6
0
 public async Task Generate(CommandContext ctx, [Description("Discord user to dump")] DiscordUser discordUser)
 {
     var newName = UsernameZalgoMonitor.GenerateRandomName(discordUser.Id);
     await ctx.Channel.SendMessageAsync(newName).ConfigureAwait(false);
 }
コード例 #7
0
 public void ZalgoDetectionTest(string name, bool isBad, string comment = null)
 {
     Assert.That(UsernameZalgoMonitor.NeedsRename(name), Is.EqualTo(isBad), comment);
 }
コード例 #8
0
            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);
                }
            }