Common networking stuffs
This commit is contained in:
10
Common/IWebSocketHandler.cs
Normal file
10
Common/IWebSocketHandler.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using CommonSocketLibrary.Abstract;
|
||||
|
||||
namespace CommonSocketLibrary.Common
|
||||
{
|
||||
public interface IWebSocketHandler
|
||||
{
|
||||
int OperationCode { get; }
|
||||
Task Execute<Data>(SocketClient<WebSocketMessage> sender, Data data);
|
||||
}
|
||||
}
|
||||
56
Common/WebSocketClient.cs
Normal file
56
Common/WebSocketClient.cs
Normal file
@@ -0,0 +1,56 @@
|
||||
using System.Text.Json;
|
||||
using CommonSocketLibrary.Abstract;
|
||||
using Serilog;
|
||||
|
||||
namespace CommonSocketLibrary.Common
|
||||
{
|
||||
public class WebSocketClient : SocketClient<WebSocketMessage>
|
||||
{
|
||||
private readonly HandlerManager<WebSocketClient, IWebSocketHandler> _handlerManager;
|
||||
private readonly HandlerTypeManager<WebSocketClient, IWebSocketHandler> _handlerTypeManager;
|
||||
|
||||
public WebSocketClient(
|
||||
ILogger logger,
|
||||
HandlerManager<WebSocketClient, IWebSocketHandler> handlerManager,
|
||||
HandlerTypeManager<WebSocketClient, IWebSocketHandler> typeManager,
|
||||
JsonSerializerOptions serializerOptions
|
||||
) : base(logger, serializerOptions)
|
||||
{
|
||||
_handlerManager = handlerManager;
|
||||
_handlerTypeManager = typeManager;
|
||||
}
|
||||
|
||||
protected override WebSocketMessage GenerateMessage<T>(int opcode, T data)
|
||||
{
|
||||
return new WebSocketMessage()
|
||||
{
|
||||
OpCode = opcode,
|
||||
Data = data
|
||||
};
|
||||
}
|
||||
|
||||
protected override async Task OnResponseReceived(WebSocketMessage? data)
|
||||
{
|
||||
if (data == null)
|
||||
return;
|
||||
|
||||
string content = data.Data?.ToString() ?? string.Empty;
|
||||
_logger.Verbose("RX #" + data.OpCode + ": " + content);
|
||||
|
||||
if (!_handlerTypeManager.HandlerTypes.TryGetValue(data.OpCode, out Type? type) || type == null)
|
||||
return;
|
||||
|
||||
var obj = JsonSerializer.Deserialize(content, type, _options);
|
||||
await _handlerManager.Execute(this, data.OpCode, obj);
|
||||
}
|
||||
|
||||
protected override async Task OnMessageSend(int opcode, string? content)
|
||||
{
|
||||
_logger.Verbose("TX #" + opcode + ": " + content);
|
||||
}
|
||||
|
||||
protected override async Task OnConnection()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
23
Common/WebSocketHandlerManager.cs
Normal file
23
Common/WebSocketHandlerManager.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using CommonSocketLibrary.Abstract;
|
||||
using CommonSocketLibrary.Common;
|
||||
using Serilog;
|
||||
|
||||
namespace CommonSocketLibrary.Socket.Manager
|
||||
{
|
||||
public class WebSocketHandlerManager : HandlerManager<WebSocketClient, IWebSocketHandler>
|
||||
{
|
||||
public WebSocketHandlerManager(ILogger logger) : base(logger)
|
||||
{
|
||||
}
|
||||
|
||||
protected void Add(IWebSocketHandler handler)
|
||||
{
|
||||
Add(handler.OperationCode, handler);
|
||||
}
|
||||
|
||||
protected override async Task Execute<T>(WebSocketClient sender, IWebSocketHandler handler, T value)
|
||||
{
|
||||
await handler.Execute(sender, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
26
Common/WebSocketHandlerTypeManager.cs
Normal file
26
Common/WebSocketHandlerTypeManager.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using CommonSocketLibrary.Abstract;
|
||||
using CommonSocketLibrary.Common;
|
||||
using Serilog;
|
||||
|
||||
namespace CommonSocketLibrary.Socket.Manager
|
||||
{
|
||||
public abstract class WebSocketHandlerTypeManager : HandlerTypeManager<WebSocketClient, IWebSocketHandler>
|
||||
{
|
||||
public WebSocketHandlerTypeManager(ILogger logger, HandlerManager<WebSocketClient, IWebSocketHandler> handlers) : base(logger, handlers)
|
||||
{
|
||||
}
|
||||
|
||||
protected override Type? FetchMessageType(Type handlerType)
|
||||
{
|
||||
if (handlerType == null)
|
||||
return null;
|
||||
|
||||
var name = handlerType.Namespace + "." + handlerType.Name;
|
||||
name = name.Replace(".Handlers.", ".Data.")
|
||||
.Replace("Handler", "Message")
|
||||
.Replace("MessageMessage", "Message");
|
||||
|
||||
return handlerType.Assembly.GetType(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
13
Common/WebSocketMessage.cs
Normal file
13
Common/WebSocketMessage.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace CommonSocketLibrary.Common
|
||||
{
|
||||
public class WebSocketMessage
|
||||
{
|
||||
[JsonPropertyName("op")]
|
||||
public int OpCode { get; set; }
|
||||
|
||||
[JsonPropertyName("d")]
|
||||
public object? Data { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user