Example #1
0
        private static void LoadWorkshopItems(SteamGame game)
        {
            if (game.WorkshopItems == null)
            {
                game.WorkshopItems = new List <SteamWorkshopItem>();
            }

            var workshop = Path.Combine(game.Universe, "workshop");

            if (!Directory.Exists(workshop))
            {
                return;
            }

            Directory.EnumerateFiles(workshop, "*.acf", SearchOption.TopDirectoryOnly).Where(File.Exists).Do(f =>
            {
                if (Path.GetFileName(f) != $"appworkshop{game.ID}.acf")
                {
                    return;
                }

                Utils.Log($"Found Steam Workshop item file {f} for \"{game.Name}\"");

                var lines                  = File.ReadAllLines(f);
                var end                    = false;
                var foundAppID             = false;
                var workshopItemsInstalled = 0;
                var workshopItemDetails    = 0;
                var bracketStart           = 0;
                var bracketEnd             = 0;

                var currentItem = new SteamWorkshopItem();

                lines.Do(l =>
                {
                    if (end)
                    {
                        return;
                    }
                    if (currentItem == null)
                    {
                        currentItem = new SteamWorkshopItem();
                    }

                    var currentLine = lines.IndexOf(l);
                    if (l.ContainsCaseInsensitive("\"appid\"") && !foundAppID)
                    {
                        if (!int.TryParse(GetVdfValue(l), out var appID))
                        {
                            return;
                        }

                        foundAppID = true;

                        if (appID != game.ID)
                        {
                            return;
                        }
                    }

                    if (!foundAppID)
                    {
                        return;
                    }

                    if (l.ContainsCaseInsensitive("\"SizeOnDisk\""))
                    {
                        if (!int.TryParse(GetVdfValue(l), out var sizeOnDisk))
                        {
                            return;
                        }

                        game.WorkshopItemsSize += sizeOnDisk;
                    }

                    if (l.ContainsCaseInsensitive("\"WorkshopItemsInstalled\""))
                    {
                        workshopItemsInstalled = currentLine;
                    }

                    if (l.ContainsCaseInsensitive("\"WorkshopItemDetails\""))
                    {
                        workshopItemDetails = currentLine;
                    }

                    if (workshopItemsInstalled == 0)
                    {
                        return;
                    }

                    if (currentLine <= workshopItemsInstalled + 1 && currentLine >= workshopItemDetails - 1)
                    {
                        return;
                    }

                    if (currentItem.ItemID == 0)
                    {
                        if (!int.TryParse(GetSingleVdfValue(l), out currentItem.ItemID))
                        {
                            return;
                        }
                    }

                    if (currentItem.ItemID == 0)
                    {
                        return;
                    }

                    if (bracketStart == 0 && l.Contains("{"))
                    {
                        bracketStart = currentLine;
                    }

                    if (bracketEnd == 0 && l.Contains("}"))
                    {
                        bracketEnd = currentLine;
                    }

                    if (bracketStart == 0)
                    {
                        return;
                    }

                    if (currentLine == bracketStart + 1)
                    {
                        if (!int.TryParse(GetVdfValue(l), out currentItem.Size))
                        {
                            return;
                        }
                    }

                    if (bracketStart == 0 || bracketEnd == 0 || currentItem.ItemID == 0 || currentItem.Size == 0)
                    {
                        return;
                    }

                    bracketStart     = 0;
                    bracketEnd       = 0;
                    currentItem.Game = game;
                    game.WorkshopItems.Add(currentItem);

                    Utils.Log($"Found Steam Workshop item {currentItem.ItemID}");

                    currentItem = null;
                    end         = true;
                });
            });
        }
