private async Task <ExecuteResult> OpenCategory(string categoryName)
        {
            var getCategoryResult = this.Categories.Select(c => c.ToString()).BestLevenshteinMatch(categoryName, 0.75);

            if (!getCategoryResult.IsSuccess)
            {
                return(ExecuteResult.FromError(getCategoryResult));
            }

            if (!Enum.TryParse <KinkCategory>(getCategoryResult.Entity, true, out var category))
            {
                return(ExecuteResult.FromError(CommandError.ParseFailed, "Could not parse kink category."));
            }

            var getKinkResult = await this.Kinks.GetFirstKinkWithoutPreferenceInCategoryAsync(this.Database, this.Context.User, category);

            if (!getKinkResult.IsSuccess)
            {
                getKinkResult = await this.Kinks.GetFirstKinkInCategoryAsync(this.Database, category);
            }

            if (!getKinkResult.IsSuccess)
            {
                return(ExecuteResult.FromError(getKinkResult));
            }

            var kink = getKinkResult.Entity;

            this.CurrentFListKinkID = (int)kink.FListID;

            this.State = KinkWizardState.KinkPreference;

            return(ExecuteResult.FromSuccess());
        }
Esempio n. 2
0
        private async Task <ModifyEntityResult> OpenCategory(string categoryName)
        {
            var getCategoryResult = _categories.Select(c => c.ToString()).BestLevenshteinMatch(categoryName, 0.75);

            if (!getCategoryResult.IsSuccess)
            {
                return(ModifyEntityResult.FromError(getCategoryResult));
            }

            if (!Enum.TryParse <KinkCategory>(getCategoryResult.Entity, true, out var category))
            {
                return(ModifyEntityResult.FromError("Could not parse kink category."));
            }

            var getKinkResult = await _kinks.GetFirstKinkWithoutPreferenceInCategoryAsync(_targetUser, category);

            if (!getKinkResult.IsSuccess)
            {
                getKinkResult = await _kinks.GetFirstKinkInCategoryAsync(category);
            }

            if (!getKinkResult.IsSuccess)
            {
                return(ModifyEntityResult.FromError(getKinkResult));
            }

            var kink = getKinkResult.Entity;

            _currentFListKinkID = (int)kink.FListID;

            _state = KinkWizardState.KinkPreference;

            return(ModifyEntityResult.FromSuccess());
        }
Esempio n. 3
0
        private async Task ConsumePreferenceInteractionAsync(SocketReaction reaction)
        {
            var emote = reaction.Emote;

            if (emote.Equals(Back))
            {
                _state = KinkWizardState.CategorySelection;
                await UpdateAsync();

                return;
            }

            KinkPreference?preference = null;

            if (emote.Equals(Fave))
            {
                preference = KinkPreference.Favourite;
            }

            if (emote.Equals(Like))
            {
                preference = KinkPreference.Like;
            }

            if (emote.Equals(Maybe))
            {
                preference = KinkPreference.Maybe;
            }

            if (emote.Equals(Never))
            {
                preference = KinkPreference.No;
            }

            if (emote.Equals(NoPreference))
            {
                preference = KinkPreference.NoPreference;
            }

            if (!(preference is null))
            {
                await SetCurrentKinkPreference(preference.Value);

                var getNextKinkResult = await _kinks.GetNextKinkByCurrentFListIDAsync(_currentFListKinkID);

                if (!getNextKinkResult.IsSuccess)
                {
                    _currentFListKinkID = -1;
                    _state = KinkWizardState.CategorySelection;
                    await _feedback.SendConfirmationAndDeleteAsync(this.MessageContext, "All done in that category!");
                }
                else
                {
                    _currentFListKinkID = (int)getNextKinkResult.Entity.FListID;
                }

                await UpdateAsync();
            }
        }
        private async Task ConsumePreferenceInteractionAsync([NotNull] IEmote emote)
        {
            if (emote.Equals(Back))
            {
                this.State = KinkWizardState.CategorySelection;
                await UpdateVisibleMessage();

                return;
            }

            KinkPreference?preference = null;

            if (emote.Equals(Fave))
            {
                preference = KinkPreference.Favourite;
            }

            if (emote.Equals(Like))
            {
                preference = KinkPreference.Like;
            }

            if (emote.Equals(Maybe))
            {
                preference = KinkPreference.Maybe;
            }

            if (emote.Equals(Never))
            {
                preference = KinkPreference.No;
            }

            if (emote.Equals(NoPreference))
            {
                preference = KinkPreference.NoPreference;
            }

            if (!(preference is null))
            {
                await SetCurrentKinkPreference(preference.Value);

                var getNextKinkResult = await this.Kinks.GetNextKinkByCurrentFListIDAsync(this.Database, this.CurrentFListKinkID);

                if (!getNextKinkResult.IsSuccess)
                {
                    this.CurrentFListKinkID = -1;
                    this.State = KinkWizardState.CategorySelection;
                    await this.Feedback.SendConfirmationAndDeleteAsync(this.Context, this.Interactive, "All done in that category!");
                }
                else
                {
                    this.CurrentFListKinkID = (int)getNextKinkResult.Entity.FListID;
                }

                await UpdateVisibleMessage();
            }
        }
