Exemple #1
0
        public static async Task CleanBadgeRecords()
        {
            var db      = new NameBadgeContext();
            var timeNow = DateTime.UtcNow;

            foreach (var(id, guild) in _client.Guilds)
            {
                var badgeSelection = db.NameBadges.Where(x => x.GuildId == id);
                if (!badgeSelection.Any())
                {
                    continue;
                }

                var liveGuild = await _client.GetGuildAsync(id);

                foreach (var badge in badgeSelection)
                {
                    if (!liveGuild.Members.ContainsKey(badge.UserId))
                    {
                        await liveGuild.GetRole(badge.RoleId).DeleteAsync();
                    }
                }
            }

            // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
            foreach (var badge in db.NameBadges.Select(x => x).ToList())
            {
                if ((timeNow - badge.LastInteraction).Days > 2)
                {
                    try
                    {
                        await(await _client.GetGuildAsync(badge.GuildId)).GetRole(badge.RoleId)
                        .ModifyAsync(hoist: false);
                        badge.IsHoisted = false;
                        await db.SaveChangesAsync();
                    }
                    catch (UnauthorizedException)
                    {
                        db.NameBadges.Remove(badge);
                        await db.SaveChangesAsync();
                    }
                }
            }

            var timeTarget = timeNow.AddDays(1).Date;

            _timer = new Timer((timeTarget - timeNow).Milliseconds)
            {
                AutoReset = false
            };
            _timer.Elapsed += DailyTimerOnElapsed;
            _timer.Enabled  = true;
        }
Exemple #2
0
        internal static async Task AddNameBadge(ulong guildId, ulong roleId, ulong userId, string color,
                                                string roleName)
        {
            var db = new NameBadgeContext();
            await db.NameBadges.AddAsync(new NameBadge
            {
                GuildId         = guildId,
                RoleId          = roleId,
                UserId          = userId,
                RoleColor       = color,
                RoleName        = roleName,
                IsHoisted       = true,
                LastInteraction = DateTime.UtcNow
            });

            await db.SaveChangesAsync();
        }
        public async Task Banish([NotNull] CommandContext ctx, DiscordUser user)
        {
            var db = new NameBadgeContext();

            if (!db.NameBadges.Any(x => x.GuildId == ctx.Guild.Id && x.UserId == user.Id))
            {
                await ctx.RespondAsync("I have not bestowed a name upon this ruffian!");

                return;
            }

            var userBadge   = db.NameBadges.Single(x => x.GuildId == ctx.Guild.Id && x.UserId == user.Id);
            var roleToClear = ctx.Guild.Roles.Any(x => x.Key == userBadge.RoleId)
                ? ctx.Guild.Roles.Single(x => x.Key == userBadge.RoleId).Value
                : null;

            if (roleToClear is { })
Exemple #4
0
        private static async Task ClientOnGuildMemberRemoved(DiscordClient sender, GuildMemberRemoveEventArgs e)
        {
            await Task.Yield();

            var db = new NameBadgeContext();

            if (!db.NameBadges.Any(x => x.UserId == e.Member.Id && x.GuildId == e.Guild.Id))
            {
                return;
            }

            var badgesToClear = db.NameBadges.Where(x => x.GuildId == e.Guild.Id && x.UserId == e.Member.Id).ToList();

            foreach (var badge in badgesToClear.Where(badge => e.Guild.Roles.Any(x => x.Key == badge.RoleId)))
            {
                await e.Guild.GetRole(badge.RoleId).DeleteAsync();

                db.NameBadges.Remove(badge);
            }

            await db.SaveChangesAsync();
        }
Exemple #5
0
        private static async Task MainAsync()
        {
            BuildConfiguration();

            CreateDiscordClient();

            BuildServiceProvider();

            ConfigureCommands();

            ConfigureInteractivity();

            _commands.RegisterCommands(Assembly.GetExecutingAssembly());

            await _discordClient.ConnectAsync(new DiscordActivity("your funny names", ActivityType.ListeningTo));

            await using var db = new NameBadgeContext();
            await db.Database.MigrateAsync();

            _service.GetRequiredService <NameBadgeService>();

            await Task.Delay(-1);
        }
Exemple #6
0
        private static async Task ClientOnMessageCreated(DiscordClient sender, MessageCreateEventArgs e)
        {
            await Task.Yield();

            var db = new NameBadgeContext();

            if (!db.NameBadges.Any(x => x.UserId == e.Author.Id && x.GuildId == e.Guild.Id))
            {
                return;
            }

            var badge = db.NameBadges.Single(x => x.UserId == e.Author.Id && x.GuildId == e.Guild.Id);

            if (!badge.IsHoisted)
            {
                await e.Guild.GetRole(badge.RoleId).ModifyAsync(hoist: true);

                badge.IsHoisted = true;
            }

            badge.LastInteraction = DateTime.UtcNow;

            await db.SaveChangesAsync();
        }
Exemple #7
0
        internal static async Task SetNameBadge([NotNull] CommandContext ctx, string roleName,
                                                DiscordColor color = default, bool admin = false,
                                                [CanBeNull] DiscordUser userOverride = null)
        {
            var filter = new ProfanityFilter();

            if (!admin && filter.IsProfanity(roleName))
            {
                await ctx.RespondAsync(
                    "Uh oh, you used a naughty word!\nIf you disagree then please go and contact an admin :3");

                return;
            }

            var         db         = new NameBadgeContext();
            var         targetUser = userOverride ?? ctx.User;
            NameBadge   userBadge  = null;
            DiscordRole userRole   = null;

            if (db.NameBadges.Any(x => x.UserId == targetUser.Id && x.GuildId == ctx.Guild.Id))
            {
                userBadge = db.NameBadges.Single(x => x.UserId == targetUser.Id && x.GuildId == ctx.Guild.Id);
                userRole  = ctx.Guild.Roles.Any(x => x.Key == userBadge.RoleId)
                    ? ctx.Guild.Roles.Single(x => x.Key == userBadge.RoleId).Value
                    : null;
            }

            userRole ??= await ctx.Guild.CreateRoleAsync();

            await userRole.ModifyAsync(roleName, color : color, hoist : true);

            await(await ctx.Guild.GetMemberAsync(targetUser.Id)).GrantRoleAsync(userRole);

            if (userBadge == null)
            {
                userBadge = new NameBadge
                {
                    GuildId         = ctx.Guild.Id,
                    RoleId          = userRole.Id,
                    UserId          = targetUser.Id,
                    RoleColor       = color.ToString(),
                    RoleName        = roleName,
                    IsHoisted       = true,
                    LastInteraction = DateTime.UtcNow
                };

                await db.NameBadges.AddAsync(userBadge);
            }
            else
            {
                userBadge.RoleName = roleName;
            }

            await db.SaveChangesAsync();

            if (userOverride != null)
            {
                await ctx.RespondAsync(
                    $"{userOverride.Mention}! I now name you, {userRole.Mention}. Go forth and spread the badgers word!");
            }
            else
            {
                await ctx.RespondAsync($"I now name thee, {userRole.Mention}. Go forth and spread the badgers word!");
            }
        }