Example #2
0
        public override bool LoadAllGames()
        {
            if (SteamUniverses == null)
            {
                LoadUniverses();
            }

            if (SteamUniverses.Count == 0)
            {
                Utils.Log("Could not find any Steam Libraries");
                return(false);
            }

            if (Games == null)
            {
                Games = new List <AStoreGame>();
            }

            SteamUniverses.Do(u =>
            {
                Utils.Log($"Searching for Steam Games in {u}");

                Directory.EnumerateFiles(u, "*.acf", SearchOption.TopDirectoryOnly).Where(File.Exists).Do(f =>
                {
                    var game  = new SteamGame();
                    var gotID = false;

                    File.ReadAllLines(f).Do(l =>
                    {
                        if (l.ContainsCaseInsensitive("\"appid\""))
                        {
                            if (!int.TryParse(GetVdfValue(l), out var id))
                            {
                                return;
                            }
                            game.ID = id;
                            gotID   = true;
                        }

                        if (l.ContainsCaseInsensitive("\"name\""))
                        {
                            game.Name = GetVdfValue(l);
                        }

                        if (!l.ContainsCaseInsensitive("\"installdir\""))
                        {
                            return;
                        }

                        var path = Path.Combine(u, "common", GetVdfValue(l));
                        if (Directory.Exists(path))
                        {
                            game.Path = path;
                        }
                    });

                    if (!gotID || !Directory.Exists(game.Path))
                    {
                        return;
                    }

                    var gameMeta = GameRegistry.Games.Values.FirstOrDefault(g =>
                    {
                        return((g.SteamIDs?.Contains(game.ID) ?? false) &&
                               (g.RequiredFiles?.TrueForAll(file => File.Exists(Path.Combine(game.Path, file))) ?? true));
                    });

                    if (gameMeta == null)
                    {
                        Utils.Log($"Steam Game \"{game.Name}\" ({game.ID}) is not supported, skipping");
                        return;
                    }

                    game.Game     = gameMeta.Game;
                    game.Universe = u;

                    Utils.Log($"Found Steam Game: \"{game.Name}\" ({game.ID}) at {game.Path}");

                    LoadWorkshopItems(game);

                    Games.Add(game);
                });
            });

            Utils.Log($"Total number of Steam Games found: {Games.Count}");

            return(true);
        }
Example #3
0
        private static void LoadWorkshopItems(SteamGame game)
        {
            var workshop = new RelativePath("workshop").RelativeTo(game.Universe);

            if (!workshop.Exists)
            {
                return;
            }

            workshop.EnumerateFiles(false, "*.acf")
            .Where(f => f.Exists)
            .Where(f => f.IsFile)
            .Do(f =>
            {
                if (f.FileName.ToString() != $"appworkshop_{game.ID}.acf")
                {
                    return;
                }

                Utils.Log($"Found Steam Workshop item file {f} for \"{game.Name}\"");

                var lines                  = f.ReadAllLines().ToList();
                var end                    = false;
                var foundAppID             = false;
                var workshopItemsInstalled = 0;
                var workshopItemDetails    = 0;
                var bracketStart           = 0;
                var bracketEnd             = 0;

                SteamWorkshopItem?currentItem = new SteamWorkshopItem(game);

                lines.Do(l =>
                {
                    if (end)
                    {
                        return;
                    }

                    currentItem ??= new SteamWorkshopItem(game);

                    var currentLine = lines.IndexOf(l);
                    if (l.ContainsCaseInsensitive("\"appid\"") && !foundAppID)
                    {
                        if (!int.TryParse(GetVdfValue(l), out var appID))
                        {
                            return;
                        }

                        foundAppID = true;

                        if (appID != game.ID)
                        {
                            return;
                        }
                    }

                    if (!foundAppID)
                    {
                        return;
                    }

                    if (l.ContainsCaseInsensitive("\"SizeOnDisk\""))
                    {
                        if (!int.TryParse(GetVdfValue(l), out var sizeOnDisk))
                        {
                            return;
                        }

                        game.WorkshopItemsSizeOnDisk += sizeOnDisk;
                    }

                    if (l.ContainsCaseInsensitive("\"WorkshopItemsInstalled\""))
                    {
                        workshopItemsInstalled = currentLine;
                    }

                    if (l.ContainsCaseInsensitive("\"WorkshopItemDetails\""))
                    {
                        workshopItemDetails = currentLine;
                    }

                    if (workshopItemsInstalled == 0)
                    {
                        return;
                    }

                    if (currentLine <= workshopItemsInstalled + 1 && currentLine >= workshopItemDetails - 1)
                    {
                        return;
                    }

                    if (currentItem.ItemID == 0)
                    {
                        if (!int.TryParse(GetSingleVdfValue(l), out currentItem.ItemID))
                        {
                            return;
                        }
                    }

                    if (currentItem.ItemID == 0)
                    {
                        return;
                    }

                    if (bracketStart == 0 && l.Contains("{"))
                    {
                        bracketStart = currentLine;
                    }

                    if (bracketEnd == 0 && l.Contains("}"))
                    {
                        bracketEnd = currentLine;
                    }

                    if (bracketStart == 0)
                    {
                        return;
                    }

                    if (currentLine == bracketStart + 1)
                    {
                        if (!long.TryParse(GetVdfValue(l), out currentItem.Size))
                        {
                            return;
                        }
                    }

                    if (bracketStart == 0 || bracketEnd == 0 || currentItem.ItemID == 0 || currentItem.Size == 0)
                    {
                        return;
                    }

                    bracketStart = 0;
                    bracketEnd   = 0;
                    game.WorkshopItems.Add(currentItem);

                    Utils.Log($"Found Steam Workshop item {currentItem.ItemID}");

                    currentItem = null;
                    end         = true;
                });
            });
        }
