Пример #1
0
        public async Task OracleRollCommand([Remainder] string Fullcommand = "")
        {
            ChannelSettings channelSettings = await ChannelSettings.GetChannelSettingsAsync(Context.Channel.Id);

            GameName game        = Utilities.GetGameContainedInString(Fullcommand);
            string   oracleTable = Utilities.RemoveGameNamesFromString(Fullcommand);

            if (game == GameName.None && channelSettings != null)
            {
                game = channelSettings.DefaultGame;
            }

            OracleRoller roller = new OracleRoller(Services, game);

            try
            {
                var msg = await ReplyAsync("", false, roller.BuildRollResults(oracleTable).GetEmbedBuilder().Build());

                if (roller.RollResultList.Count == 1 && roller.RollResultList[0].ParentTable.Pair?.Length > 0)
                {
                    await msg.AddReactionAsync(new Emoji("\uD83E\uDDE6"));
                }
            }
            catch (ArgumentException ex)
            {
                Console.WriteLine($"{Context.User} triggered an ArgumentException: {ex.Message}");
                await ReplyAsync(ex.Message);
            }
        }
Пример #2
0
        private Embed AddRollToExisting(IUserMessage message)
        {
            var embed = message.Embeds.First().ToEmbedBuilder();

            if (!embed.Title.Contains(OracleResources.OracleResult))
            {
                throw new ArgumentException("Unknown message type");
            }

            OracleRoller existingRoller = OracleRoller.RebuildRoller(_oracleService, embed, Services);
            var          rollerCopy     = new List <OracleRoller.RollResult>(existingRoller.RollResultList); //Copy the list so we can safely add to it using foreach

            foreach (var rollResult in rollerCopy.Where(tbl => tbl.ParentTable.Pair?.Length > 0))
            {
                var pairedTable = _oracleService.OracleList.Find(tbl => tbl.Name == rollResult.ParentTable.Name);
                if (existingRoller.RollResultList.Any(tbl => tbl.ParentTable.Name == pairedTable.Pair))
                {
                    continue;
                }

                var roller = new OracleRoller(Services, existingRoller.Game).BuildRollResults(pairedTable.Pair);

                roller.RollResultList.ForEach(res => res.ShouldInline = true);
                rollResult.ShouldInline = true;

                int index = existingRoller.RollResultList.IndexOf(rollResult) + 1;
                existingRoller.RollResultList.InsertRange(index, roller.RollResultList);
            }

            return(existingRoller.GetEmbedBuilder().Build());
        }
Пример #3
0
        public void BuildRollResultsTest1()
        {
            var services = new ServiceCollection().AddSingleton <OracleService>().BuildServiceProvider();

            for (int i = 0; i < 100; i++)
            {
                var rand   = new Random(i);
                var roller = new OracleRoller(services, GameName.Starforged, rand).BuildRollResults("sso");
                Console.WriteLine(string.Join(", ", roller.RollResultList.Select(rr => rr.Result.Description)));
            }
        }
Пример #4
0
        public void BuildRollResultsTest2()
        {
            var services = new ServiceCollection().AddSingleton(new OracleService().Load()).BuildServiceProvider();

            var roller = new OracleRoller(services, GameName.Ironsworn);

            for (int i = 0; i < 100; i++)
            {
                roller.BuildRollResults("Site Name Format");
                Console.WriteLine(string.Join(", ", roller.RollResultList.Select(rr => rr.Result.Description)));
            }
        }
Пример #5
0
        /// <summary>
        /// Gets the result of a oracle roll, and any rolls that would result from it.
        /// </summary>
        /// <param name="services"></param>
        /// <param name="game"></param>
        /// <returns></returns>
        public static string GetOracleResult(this IOracleEntry oracle, IServiceProvider services, GameName game, Random rnd = null)
        {
            var roller = new OracleRoller(services, game, rnd);
            var tables = roller.ParseOracleTables(oracle.Description);

            if (tables.Count == 0)
            {
                return(oracle.Description);
            }

            roller.BuildRollResults(oracle.Description);

            var finalResults = roller.RollResultList.Select(ocl => ocl.Result.Description);

            return($"{oracle.Description}\n" + String.Join(" / ", finalResults));
        }
