public async Task OverviewAsync(CommandContext ctx) { using var context = new DiscordContext(); DiscordEmbedBuilder builder = new DiscordEmbedBuilder() { Title = "These are all of your settings" }; var settings = UserSetting.GetAllSettings(ctx.Message.Author.Id, context).ToDictionary(setting => (UserSetting.SettingID)setting.SettingId); var items = await WheelItemExtension.GetUserItemsAsync(ctx.Message.Author.Id, context); AnalLevel analLevel = AnalLevel.None; if (settings.ContainsKey(SettingID.AnalLevel)) { analLevel = settings[SettingID.AnalLevel].GetValue <AnalLevel>(); } UserSetting.WheelDifficultyPreference wheelDifficulty = UserSetting.WheelDifficultyPreference.Default; if (settings.ContainsKey(SettingID.WheelDifficulty)) { wheelDifficulty = settings[SettingID.WheelDifficulty].GetValue <UserSetting.WheelDifficultyPreference>(); } UserSetting.WheelTaskPreferenceSetting wheelTaskPreference = UserSetting.WheelTaskPreferenceSetting.Default; if (settings.ContainsKey(SettingID.WheelTaskPreference)) { wheelTaskPreference = settings[SettingID.WheelTaskPreference].GetValue <UserSetting.WheelTaskPreferenceSetting>(); } BondageLevel bondageLevel = BondageLevel.None; if (settings.ContainsKey(SettingID.BondageLevel)) { bondageLevel = settings[SettingID.BondageLevel].GetValue <BondageLevel>(); } CBTLevel cbtLevel = CBTLevel.None; if (settings.ContainsKey(SettingID.CBTLevel)) { cbtLevel = settings[SettingID.CBTLevel].GetValue <CBTLevel>(); } DungeonDifficulty dungeonDifficulty = DungeonDifficulty.Normal; if (settings.ContainsKey(SettingID.DungeonDifficulty)) { dungeonDifficulty = settings[SettingID.DungeonDifficulty].GetValue <DungeonDifficulty>(); } //PeeLevel peeLevel = PeeLevel.None; //if (settings.ContainsKey(SettingID.PeeLevel)) //{ // peeLevel = settings[SettingID.PeeLevel].GetValue<PeeLevel>(); //} SissyLevel sissyLevel = SissyLevel.None; if (settings.ContainsKey(SettingID.SissyLevel)) { sissyLevel = settings[SettingID.SissyLevel].GetValue <SissyLevel>(); } //DegrationLevel degrationLevel = DegrationLevel.None; //if (settings.ContainsKey(SettingID.DegrationLevel)) //{ // degrationLevel = settings[SettingID.DegrationLevel].GetValue<DegrationLevel>(); //} PublicLevel publicLevel = PublicLevel.None; if (settings.ContainsKey(SettingID.PublicLevel)) { publicLevel = settings[SettingID.PublicLevel].GetValue <PublicLevel>(); } Gender gender = Gender.None; if (settings.ContainsKey(SettingID.Gender)) { gender = settings[SettingID.Gender].GetValue <Gender>(); } foreach (SettingID possibleSetting in Enum.GetValues(typeof(SettingID))) { Enum setting = null; switch (possibleSetting) { case SettingID.AnalLevel: setting = analLevel; break; case SettingID.BanType: break; case SettingID.WheelDifficulty: setting = wheelDifficulty; break; case SettingID.WheelTaskPreference: setting = wheelTaskPreference; break; case SettingID.BondageLevel: setting = bondageLevel; break; case SettingID.Toys: break; case SettingID.CBTLevel: setting = cbtLevel; break; case SettingID.DungeonDifficulty: break; case SettingID.PeeLevel: break; case SettingID.SissyLevel: setting = sissyLevel; break; case SettingID.DegrationLevel: break; case SettingID.PublicLevel: setting = publicLevel; break; case SettingID.BanEnd: break; case SettingID.Gender: setting = gender; break; } if (setting == null) { continue; } var name = possibleSetting.ToFormattedText(); var value = $"{setting.ToFormattedText()} ({Convert.ToInt32(setting)})"; builder.AddField(name, value, true); } await ctx.RespondAsync(embed : builder.Build()); if (items.Any()) { builder = new DiscordEmbedBuilder() { Title = "Your Items" }; foreach (var item in items.OrderBy(it => it.ItemId)) { var cItem = (WheelItemExtension.Item)item.ItemId; builder.AddField(cItem.ToFormattedText(), item.ItemId.ToString()); } await ctx.RespondAsync(embed : builder.Build()); } }
private async Task PunishmentInternal(CommandContext ctx) { using var context = new DiscordContext(); var user = await UserExtension.GetUser(ctx.Message.Author.Id); var settings = UserSetting.GetAllSettings(Convert.ToInt64(ctx.User.Id), context).ToDictionary(setting => (UserSetting.SettingID)setting.SettingId); var items = await WheelItemExtension.GetUserItemsAsync(user.UserId, context); var punishmentModules = PunishmentModule.GetAll(settings, items.ToList()); var sumChances = punishmentModules.Sum(cModule => cModule.Chance); var chanceValue = Helpers.RandomGenerator.RandomInt(0, sumChances); int cChance = 0; PunishmentModule module = null; DiscordEmbed embed = null; foreach (var cModule in punishmentModules) { cChance += cModule.Chance; if (chanceValue < cChance) { module = cModule; break; } } if (module == null) { DiscordEmbedBuilder builder = new DiscordEmbedBuilder() { Title = "No suitable punishment found :(", Description = "Please set up your preferences with ``//settings setup``. You should at least enable cbt and set up some bondage gear." }; await ctx.RespondAsync(embed : builder.Build()); return; } await module.Generate(); embed = module.Embed; if (module.WheelLockTime != null && user.LockTime <= DateTime.Now) { user.LockTime += module.WheelLockTime; var builder = new DiscordEmbedBuilder(embed); builder.Description += " You are not allowed to re-roll until then."; embed = builder.Build(); } if (module.WheelLockTime != null && user.DenialTime <= DateTime.Now) { user.DenialTime += module.DenialTime; } await ctx.RespondAsync(embed : embed); await context.SaveChangesAsync(); }
public async Task SetupAsync(CommandContext ctx) { await ctx.RespondAsync("You got Mail! *AOL chime plays*"); using var context = new DiscordContext(); var dm = await ctx.Member.CreateDmChannelAsync(); var userId = Convert.ToInt64(ctx.User.Id); string userName = ctx.Message.Author.Username; string readableUserName = RemoveSpecialCharacters(userName); if (readableUserName.Length > 4) { userName = readableUserName; } await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync($"Hey there {userName}."); await Task.Delay(1000); bool isFirstChange = true; var settings = UserSetting.GetAllSettings(userId, context); if (settings == null || settings.Count() == 0) { // *** First time setup *** if (!await Introduction(dm, ctx)) { return; } await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync($"Splendid! Now that you know how this works, let's start with the Settings!"); if (!await new WheelDifficultyModule(context, dm, ctx, userId).Execute()) { return; } if (!await new WheelTaskPreferenceModule(context, dm, ctx, userId).Execute()) { return; } isFirstChange = false; } // *** User has come back to change settings *** bool exit = false; while (!exit) { await dm.SendMessageAsync($"What{(isFirstChange ? "" : " else")} would you like to change?"); isFirstChange = false; var m = await ctx.Client.GetInteractivity().WaitForMessageAsync( x => x.Channel.Id == dm.Id && x.Author.Id == ctx.Member.Id, TimeSpan.FromSeconds(240)); if (m.TimedOut) { // *** User didn't enter anything *** return; } var text = m.Result.Content; var modules = ReflectiveEnumerator.GetEnumerableOfType <SettingsModule>(context, dm, ctx, userId).OrderByDescending(module => module.GetScore(text)).ToList(); int suggestion = 0; bool isMatch = false; while (suggestion < 2 && !isMatch) { await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync($"Do you want to change your {modules[suggestion].FriendlyName} settings? (Y/N)"); var suggestionReply = await ctx.Client.GetInteractivity().WaitForMessageAsync( x => x.Channel.Id == dm.Id && x.Author.Id == ctx.Member.Id, TimeSpan.FromSeconds(240)); if (suggestionReply.TimedOut) { return; } if (Regex.Match(suggestionReply.Result.Content, YesRegex).Success) { isMatch = true; exit = !await modules[suggestion].Execute(); } else { suggestion++; } } if (suggestion >= 2) { DiscordEmbedBuilder builder = new DiscordEmbedBuilder() { Title = "These are your options" }; foreach (var module in modules) { builder.AddField(module.FriendlyName, "--------", false); } await dm.TriggerTypingAsync(); await Task.Delay(2000); await dm.SendMessageAsync(embed : builder.Build()); await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync("Would you like to change something else? (Y/N)"); var moreChangesResponse = await ctx.Client.GetInteractivity().WaitForMessageAsync( x => x.Channel.Id == dm.Id && x.Author.Id == ctx.Member.Id, TimeSpan.FromSeconds(240)); if (moreChangesResponse.TimedOut) { return; } if (Regex.Match(moreChangesResponse.Result.Content, YesRegex).Success) { exit = false; } else { exit = true; } suggestion = 0; } } await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync($"Alrighty! I'll try to remember that"); await Task.Delay(2000); await dm.TriggerTypingAsync(); await Task.Delay(500); await dm.SendMessageAsync($"..... I'll better write it down..."); await dm.TriggerTypingAsync(); try { await context.SaveChangesAsync(); } catch (Exception ex) { await dm.SendMessageAsync($"**Uhh... something seems to have gone badly wrong...{Environment.NewLine}" + $"If you see Salem around here somewhere, tell him the following:**"); await dm.TriggerTypingAsync(); await Task.Delay(5000); string msgToSend = $"```{ex.Message}```"; while (msgToSend.Length > 1999) { await dm.SendMessageAsync(msgToSend.Substring(0, 1999)); await dm.TriggerTypingAsync(); await Task.Delay(2000); msgToSend = msgToSend.Substring(1999); } await dm.SendMessageAsync(msgToSend); return; } await dm.SendMessageAsync($"Done!"); await dm.TriggerTypingAsync(); await Task.Delay(1000); await dm.SendMessageAsync($"Nice. You can now start using the Wheel with your brand new set of settings \\*-\\*{Environment.NewLine}" + $"These might get more over time. I will remind you to revisit them, when i feel fit."); }
private async Task <WheelOutcome> GetWheelOutcome(DiscordContext context, Users user, UserSetting.Outcome outcome) { WheelOutcome wheelOutcome = null; var userItems = await WheelItemExtension.GetUserItemsAsync(user.UserId, context); while (wheelOutcome == null) { try { wheelOutcomes = ReflectiveEnumerator.GetEnumerableOfType <WheelOutcome>(outcome, UserSetting.GetAllSettings(user.UserId, context).ToDictionary(setting => (UserSetting.SettingID)setting.SettingId), userItems, _services) .ToList(); } catch (Exception e) { Console.WriteLine(e); } foreach (var wheeloutcome in wheelOutcomes) { await wheeloutcome.BuildAsync(); } wheelOutcomes = wheelOutcomes.Where(e => !e.Outcome.HasFlag(UserSetting.Outcome.NotSet)).ToList(); if (wheelOutcomes.Count < 1) { continue; } // Choose an outcome by summing up the chance values of all possible outcomes and // then generating a random number inside those. var combinedChance = 0; foreach (WheelOutcome currentOutcome in wheelOutcomes) { combinedChance += currentOutcome.Chance; } var chance = 0; var minChance = Helpers.RandomGenerator.RandomInt(0, combinedChance); foreach (WheelOutcome currentOutcome in wheelOutcomes) { chance += currentOutcome.Chance; if (minChance < chance) { wheelOutcome = currentOutcome; break; } } } return(wheelOutcome); }