/// <summary> /// returns filtered and ordered list of games /// </summary> /// <param name="titleFilter"></param> /// <param name="filter"></param> /// <param name="order"></param> /// <param name="ascending"></param> /// <returns></returns> public static string[] ListGames(string filterCommand, GameFilter filter, GameOrder order, bool ascending) { var games = Games.AsEnumerable(); if (!string.IsNullOrEmpty(filterCommand)) { try { var commands = filterCommand.Trim().ToLower().Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries); foreach (var command in commands) { if (command.StartsWith("*")) { // remove all white spaces in string var c = Regex.Replace(command, @"\s+", string.Empty); var op = GetOperatorFromCommand(c); // DATE filters if (c.Contains("*beaten")) { if (GetDateFromCommand(c.Replace($"*beaten{ op }", string.Empty), out int?year, out int?month, out int?day)) { games = games.Where(g => EvaluateDates(g.Value.Completed, op, year, month, day)); Debug.WriteLine($"beaten{ op }{ year }/{ month }/{ day }"); } } else if (c.Contains("*added")) { if (GetDateFromCommand(c.Replace($"*added{ op }", string.Empty), out int?year, out int?month, out int?day)) { games = games.Where(g => EvaluateDates(g.Value.Added, op, year, month, day)); Debug.WriteLine($"added{ op }{ year }/{ month }/{ day }"); } } else if (c.Contains("*played")) { if (GetDateFromCommand(c.Replace($"*played{ op }", string.Empty), out int?year, out int?month, out int?day)) { games = games.Where(g => EvaluateDates(g.Value.DateTimesPlayed, op, year, month, day)); Debug.WriteLine($"played{ op }{ year }/{ month }/{ day }"); } } // NUMBER filters else if (c.Contains("*playcount")) { if (GetNumberFromCommand(c.Replace($"*playcount{ op }", string.Empty), out int?count)) { games = games.Where(g => EvaluateNum(g.Value.PlayCount, op, count.Value)); Debug.WriteLine($"playcount{ op }{ count }"); } } else if (c.Contains("*rating")) { if (GetNumberFromCommand(c.Replace($"*rating{ op }", string.Empty), out int?rating)) { games = games.Where(g => EvaluateNum(g.Value.Rating, op, rating.Value)); Debug.WriteLine($"rating{ op }{ rating }"); } } } else { // filter by game title games = games.Where(g => g.Value.Title.ToLower().Contains(command)); } } } catch (Exception ex) { Log.WriteLine(ex.ToString()); games = Games.AsEnumerable(); } } switch (filter) { case GameFilter.All: break; case GameFilter.Installed: games = games.Where(g => !g.Value.Removed); break; case GameFilter.Removed: games = games.Where(g => g.Value.Removed); break; case GameFilter.Beaten: games = games.Where(g => g.Value.Completed.HasValue); break; case GameFilter.Unbeaten: games = games.Where(g => !g.Value.Completed.HasValue && !g.Value.Removed); break; case GameFilter.WithControllerSupport: games = games.Where(g => g.Value.GamepadFriendly == true && !g.Value.Removed); break; case GameFilter.Unidentified: games = games.Where(g => g.Value.Image == null); break; default: throw new NotImplementedException(filter.ToString()); } switch (order) { case GameOrder.Title: games = games.OrderBy(g => g.Value.Title); break; case GameOrder.PlayTime: games = games.OrderBy(g => g.Value.TotalTimePlayed); break; case GameOrder.PlayCount: games = games.OrderBy(g => g.Value.PlayCount); break; case GameOrder.Rating: games = games.OrderBy(g => g.Value.Rating); break; case GameOrder.BeatTime: games = games.OrderBy(g => g.Value.BeatenIn); break; case GameOrder.DateAdded: games = games.OrderBy(g => g.Value.Added); break; case GameOrder.LastPlayed: { games = games .Where(g => !g.Value.LastPlayed.HasValue) .OrderByDescending(g => g.Value.Added) .Concat(games .Where(g => g.Value.LastPlayed.HasValue) .OrderBy(g => g.Value.LastPlayed)); } break; default: throw new NotImplementedException(order.ToString()); } var result = games.Select(g => g.Key); if (!ascending) { result = result.Reverse(); } return(result.ToArray()); }