using System.Collections; using Milimoe.FunGame.Core.Controller; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Exception; namespace Milimoe.FunGame.Core.Api.Transmittal { /// /// 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用 /// 确保已添加对应的枚举 /// public class DataRequest { /// /// 数据请求结果 /// public RequestResult Result => Worker.Result; /// /// 详细错误信息 /// public string Error => Worker.Error; /// /// 获取ResultData中key值对应的Json字符串 /// -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetResult() -- /// -- 当然也可以自己反序列化 -- /// -- 基本类型可能有效,但仍建议使用反序列化方法 -- /// /// /// public object? this[string key] { get { return Worker.ResultData[key]; } set { AddRequestData(key, value); } } /// /// 私有的实现类 /// private readonly Request Worker; /// /// 基于本地已连接的Socket创建新的数据请求 /// 使用RunTimeModel中的NewDataRequest创建一个新的请求 /// /// /// /// internal DataRequest(Socket Socket, DataRequestType RequestType, bool IsLongRunning = false) { Worker = new(Socket, RequestType, IsLongRunning); } /// /// 添加数据 /// /// /// public void AddRequestData(string key, object? value) { if (Worker.RequestData.ContainsKey(key)) Worker.RequestData[key] = value; else Worker.RequestData.Add(key, value); } /// /// 长时间运行的数据请求需要在使用完毕后自行关闭 /// public void Dispose() { Worker.Dispose(); } /// /// 向服务器发送数据请求 /// /// public RequestResult SendRequest() { Worker.SendRequest(); return Result; } /// /// 异步向服务器发送数据请求 /// /// public async Task SendRequestAsync() { await Worker.SendRequestAsync(); return Result; } /// /// 获取指定key对应的反序列化对象 /// /// /// /// public T? GetResult(string key) { return GetHashtableJsonObject(Worker.ResultData, key); } private class Request : SocketHandlerController { public Hashtable RequestData { get; } = new(); public Hashtable ResultData => _ResultData; public RequestResult Result => _Result; public string Error => _Error; private readonly Socket? Socket; private readonly DataRequestType RequestType; private readonly bool _IsLongRunning; private Hashtable _ResultData = new(); private RequestResult _Result = RequestResult.Missing; private string _Error = ""; public void SendRequest() { try { SetWorking(); if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestData) == SocketResult.Success) { WaitForWorkDone(); } else throw new ConnectFailedException(); } catch (Exception e) { Working = false; _Result = RequestResult.Fail; _Error = e.GetErrorInfo(); } } public async Task SendRequestAsync() { try { SetWorking(); if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestData) == SocketResult.Success) { await WaitForWorkDoneAsync(); } else throw new ConnectFailedException(); } catch (Exception e) { Working = false; _Result = RequestResult.Fail; _Error = e.GetErrorInfo(); } } public Request(Socket? Socket, DataRequestType RequestType, bool IsLongRunning = false) : base(Socket) { this.Socket = Socket; this.RequestType = RequestType; _IsLongRunning = IsLongRunning; } public override void SocketHandler(SocketObject SocketObject) { try { if (SocketObject.SocketType == SocketMessageType.DataRequest) { Work = SocketObject; Working = false; DataRequestType type = SocketObject.GetParam(0); if (type == RequestType) { if (!_IsLongRunning) Dispose(); _ResultData = SocketObject.GetParam(1) ?? new(); _Result = RequestResult.Success; } } } catch (Exception e) { Working = false; _Result = RequestResult.Fail; _Error = e.GetErrorInfo(); } } } /// /// 反序列化Hashtable中的Json对象 /// /// /// /// /// public static T? GetHashtableJsonObject(Hashtable hashtable, string key) { return Service.JsonManager.GetObject(hashtable, key); } } }