Пример #6
0
        //TODO move this to an extension method of IOracleEntry?
        /// <summary>
        /// Gets the result of a oracle roll, and any rolls that would result from it.
        /// </summary>
        /// <param name="services"></param>
        /// <param name="game"></param>
        /// <returns></returns>
        public string GetOracleResultPrompt(ServiceProvider services, GameName game, Random rnd = null)
        {
            var roller = new OracleRoller(services, game, rnd);
            var tables = roller.ParseOracleTables(Prompt);

            if (tables.Count == 0)
            {
                return(Prompt);
            }

            roller.BuildRollResults(Prompt);

            var finalResults = roller.RollResultList.Select(ocl => ocl.Result.Prompt);

            return($"{Prompt}\n" + String.Join(" / ", finalResults));
        }
Пример #7
0
        public DelveInfoBuilder WithName(string name)
        {
            NameInput = name;

            if (randomAliases.Any(alias => alias.Equals(NameInput, StringComparison.OrdinalIgnoreCase)) && Domains.Count > 0)
            {
                var roller = new OracleRoller(Oracles, GameName.Ironsworn);
                roller.BuildRollResults("Site Name Format");
                Name = roller.RollResultList.First().Result.Description;
                string place = roller.BuildRollResults($"Site Name Place {Domains.First().DelveSiteDomain}").RollResultList.First().Result.Description;
                Name = Name.Replace("{Place}", place);
            }
            else
            {
                Name = name;
            }

            return(this);
        }
Пример #8
0
        public string RandomOracleResult(string TableName, IServiceProvider serviceProvider, GameName game = GameName.None, Random rand = null)
        {
            if (rand == null)
            {
                rand = BotRandom.Instance;
            }
            var row = RandomRow(TableName, game, rand);

            var tableData = OracleList.Single(ot => ot.Name == TableName && (ot.Game == game || game == GameName.None));

            game = tableData.Game ?? GameName.None;

            string lookup = row.Description;

            var match = Regex.Match(lookup, @"\[.*(\d+)x");

            if (match.Success && int.TryParse(match.Groups[1].Value, out int rolls))
            {
                List <string> ReplaceMultiRollTables = new List <string>();
                for (int i = 0; i < rolls; i++)
                {
                    ReplaceMultiRollTables.Add(tableData.Name);
                }
                lookup = lookup.Replace($"{match.Groups[1]}x", string.Join("/", ReplaceMultiRollTables));
            }

            var roller = new OracleRoller(serviceProvider, game, rand);
            var tables = roller.ParseOracleTables(lookup);

            if (tables.Count == 0)
            {
                return(row.Description);
            }
            roller.BuildRollResults(lookup);

            var finalResults = roller.RollResultList.Select(ocl => ocl.Result.Description);

            var spacer = (match.Success) ? " " : "\n";

            return($"{row.Description}{spacer}" + String.Join(" / ", finalResults));
        }
Пример #9
0
        public DelveInfo Build()
        {
            var delveInfo = new DelveInfo();

            delveInfo.SiteObjective = Objective;
            delveInfo.Description   = Objective;
            delveInfo.Rank          = Rank;
            delveInfo.Domains       = Domains;
            delveInfo.Themes        = Themes;

            //Just to be safe if things aren't added in the right order parse the name again
            if (randomAliases.Any(alias => alias.Equals(Name, StringComparison.OrdinalIgnoreCase)))
            {
                var roller = new OracleRoller(Oracles, GameName.Ironsworn);
                roller.BuildRollResults("Site Name Format");
                Name = roller.RollResultList.First().Result.Description;
                string place = roller.BuildRollResults($"Site Name Place {delveInfo.Domains.First().DelveSiteDomain}").RollResultList.First().Result.Description;
                Name = Name.Replace("{Place}", place);
            }
            delveInfo.SiteName = Name;

            return(delveInfo);
        }
