Пример #1
0
        private async Task <Embed> GetResistanceRank(CommandMessage message, int?characterIndex = null)
        {
            User user = await UserService.GetUser(message.Author);

            User.Character?defaultCharacter = user.GetDefaultCharacter();
            if (defaultCharacter is null)
            {
                throw new UserException("No characters linked! Use `IAm` to link a character");
            }

            int index = 0;

            if (characterIndex != null)
            {
                defaultCharacter = null;
                foreach (User.Character character in user.Characters)
                {
                    index++;

                    if (index == characterIndex)
                    {
                        defaultCharacter = character;
                    }
                }

                if (defaultCharacter is null)
                {
                    throw new UserException("I couldn't find a character at index: " + characterIndex);
                }
            }

            CharacterInfo info = await this.GetCharacterInfo(defaultCharacter.FFXIVCharacterId);

            return(await info.GetResistanceRankEmbed());
        }
Пример #2
0
        private async Task <Embed> RecordCharacter(User user, CharacterInfo character)
        {
            EmbedBuilder embed = new EmbedBuilder();

            User.Character?userCharacter = user.GetCharacter(character.Id);

            if (userCharacter == null)
            {
                userCharacter = new User.Character
                {
                    FFXIVCharacterId = character.Id,
                    CharacterName    = character.Name,
                    ServerName       = character.Server,
                    IsVerified       = false,
                };
                user.Characters.Add(userCharacter);
                await UserService.SaveUser(user);
            }

            if (userCharacter.IsVerified)
            {
                userCharacter.CharacterName = character.Name;
                userCharacter.ServerName    = character.Server;
                await UserService.SaveUser(user);

                embed.Description = "Character linked!";
                return(embed.Build());
            }
            else
            {
                if (userCharacter.FFXIVCharacterVerification == null)
                {
                    userCharacter.FFXIVCharacterVerification = Guid.NewGuid().ToString();
                    await UserService.SaveUser(user);
                }

                if (character.Bio?.Contains(userCharacter.FFXIVCharacterVerification) == true)
                {
                    userCharacter.FFXIVCharacterId           = character.Id;
                    userCharacter.CharacterName              = character.Name;
                    userCharacter.ServerName                 = character.Server;
                    userCharacter.FFXIVCharacterVerification = null;
                    userCharacter.IsVerified                 = true;
                    await UserService.SaveUser(user);

                    embed.Description = "Character linked! (You can now remove the Verification Id from your Character Profile)";
                    return(embed.Build());
                }
                else
                {
                    embed.Description = "To verify character ownership, please place the following verification Id in your [lodestone profile](https://na.finalfantasyxiv.com/lodestone/my/setting/profile/): `" + userCharacter.FFXIVCharacterVerification + "`";
                    return(embed.Build());
                }
            }
        }
Пример #3
0
        public static void RemoveCharacter(this User self, string characterName, string?serverName = null)
        {
            User.Character?character = self.GetCharacter(characterName, serverName);

            if (character == null)
            {
                return;
            }

            self.Characters.Remove(character);
        }
Пример #4
0
        public static void RemoveCharacter(this User self, uint characterId)
        {
            User.Character?character = self.GetCharacter(characterId);

            if (character == null)
            {
                return;
            }

            self.Characters.Remove(character);
        }
Пример #5
0
        public async Task <string> IAm(CommandMessage message, string characterName, string serverName)
        {
            User user = await UserService.GetUser(message.Author);

            CharacterInfo character = await this.GetCharacterInfo(characterName, serverName);

            User.Character?userCharacter = user.GetCharacter(character.Id);

            if (userCharacter == null)
            {
                userCharacter = new User.Character();
                userCharacter.FFXIVCharacterId = character.Id;
                userCharacter.CharacterName    = character.Name;
                userCharacter.ServerName       = character.Server;
                userCharacter.IsVerified       = false;
                user.Characters.Add(userCharacter);
                await UserService.SaveUser(user);
            }

            if (userCharacter.IsVerified)
            {
                userCharacter.CharacterName = character.Name;
                userCharacter.ServerName    = character.Server;
                await UserService.SaveUser(user);

                return("Character linked!");
            }
            else
            {
                if (userCharacter.FFXIVCharacterVerification == null)
                {
                    userCharacter.FFXIVCharacterVerification = Guid.NewGuid().ToString();
                    await UserService.SaveUser(user);
                }

                if (character.Bio?.Contains(userCharacter.FFXIVCharacterVerification) == true)
                {
                    userCharacter.FFXIVCharacterId           = character.Id;
                    userCharacter.CharacterName              = character.Name;
                    userCharacter.ServerName                 = character.Server;
                    userCharacter.FFXIVCharacterVerification = null;
                    userCharacter.IsVerified                 = true;
                    await UserService.SaveUser(user);

                    return("Character linked! (You can now remove the Verification Id from your Character Profile)");
                }
                else
                {
                    return("To verify character ownership, please place the following verification Id in your lodestone character profile: `" + userCharacter.FFXIVCharacterVerification + "`");
                }
            }
        }
