public DiscordEmbed Build(LaunchInfo launch, ulong?guildId, bool informAboutSubscription)
        {
            var embed = new DiscordEmbedBuilder
            {
                Title       = $"{launch.FlightNumber}. {launch.Name} ({launch.Rocket.Value.Name} {launch.Rocket.Value.Type})",
                Description = launch.Details.ShortenString(1024) ?? "*No description at this moment :(*",
                Color       = new DiscordColor(Constants.EmbedColor),
                Thumbnail   = new DiscordEmbedBuilder.EmbedThumbnail
                {
                    Url = launch.Links.Patch.Large ?? Constants.SpaceXLogoImage
                }
            };

            var launchDateTime = DateFormatter.GetDateStringWithPrecision(
                launch.DateUtc ?? DateTime.MinValue,
                launch.DatePrecision ?? DatePrecision.Year,
                true, true, true);

            embed.AddField(":clock4: Launch time (UTC)", launchDateTime, true);

            if (guildId != null)
            {
                var localLaunchDateTime = GetLocalLaunchDateTime(
                    guildId.Value,
                    launch.DateUtc ?? DateTime.MinValue,
                    launch.DatePrecision ?? DatePrecision.Year);

                var timeZoneName = _timeZoneService.GetTimeZoneForGuild(guildId.Value);

                if (timeZoneName != null)
                {
                    embed.AddField($":clock230: Launch time ({timeZoneName})", localLaunchDateTime);
                }
            }

            var googleMapsLink = $"[Map]({GoogleMapsLinkFormatter.GetGoogleMapsLink(launch.Launchpad.Value.Latitude ?? 0.0, launch.Launchpad.Value.Longitude ?? 0.0)})";

            embed.AddField(":stadium: Launchpad", $"{launch.Launchpad.Value.FullName} **[{googleMapsLink}]**");
            embed.AddField($":rocket: First stages ({1 + launch.Rocket.Value.Boosters})", GetCoresData(launch.Cores));
            embed.AddField($":package: Payloads ({launch.Payloads.Count})", GetPayloadsData(launch.Payloads));
            embed.AddField(":recycle: Reused parts", GetReusedPartsData(launch));

            var linksData = GetLinksData(launch);

            if (linksData.Length > 0)
            {
                embed.AddField(":newspaper: Links", linksData);
            }

            if (informAboutSubscription)
            {
                embed.AddField("\u200b", "*Click the reaction below to subscribe this flight and be notified on DM 10 minutes before the launch.*");
            }

            return(embed);
        }
        public DiscordEmbed Build(List <LaunchpadInfo> launchpads)
        {
            var embedBuilder = new DiscordEmbedBuilder
            {
                Title = "List of SpaceX launchpads",
                Color = new DiscordColor(Constants.EmbedColor)
            };

            var sortedLaunchpads = launchpads.OrderBy(p => p.FullName).ToList();
            var lastLaunchpad    = sortedLaunchpads.Last();

            foreach (var launchpad in sortedLaunchpads)
            {
                var responseBuilder = new StringBuilder();

                responseBuilder.Append($"**[[Map]({GoogleMapsLinkFormatter.GetGoogleMapsLink(launchpad.Latitude ?? 0, launchpad.Longitude ?? 0)})]** ");
                responseBuilder.Append(launchpad.Status);
                responseBuilder.Append("\r\n");

                if (launchpad != lastLaunchpad)
                {
                    responseBuilder.Append('\u200b');
                }

                var title = ":stadium: " + launchpad.FullName;
                switch (launchpad.Status)
                {
                case LaunchpadStatus.UnderConstruction:
                    title += " (under construction)";
                    break;

                case LaunchpadStatus.Retired:
                    title += " (retired)";
                    break;
                }

                embedBuilder.AddField(title, responseBuilder.ToString());
            }

            return(embedBuilder);
        }