/src/Sidekick.Business/Apis/Poe/Parser/Patterns/ParserPatterns.cs

https://github.com/domialex/Sidekick · C# · 205 lines · 167 code · 37 blank · 1 comment · 13 complexity · a2dc44ecf20cc875afdfda1ab693f979 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text.RegularExpressions;
  5. using System.Threading.Tasks;
  6. using Microsoft.EntityFrameworkCore.Internal;
  7. using Sidekick.Business.Apis.Poe.Models;
  8. using Sidekick.Business.Languages;
  9. using Sidekick.Core.Initialization;
  10. namespace Sidekick.Business.Apis.Poe.Parser.Patterns
  11. {
  12. public class ParserPatterns : IOnAfterInit, IParserPatterns
  13. {
  14. private readonly ILanguageProvider languageProvider;
  15. public ParserPatterns(ILanguageProvider languageProvider)
  16. {
  17. this.languageProvider = languageProvider;
  18. }
  19. public Task OnAfterInit()
  20. {
  21. InitHeader();
  22. InitProperties();
  23. InitSockets();
  24. InitInfluences();
  25. return Task.CompletedTask;
  26. }
  27. #region Header (Rarity, Name, Type)
  28. public Dictionary<Rarity, Regex> Rarity { get; private set; }
  29. public Regex ItemLevel { get; private set; }
  30. public Regex Unidentified { get; private set; }
  31. public Regex Corrupted { get; private set; }
  32. private void InitHeader()
  33. {
  34. Rarity = new Dictionary<Rarity, Regex>
  35. {
  36. { Models.Rarity.Normal, languageProvider.Language.RarityNormal.EndOfLineRegex() },
  37. { Models.Rarity.Magic, languageProvider.Language.RarityMagic.EndOfLineRegex() },
  38. { Models.Rarity.Rare, languageProvider.Language.RarityRare.EndOfLineRegex() },
  39. { Models.Rarity.Unique, languageProvider.Language.RarityUnique.EndOfLineRegex() },
  40. { Models.Rarity.Currency, languageProvider.Language.RarityCurrency.EndOfLineRegex() },
  41. { Models.Rarity.Gem, languageProvider.Language.RarityGem.EndOfLineRegex() },
  42. { Models.Rarity.DivinationCard, languageProvider.Language.RarityDivinationCard.EndOfLineRegex() }
  43. };
  44. ItemLevel = languageProvider.Language.DescriptionItemLevel.IntFromLineRegex();
  45. Unidentified = languageProvider.Language.DescriptionUnidentified.ToRegex(prefix: "[\\r\\n]");
  46. Corrupted = languageProvider.Language.DescriptionCorrupted.ToRegex(prefix: "[\\r\\n]");
  47. }
  48. #endregion Header (Rarity, Name, Type)
  49. #region Properties (Armour, Evasion, Energy Shield, Quality, Level)
  50. public Regex Armor { get; private set; }
  51. public Regex EnergyShield { get; private set; }
  52. public Regex Evasion { get; private set; }
  53. public Regex ChanceToBlock { get; private set; }
  54. public Regex Quality { get; private set; }
  55. public Regex AlternateQuality { get; private set; }
  56. public Regex Level { get; private set; }
  57. public Regex MapTier { get; private set; }
  58. public Regex ItemQuantity { get; private set; }
  59. public Regex ItemRarity { get; private set; }
  60. public Regex MonsterPackSize { get; private set; }
  61. public Regex AttacksPerSecond { get; private set; }
  62. public Regex CriticalStrikeChance { get; private set; }
  63. public Regex ElementalDamage { get; private set; }
  64. public Regex PhysicalDamage { get; private set; }
  65. public Regex Blighted { get; private set; }
  66. private void InitProperties()
  67. {
  68. Armor = languageProvider.Language.DescriptionArmour.ToRegex(prefix: "(?:^|[\\r\\n])", suffix: "[^\\r\\n\\d]*(\\d+)");
  69. EnergyShield = languageProvider.Language.DescriptionEnergyShield.IntFromLineRegex();
  70. Evasion = languageProvider.Language.DescriptionEvasion.IntFromLineRegex();
  71. ChanceToBlock = languageProvider.Language.DescriptionChanceToBlock.IntFromLineRegex();
  72. Level = languageProvider.Language.DescriptionLevel.IntFromLineRegex();
  73. AttacksPerSecond = languageProvider.Language.DescriptionAttacksPerSecond.DecimalFromLineRegex();
  74. CriticalStrikeChance = languageProvider.Language.DescriptionCriticalStrikeChance.DecimalFromLineRegex();
  75. ElementalDamage = languageProvider.Language.DescriptionElementalDamage.LineRegex();
  76. PhysicalDamage = languageProvider.Language.DescriptionPhysicalDamage.LineRegex();
  77. Quality = languageProvider.Language.DescriptionQuality.IntFromLineRegex();
  78. AlternateQuality = languageProvider.Language.DescriptionAlternateQuality.ToRegex();
  79. MapTier = languageProvider.Language.DescriptionMapTier.IntFromLineRegex();
  80. ItemQuantity = languageProvider.Language.DescriptionItemQuantity.IntFromLineRegex();
  81. ItemRarity = languageProvider.Language.DescriptionItemRarity.IntFromLineRegex();
  82. MonsterPackSize = languageProvider.Language.DescriptionMonsterPackSize.IntFromLineRegex();
  83. Blighted = languageProvider.Language.PrefixBlighted.ToRegex("[\\ \\r\\n]", "[\\ \\r\\n]");
  84. }
  85. #endregion Properties (Armour, Evasion, Energy Shield, Quality, Level)
  86. #region Sockets
  87. public Regex Socket { get; private set; }
  88. private void InitSockets()
  89. {
  90. // We need 6 capturing groups as it is possible for a 6 socket unlinked item to exist
  91. Socket = languageProvider.Language.DescriptionSockets.ToRegex(suffix: "[^\\r\\n]*?([-RGBWA]+)\\ ?([-RGBWA]*)\\ ?([-RGBWA]*)\\ ?([-RGBWA]*)\\ ?([-RGBWA]*)\\ ?([-RGBWA]*)");
  92. }
  93. #endregion Sockets
  94. #region Influences
  95. public Regex Crusader { get; private set; }
  96. public Regex Elder { get; private set; }
  97. public Regex Hunter { get; private set; }
  98. public Regex Redeemer { get; private set; }
  99. public Regex Shaper { get; private set; }
  100. public Regex Warlord { get; private set; }
  101. private void InitInfluences()
  102. {
  103. Crusader = languageProvider.Language.InfluenceCrusader.ToRegex(prefix: "[\\r\\n]+");
  104. Elder = languageProvider.Language.InfluenceElder.ToRegex(prefix: "[\\r\\n]+");
  105. Hunter = languageProvider.Language.InfluenceHunter.ToRegex(prefix: "[\\r\\n]+");
  106. Redeemer = languageProvider.Language.InfluenceRedeemer.ToRegex(prefix: "[\\r\\n]+");
  107. Shaper = languageProvider.Language.InfluenceShaper.ToRegex(prefix: "[\\r\\n]+");
  108. Warlord = languageProvider.Language.InfluenceWarlord.ToRegex(prefix: "[\\r\\n]+");
  109. }
  110. #endregion Influences
  111. #region Helpers
  112. public int GetInt(Regex regex, string input)
  113. {
  114. if (regex != null)
  115. {
  116. var match = regex.Match(input);
  117. if (match.Success)
  118. {
  119. if (int.TryParse(match.Groups[1].Value, out var result))
  120. {
  121. return result;
  122. }
  123. }
  124. }
  125. return 0;
  126. }
  127. public double GetDouble(Regex regex, string input)
  128. {
  129. if (regex != null)
  130. {
  131. var match = regex.Match(input);
  132. if (match.Success)
  133. {
  134. if (double.TryParse(match.Groups[1].Value.Replace(",", "."), out var result))
  135. {
  136. return result;
  137. }
  138. }
  139. }
  140. return 0;
  141. }
  142. public double GetDps(Regex regex, string input, double attacksPerSecond)
  143. {
  144. if (regex != null)
  145. {
  146. var match = regex.Match(input);
  147. if (match.Success)
  148. {
  149. var matches = new Regex("(\\d+-\\d+)").Matches(match.Value);
  150. var dps = matches.Select(x => x.Value.Split("-"))
  151. .ToList()
  152. .Sum(split =>
  153. {
  154. if (double.TryParse(split[0], out var minValue)
  155. && double.TryParse(split[1], out var maxValue))
  156. {
  157. return (minValue + maxValue) / 2d;
  158. }
  159. return 0d;
  160. });
  161. return Math.Round(dps * attacksPerSecond, 2);
  162. }
  163. }
  164. return 0d;
  165. }
  166. #endregion Helpers
  167. }
  168. }