private void ParseMod(List <Modifier> modifiers, ModifierPatternMetadata data, ModifierPattern pattern, string text) { var match = pattern.Pattern.Match(text); var modifier = new Modifier() { Index = match.Index, Id = data.Id, Text = pattern.Text, Category = !data.Id.StartsWith("explicit") ? data.Category : null, }; if (data.IsOption) { modifier.OptionValue = new ModifierOption() { Value = pattern.Value, }; } else if (pattern.Value.HasValue) { modifier.Values.Add(pattern.Value.Value); modifier.Text = ParseHashPattern.Replace(modifier.Text, match.Groups[1].Value, 1); } else if (match.Groups.Count > 1) { for (var index = 1; index < match.Groups.Count; index++) { if (double.TryParse(match.Groups[index].Value, NumberStyles.Any, CultureInfo.InvariantCulture, out var parsedValue)) { if (pattern.Negative) { parsedValue *= -1; } modifier.Values.Add(parsedValue); modifier.Text = ParseHashPattern.Replace(modifier.Text, match.Groups[index].Value, 1); } } modifier.Text = modifier.Text.Replace("+-", "-"); } modifiers.Add(modifier); }
public bool IsMatch(string id, string text) { ModifierPatternMetadata metadata = null; metadata = PseudoPatterns.FirstOrDefault(x => x.Id == id); if (metadata == null) { metadata = ImplicitPatterns.FirstOrDefault(x => x.Id == id); } if (metadata == null) { metadata = ExplicitPatterns.FirstOrDefault(x => x.Id == id); } if (metadata == null) { metadata = CraftedPatterns.FirstOrDefault(x => x.Id == id); } if (metadata == null) { metadata = EnchantPatterns.FirstOrDefault(x => x.Id == id); } if (metadata == null) { metadata = FracturedPatterns.FirstOrDefault(x => x.Id == id); } if (metadata == null) { return(false); } foreach (var pattern in metadata.Patterns) { if (pattern.Pattern != null && pattern.Pattern.IsMatch(text)) { return(true); } } return(false); }
public async Task Initialize() { await statTranslationProvider.Initialize(); var result = await cacheRepository.GetOrSet( "Sidekick.Infrastructure.PoeApi.Items.Modifiers.ModifierProvider.Initialize", () => poeTradeClient.Fetch <ApiCategory>("data/stats")); var categories = result.Result; PseudoPatterns = new List <ModifierPatternMetadata>(); ExplicitPatterns = new List <ModifierPatternMetadata>(); ImplicitPatterns = new List <ModifierPatternMetadata>(); EnchantPatterns = new List <ModifierPatternMetadata>(); CraftedPatterns = new List <ModifierPatternMetadata>(); VeiledPatterns = new List <ModifierPatternMetadata>(); FracturedPatterns = new List <ModifierPatternMetadata>(); foreach (var category in categories) { if (!category.Entries.Any()) { continue; } // The notes in parentheses are never translated by the game. // We should be fine hardcoding them this way. List <ModifierPatternMetadata> patterns; var categoryLabel = category.Entries[0].Id.Split('.').First(); switch (categoryLabel) { default: continue; case "pseudo": patterns = PseudoPatterns; break; case "delve": case "monster": case "explicit": patterns = ExplicitPatterns; break; case "implicit": patterns = ImplicitPatterns; break; case "enchant": patterns = EnchantPatterns; break; case "crafted": patterns = CraftedPatterns; break; case "veiled": patterns = VeiledPatterns; break; case "fractured": patterns = FracturedPatterns; break; } foreach (var entry in category.Entries) { var modifier = new ModifierPatternMetadata() { Category = categoryLabel, Id = entry.Id, IsOption = entry.Option?.Options?.Any() ?? false, }; if (modifier.IsOption) { for (var i = 0; i < entry.Option.Options.Count; i++) { modifier.Patterns.Add(new ModifierPattern() { Text = ComputeOptionText(entry.Text, entry.Option.Options[i].Text), LineCount = NewLinePattern.Matches(entry.Text).Count + NewLinePattern.Matches(entry.Option.Options[i].Text).Count + 1, Value = i + 1, Pattern = ComputePattern(categoryLabel, entry.Text, entry.Option.Options[i].Text), }); } } else { var stats = statTranslationProvider.GetAlternateModifiers(entry.Text); if (stats != null) { foreach (var stat in stats) { modifier.Patterns.Add(new ModifierPattern() { Text = stat.Text, LineCount = NewLinePattern.Matches(stat.Text).Count + 1, Pattern = ComputePattern(categoryLabel, stat.Text), Negative = stat.Negative, Value = stat.Value, }); } } else { modifier.Patterns.Add(new ModifierPattern() { Text = entry.Text, LineCount = NewLinePattern.Matches(entry.Text).Count + 1, Pattern = ComputePattern(categoryLabel, entry.Text), }); } } patterns.Add(modifier); } } }