public async Task WarnAlreadySeasonAlreadyRequestedAsync(TvShow tvShow, TvSeason requestedSeason)
        {
            var messageContent = Language.Current.DiscordCommandTvRequestAlreadyExistSeason.ReplaceTokens(tvShow, requestedSeason.SeasonNumber);
            var buttonMessage  = Language.Current.DiscordCommandRequestedButton;

            if (requestedSeason is FutureTvSeasons)
            {
                if (tvShow.AllSeasonsAvailable())
                {
                    messageContent = Language.Current.DiscordCommandTvRequestAlreadyExistFutureSeasonAvailable;
                    buttonMessage  = Language.Current.DiscordCommandAvailableButton;
                }
                else if (tvShow.AllSeasonsFullyRequested())
                {
                    messageContent = Language.Current.DiscordCommandTvRequestAlreadyExistFutureSeasonRequested;
                }
                else
                {
                    messageContent = Language.Current.DiscordCommandTvRequestAlreadyExistFutureSeasonFound;
                }
            }

            var embed         = GenerateTvShowDetailsAsync(tvShow);
            var requestButton = new DiscordButtonComponent(ButtonStyle.Primary, $"TTT/{_interactionContext.User.Id}/{tvShow.TheTvDbId}/999", buttonMessage, true);
            var builder       = (await AddPreviousDropdownsAsync(tvShow, new DiscordWebhookBuilder().AddEmbed(embed))).WithContent(messageContent).AddComponents(requestButton);

            await _interactionContext.EditOriginalResponseAsync(builder);
        }
        public async Task AskForSeasonNotificationRequestAsync(TvShow tvShow, TvSeason selectedSeason)
        {
            var message = Language.Current.DiscordCommandTvNotificationRequestSeason.ReplaceTokens(tvShow, selectedSeason.SeasonNumber);

            if (selectedSeason is FutureTvSeasons)
            {
                if (tvShow.AllSeasonsAvailable())
                {
                    message = Language.Current.DiscordCommandTvNotificationRequestFutureSeasonAvailable;
                }
                else if (tvShow.AllSeasonsFullyRequested())
                {
                    message = Language.Current.DiscordCommandTvNotificationRequestFutureSeasonRequested;
                }
                else
                {
                    message = Language.Current.DiscordCommandTvNotificationRequestFutureSeasonMissing;
                }
            }

            var requestButton = new DiscordButtonComponent(ButtonStyle.Primary, $"TNR/{_interactionContext.User.Id}/{tvShow.TheTvDbId}/{selectedSeason.GetType().Name.First()}/{selectedSeason.SeasonNumber}", Language.Current.DiscordCommandNotifyMe, false, new DiscordComponentEmoji(DiscordEmoji.FromUnicode("🔔")));

            var embed   = GenerateTvShowDetailsAsync(tvShow);
            var builder = (await AddPreviousDropdownsAsync(tvShow, new DiscordWebhookBuilder().AddEmbed(embed))).AddComponents(requestButton).WithContent(message);

            await _interactionContext.EditOriginalResponseAsync(builder);
        }
        public async Task <bool> AskForSeasonNotificationRequestAsync(TvShow tvShow, TvSeason requestedSeason)
        {
            var message = $"Season {requestedSeason.SeasonNumber} has already been requested, you can click on the 🔔 reaction to be notified when it becomes available.";

            if (requestedSeason is FutureTvSeasons)
            {
                if (tvShow.AllSeasonsAvailable())
                {
                    message = $"All seasons are already available, you can click on the 🔔 reaction to be notified when future seasons becomes available.";
                }
                else if (tvShow.AllSeasonsAlreadyRequested())
                {
                    message = $"All seasons have been already requested, you can click on the 🔔 reaction to be notified when future seasons becomes available.";
                }
                else
                {
                    message = $"Future seasons have already been requested, you can click on the 🔔 reaction to be notified when future seasons becomes available.";
                }
            }

            await _lastCommandMessage?.AddReactionAsync(new Emoji("🔔"));

            await ReplyToUserAsync(message);

            var reaction = await WaitForReactionAsync(Context, _lastCommandMessage, new Emoji("🔔"));

            return(reaction != null);
        }
        public async Task WarnShowHasEndedAsync(TvShow tvShow)
        {
            var embed = GenerateTvShowDetailsAsync(tvShow);

            if (tvShow.AllSeasonsAvailable())
            {
                var requestButton = new DiscordButtonComponent(ButtonStyle.Primary, $"TTT/{_interactionContext.User.Id}/{tvShow.TheTvDbId}/999", Language.Current.DiscordCommandAvailableButton, true);
                var builder       = (await AddPreviousDropdownsAsync(tvShow, new DiscordWebhookBuilder().AddEmbed(embed))).WithContent(Language.Current.DiscordCommandTvRequestAlreadyAvailableSeries).AddComponents(requestButton);
                await _interactionContext.EditOriginalResponseAsync(builder);
            }
            else
            {
                var requestButton = new DiscordButtonComponent(ButtonStyle.Primary, $"TTT/{_interactionContext.User.Id}/{tvShow.TheTvDbId}/999", Language.Current.DiscordCommandRequestedButton, true);
                var builder       = (await AddPreviousDropdownsAsync(tvShow, new DiscordWebhookBuilder().AddEmbed(embed))).AddComponents(requestButton).WithContent(Language.Current.DiscordCommandTvRequestAlreadyExistSeries);
                await _interactionContext.EditOriginalResponseAsync(builder);
            }
        }
        private async Task <DiscordWebhookBuilder> AddPreviousDropdownsAsync(TvShow tvShow, DiscordWebhookBuilder builder)
        {
            var selectors = (await _interactionContext.GetOriginalResponseAsync()).Components.SelectMany(x => x.Components).OfType <DiscordSelectComponent>();

            DiscordSelectComponent previousTvSelector = selectors.FirstOrDefault(x => x.CustomId.StartsWith("TRS", true, null));

            if (previousTvSelector != null)
            {
                var tvSelector = new DiscordSelectComponent(previousTvSelector.CustomId, GetFormatedTvShowTitle(tvShow), previousTvSelector.Options);
                builder.AddComponents(tvSelector);
            }

            DiscordSelectComponent previousSeasonSelector = selectors.FirstOrDefault(x => x.CustomId.StartsWith("TSS", true, null));

            if (previousSeasonSelector != null)
            {
                if (!tvShow.AllSeasonsAvailable() && previousSeasonSelector != null && previousSeasonSelector.Options.Any(x => x.Value.Contains(tvShow.TheTvDbId.ToString(), StringComparison.OrdinalIgnoreCase)))
                {
                    if (!_interactionContext.Data.CustomId.StartsWith("TRS", true, null))
                    {
                        var newOptions = tvShow.Seasons.Select(x => new DiscordSelectComponentOption(GetFormattedSeasonName(tvShow, x), $"{tvShow.TheTvDbId.ToString()}/{x.SeasonNumber.ToString()}")).ToDictionary(x => x.Value, x => x);
                        var oldOptions = previousSeasonSelector.Options;

                        var currentOptions = oldOptions.Select(x => new DiscordSelectComponentOption(newOptions.ContainsKey(x.Value) ? newOptions[x.Value].Label : x.Label, x.Value)).ToList();

                        string defaultSelectedValue = currentOptions.First().Label;

                        try
                        {
                            defaultSelectedValue = _interactionContext.Data.Values.Any()
                           ? currentOptions.Single(x => x.Value == _interactionContext.Data.Values.Single()).Label
                           : currentOptions.Single(x => x.Value == string.Join("/", _interactionContext.Data.CustomId.Split("/").Skip(2))).Label;
                        }
                        catch { }

                        var seasonSelector = new DiscordSelectComponent(previousSeasonSelector.CustomId, defaultSelectedValue, currentOptions);
                        builder.AddComponents(seasonSelector);
                    }
                }
            }

            return(builder);
        }
        public Task WarnAlreadyNotifiedForSeasonsAsync(TvShow tvShow, TvSeason requestedSeason)
        {
            if (requestedSeason is FutureTvSeasons)
            {
                if (tvShow.AllSeasonsAvailable())
                {
                    return(ReplyToUserAsync($"All seasons are available and you will be notified when new seasons become available."));
                }
                else if (tvShow.AllSeasonsAlreadyRequested())
                {
                    return(ReplyToUserAsync($"All seasons have already been requested and you will be notified when new seasons become available."));
                }
                else
                {
                    return(ReplyToUserAsync($"Future seasons have already been requested and you will be notified when they becomes available."));
                }
            }

            return(ReplyToUserAsync($"Season {requestedSeason.SeasonNumber} has already been requested and you will be notified when it becomes available."));
        }
 public Task WarnShowHasEnded(TvShow tvShow)
 {
     return(ReplyToUserAsync($"This show has ended, and all seasons {(tvShow.AllSeasonsAvailable() ? "are available" : "have been requested")}."));
 }