Пример #10
0
        public static DelveInfo FromInput(DelveService delveService, OracleService oracles, string themeInput, string domainInput, string siteNameInput, string siteObjective, string siteRankInput)
        {
            var delveInfo     = new DelveInfo();
            var themeItems    = themeInput.Split(',');
            var domainItems   = domainInput.Split(',');
            var randomAliases = DelveResources.RandomAliases.Split(',').ToList();
            int randomThemes  = 0;
            int randomDomains = 0;

            delveInfo.SiteObjective = siteObjective;

            ChallengeRankHelper.TryParse(siteRankInput, out ChallengeRank cr);
            if (cr == ChallengeRank.None && int.TryParse(siteRankInput, out int rankNumber))
            {
                if (rankNumber == 1)
                {
                    cr = ChallengeRank.Troublesome;
                }
                if (rankNumber == 2)
                {
                    cr = ChallengeRank.Dangerous;
                }
                if (rankNumber == 3)
                {
                    cr = ChallengeRank.Formidable;
                }
                if (rankNumber == 4)
                {
                    cr = ChallengeRank.Extreme;
                }
                if (rankNumber == 5)
                {
                    cr = ChallengeRank.Epic;
                }
            }
            delveInfo.Rank = cr;

            for (int i = 0; i < themeItems.Length; i++)
            {
                themeItems[i] = themeItems[i].Trim();
                if (randomAliases.Any(alias => alias.Equals(themeItems[i], StringComparison.OrdinalIgnoreCase)))
                {
                    randomThemes++;
                    continue;
                }

                var matchingTheme = delveService.Themes.Find(t => t.DelveSiteTheme.Equals(themeItems[i], StringComparison.OrdinalIgnoreCase));
                if (matchingTheme != null)
                {
                    delveInfo.Themes.Add(matchingTheme);
                    continue;
                }

                if (int.TryParse(themeItems[i], out int themeValue) && themeValue - 1 < delveService.Themes.Count)
                {
                    delveInfo.Themes.Add(delveService.Themes[themeValue - 1]);
                    continue;
                }

                throw new ArgumentException(String.Format(DelveResources.UnknownThemeError, themeItems[i]));
            }

            for (int i = 0; i < domainItems.Length; i++)
            {
                domainItems[i] = domainItems[i].Trim();
                if (randomAliases.Any(alias => alias.Equals(domainItems[i], StringComparison.OrdinalIgnoreCase)))
                {
                    randomDomains++;
                    continue;
                }

                var matchingDomain = delveService.Domains.Find(d => d.DelveSiteDomain.Equals(domainItems[i], StringComparison.OrdinalIgnoreCase));
                if (matchingDomain != null)
                {
                    delveInfo.Domains.Add(matchingDomain);
                    continue;
                }

                if (int.TryParse(domainItems[i], out int domainValue) && domainValue - 1 < delveService.Domains.Count)
                {
                    delveInfo.Domains.Add(delveService.Domains[domainValue - 1]);
                    continue;
                }

                throw new ArgumentException(String.Format(DelveResources.UnknownDomainError, domainItems[i]));
            }

            for (int i = 0; i < randomThemes; i++)
            {
                delveInfo.AddRandomTheme(delveService);
            }
            for (int i = 0; i < randomDomains; i++)
            {
                delveInfo.AddRandomDomain(delveService);
            }

            if (randomAliases.Any(alias => alias.Equals(siteNameInput, StringComparison.OrdinalIgnoreCase)))
            {
                var roller = new OracleRoller(oracles, GameName.Ironsworn);
                roller.BuildRollResults("Site Name Format");
                siteNameInput = roller.RollResultList.First().Result.Description;
                string place = roller.BuildRollResults($"Site Name Place {delveInfo.Domains.First().DelveSiteDomain}").RollResultList.First().Result.Description;
                siteNameInput = siteNameInput.Replace("{Place}", place);
            }
            delveInfo.SiteName = siteNameInput;

            return(delveInfo);
        }