using System.Collections; using System.Text; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Model; using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Utility.DataUtility; namespace Milimoe.FunGame.Server.Others { public static class Config { /// /// 服务器名称 /// public static string ServerName { get; set; } = "FunGame Server"; /// /// Socket 端口 /// public static int ServerPort { get; set; } = 22222; /// /// 使用 WebSocket /// public static bool UseWebSocket { get; set; } = false; /// /// WebSocket 监听地址 /// public static string WebSocketAddress { get; set; } = "localhost"; /// /// WebSocket 端口 /// public static int WebSocketPort { get; set; } = 22222; /// /// WebSocket 监听子路径 /// public static string WebSocketSubUrl { get; set; } = "ws"; /// /// WebSocket 开启 SSL /// public static bool WebSocketSSL { get; set; } = false; /// /// 默认状态:1可连接 0不可连接 -1不可用 /// public static int ServerStatus { get; set; } = 1; /// /// 服务器的公告 /// public static string ServerNotice { get; set; } = ""; /// /// 服务器的密码 /// public static string ServerPassword { get; set; } = ""; /// /// 服务器的描述 /// public static string ServerDescription { get; set; } = ""; /// /// 注册社区服务器的Key /// public static string ServerKey { get; set; } = ""; /// /// 禁止连接的黑名单 /// public static List ServerBannedList { get; set; } = []; /// /// 最多接受连接的玩家数量 /// public static int MaxPlayers { get; set; } = 20; /// /// 最大连接失败次数 /// public static int MaxConnectionFaileds { get; set; } = 5; /// /// 已连接的玩家数量 /// public static int OnlinePlayerCount { get; set; } = 0; /// /// 正在连接的玩家数量 /// public static int ConnectingPlayerCount { get; set; } = 0; /// /// 默认传输字符集 /// public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; /// /// FunGame Runtime /// public static FunGameInfo.FunGame FunGameType => FunGameInfo.FunGame.FunGame_Server; /// /// 服务器指令列表 /// public static Hashtable OrderList { get; } = []; /// /// 在线房间列表 /// public static RoomList RoomList { get; } = new(); /// /// 是否运行数据库模式 /// public static SQLMode SQLMode { get; set; } = SQLMode.None; /// /// Server实际安装的模组 /// public static GameModuleLoader? GameModuleLoader { get; set; } /// /// Server插件 /// public static ServerPluginLoader? ServerPluginLoader { get; set; } /// /// Web API插件 /// public static WebAPIPluginLoader? WebAPIPluginLoader { get; set; } /// /// 未Loadmodules时,此属性表示至少需要安装的模组 /// public static string[] GameModuleSupported { get; set; } = []; /// /// 全局数据库连接器 /// public static SQLHelper SQLHelper { get { if (_SQLHelper is null) throw new SQLServiceException(); return _SQLHelper; } } /// /// 全局邮件发送器 /// public static MailSender? MailSender => _MailSender; private static SQLHelper? _SQLHelper; private static MailSender? _MailSender; /// /// 初始化数据库连接器 /// public static void InitSQLHelper() { try { if (INIHelper.ExistINIFile()) { if (INIHelper.ReadINI("MySQL", "UseMySQL").Trim() == "true") { _SQLHelper = new MySQLHelper("", false); if (((MySQLHelper)_SQLHelper).Connection != null) { AfterCreateSQLService(_SQLHelper); } } else if (INIHelper.ReadINI("SQLite", "UseSQLite").Trim() == "true") { _SQLHelper = new SQLiteHelper(); AfterCreateSQLService(_SQLHelper); } else { SQLMode = SQLMode.None; ServerHelper.WriteLine("未开启 SQL 服务,某些请求将无法处理。", InvokeMessageType.Warning); } } } catch (Exception e) { ServerHelper.Error(e); } } /// /// 初始化邮件发送器 /// public static void InitMailSender() { try { _MailSender = SmtpHelper.GetMailSender(); } catch (Exception e) { ServerHelper.Error(e); } if (_MailSender != null) { Singleton.AddOrUpdate(_MailSender); } } public static bool GetGameModuleList() { List supported = []; // 构建AddonController Dictionary delegates = []; delegates.Add("WriteLine", new Action(msg => ServerHelper.WriteLine(msg, InvokeMessageType.GameModule))); delegates.Add("Error", new Action(ServerHelper.Error)); // 读取modules目录下的模组 try { GameModuleLoader = GameModuleLoader.LoadGameModules(FunGameType, delegates); foreach (GameModuleServer module in GameModuleLoader.ModuleServers.Values) { try { bool check = true; // 检查模组是否有相对应的地图 if (!GameModuleLoader.Maps.ContainsKey(module.DefaultMap)) { ServerHelper.WriteLine("GameModule Load Failed: " + module + " 没有找到相对应的地图,加载失败", InvokeMessageType.Error); check = false; } if (check) { supported.Add(module.Name); } } catch (Exception e) { ServerHelper.Error(e); } } } catch (Exception e2) { ServerHelper.Error(e2); } // 设置全局 GameModuleSupported = supported.Distinct().ToArray(); foreach (string modename in GameModuleSupported) { ServerHelper.WriteLine("Loaded: " + modename, InvokeMessageType.GameModule); } return GameModuleSupported.Length > 0; } public static void GetServerPlugins() { Dictionary delegates = []; delegates.Add("WriteLine", new Action(msg => ServerHelper.WriteLine(msg, InvokeMessageType.Plugin))); delegates.Add("Error", new Action(ServerHelper.Error)); try { // 读取plugins目录下的插件 ServerPluginLoader = ServerPluginLoader.LoadPlugins(delegates); foreach (ServerPlugin plugin in ServerPluginLoader.Plugins.Values) { ServerHelper.WriteLine("Loaded: " + plugin.Name, InvokeMessageType.Plugin); } } catch (Exception e) { ServerHelper.Error(e); } } public static void GetWebAPIPlugins() { Dictionary delegates = []; delegates.Add("WriteLine", new Action(msg => ServerHelper.WriteLine(msg, InvokeMessageType.Plugin))); delegates.Add("Error", new Action(ServerHelper.Error)); try { // 读取plugins目录下的插件 WebAPIPluginLoader = WebAPIPluginLoader.LoadPlugins(delegates); foreach (WebAPIPlugin plugin in WebAPIPluginLoader.Plugins.Values) { ServerHelper.WriteLine("Loaded: " + plugin.Name, InvokeMessageType.Plugin); } } catch (Exception e) { ServerHelper.Error(e); } } /// /// 服务器启动登记 /// public static void ServerLogin() { if (SQLMode != SQLMode.None) { SQLHelper.Execute(ServerLoginLogs.Insert_ServerLoginLogs(ServerName, ServerKey)); } } /// /// 重启服务器后,所有房间都会被删除 /// public static void ClearRoomList() { if (SQLMode != SQLMode.None) { SQLHelper.Execute(RoomQuery.Delete_Rooms()); } } public static void AfterCreateSQLService(SQLHelper sqlHelper) { SQLMode = sqlHelper.Mode; Singleton.AddOrUpdate(sqlHelper, true); ServerLogin(); ClearRoomList(); Task t = Task.Run(async () => { while (true) { // 每两小时触发一次SQL服务器的心跳查询,防止SQL服务器掉线 try { await Task.Delay(2 * 1000 * 3600); SQLHelper?.ExecuteDataSet(ServerLoginLogs.Select_GetLastLoginTime()); } catch (Exception e) { ServerHelper.Error(e); } } }); } } /// /// 此服务器的联系邮箱 /// public static class OfficialEmail { public static string Email { get; set; } = ""; public static string SupportEmail { get; set; } = ""; } }