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; }); }); }
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); }
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; }); }); }
public SteamWorkshopItem(SteamGame game) { Game = game; }
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); }