public void TrinitySeekerProg_ReturnsSelf() { var role = DelubrumProgressionRoles.Roles .First(kvp => kvp.Value == "Trinity Seeker Progression").Key; var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role) .ToList(); Assert.That(contingentRoles.Count == 1 && contingentRoles[0] == role); }
public async Task DRSUpgradeRoles([Remainder] string roleName) { var role = Context.Guild.Roles.FirstOrDefault(r => r.Name == roleName); if (role == null) { await ReplyAsync("No role by that name exists!"); return; } if (!DelubrumProgressionRoles.Roles.ContainsKey(role.Id)) { await ReplyAsync("Not a valid DRS role!"); return; } var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role.Id) .Select(cr => Context.Guild.GetRole(cr)) .ToList(); await Context.Guild.DownloadUsersAsync(); var applicableUsers = Context.Guild.Users .Where(u => u.HasRole(role)) .ToList(); var left = applicableUsers.Count; var pogRess = await ReplyAsync($"Downloaded full user list, upgrading {left} users..."); foreach (var user in applicableUsers) { foreach (var cr in contingentRoles) { if (!user.HasRole(cr)) { await user.AddRoleAsync(cr); } } left--; await pogRess.ModifyAsync(props => props.Content = $"Downloaded full user list, upgrading {left} users..."); } await pogRess.ModifyAsync(props => props.Content = "Roles updated!"); }
public void QueenProg_ReturnsAll() { var role = DelubrumProgressionRoles.Roles .First(kvp => kvp.Value == "The Queen Progression").Key; var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role) .ToList(); var contingentRolesExpected = DelubrumProgressionRoles.Roles .Where(kvp => kvp.Value != "The Queen Progression") .Where(kvp => kvp.Value != "debug delub role") .Select(kvp => kvp.Key) .ToList(); foreach (var cr in contingentRolesExpected) { Assert.IsTrue(contingentRoles.Contains(cr)); } }
public async Task RPrgDrs() { // Removes DRS prog roles from cleared people var queenProg = Context.Guild.Roles.FirstOrDefault(r => r.Name == "The Queen Progression"); var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(queenProg?.Id ?? 0) .Select(r => Context.Guild.GetRole(r)) .ToList(); var clearedRole = Context.Guild.GetRole(806362589134454805); var cleared = Context.Guild.Users .Where(u => u.HasRole(clearedRole)); foreach (var member in cleared) { await member.RemoveRolesAsync(contingentRoles); } await ReplyAsync("Done!"); }
public async Task SanCheckDRSUR([Remainder] string roleName) { var role = Context.Guild.Roles.FirstOrDefault(r => r.Name == roleName); if (role == null) { await ReplyAsync("No role by that name exists!"); return; } if (!DelubrumProgressionRoles.Roles.ContainsKey(role.Id)) { await ReplyAsync("Not a valid DRS role!"); return; } var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role.Id) .Select(cr => Context.Guild.GetRole(cr)) .Aggregate("", (s, socketRole) => s + socketRole.Name + "\n"); await ReplyAsync(contingentRoles); }
private async Task ReadLog(string logLink) { using var typing = Context.Channel.EnterTypingState(); var logMatch = FFLogsUtils.LogLinkToIdRegex.Match(logLink); if (!logMatch.Success) { await ReplyAsync("That doesn't look like a log link!"); return; } var logId = logMatch.Value; var req = FFLogsUtils.BuildLogRequest(logId); var res = (await FFLogsAPI.MakeGraphQLRequest <LogInfo>(req)).Content.Data.ReportInfo; if (res == null) { await ReplyAsync("That log is private; please make it unlisted or public."); return; } var encounters = res.Fights .Where(f => f.Kill != null && f.FriendlyPlayers != null); var originalUsers = res.MasterData.Actors .Where(a => a.Server != null) .ToList(); var members = Context.Guild.Users; var potentialUsers = originalUsers.ToDictionary(a => a.Id, a => a) .Select(kvp => new KeyValuePair <int, PotentialDbUser>(kvp.Key, new PotentialDbUser { Name = kvp.Value.Name, World = kvp.Value.Server, User = Db.Users.FirstOrDefault(u => string.Equals(u.Name, kvp.Value.Name, StringComparison.InvariantCultureIgnoreCase) && string.Equals(u.World, kvp.Value.Server, StringComparison.InvariantCultureIgnoreCase)), })) .Select(async kvp => { var(id, potentialUser) = kvp; await RegisterUser(members, potentialUser); return(new KeyValuePair <int, DiscordXIVUser>(id, potentialUser.User)); }) .ToList(); // We can't cleanly go from a KeyValuePair<int, Task<DiscordXIVUser>> // to a KeyValuePair<int, DiscordXIVUser>, so let's break it up into // multiple queries. var users = (await Task.WhenAll(potentialUsers)) .Where(kvp => kvp.Value != null) .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);; var missedUsers = new List <LogInfo.ReportDataWrapper.ReportData.Report.Master.Actor>(); var addedAny = false; foreach (var encounter in encounters) { var roleName = encounter.Name; if (roleName == "The Queen's Guard") { roleName = "Queen's Guard"; } roleName += " Progression"; var role = Context.Guild.Roles.FirstOrDefault(r => r.Name == roleName); if (role == null) { Log.Error("Role {RoleName} does not exist!", roleName); continue; } var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role.Id) .Select(r => Context.Guild.GetRole(r)) .ToList(); var killRole = Context.Guild.GetRole(DelubrumProgressionRoles.GetKillRole(role.Name)); foreach (var id in encounter.FriendlyPlayers) { if (!users.ContainsKey(id)) { var actor = originalUsers.Find(a => a.Id == id); if (actor != null) { missedUsers.Add(actor); } continue; } var user = Context.Guild.GetUser(users[id].DiscordId); if (user == null || user.HasRole(806362589134454805)) { continue; } if (killRole.Id == 806362589134454805 && encounter.Kill == true) { addedAny = true; // Remove all contingent roles (this is bodge and should be refactored) foreach (var progRole in contingentRoles) { Log.Information("Checking role {RoleName} on user {User}", progRole.Name, user); if (user.HasRole(progRole)) { await user.RemoveRoleAsync(progRole); Log.Information("Removed role {RoleName} from user {User}", progRole.Name, user); } } // Give everyone the clear role if they cleared DRS Log.Information("Checking role {RoleName} on user {User}", killRole.Name, user); if (!user.HasRole(killRole)) { await user.AddRoleAsync(killRole); Log.Information("Added role {RoleName} to {User}", killRole.Name, user); } } else { // Give all contingent roles as well as the clear role for the fight foreach (var progRole in contingentRoles) { Log.Information("Checking role {RoleName} on user {User}", progRole.Name, user); if (!user.HasRole(progRole)) { addedAny = true; await user.AddRoleAsync(progRole); Log.Information("Added role {RoleName} to user {User}", progRole.Name, user); } } if (encounter.Kill == true) { Log.Information("Checking role {RoleName} on user {User}", killRole.Name, user); if (!user.HasRole(killRole)) { addedAny = true; await user.AddRoleAsync(killRole); Log.Information("Added role {RoleName} to {User}", killRole.Name, user); } } } } } if (addedAny) { await ReplyAsync("Roles added!"); } else { await ReplyAsync("No roles to add."); } if (missedUsers.Any()) { await ReplyAsync($"Missed users: ```{missedUsers.Select(a => $"({a.Server}) {a.Name}").Distinct().Aggregate("", (agg, next) => agg + $"{next}\n") + "```"}\nThey may need to re-register with `~iam`."); } }
public async Task AddDelubrumProgRoleAsync([Remainder] string args) { var isFFLogs = FFLogsUtils.IsLogLink(args); Log.Information($"FFLogs link provided: {isFFLogs}"); if (isFFLogs) { await ReadLog(args); return; } var executor = Context.Guild.GetUser(Context.User.Id); if (!executor.HasRole(DelubrumProgressionRoles.Executor, Context) && !executor.HasRole(579916868035411968, Context) && // or Mentor !executor.GuildPermissions.KickMembers) // or can kick users { Log.Information("User does not have roler role."); var res = await ReplyAsync($"{Context.User.Mention}, you don't have the roler role!"); await Task.Delay(5000); await res.DeleteAsync(); return; } var words = args.Split(' '); var members = words .Where(w => w.StartsWith('<')) .Select(idStr => RegexSearches.NonNumbers.Replace(idStr, "")) .Select(ulong.Parse) .Select(id => Context.Guild.GetUser(id) ?? (IGuildUser)Context.Client.Rest.GetGuildUserAsync(Context.Guild.Id, id).GetAwaiter().GetResult()); var roleName = string.Join(' ', words.Where(w => !w.StartsWith('<'))); roleName = RegexSearches.UnicodeApostrophe.Replace(roleName, "'"); roleName = roleName.Trim(); var role = Context.Guild.Roles.FirstOrDefault(r => string.Equals(r.Name.ToLowerInvariant(), roleName.ToLowerInvariant(), StringComparison.InvariantCultureIgnoreCase)); if (role == null) { Log.Information("Role name invalid."); var res = await ReplyAsync($"{Context.User.Mention}, no role by that name exists! Make sure you spelled it correctly."); await Task.Delay(5000); await res.DeleteAsync(); return; } if (!DelubrumProgressionRoles.Roles.Keys.Contains(role.Id)) { Log.Information("Role key invalid."); return; } var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(role.Id) .Select(Context.Guild.GetRole) .ToList(); await Task.WhenAll(members .Select(m => { try { return(m.AddRolesAsync(contingentRoles.Where(r => !m.MemberHasRole(r, Context)))); } catch (Exception e) { Log.Error(e, "Failed to add roles to user {User}.", m.ToString()); return(Task.CompletedTask); } })); await ReplyAsync("Roles added!"); }
public async Task VerifyAsync(params string[] args) { if (Context.Guild != null && Context.Guild.Id == SpecialGuilds.CrystalExploratoryMissions) { const ulong welcome = 573350095903260673; const ulong botSpam = 551586630478331904; if (Context.Channel.Id == welcome || Context.Channel.Id != botSpam) { await Context.Message.DeleteAsync(); var reply = await ReplyAsync("That command is disabled in this channel."); await Task.Delay(10000); await reply.DeleteAsync(); return; } } var guild = Context.Guild ?? Context.User.MutualGuilds.First(g => Db.Guilds.Any(gc => gc.Id == g.Id)); Log.Information("Mututal guild ID: {GuildId}", guild.Id); var guildConfig = Db.Guilds.First(g => g.Id == guild.Id); var prefix = guildConfig.Prefix == ' ' ? Db.Config.Prefix : guildConfig.Prefix; var member = guild.GetUser(Context.User.Id); var arsenalMaster = guild.GetRole(ulong.Parse(guildConfig.Roles["Arsenal Master"])); var cleared = guild.GetRole(ulong.Parse(guildConfig.Roles["Cleared"])); var clearedCastrumLacusLitore = guild.GetRole(ulong.Parse(guildConfig.Roles["Cleared Castrum"])); var siegeLiege = guild.GetRole(ulong.Parse(guildConfig.Roles["Siege Liege"])); var clearedDRS = guild.GetRole(ulong.Parse(guildConfig.Roles["Cleared Delubrum Savage"])); var savageQueen = guild.GetRole(ulong.Parse(guildConfig.Roles["Savage Queen"])); if (member.Roles.Contains(arsenalMaster) && member.Roles.Contains(siegeLiege)) { await ReplyAsync(Properties.Resources.MemberAlreadyHasRoleError); return; } using var typing = Context.Channel.EnterTypingState(); var user = Db.Users.FirstOrDefault(u => u.DiscordId == Context.User.Id); if (args.Length == 0 && user == null) { await ReplyAsync($"Your Lodestone information doesn't seem to be stored. Please register it again with `{prefix}iam`."); return; } Character character; if (user == null) { character = await XIVAPI.GetCharacter(ulong.Parse(args[0])); } else { character = await XIVAPI.GetCharacter(ulong.Parse(user?.LodestoneId)); } var hasAchievement = false; var hasMount = false; var hasCastrumLLAchievement1 = false; var hasCastrumLLAchievement2 = false; var hasDRSAchievement1 = false; var hasDRSAchievement2 = false; if (!character.GetBio().Contains(Context.User.Id.ToString())) { await ReplyAsync(Properties.Resources.LodestoneDiscordIdNotFoundError); return; } if (character.GetAchievements().Any(achievement => achievement.ID == 2229)) // We're On Your Side III { Log.Information("Added role " + arsenalMaster.Name); await member.AddRoleAsync(arsenalMaster); await ReplyAsync(Properties.Resources.LodestoneBAAchievementSuccess); hasAchievement = true; } if (character.GetAchievements().Any(achievement => achievement.ID == 2680)) // Operation: Eagle's Nest I { Log.Information("Added role " + clearedCastrumLacusLitore.Name); await member.AddRoleAsync(clearedCastrumLacusLitore); await ReplyAsync(Properties.Resources.LodestoneCastrumLLAchievement1Success); // Make these format strings hasCastrumLLAchievement1 = true; } if (character.GetAchievements().Any(achievement => achievement.ID == 2682)) // Operation: Eagle's Nest III { Log.Information("Added role " + siegeLiege.Name); await member.AddRoleAsync(siegeLiege); await ReplyAsync(Properties.Resources.LodestoneCastrumLLAchievement2Success); hasCastrumLLAchievement2 = true; } if (character.GetAchievements().Any(achievement => achievement.ID == 2765)) // Operation: Savage Queen of Swords I { Log.Information("Added role " + clearedDRS.Name); await member.AddRoleAsync(clearedDRS); await ReplyAsync(Properties.Resources.LodestoneDRSSuccess1); var queenProg = member.Guild.Roles.FirstOrDefault(r => r.Name == "The Queen Progression"); var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(queenProg?.Id ?? 0); foreach (var crId in contingentRoles) { var cr = member.Guild.GetRole(crId); if (member.HasRole(cr)) { continue; } await member.AddRoleAsync(cr); Log.Information("Role {RoleName} added to {User}.", cr.Name, member.ToString()); } hasDRSAchievement1 = true; } if (character.GetAchievements().Any(achievement => achievement.ID == 2767)) // Operation: Savage Queen of Swords III { Log.Information("Added role " + savageQueen.Name); await member.AddRoleAsync(savageQueen); await ReplyAsync(Properties.Resources.LodestoneDRSSuccess2); var queenProg = member.Guild.Roles.FirstOrDefault(r => r.Name == "The Queen Progression"); var contingentRoles = DelubrumProgressionRoles.GetContingentRoles(queenProg?.Id ?? 0); foreach (var crId in contingentRoles) { var cr = member.Guild.GetRole(crId); if (member.HasRole(cr)) { continue; } await member.AddRoleAsync(cr); Log.Information("Role {RoleName} added to {User}.", cr.Name, member.ToString()); } hasDRSAchievement2 = true; } if (character.GetMiMo().Any(mimo => mimo.Name == "Demi-Ozma")) { Log.Information("Added role {Role} to {DiscordName}.", cleared.Name, Context.User.ToString()); await member.AddRoleAsync(cleared); await ReplyAsync(Properties.Resources.LodestoneBAMountSuccess); hasMount = true; } if (!hasAchievement && !hasMount && !hasCastrumLLAchievement1 && !hasCastrumLLAchievement2 && !hasDRSAchievement1 && !hasDRSAchievement2) { await ReplyAsync(Properties.Resources.LodestoneMountAchievementNotFoundError); } if (user == null) { await Db.AddUser(new DiscordXIVUser { DiscordId = Context.User.Id, LodestoneId = args[0], Avatar = character.XivapiResponse["Character"]["Avatar"].ToObject <string>(), Name = character.XivapiResponse["Character"]["Name"].ToObject <string>(), World = character.XivapiResponse["Character"]["Server"].ToObject <string>(), }); } }