private void Watcher_Changed(object sender, FileSystemEventArgs e) { // In some cases changed event may be called even when the file was deleted if (!File.Exists(e.FullPath)) { return; } var kv = new KeyValue(); Policy.Handle <IOException>().WaitAndRetry(4, r => TimeSpan.FromSeconds(1)).Execute(() => { kv.ReadFileAsText(e.FullPath); }); var state = kv["StateFlags"].Value; if (state == "4" && oldGameState != state) { oldGameState = state; var newGame = library.GetInstalledGameFromFile(e.FullPath); logger.Info("Steam app {0} installed.", id); GameInstalled?.Invoke(this, new GameInstalledEventArgs(newGame)); } }
private void Watcher_Created(object sender, FileSystemEventArgs e) { logger.Info("Origin app {0} installed.", id); GameInstalled?.Invoke(this, new GameInstalledEventArgs(new Game() { PlayTask = library.GetGamePlayTask(manifest), InstallDirectory = Path.GetDirectoryName(executablePath) })); }
public void StartInstallMonitoring() { logger.Info("Starting install monitoring of Uplay app " + id); Dispose(); cancelToken = new CancellationTokenSource(); Task.Factory.StartNew(() => { // Uplay is currently 32bit only, but this will future proof this feature var root32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32); var root64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); while (!cancelToken.Token.IsCancellationRequested) { var installsKey32 = root32.OpenSubKey(@"SOFTWARE\ubisoft\Launcher\Installs\"); if (installsKey32 != null) { var gameKey = installsKey32.OpenSubKey(id); if (gameKey != null) { logger.Info($"Uplay app {id} has been installed."); GameInstalled?.Invoke(this, new GameInstalledEventArgs(new Game() { PlayTask = library.GetGamePlayTask(id), InstallDirectory = (gameKey.GetValue("InstallDir") as string).Replace('/', Path.DirectorySeparatorChar) })); return; } } if (Environment.Is64BitOperatingSystem) { var installsKey64 = root64.OpenSubKey(@"SOFTWARE\ubisoft\Launcher\Installs\"); if (installsKey64 != null) { var gameKey = installsKey64.OpenSubKey(id); if (gameKey != null) { logger.Info($"Uplay app {id} has been installed."); GameInstalled?.Invoke(this, new GameInstalledEventArgs(new Game() { PlayTask = library.GetGamePlayTask(id), InstallDirectory = (gameKey.GetValue("InstallDir") as string).Replace('/', Path.DirectorySeparatorChar) })); return; } } } Thread.Sleep(5000); } }, cancelToken.Token); }
public void StartInstallMonitoring() { logger.Info("Starting install monitoring of BattleNet app " + app.ProductId); Dispose(); cancelToken = new CancellationTokenSource(); Task.Factory.StartNew(() => { while (!cancelToken.Token.IsCancellationRequested) { var entry = BattleNetLibrary.GetUninstallEntry(app); if (entry != null) { logger.Info($"BattleNet app {app.ProductId} has been installed."); GameTask playTask; if (app.Type == BattleNetLibrary.BNetAppType.Classic) { playTask = new GameTask() { Type = GameTaskType.File, WorkingDir = @"{InstallDir}", Path = @"{InstallDir}\" + app.ClassicExecutable }; } else { playTask = library.GetGamePlayTask(app.ProductId); } GameInstalled?.Invoke(this, new GameInstalledEventArgs(new Game() { PlayTask = playTask, InstallDirectory = entry.InstallLocation })); return; } Thread.Sleep(5000); } }, cancelToken.Token); }
public void InstallGame(Game game, IEnumerable <PropertyDef> properties) { Game existingGame = _cachedGames.FirstOrDefault(g => g.Id == game.Id); SQLiteTransaction trans = null; try { var sb = new StringBuilder(); trans = DatabaseConnection.BeginTransaction(); if (existingGame != null && existingGame.Id == game.Id) { UpdateGameDefinition(game, properties); } else { using (SQLiteCommand com = DatabaseConnection.CreateCommand()) { //Build Query sb.Append("INSERT OR REPLACE INTO [games]("); sb.Append( "[id],[name],[filename],[version], [card_width],[card_height],[card_back],[deck_sections],[shared_deck_sections],[file_hash]"); sb.Append(") VALUES("); sb.Append( "@id,@name,@filename,@version,@card_width,@card_height,@card_back,@deck_sections,@shared_deck_sections,@file_hash"); sb.Append(");\n"); com.CommandText = sb.ToString(); com.Parameters.AddWithValue("@id", game.Id.ToString()); com.Parameters.AddWithValue("@name", game.Name); com.Parameters.AddWithValue("@filename", game.Filename); com.Parameters.AddWithValue("@version", game.Version.ToString()); com.Parameters.AddWithValue("@card_width", game.CardWidth); com.Parameters.AddWithValue("@card_height", game.CardHeight); com.Parameters.AddWithValue("@card_back", game.CardBack); com.Parameters.AddWithValue("@deck_sections", SerializeList(game.DeckSections)); if (game.SharedDeckSections != null) { com.Parameters.AddWithValue("@shared_deck_sections", SerializeList(game.SharedDeckSections)); } else { com.Parameters.AddWithValue("@shared_deck_sections", DBNull.Value); } com.Parameters.AddWithValue("@file_hash", game.FileHash); com.ExecuteNonQuery(); if (!Directory.Exists(Path.Combine(BasePath, "Decks"))) { Directory.CreateDirectory(Path.Combine(BasePath, "Decks")); } game.CopyDecks(); } } //Add custom properties for the card. sb = new StringBuilder(); sb.Append("INSERT OR REPLACE INTO [custom_properties]("); sb.Append("[id],[card_real_id],[game_id],[name], [type],[vint],[vstr]"); sb.Append(") VALUES("); sb.Append( "@id,(SELECT real_id FROM cards WHERE id = @card_id LIMIT 1),@game_id,@name,@type,@vint,@vstr"); sb.Append(");\n"); string command = sb.ToString(); foreach (PropertyDef pair in properties) { string name = string.Format("{0}{1}", game.Id.ToString().Replace("-", ""), pair.Name); if (!DatabaseHandler.ColumnExists("cards", name, DatabaseConnection)) { DatabaseHandler.AddColumn("cards", name, pair.Type, DatabaseConnection); } using (SQLiteCommand com = DatabaseConnection.CreateCommand()) { com.CommandText = command; com.Parameters.AddWithValue("@card_id", ""); com.Parameters.AddWithValue("@vint", 0); com.Parameters.AddWithValue("@vstr", " "); com.Parameters.AddWithValue("@id", pair.Name + game.Id); com.Parameters.AddWithValue("@game_id", game.Id.ToString()); com.Parameters.AddWithValue("@name", pair.Name); switch (pair.Type) { case PropertyType.String: com.Parameters.AddWithValue("@type", 0); break; case PropertyType.Integer: com.Parameters.AddWithValue("@type", 1); break; default: com.Parameters.AddWithValue("@type", 2); break; } com.ExecuteNonQuery(); } } DatabaseHandler.RebuildCardTable(DatabaseConnection); trans.Commit(); } catch (Exception) { if (trans != null) { trans.Rollback(); } if (Debugger.IsAttached) { Debugger.Break(); } return; } existingGame = _cachedGames.FirstOrDefault(g => g.Id == game.Id); if (existingGame != null) { _cachedGames.Remove(existingGame); } _cachedGames.Add(game); if (GameInstalled != null) { GameInstalled.Invoke(game, new EventArgs()); } }