From 29d661f8a058ebe3d38e37c897553c7aaddb0103 Mon Sep 17 00:00:00 2001 From: milimoe Date: Wed, 5 Mar 2025 23:43:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ConnectController.cs | 136 +++++++++++------- FunGame.Server/Main.cs | 2 +- FunGame.Server/Others/Config.cs | 7 +- FunGame.Server/Utilities/General.cs | 5 +- FunGame.WebAPI/Program.cs | 2 +- 5 files changed, 100 insertions(+), 52 deletions(-) diff --git a/FunGame.Server/Controllers/ConnectController.cs b/FunGame.Server/Controllers/ConnectController.cs index 4e3de9c..949a870 100644 --- a/FunGame.Server/Controllers/ConnectController.cs +++ b/FunGame.Server/Controllers/ConnectController.cs @@ -1,4 +1,5 @@ -using Milimoe.FunGame.Core.Interface.Base; +using System.Text; +using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Others; @@ -24,59 +25,43 @@ namespace Milimoe.FunGame.Server.Controller { bool isConnected = false; bool isDebugMode = false; + objs = objs.Where(o => o.SocketType == SocketMessageType.Connect); foreach (SocketObject obj in objs) { - if (obj.SocketType == SocketMessageType.Connect) + if (Config.ConnectingPlayerCount + Config.OnlinePlayerCount > Config.MaxPlayers) { - if (Config.ConnectingPlayerCount + Config.OnlinePlayerCount > Config.MaxPlayers) - { - await SendRefuseConnect(socket, "服务器可接受的连接数量已上限!"); - ServerHelper.WriteLine("服务器可接受的连接数量已上限!", InvokeMessageType.Core); - return (isConnected, isDebugMode); - } - ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 正在连接服务器 . . .", InvokeMessageType.Core); - if (IsIPBanned(listener, clientip)) - { - await SendRefuseConnect(socket, "服务器已拒绝黑名单用户连接。"); - ServerHelper.WriteLine("检测到 " + ServerHelper.MakeClientName(clientip) + " 为黑名单用户,已禁止其连接!", InvokeMessageType.Core); - return (isConnected, isDebugMode); - } + await SendRefuseConnect(socket, "服务器可接受的连接数量已上限!"); + ServerHelper.WriteLine("服务器可接受的连接数量已上限!", InvokeMessageType.Core); + return (isConnected, isDebugMode); + } + ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 正在连接服务器 . . .", InvokeMessageType.Core); + if (IsIPBanned(listener, clientip)) + { + await SendRefuseConnect(socket, "服务器已拒绝黑名单用户连接。"); + ServerHelper.WriteLine("检测到 " + ServerHelper.MakeClientName(clientip) + " 为黑名单用户,已禁止其连接!", InvokeMessageType.Core); + return (isConnected, isDebugMode); + } - ServerHelper.WriteLine("[" + SocketSet.GetTypeString(obj.SocketType) + "] " + ServerHelper.MakeClientName(socket.ClientIP), InvokeMessageType.Core); + ServerHelper.WriteLine("[" + SocketSet.GetTypeString(obj.SocketType) + "] " + ServerHelper.MakeClientName(socket.ClientIP), InvokeMessageType.Core); - // 读取参数 - // 参数1:客户端的游戏模组列表,没有服务器的需要拒绝 - string[] modes = obj.GetParam(0) ?? []; - // 参数2:客户端是否开启了开发者模式,开启开发者模式部分功能不可用 - isDebugMode = obj.GetParam(1); - if (isDebugMode) ServerHelper.WriteLine("客户端已开启开发者模式"); + // 验证客户端参数 + string msg = OnValidateClientParameters(ref isDebugMode, obj); - string msg = ""; - List ClientDontHave = []; - string strDontHave = string.Join("\r\n", Config.GameModuleSupported.Where(mode => !modes.Contains(mode))); - if (strDontHave != "") - { - strDontHave = "客户端缺少服务器所需的模组:" + strDontHave; - ServerHelper.WriteLine(strDontHave, InvokeMessageType.Core); - msg += strDontHave; - } - - if (msg == "" && await socket.SendAsync(SocketMessageType.Connect, true, msg, token, Config.ServerName, Config.ServerNotice) == SocketResult.Success) - { - isConnected = true; - ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接", InvokeMessageType.Core); - return (isConnected, isDebugMode); - } - else if (msg != "" && await socket.SendAsync(SocketMessageType.Connect, false, msg) == SocketResult.Success) - { - ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "拒绝连接", InvokeMessageType.Core); - return (isConnected, isDebugMode); - } - else - { - ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。", InvokeMessageType.Core); - return (isConnected, isDebugMode); - } + if (msg == "" && await socket.SendAsync(SocketMessageType.Connect, true, msg, token, Config.ServerName, Config.ServerNotice) == SocketResult.Success) + { + isConnected = true; + ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接", InvokeMessageType.Core); + return (isConnected, isDebugMode); + } + else if (msg != "" && await socket.SendAsync(SocketMessageType.Connect, false, msg) == SocketResult.Success) + { + ServerHelper.WriteLine(ServerHelper.MakeClientName(socket.ClientIP) + " <- " + "拒绝连接", InvokeMessageType.Core); + return (isConnected, isDebugMode); + } + else + { + ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。", InvokeMessageType.Core); + return (isConnected, isDebugMode); } } @@ -130,5 +115,60 @@ namespace Milimoe.FunGame.Server.Controller } return false; } + + /// + /// 验证客户端参数事件 + /// + public static event Func? ValidateClientParameters; + + /// + /// 触发验证客户端参数事件 + /// + /// + /// + public static string OnValidateClientParameters(ref bool isDebugMode, SocketObject obj) + { + StringBuilder builder = new(); + + // 先检查 Desktop 参数 + if (Config.UseDesktopParameters) + { + // 参数1:客户端的游戏模组列表,没有服务器的需要拒绝 + if (obj.Parameters.Length > 0) + { + string[] modes = obj.GetParam(0) ?? []; + List ClientDontHave = []; + string strDontHave = string.Join("\r\n", Config.GameModuleSupported.Where(mode => !modes.Contains(mode))); + if (strDontHave != "") + { + strDontHave = "客户端缺少服务器所需的模组:" + strDontHave; + ServerHelper.WriteLine(strDontHave, InvokeMessageType.Core); + builder.AppendLine(strDontHave); + } + } + // 参数2:客户端是否开启了开发者模式,开启开发者模式部分功能不可用 + if (obj.Parameters.Length > 1) + { + isDebugMode = obj.GetParam(1); + if (isDebugMode) ServerHelper.WriteLine("客户端已开启开发者模式"); + } + } + + if (ValidateClientParameters is null) + { + return ""; + } + + foreach (Func handler in ValidateClientParameters.GetInvocationList().Cast>()) + { + string msg = handler(obj); + if (msg != "") + { + builder.AppendLine(msg); + ServerHelper.WriteLine(msg, InvokeMessageType.Error); + } + } + return builder.ToString().Trim(); + } } } diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index 64f6d8f..60b47cb 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -212,7 +212,7 @@ void StartServer() IEnumerable objs = []; while (!objs.Any(o => o.SocketType == SocketMessageType.Connect)) { - objs = objs.Union(await socket.ReceiveAsync()); + objs = await socket.ReceiveAsync(); } (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect)); if (isConnected) diff --git a/FunGame.Server/Others/Config.cs b/FunGame.Server/Others/Config.cs index 104e101..9bffd3d 100644 --- a/FunGame.Server/Others/Config.cs +++ b/FunGame.Server/Others/Config.cs @@ -37,7 +37,7 @@ namespace Milimoe.FunGame.Server.Others }; } } - + /// /// 服务器名称 /// @@ -103,6 +103,11 @@ namespace Milimoe.FunGame.Server.Others /// public static List ServerBannedList { get; set; } = []; + /// + /// 是否使用 FunGame.Desktop 的参数检查 + /// + public static bool UseDesktopParameters { get; set; } = true; + /// /// 最多接受连接的玩家数量 /// diff --git a/FunGame.Server/Utilities/General.cs b/FunGame.Server/Utilities/General.cs index 4afb9aa..0449540 100644 --- a/FunGame.Server/Utilities/General.cs +++ b/FunGame.Server/Utilities/General.cs @@ -155,6 +155,7 @@ namespace Milimoe.FunGame.Server.Utility settings.Add("Key", INIHelper.ReadINI("Server", "Key")); settings.Add("Status", Convert.ToInt32(INIHelper.ReadINI("Server", "Status"))); settings.Add("BannedList", INIHelper.ReadINI("Server", "BannedList")); + settings.Add("UseDesktopParameters", Convert.ToBoolean(INIHelper.ReadINI("Server", "UseDesktopParameters"))); settings.Add("OfficialMail", INIHelper.ReadINI("ServerMail", "OfficialMail")); settings.Add("SupportMail", INIHelper.ReadINI("ServerMail", "SupportMail")); settings.Add("Port", Convert.ToInt32(INIHelper.ReadINI("Socket", "Port"))); @@ -186,13 +187,15 @@ namespace Milimoe.FunGame.Server.Utility string? Notice = (string?)settings["Notice"]; string? Key = (string?)settings["Key"]; string? BannedList = (string?)settings["BannedList"]; + bool? UseDesktopParameters = (bool?)settings["UseDesktopParameters"]; if (Name != null) Config.ServerName = Name; if (Password != null) Config.ServerPassword = Password; if (Description != null) Config.ServerDescription = Description; if (Notice != null) Config.ServerNotice = Notice; if (Key != null) Config.ServerKey = Key; - if (BannedList != null) Config.ServerBannedList = BannedList.Split(',').Select(s => s.Trim()).ToList(); + if (BannedList != null) Config.ServerBannedList = [.. BannedList.Split(',').Select(s => s.Trim())]; + if (UseDesktopParameters != null) Config.UseDesktopParameters = (bool)UseDesktopParameters; string? OfficialMail = (string?)settings["OfficialMail"]; string? SupportMail = (string?)settings["SupportMail"]; diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs index fc4bef6..4c5334d 100644 --- a/FunGame.WebAPI/Program.cs +++ b/FunGame.WebAPI/Program.cs @@ -259,7 +259,7 @@ async Task WebSocketConnectionHandler(HttpContext context) IEnumerable objs = []; while (!objs.Any(o => o.SocketType == SocketMessageType.Connect)) { - objs = objs.Union(await socket.ReceiveAsync()); + objs = await socket.ReceiveAsync(); } (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect)); if (isConnected)