| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 | using InABox.Clients;using InABox.Core;using System;using System.Collections.Generic;using System.Linq;using System.Net.NetworkInformation;using System.Text;using System.Threading.Tasks;namespace InABox.IPC{    public enum RequestError    {        NONE,        DISCONNECTED,        UNKNOWN,        TIMEOUT    }    public enum Method    {        None,        Query,        Save,        MultiSave,        Delete,        MultiDelete,        QueryMultiple,        Validate,        Check2FA,        Ping,        Info,        Push    }    [Serializable]    public class IPCMessage    {        public Guid RequestID;        public Method Method;        public string? Type;        private string? Data;        private byte[]? BinaryData;        [NonSerialized]        public RequestError ErrorCode;        private IPCMessage(Guid requestID, Method method, string? type, string data, RequestError error = RequestError.NONE)        {            RequestID = requestID;            Method = method;            Type = type;            Data = data;            BinaryData = null;            ErrorCode = error;        }        private IPCMessage(Guid requestID, Method method, string? type, byte[] data, RequestError error = RequestError.NONE)        {            RequestID = requestID;            Method = method;            Type = type;            BinaryData = data;            Data = null;            ErrorCode = error;        }        public IPCMessage Respond<TResponse>(TResponse response) where TResponse : Response        {            return CreateRequest(RequestID, Method.None, Type, response);        }        private static IPCMessage CreateRequest(Guid requestID, Method method, string? type, object? data)        {            if (data is ISerializeBinary binary)            {                return new IPCMessage(requestID, method, type, binary.WriteBinary(BinarySerializationSettings.Latest));            }            {                return new IPCMessage(requestID, method, type, Serialization.Serialize(data));            }        }        public TRequest GetRequest<TRequest>()        {            if (BinaryData is not null)            {                return (TRequest)Serialization.ReadBinary(typeof(TRequest), BinaryData, BinarySerializationSettings.Latest);            }            else            {                return Serialization.Deserialize<TRequest>(Data);            }        }        public object? GetRequest(Type TRequest)        {            if (BinaryData is not null)            {                return Serialization.ReadBinary(TRequest, BinaryData, BinarySerializationSettings.Latest);            }            else if(Data is not null)            {                return Serialization.Deserialize(TRequest, Data);            }            else            {                return null;            }        }        public TResponse GetResponse<TResponse>() where TResponse : Response, new()        {            var start = DateTime.Now;            var response = GetRequest<TResponse>();            response ??= new TResponse();            switch (ErrorCode)            {                case RequestError.NONE:                    break;                case RequestError.DISCONNECTED:                    response.Status = StatusCode.Error;                    response.Messages.Add("Server disconnected");                    break;                case RequestError.UNKNOWN:                    response.Status = StatusCode.Error;                    response.Messages.Add("Unknown Error");                    break;                case RequestError.TIMEOUT:                    response.Status = StatusCode.Error;                    response.Messages.Add("Timeout");                    break;            }            return response;        }        public static IPCMessage Query<T>(QueryRequest<T> request) where T : Entity, new()        {            return CreateRequest(Guid.NewGuid(), Method.Query, typeof(T).Name, request);        }        public static IPCMessage Save<T>(SaveRequest<T> request) where T : Entity, new()        {            return CreateRequest(Guid.NewGuid(), Method.Save, typeof(T).Name, request);        }        public static IPCMessage MultiSave<T>(MultiSaveRequest<T> request) where T : Entity, new()        {            return CreateRequest(Guid.NewGuid(), Method.MultiSave, typeof(T).Name, request);        }        public static IPCMessage Delete<T>(DeleteRequest<T> request) where T : Entity, new()        {            return CreateRequest(Guid.NewGuid(), Method.Delete, typeof(T).Name, request);        }        public static IPCMessage MultiDelete<T>(MultiDeleteRequest<T> request) where T : Entity, new()        {            return CreateRequest(Guid.NewGuid(), Method.MultiDelete, typeof(T).Name, request);        }        public static IPCMessage QueryMultiple(MultiQueryRequest request)        {            return CreateRequest(Guid.NewGuid(), Method.QueryMultiple, null, request);        }        public static IPCMessage Validate(ValidateRequest request)        {            return CreateRequest(Guid.NewGuid(), Method.Validate, null, request);        }        public static IPCMessage Check2FA(Check2FARequest request)        {            return CreateRequest(Guid.NewGuid(), Method.Check2FA, null, request);        }        public static IPCMessage Error(RequestError error)        {            return new IPCMessage(Guid.NewGuid(), Method.None, null, "", error);        }        public static IPCMessage Ping(PingRequest request)        {            return CreateRequest(Guid.NewGuid(), Method.Ping, null, request);        }                public static IPCMessage Info(InfoRequest request)        {            return CreateRequest(Guid.NewGuid(), Method.Info, null, request);        }        public static IPCMessage Push<TPush>(TPush push) where TPush : BaseObject            => Push(typeof(TPush), push);        public static IPCMessage Push(Type TPush, BaseObject push)        {            return CreateRequest(Guid.NewGuid(), Method.Push, TPush.EntityName(), push);        }    }}
 |