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);
        }
예제 #2
0
        public string Build(List <LaunchInfo> launches, CacheContentType contentType, int currentPage, string paginationFooter)
        {
            launches = launches.OrderBy(p => p.FlightNumber ?? 0).ToList();

            var launchesListBuilder = new StringBuilder();

            launchesListBuilder.Append($":rocket:  **{_listHeader[contentType]}**");
            launchesListBuilder.Append("\r\n");

            launchesListBuilder.Append("```");

            launchesListBuilder.Append("No. ".PadRight(MissionNumberLength));
            launchesListBuilder.Append("Mission name".PadRight(MissionNameLength));
            launchesListBuilder.Append("Launch time UTC".PadRight(LaunchDateLength));
            launchesListBuilder.Append("Launch site".PadRight(SiteNameLength));
            launchesListBuilder.Append("Landing".PadRight(LandingLength));
            launchesListBuilder.Append("\r\n");
            launchesListBuilder.Append(new string('-', TotalLength));
            launchesListBuilder.Append("\r\n");

            foreach (var launch in launches)
            {
                var launchDateTime = DateFormatter.GetDateStringWithPrecision(
                    launch.DateUtc ?? DateTime.MinValue,
                    launch.DatePrecision ?? DatePrecision.Year,
                    false, false, false);

                launchesListBuilder.Append($"{launch.FlightNumber ?? 0}.".PadRight(MissionNumberLength));
                launchesListBuilder.Append(launch.Name.ShortenString(MissionNameLength - 2).PadRight(MissionNameLength));
                launchesListBuilder.Append(launchDateTime.PadRight(LaunchDateLength));
                launchesListBuilder.Append((launch.Launchpad.Value.Name ?? "?").PadRight(SiteNameLength));

                if (launch.DatePrecision == DatePrecision.Hour && launch.DateUtc < DateTime.UtcNow)
                {
                    var landing = launch.Cores.Any(p => p.LandingType != null && p.LandingType != "Ocean");
                    launchesListBuilder.Append(landing.ConvertToYesNo(false).PadRight(LandingLength));
                    launchesListBuilder.Append("\r\n");
                }
                else
                {
                    launchesListBuilder.Append("?\r\n");
                }
            }

            launchesListBuilder.Append("\r\n");
            launchesListBuilder.Append("Type \"e!GetLaunch number\" (e.g. e!GetLaunch 45) to get more information.");
            launchesListBuilder.Append("\r\n");
            launchesListBuilder.Append(paginationFooter);
            launchesListBuilder.Append("\r\n");
            launchesListBuilder.Append("```");

            return(launchesListBuilder.ToString());
        }
        private string GetLocalLaunchDateTime(ulong guildId, DateTime utc, DatePrecision precision)
        {
            var convertedToLocal = precision == DatePrecision.Hour
                ? _timeZoneService.ConvertUtcToLocalTime(guildId, utc)
                : utc;

            if (convertedToLocal == null)
            {
                return(null);
            }

            return(DateFormatter.GetDateStringWithPrecision(convertedToLocal.Value, precision, false, true, true));
        }
        public DiscordEmbed Build(LaunchNotification launchNotification)
        {
            var oldLaunchState = launchNotification.OldLaunchState;
            var launch         = launchNotification.NewLaunchState;

            var embed = new DiscordEmbedBuilder
            {
                Color     = new DiscordColor(Constants.EmbedColor),
                Thumbnail = new DiscordEmbedBuilder.EmbedThumbnail
                {
                    Url = launch.Links.Patch.Large ?? Constants.SpaceXLogoImage
                }
            };

            var launchTme = launch.DateUtc ?? DateTime.MinValue;
            var now       = DateTime.Now.ToUniversalTime();
            var timeLeft  = (launchTme - now).TotalMinutes;

            switch (launchNotification.Type)
            {
            case LaunchNotificationType.Reminder:
            {
                var timeLeftDescription = timeLeft > 60 ? Math.Ceiling(timeLeft / 60) + " hours" : Math.Ceiling(timeLeft) + " minutes";

                var descriptionBuilder = new StringBuilder();
                descriptionBuilder.Append($"**{timeLeftDescription}** to launch **{launch.Name}**! ");
                descriptionBuilder.Append($"Type `e!NextLaunch` to get more information.");

                embed.Title       = ":rocket: Launch is coming!";
                embed.Description = descriptionBuilder.ToString();
                break;
            }

            case LaunchNotificationType.Scrub:
            {
                var oldLaunchDate = DateFormatter.GetDateStringWithPrecision(
                    oldLaunchState.DateUtc ?? DateTime.MinValue,
                    oldLaunchState.DatePrecision ?? DatePrecision.Year,
                    true, true, true);

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

                var descriptionBuilder = new StringBuilder();
                descriptionBuilder.Append($"**{launch.Name}** launch time has been changed from ");
                descriptionBuilder.Append($"**{oldLaunchDate}** to ");
                descriptionBuilder.Append($"**{newLaunchDate}**. ");

                descriptionBuilder.Append($"Type `e!NextLaunch` to get more information.");

                embed.Title       = ":warning: Scrub!";
                embed.Description = descriptionBuilder.ToString();
                break;
            }

            case LaunchNotificationType.NewTarget:
            {
                var nextLaunchDate = DateFormatter.GetDateStringWithPrecision(
                    launchNotification.NewLaunchState.DateUtc ?? DateTime.MinValue,
                    launchNotification.NewLaunchState.DatePrecision ?? DatePrecision.Year,
                    true, true, true);

                var descriptionBuilder = new StringBuilder();
                descriptionBuilder.Append($"The next launch will be **{launchNotification.NewLaunchState.Name}** on **{nextLaunchDate}**. ");
                descriptionBuilder.Append($"Type `e!NextLaunch` to get more information.");

                embed.Title       = ":rocket: New target!";
                embed.Description = descriptionBuilder.ToString();
                break;
            }
            }

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