mirror of
https://github.com/vdemydiuk/mtapi.git
synced 2026-07-27 18:47:55 +00:00
199 lines
6.2 KiB
C#
Executable File
199 lines
6.2 KiB
C#
Executable File
namespace MtClient
|
|
{
|
|
internal enum MessageType
|
|
{
|
|
Command = 0,
|
|
Response = 1,
|
|
Event = 2,
|
|
ExpertList = 3,
|
|
ExpertAdded = 4,
|
|
ExpertRemoved = 5,
|
|
ServiceRequest = 6
|
|
}
|
|
|
|
internal enum ServiceRequestType
|
|
{
|
|
ExpertList = 0
|
|
}
|
|
|
|
internal abstract class MtMessage
|
|
{
|
|
public abstract MessageType MsgType { get; }
|
|
|
|
public string Serialize()
|
|
{
|
|
return $"{(int)MsgType};{GetMessageBody()}";
|
|
}
|
|
|
|
protected abstract string GetMessageBody();
|
|
}
|
|
|
|
internal class MtCommand(int expertHandle, int commandType, int commandId, string payload) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.Command;
|
|
|
|
public int ExpertHandle { private set; get; } = expertHandle;
|
|
public int CommandType { private set; get; } = commandType;
|
|
public int CommandId { private set; get; } = commandId;
|
|
public string Payload { private set; get; } = payload;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
return $"{ExpertHandle};{CommandId};{CommandType};{Payload}";
|
|
}
|
|
}
|
|
|
|
internal class MtServiceRequest(ServiceRequestType requestType) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.ServiceRequest;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
return $"{(int)ServiceRequestType}";
|
|
}
|
|
|
|
public ServiceRequestType ServiceRequestType { private set; get; } = requestType;
|
|
}
|
|
|
|
internal class MtEvent(int expertHandle, int eventType, string payload) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.Event;
|
|
|
|
public int ExpertHandle { private set; get; } = expertHandle;
|
|
public int EventType { private set; get; } = eventType;
|
|
public string Payload { private set; get; } = payload;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
{
|
|
var pieces = payload.Split(";", 3);
|
|
if (pieces.Length == 3
|
|
&& int.TryParse(pieces[0], out int expertHandle)
|
|
&& int.TryParse(pieces[1], out int eventType))
|
|
return new MtEvent(expertHandle, eventType, pieces[2]);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
internal class MtExpertAddedMsg(int expertHandle) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.ExpertAdded;
|
|
|
|
public int ExpertHandle { private set; get; } = expertHandle;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
{
|
|
if (int.TryParse(payload, out int expertHandle) == false)
|
|
return null;
|
|
|
|
return new MtExpertAddedMsg(expertHandle);
|
|
}
|
|
}
|
|
|
|
internal class MtExpertRemovedMsg(int expertHandle) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.ExpertRemoved;
|
|
|
|
public int ExpertHandle { private set; get; } = expertHandle;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
{
|
|
if (int.TryParse(payload, out int expertHandle) == false)
|
|
return null;
|
|
|
|
return new MtExpertRemovedMsg(expertHandle);
|
|
}
|
|
}
|
|
|
|
internal class MtExpertListMsg(HashSet<int> experts) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.ExpertList;
|
|
|
|
public HashSet<int> Experts { private set; get; } = experts;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
{
|
|
var pieces = payload.Split(",");
|
|
HashSet<int> handles = [];
|
|
foreach (var p in pieces)
|
|
{
|
|
if (int.TryParse(p, out int expertHandle) == false)
|
|
return null;
|
|
handles.Add(expertHandle);
|
|
}
|
|
|
|
return new MtExpertListMsg(handles);
|
|
}
|
|
}
|
|
|
|
internal class MtResponse(int expertHandle, int commandId, string payload) : MtMessage
|
|
{
|
|
public override MessageType MsgType => MessageType.Response;
|
|
|
|
public int ExpertHandle { private set; get; } = expertHandle;
|
|
public int CommandId { private set; get; } = commandId;
|
|
public string Payload { private set; get; } = payload;
|
|
|
|
protected override string GetMessageBody()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
{
|
|
var pieces = payload.Split(";", 3);
|
|
if (pieces.Length != 3
|
|
|| string.IsNullOrEmpty(pieces[0])
|
|
|| string.IsNullOrEmpty(pieces[1])
|
|
|| string.IsNullOrEmpty(pieces[2]))
|
|
return null;
|
|
|
|
if (int.TryParse(pieces[0], out int expertHandle) == false)
|
|
return null;
|
|
|
|
if (int.TryParse(pieces[1], out int commandId) == false)
|
|
return null;
|
|
|
|
return new MtResponse(expertHandle, commandId, pieces[2]);
|
|
}
|
|
}
|
|
|
|
internal static class MtMessageParser
|
|
{
|
|
static MtMessageParser()
|
|
{
|
|
msgHandlers_[MessageType.Event] = MtEvent.Parse;
|
|
msgHandlers_[MessageType.Response] = MtResponse.Parse;
|
|
msgHandlers_[MessageType.ExpertList] = MtExpertListMsg.Parse;
|
|
msgHandlers_[MessageType.ExpertAdded] = MtExpertAddedMsg.Parse;
|
|
msgHandlers_[MessageType.ExpertRemoved] = MtExpertRemovedMsg.Parse;
|
|
}
|
|
|
|
public static MtMessage? Parse(MessageType msgType, string payload)
|
|
{
|
|
return msgHandlers_[msgType](payload);
|
|
}
|
|
|
|
private static readonly Dictionary<MessageType, Func<string, MtMessage?>> msgHandlers_ = new();
|
|
}
|
|
}
|