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);
}
///
/// 基于本地已连接的Socket创建非标准的数据请求( 或 ,具体类型由 决定)
/// 可以指定 ,以便发送给一个已知的服务器模组或服务器插件
///
///
///
///
///
public DataRequest NewDataRequest(string targetAddon = "", bool longRunning = false)
{
if (Addon is IPlugin)
{
DataRequest request;
if (longRunning)
{
request = NewLongRunningDataRequest(DataRequestType.Addon_Plugin);
}
else
{
request = NewDataRequest(DataRequestType.Addon_Plugin);
}
request.AddRequestData(SocketSet.AddonDataRequestMark_FromPlugin, Addon.Name);
request.AddRequestData(SocketSet.AddonDataRequestMark_TargetPlugin, targetAddon);
return request;
}
else if (Addon is IGameModule)
{
DataRequest request;
if (longRunning)
{
request = NewLongRunningDataRequest(DataRequestType.Addon_Module);
}
else
{
request = NewDataRequest(DataRequestType.Addon_Module);
}
request.AddRequestData(SocketSet.AddonDataRequestMark_FromModule, Addon.Name);
request.AddRequestData(SocketSet.AddonDataRequestMark_TargetModule, targetAddon);
return request;
}
throw new ConnectFailedException();
}
///
/// 基于本地已连接的Socket创建长时间运行的、非标准的数据请求( 或 ,具体类型由 决定)
/// 可以指定 ,以便发送给一个已知的服务器模组或服务器插件
///
///
///
///
public DataRequest NewLongRunningDataRequest(string targetAddon = "") => NewDataRequest(targetAddon, true);
///
/// 新建一个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();
}
}