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); }
private static bool GetLocalNetworkStatus(IPEndPoint endpoint, out QueryMaster.ServerInfo serverInfo, out int onlinePlayerCount) { serverInfo = null; onlinePlayerCount = 0; try { using (var server = QueryMaster.ServerQuery.GetServerInstance(QueryMaster.EngineType.Source, endpoint)) { try { serverInfo = server?.GetInfo(); } catch (Exception) { serverInfo = null; } try { var players = server?.GetPlayers()?.Where(p => !string.IsNullOrWhiteSpace(p.Name?.Trim())); onlinePlayerCount = players?.Count() ?? 0; } catch (Exception) { onlinePlayerCount = 0; } } } catch (SocketException ex) { Logger.Debug($"{nameof(GetLocalNetworkStatus)} failed: {endpoint.Address}:{endpoint.Port}. {ex.Message}"); // Common when the server is unreachable. Ignore it. } return(true); }
private static bool GetLocalNetworkStatus(string gameFile, IPEndPoint endpoint, out QueryMaster.ServerInfo serverInfo, out int onlinePlayerCount) { serverInfo = null; onlinePlayerCount = 0; try { using (var server = QueryMaster.ServerQuery.GetServerInstance(QueryMaster.EngineType.Source, endpoint)) { try { serverInfo = server.GetInfo(); } catch (Exception) { serverInfo = null; } } try { // load the player data from the files. onlinePlayerCount = DataContainer.GetOnlinePlayerCount(gameFile); } catch (Exception) { onlinePlayerCount = 0; } } catch (SocketException ex) { // Common when the server is unreachable. Log and Ignore it. Logger.Debug($"{nameof(GetLocalNetworkStatus)} failed: {endpoint.Address}:{endpoint.Port}. {ex.Message}"); } return(true); }