BF2Statistics.Gamespy.MasterClient.PackServerList C# (CSharp) Method

PackServerList() private method

Packs and prepares the response to a Server List request from the clients game.
private PackServerList ( string filter, string fields ) : byte[]
filter string
fields string
return byte[]
        private byte[] PackServerList(string filter, string[] fields)
        {
            // Get the client remote end point
            IPEndPoint remoteEndPoint = (IPEndPoint)Stream.RemoteEndPoint;
            byte[] portBytes = BitConverter.GetBytes((ushort)6500);
            if (BitConverter.IsLittleEndian)
                Array.Reverse(portBytes, 0, portBytes.Length);

            // Prepare response header
            List<byte> data = new List<byte>();
            data.AddRange(remoteEndPoint.Address.GetAddressBytes());
            data.AddRange(portBytes);
            data.Add((byte)fields.Length);
            data.Add(0);

            // Write each field header
            foreach (string field in fields)
            {
                data.AddRange(Encoding.UTF8.GetBytes(field));
                data.AddRange(new byte[] { 0, 0 });
            }

            // Execute query right here in memory
            IQueryable<GameServer> servers = MasterServer.Servers.ToList().Select(x => x.Value).Where(x => x.IsValidated).AsQueryable();
            if (!String.IsNullOrWhiteSpace(filter))
            {
                try
                {
                    // Apply Filter
                    servers = servers.Where(filter);
                }
                catch (Exception e)
                {
                    Program.ErrorLog.Write("NOTICE: [PackServerList.ApplyFilter] Unable to apply server filter, "
                        + e.Message + Environment.NewLine + "\tFilter: " + filter
                    );
                }
            }

            // Add Servers
            foreach (GameServer server in servers)
            {
                // Get port bytes
                portBytes = BitConverter.GetBytes((ushort)server.QueryPort);
                if (BitConverter.IsLittleEndian)
                    Array.Reverse(portBytes, 0, portBytes.Length);

                data.Add(81); // it could be 85 as well, unsure of the difference, but 81 seems more common...
                data.AddRange(server.AddressInfo.Address.GetAddressBytes());
                data.AddRange(portBytes);
                data.Add(255);

                for (int i = 0; i < fields.Length; i++)
                {
                    data.AddRange(Encoding.UTF8.GetBytes(GetField(server, fields[i])));
                    if (i < fields.Length - 1)
                        data.AddRange(new byte[] { 0, 255 }); // Field Seperator
                }

                data.Add(0);
            }

            data.AddRange(new byte[] { 0, 255, 255, 255, 255 });
            return data.ToArray();
        }