/// <summary> /// Get a list of currently in-game clients on the specified gameserver. /// <b>Please note:</b> the playtime is stored as a float in <i>seconds</i>, you might want to convert it. /// /// See https://developer.valvesoftware.com/wiki/Server_queries#A2S_PLAYER for more Information /// </summary> /// <returns>A PLayersResponse Object containing the name, score and playtime of each player</returns> public PlayersResponse GetPlayerList() { // open socket if not already open this.GetSocket(); // we don't need the header, so set pointer to where the payload begins this.offset = 5; try { PlayersResponse pr = new PlayersResponse(); // since A2S_PLAYER requests require a valid challenge, get it first byte[] challenge = this.GetChallenge(0x55, true); byte[] request = new byte[challenge.Length + this.FFFFFFFF.Length + 1]; Array.Copy(this.FFFFFFFF, 0, request, 0, this.FFFFFFFF.Length); request[this.FFFFFFFF.Length] = 0x55; Array.Copy(challenge, 0, request, this.FFFFFFFF.Length + 1, challenge.Length); this.socket.Send(request); // MODIFIED BY ZACKBOE // Increased byte size from 1024 in order to receive more player data // Previously returned a socket exception at >~ 51 players. this.raw_data = new byte[2048]; // END MODIFICATION this.socket.Receive(this.raw_data); byte player_count = this.ReadByte(); // fill up the list of players for (int i = 0; i < player_count; i++) { this.ReadByte(); PlayersResponse.Player p = new PlayersResponse.Player(); p.name = this.ReadString(); p.score = this.ReadInt32(); p.playtime = this.ReadFloat(); pr.players.Add(p); } pr.player_count = player_count; return(pr); } catch (SocketException) { return(null); } }
public async Task <ActionResult <PlayersResponse> > GetAllPlayers([FromQuery(Name = "perPage")] int perPage = 0, [FromQuery(Name = "page")] int page = 0) { var players = await _apiService.Get <Player>(perPage, page); if (players == null) { return(NotFound()); } var result = new PlayersResponse(); var playerList = new List <PlayerResponse>(); foreach (var player in players) { playerList.Add(new PlayerResponse( player.Id, player.NbaNetId, player.FirstName, player.LastName, player.DateOfBirth, player.Age, player.HeightMetric, player.HeightFeet, player.HeightInches, player.WeightPounds, player.WeightKilograms, player.CurrentTeam, player.CareerInfo.College, player.CareerInfo.Country, player.CareerInfo.JerseyNumber, player.CareerInfo.YearsPro, player.CareerInfo.Position, player.CareerInfo.DraftYear, player.CareerInfo.DraftRound, player.CareerInfo.DraftPick, player.CareerInfo.DraftTeam )); } result.Players = playerList; var responseInfo = await _apiService.GetEntityInfo <Player>(perPage); result.Meta = new EntityInfo(responseInfo.Item1, responseInfo.Item2); return(result); }
public async Task <ActionResult <PlayersResponse> > GetPlayers(int?start = null, int?count = null) { IQueryable <Player> result = _context.Players .ApplySophisticatedAiAlgorithm() .OrderByDescending(x => x.ExtendNow) .ThenBy(x => x.ExpiryDate) .ThenBy(x => x.Id); result = result.Skip(start.GetValueOrDefault()) .Take(count.GetValueOrDefault()); var response = new PlayersResponse() { TotalCount = await _context.Players.CountAsync(), Players = await result.ToListAsync() }; return(response); }
// MouseUp action on a server row private void ServerGrid_Click(object sender, EventArgs e) { Server server = (Server)ServerGrid.SelectedItem; // Don't want to try to query the fake servers CCG uses as group headings if (!server.Name.StartsWith("---")) { int port = Convert.ToInt32(server.SPort); // Arma2 servers respond to Source server queries SourceServerQuery query = new SourceServerQuery(server.IP, port); ServerInfoResponse sr = query.GetServerInformation(); PlayersResponse pr = query.GetPlayerList(); // Slide out details pane serverDetails.IsOpen = true; // If the server responds with a name, let's go // Actually I don't think this works - the source query lib returns "N/A (Timed out)" instead of null if (sr.name != null) { // Populate the details pane with, ya know, details serverDetails.Header = server.Name; fly_serverName.Content = stripUni(sr.name); fly_serverName.ToolTip = stripUni(sr.name); fly_serverPlayers.Content = "Players: " + sr.players.ToString() + "/" + sr.maxplayers.ToString(); fly_serverIP.Content = server.FullIP; fly_serverVer.Content = "v" + stripUni(sr.version); fly_serverGame.Content = "Gamemode: " + stripUni(sr.game); if (server.Mods != "") { fly_serverMods.Content = "Mods: " + server.Mods; fly_serverMods.ToolTip = server.Mods; } else { fly_serverMods.Visibility = System.Windows.Visibility.Hidden; } // Don't need to show a player list for an empty server if (sr.players > 0) { // Modified SourceQuery Library for larger buffer size. // Previously returned null (SocketException) for >~ 51 players try { fly_playerList.Items.Clear(); fly_playerList.Visibility = System.Windows.Visibility.Visible; foreach (var player in pr.players) { fly_playerList.Items.Add(stripUni(player.name)); } } catch (NullReferenceException ex) { fly_serverPlayers.Content += " (Error Reading Players)"; fly_playerList.Visibility = System.Windows.Visibility.Hidden; } } else { fly_playerList.Visibility = System.Windows.Visibility.Hidden; } } // Again, this probably won't work because query doesn't return null if server doesn't respond else { fly_serverName.Content = "Error querying server, possibly offline."; } } }