Esempio n. 5
0
        /// <inheritdoc />
        protected override async Task <IUserMessage> OnDisplayAsync(IMessageChannel channel)
        {
            if (!(this.Message is null))
            {
                throw new InvalidOperationException("The wizard is already active in a channel.");
            }

            _categories = (await _kinks.GetKinkCategoriesAsync()).ToList();
            _state      = KinkWizardState.CategorySelection;

            return(await channel.SendMessageAsync(string.Empty, embed : _loadingEmbed));
        }
Esempio n. 6
0
        /// <inheritdoc />
        public async Task <Embed> GetCurrentPageAsync()
        {
            switch (_state)
            {
            case KinkWizardState.CategorySelection:
            {
                var eb = _feedback.CreateEmbedBase();
                eb.WithTitle("Category selection");

                if (_categories.Any())
                {
                    eb.WithDescription("Select from one of the categories below.");
                    var categories = _categories.Skip(_currentCategoryOffset).Take(3).ToList();
                    foreach (var category in categories)
                    {
                        eb.AddField(category.ToString().Humanize().Transform(To.TitleCase), category.Humanize());
                    }

                    eb.WithFooter($"Categories {_currentCategoryOffset}-{_currentCategoryOffset + categories.Count} / {_categories.Count}");
                }
                else
                {
                    eb.WithDescription("There aren't any categories in the database.");
                }

                return(eb.Build());
            }

            case KinkWizardState.KinkPreference:
            {
                var getUserKinkResult = await _kinks.GetUserKinkByFListIDAsync(_targetUser, _currentFListKinkID);

                if (!getUserKinkResult.IsSuccess)
                {
                    await _feedback.SendErrorAndDeleteAsync(this.MessageContext, "Failed to get the user kink.", TimeSpan.FromSeconds(10));

                    _state = KinkWizardState.CategorySelection;

                    // Recursively calling at this point is safe, since we will get the emotes from the category page.
                    return(await GetCurrentPageAsync());
                }

                var userKink = getUserKinkResult.Entity;
                return(_kinks.BuildUserKinkInfoEmbedBase(userKink).Build());
            }

            default:
            {
                throw new ArgumentOutOfRangeException();
            }
            }
        }
Esempio n. 7
0
        /// <inheritdoc />
        protected override async Task <CreateEntityResult <IUserMessage> > OnDisplayAsync(IMessageChannel channel)
        {
            if (!(this.Message is null))
            {
                return(CreateEntityResult <IUserMessage> .FromError("The wizard is already active in a channel."));
            }

            _categories = (await _kinks.GetKinkCategoriesAsync()).ToList();
            _state      = KinkWizardState.CategorySelection;

            var message = await channel.SendMessageAsync(string.Empty, embed : _loadingEmbed);

            return(CreateEntityResult <IUserMessage> .FromSuccess(message));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="KinkWizard"/> class.
        /// </summary>
        /// <param name="database">A database context from the context pool.</param>
        /// <param name="context">The context.</param>
        /// <param name="feedback">The user feedback service.</param>
        /// <param name="kinkService">The kink service.</param>
        /// <param name="interactiveService">The interactive service.</param>
        public KinkWizard(GlobalInfoContext database, SocketCommandContext context, UserFeedbackService feedback, KinkService kinkService, InteractiveService interactiveService)
            : base(context, interactiveService)
        {
            this.Database = database;
            this.Feedback = feedback;
            this.Kinks    = kinkService;

            this.State = KinkWizardState.CategorySelection;

            var eb = new EmbedBuilder();

            eb.WithTitle("Kink Wizard");
            eb.WithDescription("Loading...");

            this.LoadingEmbed = eb.Build();
        }
        /// <inheritdoc />
        public override async Task <IUserMessage> DisplayAsync([NotNull] ISocketMessageChannel channel)
        {
            if (!(this.Message is null))
            {
                throw new InvalidOperationException("The wizard is already active in a channel.");
            }

            this.Categories = (await this.Kinks.GetKinkCategoriesAsync(this.Database)).ToList();

            this.State = KinkWizardState.CategorySelection;

            this.Message = await channel.SendMessageAsync(string.Empty, embed : this.LoadingEmbed).ConfigureAwait(false);

            this.ReactionCallback = new WizardCallback(this.Context, this);

            await UpdateVisibleMessage();

            return(this.Message);
        }
Esempio n. 10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="KinkWizard"/> class.
        /// </summary>
        /// <param name="feedback">The user feedback service.</param>
        /// <param name="kinkService">The kink service.</param>
        /// <param name="targetUser">The target user.</param>
        public KinkWizard
        (
            [NotNull] UserFeedbackService feedback,
            [NotNull] KinkService kinkService,
            [NotNull] IUser targetUser
        )
            : base(targetUser)
        {
            _feedback = feedback;
            _kinks    = kinkService;

            _targetUser = targetUser;

            _state = KinkWizardState.CategorySelection;

            var eb = new EmbedBuilder();

            eb.WithTitle("Kink Wizard");
            eb.WithDescription("Loading...");

            _loadingEmbed = eb.Build();
        }