Пример #6
0
        private async Task <CharacterInfo> GetCharacterInfo(IGuildUser guildUser)
        {
            User user = await UserService.GetUser(guildUser);

            User.Character?character = user.GetDefaultCharacter();

            if (character is null)
            {
                throw new UserException("No characters linked.");
            }

            return(await this.GetCharacterInfo(character.FFXIVCharacterId));
        }
Пример #7
0
        public async Task <Embed> ShowProfile(CommandMessage message)
        {
            EmbedBuilder embed = new EmbedBuilder();

            User user = await UserService.GetUser(message.Author);

            embed.Title        = message.Author.GetName();
            embed.ThumbnailUrl = message.Author.GetAvatarUrl();
            embed.Color        = Color.Teal;

            // Default character
            User.Character?defaultCharacter = user.GetDefaultCharacter();
            if (defaultCharacter != null && !string.IsNullOrWhiteSpace(defaultCharacter.CharacterName))
            {
                // Character
                EmbedFieldBuilder character = new EmbedFieldBuilder()
                                              .WithName("Default Character")
                                              .WithValue("**" + defaultCharacter.CharacterName + "**");
                embed.AddField(character);
            }

            // Nuts
            EmbedFieldBuilder nuts = new EmbedFieldBuilder()
                                     .WithName("Nuts")
                                     .WithValue("**" + user.TotalKupoNutsCurrent + "** (Total Held: " + user.TotalKupoNutsReceived + ")");

            embed.AddField(nuts);

            // Level
            EmbedFieldBuilder level = new EmbedFieldBuilder()
                                      .WithName("Level")
                                      .WithValue("**" + user.Level + "** (Total XP: " + user.TotalXPCurrent + ")");

            embed.AddField(level);

            // Rep
            EmbedFieldBuilder rep = new EmbedFieldBuilder()
                                    .WithName("Reputation")
                                    .WithValue("**" + user.Reputation + "**");

            embed.AddField(rep);

            // Joined At
            EmbedFieldBuilder joined = new EmbedFieldBuilder()
                                       .WithName("Joined")
                                       .WithValue(message.Author.JoinedAt?.ToString("dd MMM yy") + " (" + (DateTime.Now.Date - (message.Author?.JoinedAt?.Date ?? DateTime.Now.Date)).TotalDays + " days ago)");

            embed.AddField(joined);

            return(embed.Build());
        }
Пример #8
0
        public static void SetDefaultCharacter(this User self, string characterName, string?serverName = null)
        {
            foreach (User.Character otherCharacter in self.Characters)
            {
                otherCharacter.IsDefault = false;
            }

            User.Character?character = self.GetCharacter(characterName, serverName);

            if (character is null)
            {
                throw new Exception("I couldn't find that character, Have you linked them with `IAm`?");
            }

            character.IsDefault = true;
        }
Пример #9
0
        public async Task PostWhoIsResponse(CommandMessage message, User user, int?characterIndex = null)
        {
            // Special case to just load Kupo Nuts' portrait from disk.
            if (user.DiscordUserId == Program.DiscordClient.CurrentUser.Id)
            {
                await message.Channel.SendMessageAsync("Thats me!");

                await message.Channel.SendFileAsync(PathUtils.Current + "/Assets/self.png");

                return;
            }

            User.Character?defaultCharacter = user.GetDefaultCharacter();
            if (defaultCharacter is null)
            {
                throw new UserException("No characters linked! Use `IAm` to link a character");
            }

            if (characterIndex != null)
            {
                try
                {
                    defaultCharacter = user.Characters[characterIndex.Value - 1];
                }
                catch
                {
                    throw new UserException("I couldn't find a character at index: " + characterIndex);
                }
            }

            // Default character
            CharacterInfo defaultCharacterInfo = await this.GetCharacterInfo(defaultCharacter.FFXIVCharacterId);

            string file = await CharacterCard.Draw(defaultCharacterInfo);

            await message.Channel.SendFileAsync(file, messageReference : message.MessageReference);

            // Get current Verification status
            bool oldIsVerified = defaultCharacter.IsVerified;

            if (!defaultCharacter.CheckVerification(defaultCharacterInfo))
            {
                EmbedBuilder builder = new EmbedBuilder
                {
                    Description = "This character has not been verified.",
                    Color       = Discord.Color.Gold,
                };

                // If this is the requesting users character, give instructions on how to verify
                if (message.Author.Id == user.DiscordUserId)
                {
                    builder.Title       = "This character has not been verified";
                    builder.Description = "To verify this character, enter the following verification code in your [lodestone profile](https://na.finalfantasyxiv.com/lodestone/my/setting/profile/): " + defaultCharacter.FFXIVCharacterVerification;
                }

                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }

            if (!defaultCharacterInfo.HasMinions && !defaultCharacterInfo.HasMounts && !defaultCharacterInfo.HasAchievements)
            {
                EmbedBuilder builder = new EmbedBuilder
                {
                    Description = "To show Minions, Mounts, and Achievements, please link your character at [FFXIV Collect](https://ffxivcollect.com/)",
                };
                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }

            // While building the AKA, we can confirm if a name/server change has occured
            // for queried character and update DB
            // Initial value used to see if verification has been updated
            bool hasChanges = oldIsVerified != defaultCharacter.IsVerified;

            // AKA
            StringBuilder akaDescBuilder = new StringBuilder();
            int           index          = 0;

            foreach (User.Character character in user.Characters)
            {
                // For the queried character, check if the name/server has changed and update
                if (character.FFXIVCharacterId == defaultCharacterInfo.Id &&
                    ((!string.IsNullOrWhiteSpace(defaultCharacterInfo.Name) && character.CharacterName != defaultCharacterInfo.Name) ||
                     (!string.IsNullOrWhiteSpace(defaultCharacterInfo.Server) && character.ServerName != defaultCharacterInfo.Server)))
                {
                    hasChanges = true;
                    character.CharacterName = defaultCharacterInfo.Name;
                    character.ServerName    = defaultCharacterInfo.Server;
                }

                index++;

                akaDescBuilder.Append(index);
                akaDescBuilder.Append(") ");
                akaDescBuilder.Append(character.CharacterName);
                akaDescBuilder.Append(" (");
                akaDescBuilder.Append(Emotes.Home.GetString());
                akaDescBuilder.Append(character.ServerName);
                akaDescBuilder.Append(")");

                if (!await character.IsVerified(user))
                {
                    akaDescBuilder.Append(" *(Not Verified)*");
                }

                akaDescBuilder.AppendLine();
            }

            // Character change detected, save user information
            if (hasChanges)
            {
                _ = UserService.SaveUser(user);
            }

            if (index > 1)
            {
                EmbedBuilder builder = new EmbedBuilder
                {
                    Description = akaDescBuilder.ToString(),
                    Title       = "Also known as:",
                };
                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }
        }
Пример #10
0
        public async Task PostWhoIsResponse(CommandMessage message, User user, int?characterIndex = null)
        {
            User.Character?defaultCharacter = user.GetDefaultCharacter();
            if (defaultCharacter is null)
            {
                throw new UserException("No characters linked! Use `IAm` to link a character");
            }

            int index = 0;

            if (characterIndex != null)
            {
                defaultCharacter = null;
                foreach (User.Character character in user.Characters)
                {
                    index++;

                    if (index == characterIndex)
                    {
                        defaultCharacter = character;
                    }
                }

                if (defaultCharacter is null)
                {
                    throw new UserException("I couldn't find a character at index: " + characterIndex);
                }
            }

            // Default character
            CharacterInfo defaultCharacterInfo = await this.GetCharacterInfo(defaultCharacter.FFXIVCharacterId);

            string file = await CharacterCard.Draw(defaultCharacterInfo);

            await message.Channel.SendFileAsync(file);

            if (!defaultCharacter.IsVerified(defaultCharacterInfo))
            {
                EmbedBuilder builder = new EmbedBuilder();
                builder.Description = "This character has not been verified.";
                builder.Color       = Discord.Color.Gold;

                // If this is the requesting users character, give instructions on how to verify
                if (message.Author.Id == user.DiscordUserId)
                {
                    builder.Title       = "This character has not been verified";
                    builder.Description = "To verify this character, enter the following verification code in your [lodestone profile](https://na.finalfantasyxiv.com/lodestone/my/setting/profile/).\n" + defaultCharacter.FFXIVCharacterVerification;
                }

                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }

            if (!defaultCharacterInfo.HasMinions && !defaultCharacterInfo.HasMounts && !defaultCharacterInfo.HasAchievements)
            {
                EmbedBuilder builder = new EmbedBuilder();
                builder.Description = "To show Minions, Mounts, and Achievements, please link your character at [FFXIV Collect](https://ffxivcollect.com/)";
                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }

            // AKA
            StringBuilder akaDescBuilder = new StringBuilder();

            index = 0;
            foreach (User.Character character in user.Characters)
            {
                index++;

                akaDescBuilder.Append(index);
                akaDescBuilder.Append(") ");
                akaDescBuilder.Append(character.CharacterName);
                akaDescBuilder.Append(" (");
                akaDescBuilder.Append(Emotes.Home.GetString());
                akaDescBuilder.Append(character.ServerName);
                akaDescBuilder.Append(")");

                if (!await character.IsVerified(user))
                {
                    akaDescBuilder.Append(" *(Not Verified)*");
                }

                akaDescBuilder.AppendLine();
            }

            if (index > 1)
            {
                EmbedBuilder builder = new EmbedBuilder();
                builder.Description = akaDescBuilder.ToString();
                builder.Title       = "Also known as:";
                await message.Channel.SendMessageAsync(null, false, builder.Build());
            }
        }