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()); }
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()); }
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(); } }
/// <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)); }
/// <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(); } } }
/// <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); }
/// <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(); }