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)
     }));
 }
示例#3
0
        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);
        }
示例#5
0
        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());
            }
        }