private async Task UpdatePlayerDetails() { if (!String.IsNullOrEmpty(rconParams.InstallDirectory)) { var savedArksPath = ServerProfile.GetProfileSavePath(rconParams.InstallDirectory, rconParams.AltSaveDirectoryName, rconParams.PGM_Enabled, rconParams.PGM_Name); var arkData = await ArkData.ArkDataContainer.CreateAsync(savedArksPath); await arkData.LoadSteamAsync(Config.Default.SteamAPIKey); TaskUtils.RunOnUIThreadAsync(() => { foreach (var playerData in arkData.Players) { var playerToUpdate = this.Players.FirstOrDefault(p => p.SteamId == Int64.Parse(playerData.SteamId)); if (playerToUpdate != null) { playerToUpdate.UpdateArkDataAsync(playerData).DoNotWait(); } else { var newPlayer = new PlayerInfo() { SteamId = Int64.Parse(playerData.SteamId), SteamName = playerData.SteamName }; newPlayer.UpdateArkDataAsync(playerData).DoNotWait(); this.Players.Add(newPlayer); } } }).DoNotWait(); } }
private async Task UpdatePlayerDetails() { if (updatingPlayerDetails) { return; } updatingPlayerDetails = true; if (!String.IsNullOrEmpty(rconParams.InstallDirectory)) { var savedArksPath = ServerProfile.GetProfileSavePath(rconParams.InstallDirectory, rconParams.AltSaveDirectoryName, rconParams.PGM_Enabled, rconParams.PGM_Name); var arkData = await ArkData.ArkDataContainer.CreateAsync(savedArksPath); try { await arkData.LoadSteamAsync(SteamUtils.SteamWebApiKey); } catch (Exception ex) { Debug.WriteLine($"Error: UpdatePlayerDetails - arkData.LoadSteamAsync - {ex.Message}"); } TaskUtils.RunOnUIThreadAsync(() => { // create a new temporary list List <PlayerInfo> players = new List <PlayerInfo>(this.Players.Count + arkData.Players.Count); players.AddRange(this.Players); try { foreach (var playerData in arkData.Players) { var player = players.FirstOrDefault(p => p.SteamId == Int64.Parse(playerData.SteamId)); if (player == null) { player = new PlayerInfo() { SteamId = Int64.Parse(playerData.SteamId), SteamName = playerData.SteamName }; players.Add(player); } if (player != null) { player.UpdateArkDataAsync(playerData).DoNotWait(); } } this.Players = new SortableObservableCollection <PlayerInfo>(players); OnPlayerCollectionUpdated(); } finally { updatingPlayerDetails = false; } }).DoNotWait(); } }
private async Task LoadWorldSaveFiles() { var cursor = this.Cursor; try { Application.Current.Dispatcher.Invoke(() => this.Cursor = System.Windows.Input.Cursors.Wait); await Task.Delay(500); WorldSaveFiles.Clear(); var saveFolder = ServerProfile.GetProfileSavePath(_profile); if (!Directory.Exists(saveFolder)) { return; } var saveFolderInfo = new DirectoryInfo(saveFolder); var mapName = ServerProfile.GetProfileMapFileName(_profile); var mapFileName = $"{mapName}{Config.Default.MapExtension}"; var searchPattern = $"{mapName}*{Config.Default.MapExtension}"; var saveFiles = saveFolderInfo.GetFiles(searchPattern); foreach (var file in saveFiles) { WorldSaveFiles.Add(new WorldSaveFile { File = file.FullName, FileName = file.Name, CreatedDate = file.CreationTime, UpdatedDate = file.LastWriteTime, IsArchiveFile = false, IsActiveFile = file.Name.Equals(mapFileName, StringComparison.OrdinalIgnoreCase) }); } var backupFolder = ServerApp.GetServerBackupFolder(_profile.ProfileName); if (Directory.Exists(backupFolder)) { var backupFolderInfo = new DirectoryInfo(backupFolder); searchPattern = $"{mapName}*{Config.Default.BackupExtension}"; var backupFiles = backupFolderInfo.GetFiles(searchPattern); foreach (var file in backupFiles) { WorldSaveFiles.Add(new WorldSaveFile { File = file.FullName, FileName = file.Name, CreatedDate = file.CreationTime, UpdatedDate = file.LastWriteTime, IsArchiveFile = true, IsActiveFile = false }); } } WorldSaveFiles.Sort(f => f, new WorldSaveFileComparer()); } finally { Application.Current.Dispatcher.Invoke(() => this.Cursor = cursor); } }
private async Task LoadWorldSaveFiles() { var cursor = this.Cursor; try { Application.Current.Dispatcher.Invoke(() => this.Cursor = System.Windows.Input.Cursors.Wait); await Task.Delay(500); WorldSaveFiles.Clear(); var profileSaveFolder = ServerProfile.GetProfileSavePath(_profile); if (!Directory.Exists(profileSaveFolder)) { return; } var profileSaveFolderInfo = new DirectoryInfo(profileSaveFolder); var mapName = ServerProfile.GetProfileMapFileName(_profile); var mapFileName = $"{mapName}.ark"; var searchPattern = $"{mapName}*.ark"; foreach (var file in profileSaveFolderInfo.GetFiles(searchPattern)) { WorldSaveFiles.Add(new WorldSaveFile { File = file.FullName, FileName = file.Name, CreatedDate = file.CreationTime, UpdatedDate = file.LastWriteTime, IsActiveFile = file.Name.Equals(mapFileName, StringComparison.OrdinalIgnoreCase) }); } WorldSaveFiles.Sort(f => f, new WorldSaveFileComparer()); } finally { Application.Current.Dispatcher.Invoke(() => this.Cursor = cursor); } }
private async Task <List <string> > UpdatePlayerDetailsAsync(CancellationToken token) { if (this._disposed) { return(new List <string>()); } if (string.IsNullOrWhiteSpace(_rconParameters.GameFile) || !File.Exists(_rconParameters.GameFile)) { return(new List <string>()); } var savedPath = ServerProfile.GetProfileSavePath(_rconParameters.InstallDirectory); DataContainer dataContainer = null; try { // load the player data from the files. dataContainer = await DataContainer.CreateAsync(_rconParameters.GameFile); } catch (Exception ex) { _errorLogger?.Error($"{nameof(UpdatePlayerDetailsAsync)} - Error: CreateAsync. {ex.Message}\r\n{ex.StackTrace}"); return(new List <string>()); } if (token.IsCancellationRequested) { return(new List <string>()); } await Task.Run(() => { // update the player data with the latest update value from the players collection foreach (var playerData in dataContainer.Players) { var id = playerData.PlayerId; if (string.IsNullOrWhiteSpace(id)) { continue; } this._players.TryGetValue(id, out PlayerInfo player); player?.UpdatePlatformData(playerData); } }, token); if (token.IsCancellationRequested) { return(new List <string>()); } var totalPlayers = dataContainer.Players.Count; var output = new List <string>(); foreach (var playerData in dataContainer.Players) { token.ThrowIfCancellationRequested(); await Task.Run(async() => { var id = playerData.PlayerId; if (!string.IsNullOrWhiteSpace(id)) { var validPlayer = new PlayerInfo() { PlayerId = id, PlayerName = playerData.PlayerName, IsValid = true, }; this._players.AddOrUpdate(id, validPlayer, (k, v) => { v.PlayerName = playerData.PlayerName; v.IsValid = true; return(v); }); } else { _debugLogger?.Debug($"{nameof(UpdatePlayerDetailsAsync)} - Error: corrupted profile.\r\n{playerData.CharacterId}."); } if (this._players.TryGetValue(id, out PlayerInfo player) && player != null) { if (player.IsOnline != playerData.Online) { if (playerData.Online) { var messageFormat = GlobalizedApplication.Instance.GetResourceString("Player_Join") ?? "Player '{0}' joined the game."; var message = string.Format(messageFormat, playerData.CharacterName); output.Add(message); LogEvent(LogEventType.Event, message); LogEvent(LogEventType.All, message); } else { var messageFormat = GlobalizedApplication.Instance.GetResourceString("Player_Leave") ?? "Player '{0}' left the game."; var message = string.Format(messageFormat, playerData.CharacterName); output.Add(message); LogEvent(LogEventType.Event, message); LogEvent(LogEventType.All, message); } } player.UpdateData(playerData); await TaskUtils.RunOnUIThreadAsync(() => { player.IsWhitelisted = _rconParameters?.Server?.Profile?.ServerFilesWhitelisted?.Any(u => u.PlayerId.Equals(player.PlayerId, StringComparison.OrdinalIgnoreCase)) ?? false; }); } }, token); } if (token.IsCancellationRequested) { return(new List <string>()); } // remove any players that do not have a player record. var droppedPlayers = this._players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray(); foreach (var droppedPlayer in droppedPlayers) { _players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player); } return(output); }
private async Task UpdatePlayerDetailsAsync(CancellationToken token) { if (!string.IsNullOrWhiteSpace(_playerListParameters.InstallDirectory)) { var savedPath = ServerProfile.GetProfileSavePath(_playerListParameters.InstallDirectory, _playerListParameters.AltSaveDirectoryName, _playerListParameters.PGM_Enabled, _playerListParameters.PGM_Name); DataContainer dataContainer = null; DateTime lastSteamUpdateUtc = DateTime.MinValue; try { // load the player data from the files. dataContainer = await DataContainer.CreateAsync(savedPath, savedPath); } catch (Exception ex) { _errorLogger?.Error($"{nameof(UpdatePlayerDetailsAsync)} - Error: CreateAsync. {ex.Message}\r\n{ex.StackTrace}"); return; } token.ThrowIfCancellationRequested(); await Task.Run(() => { // update the player data with the latest steam update value from the players collection foreach (var playerData in dataContainer.Players) { var id = playerData.PlayerId; if (string.IsNullOrWhiteSpace(id)) { continue; } _players.TryGetValue(id, out PlayerInfo player); player?.UpdatePlatformData(playerData); } }, token); try { // load the player data from steam lastSteamUpdateUtc = await dataContainer.LoadSteamAsync(SteamUtils.SteamWebApiKey, STEAM_UPDATE_INTERVAL); } catch (Exception ex) { _errorLogger?.Error($"{nameof(UpdatePlayerDetailsAsync)} - Error: LoadSteamAsync. {ex.Message}\r\n{ex.StackTrace}"); } token.ThrowIfCancellationRequested(); var totalPlayers = dataContainer.Players.Count; foreach (var playerData in dataContainer.Players) { token.ThrowIfCancellationRequested(); await Task.Run(async() => { var id = playerData.PlayerId; if (!string.IsNullOrWhiteSpace(id)) { var validPlayer = new PlayerInfo() { PlayerId = playerData.PlayerId, PlayerName = playerData.PlayerName, IsValid = true, }; _players.AddOrUpdate(id, validPlayer, (k, v) => { v.PlayerName = playerData.PlayerName; v.IsValid = true; return(v); }); } else { id = Path.GetFileNameWithoutExtension(playerData.Filename); if (!string.IsNullOrWhiteSpace(id)) { var invalidPlayer = new PlayerInfo() { PlayerId = id, PlayerName = "< corrupted profile >", IsValid = false, }; _players.AddOrUpdate(id, invalidPlayer, (k, v) => { v.PlayerName = "< corrupted profile >"; v.IsValid = false; return(v); }); } else { _debugLogger?.Debug($"{nameof(UpdatePlayerDetailsAsync)} - Error: corrupted profile.\r\n{playerData.Filename}."); } } if (_players.TryGetValue(id, out PlayerInfo player) && player != null) { player.UpdateData(playerData); await TaskUtils.RunOnUIThreadAsync(() => { player.IsAdmin = _playerListParameters?.Server?.Profile?.ServerFilesAdmins?.Any(u => u.PlayerId.Equals(player.PlayerId, StringComparison.OrdinalIgnoreCase)) ?? false; player.IsWhitelisted = _playerListParameters?.Server?.Profile?.ServerFilesWhitelisted?.Any(u => u.PlayerId.Equals(player.PlayerId, StringComparison.OrdinalIgnoreCase)) ?? false; }); } }, token); } token.ThrowIfCancellationRequested(); // remove any players that do not have a player file. var droppedPlayers = _players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.PlayerId.Equals(p.PlayerId, StringComparison.OrdinalIgnoreCase)) == null).ToArray(); foreach (var droppedPlayer in droppedPlayers) { _players.TryRemove(droppedPlayer.PlayerId, out PlayerInfo player); } } }
private async Task UpdatePlayerDetails() { if (updatingPlayerDetails) { return; } updatingPlayerDetails = true; try { if (!String.IsNullOrEmpty(rconParams.InstallDirectory)) { var savedPath = ServerProfile.GetProfileSavePath(rconParams.InstallDirectory, rconParams.AltSaveDirectoryName, rconParams.PGM_Enabled, rconParams.PGM_Name); ArkDataContainer dataContainer = null; try { dataContainer = await ArkDataContainer.CreateAsync(savedPath); } catch (Exception ex) { errorLogger.Error($"{nameof(UpdatePlayerDetails)} - Error: CreateAsync. {ex.Message}\r\n{ex.StackTrace}"); return; } try { await dataContainer.LoadSteamAsync(SteamUtils.SteamWebApiKey); } catch (Exception ex) { errorLogger.Error($"{nameof(UpdatePlayerDetails)} - Error: LoadSteamAsync. {ex.Message}\r\n{ex.StackTrace}"); return; } TaskUtils.RunOnUIThreadAsync(() => { // create a new temporary list List <PlayerInfo> players = new List <PlayerInfo>(this.Players.Count + dataContainer.Players.Count); players.AddRange(this.Players); foreach (var playerData in dataContainer.Players) { PlayerInfo player = null; if (Int64.TryParse(playerData.SteamId, out long steamId)) { player = players.FirstOrDefault(p => p.SteamId == steamId); if (player == null) { player = new PlayerInfo(this.debugLogger) { SteamId = steamId, SteamName = playerData.SteamName }; players.Add(player); } player.IsValid = true; } else { var filename = Path.GetFileNameWithoutExtension(playerData.Filename); if (Int64.TryParse(filename, out steamId)) { player = players.FirstOrDefault(p => p.SteamId == steamId); if (player == null) { player = new PlayerInfo(this.debugLogger) { SteamId = steamId, SteamName = "< corrupted profile >" }; players.Add(player); } player.IsValid = false; } else { debugLogger.Debug($"{nameof(UpdatePlayerDetails)} - Error: corrupted profile.\r\n{playerData.Filename}."); } } if (player != null) { player.UpdateDataAsync(playerData, savedPath).DoNotWait(); } } this.Players = new SortableObservableCollection <PlayerInfo>(players); OnPlayerCollectionUpdated(); }).DoNotWait(); } } finally { updatingPlayerDetails = false; } }
private async Task UpdatePlayerDetailsAsync(CancellationToken token) { if (!string.IsNullOrWhiteSpace(rconParams.InstallDirectory)) { var savedPath = ServerProfile.GetProfileSavePath(rconParams.InstallDirectory, rconParams.AltSaveDirectoryName, rconParams.PGM_Enabled, rconParams.PGM_Name); DataContainer dataContainer = null; DateTime lastSteamUpdateUtc = DateTime.MinValue; try { DataFileDetails.PlayerFileFolder = savedPath; DataFileDetails.TribeFileFolder = savedPath; // load the player data from the files. dataContainer = await DataContainer.CreateAsync(); } catch (Exception ex) { errorLogger.Error($"{nameof(UpdatePlayerDetailsAsync)} - Error: CreateAsync. {ex.Message}\r\n{ex.StackTrace}"); return; } token.ThrowIfCancellationRequested(); await Task.Run(() => { // update the player data with the latest steam update value from the players collection foreach (var playerData in dataContainer.Players) { if (!long.TryParse(playerData.SteamId, out long steamId)) { continue; } this.players.TryGetValue(steamId, out PlayerInfo player); player?.UpdateSteamData(playerData); } }, token); try { // load the player data from steam lastSteamUpdateUtc = await dataContainer.LoadSteamAsync(SteamUtils.SteamWebApiKey, STEAM_UPDATE_INTERVAL); } catch (Exception ex) { errorLogger.Error($"{nameof(UpdatePlayerDetailsAsync)} - Error: LoadSteamAsync. {ex.Message}\r\n{ex.StackTrace}"); return; } token.ThrowIfCancellationRequested(); var totalPlayers = dataContainer.Players.Count; foreach (var playerData in dataContainer.Players) { token.ThrowIfCancellationRequested(); await Task.Run(async() => { if (long.TryParse(playerData.SteamId, out long steamId)) { var validPlayer = new PlayerInfo(this.debugLogger) { SteamId = steamId, SteamName = playerData.SteamName, IsValid = true, }; this.players.AddOrUpdate(steamId, validPlayer, (k, v) => { v.SteamName = playerData.SteamName; v.IsValid = true; return(v); }); } else { var filename = Path.GetFileNameWithoutExtension(playerData.Filename); if (long.TryParse(filename, out steamId)) { var invalidPlayer = new PlayerInfo(this.debugLogger) { SteamId = steamId, SteamName = "< corrupted profile >", IsValid = false, }; this.players.AddOrUpdate(steamId, invalidPlayer, (k, v) => { v.SteamName = "< corrupted profile >"; v.IsValid = false; return(v); }); } else { debugLogger.Debug($"{nameof(UpdatePlayerDetailsAsync)} - Error: corrupted profile.\r\n{playerData.Filename}."); } } if (this.players.TryGetValue(steamId, out PlayerInfo player) && player != null) { player.UpdateData(playerData, lastSteamUpdateUtc); await TaskUtils.RunOnUIThreadAsync(() => { player.IsAdmin = rconParams?.Server?.Profile?.ServerFilesAdmins?.Any(u => u.SteamId.Equals(player.SteamId.ToString(), StringComparison.OrdinalIgnoreCase)) ?? false; player.IsWhitelisted = rconParams?.Server?.Profile?.ServerFilesWhitelisted?.Any(u => u.SteamId.Equals(player.SteamId.ToString(), StringComparison.OrdinalIgnoreCase)) ?? false; if (totalPlayers <= Config.Default.RCON_MaximumPlayerAvatars && Config.Default.RCON_ShowPlayerAvatars) { player.UpdateAvatarImageAsync(savedPath).DoNotWait(); } }); } }, token); } token.ThrowIfCancellationRequested(); // remove any players that do not have a player file. var droppedPlayers = this.players.Values.Where(p => dataContainer.Players.FirstOrDefault(pd => pd.SteamId == p.SteamId.ToString()) == null).ToArray(); foreach (var droppedPlayer in droppedPlayers) { players.TryRemove(droppedPlayer.SteamId, out PlayerInfo player); } } }