Exemplo n.º 1
0
        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());
            }
        }
Exemplo n.º 2
0
        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();
        }
Exemplo n.º 3
0
        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.");
        }
Exemplo n.º 4
0
        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);
        }