using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Interface.Addons; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Controller { /// /// 这个控制器在 Base 的基础上添加了 DataRequest /// /// public class AddonController : BaseAddonController where T : IAddon { /// /// 基于本地已连接的Socket创建新的数据请求 /// private Func MaskMethod_NewDataRequest { get; set; } /// /// 基于本地已连接的Socket创建长时间运行的数据请求 /// private Func MaskMethod_NewLongRunningDataRequest { get; set; } /// /// 基于本地已连接的Socket创建新的局内数据请求 /// private Func MaskMethod_NewGamingRequest { get; set; } /// /// 基于本地已连接的Socket创建长时间运行的局内数据请求 /// private Func MaskMethod_NewLongRunningGamingRequest { get; set; } /// /// 基于本地已连接的Socket创建新的数据请求 /// 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常 /// /// /// /// public DataRequest NewDataRequest(DataRequestType type) { if (typeof(IGameModule).IsAssignableFrom(typeof(T)) || typeof(IGameModuleServer).IsAssignableFrom(typeof(T))) { throw new InvalidNewDataRequestException(); } return MaskMethod_NewDataRequest(type); } /// /// 基于本地已连接的Socket创建长时间运行的数据请求 /// 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常 /// /// /// /// public DataRequest NewLongRunningDataRequest(DataRequestType type) { if (typeof(IGameModule).IsAssignableFrom(typeof(T)) || typeof(IGameModuleServer).IsAssignableFrom(typeof(T))) { throw new InvalidNewDataRequestException(); } return MaskMethod_NewLongRunningDataRequest(type); } /// /// 基于本地已连接的Socket创建新的局内()数据请求 /// 此方法是给 提供的,但是 也能调用 /// 模组服务器调用此方法将抛出异常 /// /// /// /// /// public DataRequest NewDataRequest(GamingType type) { if (typeof(IGameModuleServer).IsAssignableFrom(typeof(T))) { throw new InvalidNewDataRequestException(); } return MaskMethod_NewGamingRequest(type); } /// /// 基于本地已连接的Socket创建长时间运行的局内()数据请求 /// 此方法是给 提供的,但是 也能调用 /// 模组服务器调用此方法将抛出异常 /// /// /// /// /// public DataRequest NewLongRunningDataRequest(GamingType type) { if (typeof(IGameModuleServer).IsAssignableFrom(typeof(T))) { throw new InvalidNewDataRequestException(); } return MaskMethod_NewLongRunningGamingRequest(type); } /// /// 新建一个AddonController /// /// /// public AddonController(IAddon addon, Dictionary delegates) : base(addon, delegates) { if (delegates.TryGetValue("NewDataRequest", out object? value)) MaskMethod_NewDataRequest = value != null ? (Func)value : new(DefaultNewDataRequest); if (delegates.TryGetValue("NewLongRunningDataRequest", out value)) MaskMethod_NewLongRunningDataRequest = value != null ? (Func)value : new(DefaultNewDataRequest); if (delegates.TryGetValue("NewGamingRequest", out value)) MaskMethod_NewGamingRequest = value != null ? (Func)value : new(DefaultNewDataRequest); if (delegates.TryGetValue("NewLongRunningGamingRequest", out value)) MaskMethod_NewLongRunningGamingRequest = value != null ? (Func)value : new(DefaultNewDataRequest); MaskMethod_NewDataRequest ??= new(DefaultNewDataRequest); MaskMethod_NewLongRunningDataRequest ??= new(DefaultNewDataRequest); MaskMethod_NewGamingRequest ??= new(DefaultNewDataRequest); MaskMethod_NewLongRunningGamingRequest ??= new(DefaultNewDataRequest); } private DataRequest DefaultNewDataRequest(DataRequestType type) => throw new InvalidNewDataRequestException(); private DataRequest DefaultNewDataRequest(GamingType type) => throw new InvalidNewDataRequestException(); } }