Beispiel #1
0
        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);
        }
Beispiel #2
0
        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!");
        }
Beispiel #3
0
        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));
            }
        }
Beispiel #4
0
        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!");
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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`.");
            }
        }
Beispiel #7
0
        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!");
        }
Beispiel #8
0
        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>(),
                });
            }
        }