Example #4
0
 public SteamWorkshopItem(SteamGame game)
 {
     Game = game;
 }
Example #5
0
        public override bool LoadAllGames()
        {
            SteamUniverses ??= LoadUniverses();

            if (SteamUniverses.Count == 0)
            {
                Utils.Log("Could not find any Steam Libraries");
                return(false);
            }

            SteamUniverses.Do(u =>
            {
                Utils.Log($"Searching for Steam Games in {u}");

                u.EnumerateFiles(false, "*.acf")
                .Where(a => a.Exists)
                .Where(a => a.IsFile)
                .Do(f =>
                {
                    var game  = new SteamGame();
                    var gotID = false;

                    f.ReadAllLines().Do(l =>
                    {
                        if (l.ContainsCaseInsensitive("\"appid\""))
                        {
                            if (!int.TryParse(GetVdfValue(l), out var id))
                            {
                                return;
                            }
                            game.ID = id;
                            gotID   = true;
                        }

                        if (l.ContainsCaseInsensitive("\"name\""))
                        {
                            game.Name = GetVdfValue(l);
                        }

                        if (!l.ContainsCaseInsensitive("\"installdir\""))
                        {
                            return;
                        }

                        var value = GetVdfValue(l);
                        AbsolutePath absPath;

                        if (Path.IsPathRooted(value))
                        {
                            absPath = (AbsolutePath)value;
                        }
                        else
                        {
                            absPath = new RelativePath("common").Combine(GetVdfValue(l)).RelativeTo(u);
                        }

                        if (absPath.Exists)
                        {
                            game.Path = absPath;
                        }
                    });

                    if (!gotID || !game.Path.IsDirectory)
                    {
                        return;
                    }

                    var gameMeta = GameRegistry.Games.Values.FirstOrDefault(g => g.SteamIDs?.Contains(game.ID) ?? false);

                    if (gameMeta == null)
                    {
                        Utils.Log($"Steam Game \"{game.Name}\" ({game.ID}) is not supported, skipping");
                        return;
                    }

                    game.Game     = gameMeta.Game;
                    game.Universe = u;

                    Utils.Log($"Found Steam Game: \"{game.Name}\" ({game.ID}) at {game.Path}");

                    LoadWorkshopItems(game);

                    Games.Add(game);
                });
            });

            Utils.Log($"Total number of Steam Games found: {Games.Count}");

            return(true);
        }