public bool TryGetDetails(AdventurersLogActivity activity, out TDetails details)
 {
     if (IsMatch(activity))
     {
         details = ParseDetails(activity);
         return(true);
     }
     else
     {
         details = default;
         return(false);
     }
 }
            protected override FealtyActivityDetails ParseDetails(AdventurersLogActivity activity)
            {
                if (activity.Text.IndexOf("Maintained", StringComparison.OrdinalIgnoreCase) >= 0)
                {
                    return(new FealtyActivityDetails(3, true));
                }

                int  levelIndex = activity.Text.IndexOfAny(fealtyLevelChars);
                char levelChar  = activity.Text[levelIndex];
                int  level      = levelChar - '0';

                return(new FealtyActivityDetails(level, false));
            }
 public abstract bool IsMatch(AdventurersLogActivity activity);
 protected abstract TDetails ParseDetails(AdventurersLogActivity activity);
 public override bool IsMatch(AdventurersLogActivity activity)
 => activity.Text.IndexOf("Clan Fealty", StringComparison.OrdinalIgnoreCase) >= 0;