/// <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);
        }
    }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        // 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.";
                }
            }
        }