mirror of
https://github.com/tribufu/ServerManagers
synced 2026-05-06 15:17:34 +00:00
source code checkin
This commit is contained in:
parent
5f8fb2c825
commit
7e57b72e35
675 changed files with 168433 additions and 0 deletions
100
src/QueryMaster/MasterUtil.cs
Normal file
100
src/QueryMaster/MasterUtil.cs
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Net;
|
||||
|
||||
namespace QueryMaster
|
||||
{
|
||||
static class MasterUtil
|
||||
{
|
||||
private static readonly byte Header = 0x31;
|
||||
internal static byte[] BuildPacket(string endPoint, Region region, IpFilter filter)
|
||||
{
|
||||
List<byte> msg = new List<byte>();
|
||||
msg.Add(Header);
|
||||
msg.Add((byte)region);
|
||||
msg.AddRange(Util.StringToBytes(endPoint));
|
||||
msg.Add(0x00);
|
||||
if (filter != null)
|
||||
msg.AddRange(Util.StringToBytes(ProcessFilter(filter)));
|
||||
msg.Add(0x00);
|
||||
return msg.ToArray();
|
||||
}
|
||||
internal static ReadOnlyCollection<IPEndPoint> ProcessPacket(byte[] packet)
|
||||
{
|
||||
Parser parser = new Parser(packet);
|
||||
List<IPEndPoint> endPoints = new List<IPEndPoint>();
|
||||
parser.Skip(6);
|
||||
int counter = 6;
|
||||
string ip = string.Empty; ;
|
||||
int port = 0;
|
||||
while (counter != packet.Length)
|
||||
{
|
||||
ip = parser.ReadByte() + "." + parser.ReadByte() + "." + parser.ReadByte() + "." + parser.ReadByte();
|
||||
byte portByte1 = parser.ReadByte();
|
||||
byte portByte2 = parser.ReadByte();
|
||||
if (BitConverter.IsLittleEndian)
|
||||
{
|
||||
port = BitConverter.ToUInt16(new byte[] { portByte2, portByte1 }, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
port = BitConverter.ToUInt16(new byte[] { portByte1, portByte2 }, 0);
|
||||
}
|
||||
endPoints.Add(new IPEndPoint(IPAddress.Parse(ip), port));
|
||||
counter += 6;
|
||||
}
|
||||
return endPoints.AsReadOnly();
|
||||
|
||||
}
|
||||
internal static string ProcessFilter(IpFilter filter)
|
||||
{
|
||||
StringBuilder filterStr = new StringBuilder();
|
||||
if(filter.IsDedicated)
|
||||
filterStr.Append(@"\type\d");
|
||||
if (filter.IsSecure)
|
||||
filterStr.Append(@"\secure\1");
|
||||
if (!string.IsNullOrEmpty(filter.GameDirectory))
|
||||
filterStr.Append(@"\gamedir\" + filter.GameDirectory);
|
||||
if (!string.IsNullOrEmpty(filter.Map))
|
||||
filterStr.Append(@"\map\" + filter.Map);
|
||||
if (filter.IsLinux)
|
||||
filterStr.Append(@"\linux\1");
|
||||
if (filter.IsNotEmpty)
|
||||
filterStr.Append(@"\empty\1");
|
||||
if (filter.IsNotFull)
|
||||
filterStr.Append(@"\full\1");
|
||||
if (filter.IsProxy)
|
||||
filterStr.Append(@"\proxy\1");
|
||||
if (filter.App != 0)
|
||||
filterStr.Append(@"\appid\" + filter.App);
|
||||
if (filter.NApp != 0)
|
||||
filterStr.Append(@"\napp\" + filter.NApp);
|
||||
if (filter.IsNoPlayers)
|
||||
filterStr.Append(@"\noplayers\1");
|
||||
if (filter.IsWhiteListed)
|
||||
filterStr.Append(@"\white\1");
|
||||
if (!string.IsNullOrEmpty(filter.Sv_Tags))
|
||||
filterStr.Append(@"\gametype\" + filter.Sv_Tags);
|
||||
if (!string.IsNullOrEmpty(filter.GameData))
|
||||
filterStr.Append(@"\gamedata\" + filter.GameData);
|
||||
if (!string.IsNullOrEmpty(filter.GameDataOr))
|
||||
filterStr.Append(@"\gamedataor\" + filter.GameDataOr);
|
||||
|
||||
if (filter.IpAddr != null && filter.IpAddr.Length > 0)
|
||||
{
|
||||
foreach (var ipaddr in filter.IpAddr)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(ipaddr))
|
||||
{
|
||||
filterStr.Append(@"\gameaddr\").Append(ipaddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
//filterStr.Append('\0');
|
||||
return filterStr.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue