diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs b/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs new file mode 100644 index 0000000..64cd4aa --- /dev/null +++ b/src/libnpsharp/Master/Messages/Client/MasterGetServersExtendedMessage.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using log4net; +using NPSharp.Master.Messages.Data; + +namespace NPSharp.Master.Messages.Client +{ + /// + /// Represents a request message for the master server for an extended dedicated server list. + /// + [MasterClientMessage("getserversExt")] + public class MasterGetServersExtendedMessage : MasterClientMessage + { + private static readonly ILog Log; + + static MasterGetServersExtendedMessage() + { + Log = LogManager.GetLogger(typeof (MasterGetServersExtendedMessage)); + } + + protected override string Serialize() + { + // I wonder if an extra useless space char at the end is okay in this case + return string.Format("{0} {1} {2} {3}", Name, GameName, ProtocolVersion, string.Join(" ", Keywords.Select(k => k.ToString()))); + } + + protected override void Deserialize(string[] arguments) + { + GameName = arguments[0]; + ProtocolVersion = uint.Parse(arguments[1]); + foreach (var kw in arguments.Skip(2)) + { + switch (kw.ToLower()) + { + case "empty": + Keywords.Add(MasterGetServersExtendedKeywords.Empty); + break; + case "full": + Keywords.Add(MasterGetServersExtendedKeywords.Full); + break; + case "ipv4": + Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion4); + break; + case "ipv6": + Keywords.Add(MasterGetServersExtendedKeywords.InternetProtocolVersion6); + break; + default: + Log.WarnFormat("{0}: weird keyword {1}", Name, kw); + break; + } + } + } + + /// + /// The game for which servers should be fetched + /// + public string GameName { get; set; } + + /// + /// The protocol version of the dedicated servers to search for + /// + public uint ProtocolVersion { get; set; } + + /// + /// Extra keywords to take care of when generating the server list + /// + public List Keywords { get; set; } + } +} + +namespace NPSharp.Master.Messages.Data +{ + /// + /// Represents keywords for a master server standard serverlist request. + /// + public enum MasterGetServersExtendedKeywords + { + Full = 0x01, + Empty = 0x02, + InternetProtocolVersion4 = 0x04, + InternetProtocolVersion6 = 0x08 + } +} \ No newline at end of file diff --git a/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs b/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs new file mode 100644 index 0000000..98e6612 --- /dev/null +++ b/src/libnpsharp/Master/Messages/Client/MasterGetServersMessage.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using log4net; +using NPSharp.Master.Messages.Data; + +namespace NPSharp.Master.Messages.Client +{ + /// + /// Represents a request message for the master server for a standard dedicated server list. + /// + [MasterClientMessage("getservers")] + public class MasterGetServersMessage : MasterClientMessage + { + private static readonly ILog Log; + + static MasterGetServersMessage() + { + Log = LogManager.GetLogger(typeof (MasterGetServersMessage)); + } + + protected override string Serialize() + { + // I wonder if an extra useless space char at the end is okay in this case + return string.Format("{0} {1} {2} {3}", Name, GameName, ProtocolVersion, string.Join(" ", Keywords.Select(k => k.ToString()))); + } + + protected override void Deserialize(string[] arguments) + { + GameName = arguments[0]; + ProtocolVersion = uint.Parse(arguments[1]); + foreach (var kw in arguments.Skip(2)) + { + switch (kw.ToLower()) + { + case "empty": + Keywords.Add(MasterGetServersKeywords.Empty); + break; + case "full": + Keywords.Add(MasterGetServersKeywords.Full); + break; + default: + Log.WarnFormat("{0}: weird keyword {1}", Name, kw); + break; + } + } + } + + /// + /// The game for which servers should be fetched + /// + public string GameName { get; set; } + + /// + /// The protocol version of the dedicated servers to search for + /// + public uint ProtocolVersion { get; set; } + + /// + /// Extra keywords to take care of when generating the server list + /// + public List Keywords { get; set; } + } +} + +namespace NPSharp.Master.Messages.Data +{ + /// + /// Represents keywords for a master server standard serverlist request. + /// + public enum MasterGetServersKeywords + { + Full = 0x01, + Empty = 0x02 + } +} \ No newline at end of file diff --git a/src/libnpsharp/Master/Messages/MasterClientMessage.cs b/src/libnpsharp/Master/Messages/MasterClientMessage.cs new file mode 100644 index 0000000..0e972ac --- /dev/null +++ b/src/libnpsharp/Master/Messages/MasterClientMessage.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Net.Sockets; +using System.Reflection; +using System.Text; + +namespace NPSharp.Master.Messages +{ + public abstract class MasterClientMessage + { + protected List Properties { get; set; } + + internal MasterClientMessage Deserialize(Socket sock) + { + // TODO + } + + internal byte[] SerializeInternal() + { + var buffer = new List(); + buffer.AddRange(Header); + buffer.AddRange(Encoding.ASCII.GetBytes(Serialize())); + buffer.Add(0x0a); // end of command + return buffer.ToArray(); + } + + protected virtual string Serialize() + { + return Name; + } + + public virtual byte[] Header { get { return new byte[] {0xFF, 0xFF, 0xFF, 0xFF}; } } + + internal string Name + { + get { return GetType().GetCustomAttribute().Name; } + } + + protected abstract void Deserialize(string[] arguments); + } +} diff --git a/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs b/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs new file mode 100644 index 0000000..745fc9b --- /dev/null +++ b/src/libnpsharp/Master/Messages/MasterClientMessageAttribute.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NPSharp.Master.Messages +{ + public class MasterClientMessageAttribute : Attribute + { + public MasterClientMessageAttribute(string name) + { + Name = name; + } + + internal string Name { get; private set; } + } +} diff --git a/src/libnpsharp/libnpsharp.csproj b/src/libnpsharp/libnpsharp.csproj index 9a9e1bf..0a1074f 100644 --- a/src/libnpsharp/libnpsharp.csproj +++ b/src/libnpsharp/libnpsharp.csproj @@ -63,6 +63,10 @@ + + + +