private Page CreateOpDetailPage(OpDetail op, int index)
        {
            Elite e = op.Elites[index];
            DiscordEmbedBuilder embed = new DiscordEmbedBuilder()
                                        .WithTitle($"[{op.Rarity}★] {op.Name}")
                                        .AddField($"Level 1 → {e.MaxLevel}",
                                                  $"{Formatter.Bold("Health:")} {e.Hp} → {e.MaxHp}\n" +
                                                  $"{Formatter.Bold("Attack:")} {e.Atk} → {e.MaxAtk}\n" +
                                                  $"{Formatter.Bold("Defense:")} {e.Def} → {e.MaxDef}\n" +
                                                  $"{Formatter.Bold("Resistance:")} {e.MagicResistance}", true)
                                        .AddField("\u200b", $"{Formatter.Bold("Cost:")}{e.Cost}\n" +
                                                  $"{Formatter.Bold("Block:")} {e.BlockCnt}\n" +
                                                  $"{Formatter.Bold("Attack Time:")} 100\n" +
                                                  $"{Formatter.Bold("Respawn Time:")} {e.RespawnTime}\n", true)
                                        .AddField("Range", AttackRange.GetAttackRange(op.Elites[index].RangeId), true);
            string img = string.Empty;

            switch (index)
            {
            case 1:
            {
                if (op.OperatorCode.Equals("Amiya"))
                {
                    embed.WithThumbnail($"{s3.Url}avatars/{op.OperatorCode}_1+.png");
                }
                else
                {
                    embed.WithThumbnail($"{s3.Url}avatars/{op.OperatorCode}.png");
                }
                break;
            }

            case 2:
            {
                embed.WithThumbnail($"{s3.Url}avatars/{op.OperatorCode}_2.png");
                break;
            }
            }
            if (op.Talents != null && op.Talents.Count > 0)
            {
                string talent = string.Empty;
                foreach (Talent t in op.Talents)
                {
                    if (t.Phase == index)
                    {
                        talent += $"{Formatter.Bold(t.Name + ':')} {t.Description} (Lvl.1,Potential {t.RequirePotential})\n";
                    }
                }
                if (!string.IsNullOrEmpty(talent))
                {
                    talent = talent.Substring(0, talent.Count() - 1);
                    embed.AddField("Talents", talent);
                }
            }
            return(new Page {
                Embed = embed.Build()
            });
        }
        public async Task GetOperatorByName(CommandContext ctx,
                                            [Description("Operator's name")] string name)
        {
            try
            {
                OpDetail op = await operatorService.GetOperatorDetail(name);

                if (op is null)
                {
                    await ctx.RespondAsync("Operator not found.");

                    return;
                }
                var         itr   = ctx.Client.GetInteractivity();
                List <Page> pages = embedService.CreateOpDetailPages(op, ctx.Client);
                await itr.SendPaginatedMessageAsync(ctx.Channel, ctx.User, pages, timeoutoverride : TimeSpan.FromMinutes(5));
            }
            catch (Exception e)
            {
                await ctx.RespondAsync($"An error occurred:{e.Message}");
            }
        }
        public List <Page> CreateOpDetailPages(OpDetail op, DiscordClient client)
        {
            List <DiscordEmoji> emojis = new List <DiscordEmoji>
            {
                DiscordEmoji.FromGuildEmote(client, 840489819812921384),
                DiscordEmoji.FromGuildEmote(client, 840489819481440267),
                DiscordEmoji.FromGuildEmote(client, 840489819594555414),
                DiscordEmoji.FromGuildEmote(client, 840489820177563648),
                DiscordEmoji.FromGuildEmote(client, 840489820924543016)
            };
            int    i   = 0;
            string pot = "\u200b";

            if (op.Potentials != null && op.Potentials.Any())
            {
                foreach (var p in op.Potentials)
                {
                    pot += $"{emojis[i]} {p.Desc}\n";
                    i++;
                }
                pot = pot.Substring(0, pot.Length - 1);
            }
            Console.WriteLine($"{s3.Url}avatars/{op.OperatorCode}.png");
            List <Page>         pages = new List <Page>();
            DiscordEmbedBuilder embed = new DiscordEmbedBuilder()
                                        .WithTitle($"[{op.Rarity}★] {op.Name}")
                                        .WithDescription($"{op.ItemUsage}\n{op.ItemDesc}")
                                        .WithThumbnail($"{s3.Url}avatars/{op.OperatorCode}.png", 60, 60)
                                        .AddField("Detail", $"{Formatter.Bold("Affiliation:")} {TextUtil.ToTitleCase(op.Team)}\n" +
                                                  $"{Formatter.Bold("Obtain:")} {op.ItemObtainApproach}", true)
                                        .AddField("\u200b",
                                                  $"{Formatter.Bold("Tag:")} {op.TagList}\n" +
                                                  $"{Formatter.Bold("Position:")} {TextUtil.ToTitleCase(op.Position)}\n" +
                                                  $"{Formatter.Bold("Class:")} {TextUtil.ToTitleCase(op.Profession)}", true)
                                        .AddField("Range", AttackRange.GetAttackRange(op.Elites[0].RangeId), true)
                                        .AddField("Effect", op.Description)
                                        .AddField($"Level 1 → {op.Elites[0].MaxLevel}", $"{Formatter.Bold("Health:")} {op.Elites[0].Hp} → {op.Elites[0].MaxHp}\n" +
                                                  $"{Formatter.Bold("Attack:")} {op.Elites[0].Atk} → {op.Elites[0].MaxAtk}\n" +
                                                  $"{Formatter.Bold("Defense:")} {op.Elites[0].Def} → {op.Elites[0].MaxDef}\n" +
                                                  $"{Formatter.Bold("Resistance:")} {op.Elites[0].MagicResistance}\n" +
                                                  $"{Formatter.Bold("Cost:")} {op.Elites[0].Cost}\n" +
                                                  $"{Formatter.Bold("AttackTime:")} 100\n" +
                                                  $"{Formatter.Bold("Block:")} {op.Elites[0].BlockCnt}\n" +
                                                  $"{Formatter.Bold("RespawnTime:")} {op.Elites[0].RespawnTime}\n", true)
                                        .AddField("Potentials", pot, true);

            if (op.Talents != null && op.Talents.Count > 0)
            {
                string talent = string.Empty;
                foreach (Talent t in op.Talents)
                {
                    if (t.Phase == 0)
                    {
                        talent += $"{Formatter.Bold(t.Name + ':')} {t.Description} (Lv. 1,Potential {t.RequirePotential})\n";
                    }
                }
                if (!string.IsNullOrEmpty(talent))
                {
                    talent = talent.Substring(0, talent.Count() - 1);
                    embed.AddField("Talents", talent);
                }
            }
            pages.Add(new Page
            {
                Embed = embed.Build()
            });
            if (op.Elites.ElementAtOrDefault(1) != null)
            {
                pages.Add(CreateOpDetailPage(op, 1));
            }
            if (op.Elites.ElementAtOrDefault(2) != null)
            {
                pages.Add(CreateOpDetailPage(op, 2));
            }
            return(pages);
        }