using System; using H.Formatters; using H.Pipes; using InABox.Logikal; namespace PRSLogikal { public class LogikalListener : IDisposable { private PipeServer _server; public LogikalServer Server { get; set; } public event LogikalLogEvent Log; public event EventHandler Disconnecting; public LogikalListener() { _server = new PipeServer("$logikal", formatter: new NewtonsoftJsonFormatter()); _server.ClientConnected += async (o, args) => { Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} is now connected!")); }; _server.ClientDisconnected += (o, args) => { Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} disconnected")); }; _server.MessageReceived += (sender, args) => { Log?.Invoke(this, new LogikalLogArguments($@"Client {args.Connection.PipeName} says: {args.Message.Method}: {args.Message.Payload}")); var _request = LogikalRequest.FromMessage(args.Message); if (_request is LogikalConnectRequest _connectrequest) Connect(_connectrequest); if (_request is LogikalLoginRequest _loginrequest) Login(_loginrequest); if (_request is LogikalLogoutRequest _logoutrequest) Logout(_logoutrequest); if (_request is LogikalDisconnectRequest _disconnectrequest) Disconnect(_disconnectrequest); }; _server.ExceptionOccurred += (sender, args) => { Log?.Invoke(this, new LogikalLogArguments($@"Exception: {args.Exception.Message}")); }; } public void Start() => _server.StartAsync(); public void Stop() => _server.StopAsync(); private void Connect(LogikalConnectRequest request) { var _response = new LogikalConnectResponse() { Status = Server.Connect(request.Path) }; _server.WriteAsync(_response.ToMessage()); } private void Disconnect(LogikalDisconnectRequest request) { var _response = new LogikalDisconnectResponse() { Status = Server.Logout() }; _server.WriteAsync(_response.ToMessage()); Disconnecting?.Invoke(this,EventArgs.Empty); } private void Login(LogikalLoginRequest request) { var _response = new LogikalLoginResponse() { Status = Server.Login(request.UserID, request.Password) }; _server.WriteAsync(_response.ToMessage()); } private void Logout(LogikalLogoutRequest request) { var _response = new LogikalLogoutResponse() { Status = Server.Logout() }; _server.WriteAsync(_response.ToMessage()); } public void Dispose() { if (_server != null) _ = _server.DisposeAsync().AsTask(); } } }