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; }
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 { })
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(); }
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); }
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(); }
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!"); } }