コード例 #1
0
ファイル: SIOnlineViewModel.cs プロジェクト: wurunduk/SI
 private void GameServerClient_GameCreated(GameInfo gameInfo)
 {
     lock (_serverGamesLock)
     {
         ServerGamesCache.Add(gameInfo);
         RecountGames();
     }
 }
コード例 #2
0
ファイル: SIOnlineViewModel.cs プロジェクト: wurunduk/SI
        private void GameServerClient_GameDeleted(int id)
        {
            lock (_serverGamesLock)
            {
                for (int i = 0; i < ServerGamesCache.Count; i++)
                {
                    if (ServerGamesCache[i].GameID == id)
                    {
                        ServerGamesCache.RemoveAt(i);
                        break;
                    }
                }

                RecountGames();
            }
        }
コード例 #3
0
ファイル: SIOnlineViewModel.cs プロジェクト: wurunduk/SI
        private void RecountGames()
        {
            var serverGames = ServerGames.ToArray();

            for (var i = 0; i < serverGames.Length; i++)
            {
                var item = serverGames[i];
                var game = ServerGamesCache.FirstOrDefault(sg => sg.GameID == item.GameID);
                if (game == null || !FilterGame(game))
                {
                    ServerGames.Remove(item);
                }
            }

            serverGames = ServerGames.ToArray();
            for (var i = 0; i < serverGames.Length; i++)
            {
                var item = serverGames[i];
                var game = ServerGamesCache.FirstOrDefault(sg => sg.GameID == item.GameID);
                if (game != null && game != item)
                {
                    ServerGames[i] = game;
                }
            }

            for (int i = 0; i < ServerGamesCache.Count; i++)
            {
                var item = ServerGamesCache[i];

                var game = ServerGames.FirstOrDefault(sg => sg.GameID == item.GameID);
                if (game == null && FilterGame(item))
                {
                    InsertGame(item);
                }
            }

            if (CurrentGame != null && !ServerGames.Contains(CurrentGame))
            {
                CurrentGame = null;
            }

            if (CurrentGame == null && ServerGames.Any())
            {
                CurrentGame = ServerGames[0];
            }
        }
コード例 #4
0
ファイル: SIOnlineViewModel.cs プロジェクト: wurunduk/SI
        private async Task ReloadGamesAsync(CancellationToken cancellationToken = default)
        {
            IsProgress = true;
            Error      = "";
            try
            {
                lock (_serverGamesLock)
                {
                    ServerGamesCache.Clear();
                    RecountGames();
                }

                SI.GameServer.Contract.Slice <GameInfo> gamesSlice = null;
                var whileGuard = 100;
                do
                {
                    var fromId = gamesSlice != null && gamesSlice.Data.Length > 0 ? gamesSlice.Data.Last().GameID + 1 : 0;
                    gamesSlice = await _gameServerClient.GetGamesAsync(fromId, cancellationToken);

                    lock (_serverGamesLock)
                    {
                        ServerGamesCache.AddRange(gamesSlice.Data);
                        RecountGames();
                    }

                    whileGuard--;
                } while (!gamesSlice.IsLastSlice && whileGuard > 0);
            }
            catch (Exception exc)
            {
                Error     = exc.Message;
                FullError = exc.ToString();
            }
            finally
            {
                IsProgress = false;
            }
        }