using SSQLib; using System.Net; using System.Linq; using System.Collections.Generic; using Newtonsoft.Json; using System.Runtime.Remoting; using System; /// /// The container for the data. /// namespace ArkData { public partial class DataContainer { const int MAX_STEAM_IDS = 100; const int MAX_INVALID_COUNT = 10; /// /// A list of all players registered on the server. /// public List Players { get; set; } /// /// A list of all tribes registered on the server. /// public List Tribes { get; set; } /// /// Indicates whether the steam user data has been loaded. /// private bool SteamLoaded { get; set; } /// /// Constructs the DataContainer. /// public DataContainer() { Players = new List(); Tribes = new List(); SteamLoaded = false; } /// /// Links the online players, to the player profiles. /// /// The server ip address. /// The Steam query port. private void LinkOnlinePlayers(string ipString, int port) { try { var online = Enumerable.OfType(new SSQL().Players(new IPEndPoint(IPAddress.Parse(ipString), port))); for (var i = 0; i < Players.Count; i++) { var online_player = online.FirstOrDefault(p => p.Name == Players[i].PlayerName); Players[i].Online = online_player != null; } } catch (SSQLServerException) { throw new ServerException("The connection to the server failed. Please check the configured IP address and port."); } } /// /// Links the players to their tribes and the tribes to the players. /// private void LinkPlayerTribe() { for (var i = 0; i < Players.Count; i++) { var player = Players[i]; player.OwnedTribes = Tribes.Where(t => t.OwnerId == player.CharacterId).ToList(); player.Tribe = Tribes.FirstOrDefault(t => t.Id == player.TribeId); } for (var i = 0; i < Tribes.Count; i++) { var tribe = Tribes[i]; tribe.Owner = Players.FirstOrDefault(p => p.CharacterId == tribe.OwnerId); tribe.Players = Players.Where(p => p.TribeId == tribe.Id).ToList(); } } /// /// Deserializes JSON from Steam API and links Steam profile to player profile. /// /// The JSON data string. private void LinkSteamProfiles(string jsonString, DateTime lastSteamUpdateUtc, string[] playerSteamIds) { var profiles = JsonConvert.DeserializeObject>(jsonString).response.players; for (var i = 0; i < profiles.Count; i++) { var player = Players.FirstOrDefault(p => p.PlayerId == profiles[i].steamid); if (player != null) { player.PlayerName = profiles[i].personaname; player.LastPlatformUpdateUtc = lastSteamUpdateUtc; } } for (var i = 0; i < playerSteamIds.Length; i++) { var player = Players.FirstOrDefault(p => p.PlayerId == playerSteamIds[i]); if (player != null && player.LastPlatformUpdateUtc == DateTime.MinValue) { player.NoUpdateCount = Math.Min(MAX_INVALID_COUNT, player.NoUpdateCount + 1); } } } } }