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();
}