Ejemplo n.º 1
0
        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);
        }