Пример #1
0
        /// <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());
        }