private void GameServerClient_GameCreated(GameInfo gameInfo) { lock (_serverGamesLock) { ServerGamesCache.Add(gameInfo); RecountGames(); } }
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(); } }
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]; } }
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; } }