using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Addons; using Milimoe.FunGame.Core.Library.SQLScript.Common; namespace Milimoe.FunGame.Core.Controller { /// /// 这个控制器在 Base 的基础上添加了 SQLHelper 和 MailSender /// /// /// /// 新建一个ServerAddonController /// /// /// public class ServerAddonController(IAddon addon, Dictionary delegates) : BaseAddonController(addon, delegates), IServerAddon where T : IAddon { /// /// 数据库连接器 [ 后台长连接仅查询专用,请勿用于事务、更新和新增,对应需求请使用: ] /// public SQLHelper? SQLHelper => _sqlHelper; /// /// 邮件发送器 /// public MailSender? MailSender => _mailSender; private SQLHelper? _sqlHelper = null; private MailSender? _mailSender = null; private Task? _sqlPolling = null; private CancellationTokenSource? _cts = null; /// /// 获取一个可以用来进行事务操作、更新/新增数据的数据库连接器 [ 请使用 using Controller.GetSQLHelper() 来让它能够自动释放 ] /// /// public SQLHelper? GetSQLHelper() { return Factory.OpenFactory.GetSQLHelper(); } /// /// 新建 SQLHelper [ 后台长连接仅查询专用,请勿用于事务、更新和新增,对应需求请使用: ] /// public void NewSQLHelper() { if (_sqlHelper is null) { // 创建持久化 SQLHelper _sqlHelper = Factory.OpenFactory.GetSQLHelper(); if (_sqlHelper != null) { _cts = new(); _sqlPolling = Task.Run(async () => { await Task.Delay(30); while (true) { if (_cts.Token.IsCancellationRequested) { break; } // 每两小时触发一次SQL服务器的心跳查询,防止SQL服务器掉线 try { await Task.Delay(2 * 1000 * 3600, _cts.Token); _sqlHelper?.ExecuteDataSet(ServerLoginLogs.Select_GetLastLoginTime()); } catch (OperationCanceledException) { break; } catch (Exception e) { Error(e); } } }, _cts.Token); } } else { WriteLine("已经创建过 SQLHelper 实例。", Library.Constant.LogLevel.Warning); } } /// /// 新建 MailSender /// public void NewMailSender() { if (_mailSender is null) { _mailSender = Factory.OpenFactory.GetMailSender(); } else { WriteLine("已经创建过 MailSender 实例。", Library.Constant.LogLevel.Warning); } } /// /// 关闭插件的服务 /// public async void Close() { _mailSender?.Dispose(); _mailSender = null; _cts?.Cancel(); if (_sqlPolling != null) { await _sqlPolling; _sqlPolling.Dispose(); _sqlPolling = null; } _cts?.Dispose(); _cts = null; } } }