2024-01-12 21:29:46 +02:00
|
|
|
namespace MtClient
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
2024-01-12 23:24:47 +02:00
|
|
|
internal enum MessageType
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
Command = 0,
|
|
|
|
|
Response = 1,
|
|
|
|
|
Event = 2,
|
|
|
|
|
ExpertList = 3,
|
|
|
|
|
ExpertAdded = 4,
|
|
|
|
|
ExpertRemoved = 5,
|
2025-12-05 23:43:27 +02:00
|
|
|
ServiceRequest = 6
|
2024-01-12 21:29:46 +02:00
|
|
|
}
|
|
|
|
|
|
2025-12-05 23:43:27 +02:00
|
|
|
internal enum ServiceRequestType
|
2024-01-12 21:29:46 +02:00
|
|
|
{
|
2025-12-05 23:43:27 +02:00
|
|
|
ExpertList = 0
|
2024-01-04 18:35:15 +02:00
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal abstract class MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
public abstract MessageType MsgType { get; }
|
|
|
|
|
|
|
|
|
|
public string Serialize()
|
|
|
|
|
{
|
|
|
|
|
return $"{(int)MsgType};{GetMessageBody()}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected abstract string GetMessageBody();
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtCommand(int expertHandle, int commandType, int commandId, string payload) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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}";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-12-05 23:43:27 +02:00
|
|
|
internal class MtServiceRequest(ServiceRequestType requestType) : MtMessage
|
2024-01-11 22:52:43 +02:00
|
|
|
{
|
2025-12-05 23:43:27 +02:00
|
|
|
public override MessageType MsgType => MessageType.ServiceRequest;
|
2024-01-11 22:52:43 +02:00
|
|
|
|
|
|
|
|
protected override string GetMessageBody()
|
|
|
|
|
{
|
2025-12-05 23:43:27 +02:00
|
|
|
return $"{(int)ServiceRequestType}";
|
2024-01-11 22:52:43 +02:00
|
|
|
}
|
2024-01-12 21:29:46 +02:00
|
|
|
|
2025-12-05 23:43:27 +02:00
|
|
|
public ServiceRequestType ServiceRequestType { private set; get; } = requestType;
|
2024-01-11 22:52:43 +02:00
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtEvent(int expertHandle, int eventType, string payload) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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))
|
2024-01-12 18:13:32 +02:00
|
|
|
return new MtEvent(expertHandle, eventType, pieces[2]);
|
2024-01-04 18:35:15 +02:00
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtExpertAddedMsg(int expertHandle) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtExpertRemovedMsg(int expertHandle) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtExpertListMsg(HashSet<int> experts) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
public override MessageType MsgType => MessageType.ExpertList;
|
|
|
|
|
|
2024-01-11 22:52:43 +02:00
|
|
|
public HashSet<int> Experts { private set; get; } = experts;
|
2024-01-04 18:35:15 +02:00
|
|
|
|
|
|
|
|
protected override string GetMessageBody()
|
|
|
|
|
{
|
|
|
|
|
throw new NotImplementedException();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static MtMessage? Parse(string payload)
|
|
|
|
|
{
|
|
|
|
|
var pieces = payload.Split(",");
|
2024-01-11 22:52:43 +02:00
|
|
|
HashSet<int> handles = [];
|
2024-01-04 18:35:15 +02:00
|
|
|
foreach (var p in pieces)
|
|
|
|
|
{
|
|
|
|
|
if (int.TryParse(p, out int expertHandle) == false)
|
|
|
|
|
return null;
|
|
|
|
|
handles.Add(expertHandle);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new MtExpertListMsg(handles);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal class MtResponse(int expertHandle, int commandId, string payload) : MtMessage
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-12 23:24:47 +02:00
|
|
|
internal static class MtMessageParser
|
2024-01-04 18:35:15 +02:00
|
|
|
{
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
}
|