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