public static async Task<ServerNetworkInfo> GetServerNetworkInfo(IPEndPoint endpoint) { ServerNetworkInfo result = null; try { string jsonString; using (var client = new WebClient()) { jsonString = await client.DownloadStringTaskAsync(String.Format(Config.Default.ServerStatusUrlFormat, endpoint.Address, endpoint.Port)); } if(jsonString == null) { logger.Debug(String.Format("Server info request returned null string for {0}:{1}", endpoint.Address, endpoint.Port)); return result; } JObject query = JObject.Parse(jsonString); if(query == null) { logger.Debug(String.Format("Server info request failed to parse for {0}:{1} - '{2}'", endpoint.Address, endpoint.Port, jsonString)); return null; } var status = query.SelectToken("status"); if(status == null || !(bool)status) { logger.Debug($"Server at {endpoint.Address}:{endpoint.Port} returned no status or a status of false."); return null; } var server = query.SelectToken("server"); if (server.Type == JTokenType.String) { logger.Debug(String.Format("Server at {0}:{1} returned status {2}", endpoint.Address, endpoint.Port, (string)server)); } else { result = new ServerNetworkInfo(); result.Name = (string)query.SelectToken("server.name"); Version ver; string versionString = (string)query.SelectToken("server.version"); if (versionString.IndexOf('.') == -1) { versionString = versionString + ".0"; } Version.TryParse(versionString, out ver); result.Version = ver; result.Map = (string)query.SelectToken("server.map"); result.Players = Int32.Parse((string)query.SelectToken("server.playerCount")); result.MaxPlayers = Int32.Parse((string)query.SelectToken("server.playerMax")); } } catch (Exception ex) { logger.Debug(String.Format("Exception checking status for: {0}:{1} {2}\r\n{3}", endpoint.Address, endpoint.Port, ex.Message, ex.StackTrace)); } return result; }
public static ServerNetworkInfo GetServerNetworkInfoDirect(IPEndPoint endpoint) { ServerNetworkInfo result = null; QueryMaster.ServerInfo serverInfo = null; ReadOnlyCollection <QueryMaster.Player> players = null; try { using (var server = QueryMaster.ServerQuery.GetServerInstance(QueryMaster.EngineType.Source, endpoint)) { serverInfo = server.GetInfo(); players = server.GetPlayers(); } if (serverInfo != null) { result = new ServerNetworkInfo(); result.Name = serverInfo.Name; result.Map = serverInfo.Map; result.Players = serverInfo.Players; result.MaxPlayers = serverInfo.MaxPlayers; // get the name and version of the server using regular expression. if (!string.IsNullOrWhiteSpace(result.Name)) { var match = Regex.Match(result.Name, @" - \(v([0-9]+\.[0-9]*)\)"); if (match.Success && match.Groups.Count >= 2) { // remove the version number from the name result.Name = result.Name.Replace(match.Groups[0].Value, ""); // get the version number var serverVersion = match.Groups[1].Value; Version ver; if (!String.IsNullOrWhiteSpace(serverVersion) && Version.TryParse(serverVersion, out ver)) { result.Version = ver; } } } } if (players != null) { // set the number of players based on the player list, excludes any players in the list without a valid name. result.Players = players.Count(record => !string.IsNullOrWhiteSpace(record.Name)); } } catch (Exception ex) { logger.Debug(String.Format("Exception checking status for: {0}:{1} {2}\r\n{3}", endpoint.Address, endpoint.Port, ex.Message, ex.StackTrace)); } return(result); }