private void Update() { foreach (var server in playerCounts.Keys.Except(Servers)) { playerCounts.Remove(server); } Parallel.ForEach(Servers, server => { try { ServerInfoResult info = server.GetServerInfoSync(infoSettings); if (playerCounts.ContainsKey(server) && info.Players == playerCounts[server]) { return; } playerCounts[server] = info.Players; if (info.Players >= PlayerCountTrigger) { PlayerCountReached?.Invoke(this, new EventData { Server = server, Info = info }); } } catch (SocketException e) when(e.SocketErrorCode == SocketError.TimedOut || e.SocketErrorCode == SocketError.ConnectionRefused) { } }); }
public static ServerInfoResult Parse(byte[] data) { var parser = new ResponseParser(data); parser.CurrentPosition += 5; //Header var result = new ServerInfoResult(); result.Protocol = parser.GetByte(); result.Name = parser.GetStringToTermination(); result.Map = parser.GetStringToTermination(); result.Folder = parser.GetStringToTermination(); result.Game = parser.GetStringToTermination(); result.ID = parser.GetShort(); result.Players = parser.GetByte(); result.MaxPlayers = parser.GetByte(); result.Bots = parser.GetByte(); result.ServerType = parser.GetStringOfByte(); result.Environment = parser.GetStringOfByte(); result.Visibility = parser.GetByte(); result.VAC = parser.GetByte(); result.Version = parser.GetStringToTermination(); //get EDF uint edf = parser.GetByte(); if ((edf & 0x80) != 0) //has port number { result.Port = parser.GetShort(); } return(result); }
string Format(ServerInfoResult info, string ipAddress, int port) { var str = new List <string>(); str.Add(string.Format("{0}{1}:{2}", "steam://connect/", ipAddress, port)); str.Add(string.Format("Players: {0} / {1}", info.Players, info.MaxPlayers)); str.Add("Map: " + info.GetMapInfo()); return(ServerName + " // " + string.Join(" // ", str)); }