diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs
index 533d75a..6e52621 100644
--- a/FunGame.Server/Controllers/DataRequestController.cs
+++ b/FunGame.Server/Controllers/DataRequestController.cs
@@ -21,9 +21,9 @@ namespace Milimoe.FunGame.Server.Controller
///
public class DataRequestController where T : ISocketMessageProcessor
{
- public ServerModel Server { get; }
- public SQLHelper? SQLHelper => Server.SQLHelper;
- public MailSender? MailSender => Server.MailSender;
+ public ServerModel Client { get; }
+ public SQLHelper? SQLHelper => Client.SQLHelper;
+ public MailSender? MailSender => Client.MailSender;
public Authenticator? Authenticator { get; }
public DataRequestType LastRequest => _lastRequest;
@@ -35,11 +35,11 @@ namespace Milimoe.FunGame.Server.Controller
///
/// 数据请求控制器
///
- ///
- public DataRequestController(ServerModel server)
+ ///
+ public DataRequestController(ServerModel client)
{
- Server = server;
- if (SQLHelper != null) Authenticator = new(Server, SQLHelper, MailSender);
+ Client = client;
+ if (SQLHelper != null) Authenticator = new(Client, SQLHelper, MailSender);
}
///
@@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Server.Controller
{
Dictionary result = [];
_lastRequest = type;
- ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest);
+ ServerHelper.WriteLine(Client.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest);
switch (type)
{
@@ -199,6 +199,14 @@ namespace Milimoe.FunGame.Server.Controller
RespondOffer(data, result);
break;
+ case DataRequestType.Addon_Plugin:
+ result = HandleDataRequest_ServerPlugin(data);
+ break;
+
+ case DataRequestType.Addon_Module:
+ result = HandleDataRequest_GameModuleServer(data);
+ break;
+
default:
break;
}
@@ -230,11 +238,11 @@ namespace Milimoe.FunGame.Server.Controller
msg = DataRequestService.GetPluginCancelString(DataRequestType.RunTime_Logout, eventArgs);
ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning);
}
- else if (Server.IsLoginKey(key))
+ else if (Client.IsLoginKey(key))
{
// 从玩家列表移除
- Server.RemoveUser();
- Server.GetUsersCount();
+ Client.RemoveUser();
+ Client.GetUsersCount();
msg = "你已成功退出登录! ";
}
else eventArgs.Success = false;
@@ -367,7 +375,7 @@ namespace Milimoe.FunGame.Server.Controller
}
else
{
- result = await Server.QuitRoom(roomid, isMaster);
+ result = await Client.QuitRoom(roomid, isMaster);
}
eventArgs.Success = result;
@@ -406,11 +414,11 @@ namespace Milimoe.FunGame.Server.Controller
SQLHelper.ExecuteDataSet(RoomQuery.Select_RoomByRoomId(SQLHelper, roomid));
if (SQLHelper.Success)
{
- FunGameSystem.RoomList.IntoRoom(roomid, Server.User);
- Server.InRoom = room;
- Server.User.OnlineState = OnlineState.InRoom;
- await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0),
- SocketMessageType.Chat, Server.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Server.User.Username + " ] 进入了房间。");
+ FunGameSystem.RoomList.IntoRoom(roomid, Client.User);
+ Client.InRoom = room;
+ Client.User.OnlineState = OnlineState.InRoom;
+ await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0),
+ SocketMessageType.Chat, Client.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Client.User.Username + " ] 进入了房间。");
result = true;
}
else
@@ -482,7 +490,7 @@ namespace Milimoe.FunGame.Server.Controller
if (requestData.Count >= 1)
{
roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1";
- User user = Server.User;
+ User user = Client.User;
if (roomid != "-1" && user.Id != 0 && user.Id != FunGameSystem.RoomList.GetRoomMaster(roomid).Id && !FunGameSystem.RoomList.GetReadyUserList(roomid).Contains(user))
{
@@ -507,7 +515,7 @@ namespace Milimoe.FunGame.Server.Controller
if (requestData.Count >= 1)
{
roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1";
- User user = Server.User;
+ User user = Client.User;
if (roomid != "-1" && user.Id != 0 && user.Id != FunGameSystem.RoomList.GetRoomMaster(roomid).Id && FunGameSystem.RoomList.GetReadyUserList(roomid).Contains(user))
{
@@ -540,8 +548,8 @@ namespace Milimoe.FunGame.Server.Controller
}
else if (msg.Trim() != "")
{
- await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && Server.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0),
- SocketMessageType.Chat, Server.User.Username, msg);
+ await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && Client.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0),
+ SocketMessageType.Chat, Client.User.Username, msg);
}
eventArgs.Success = !eventArgs.Cancel;
@@ -583,8 +591,8 @@ namespace Milimoe.FunGame.Server.Controller
if (_isReadyCheckCD[0] == false)
{
// 提醒玩家准备
- Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Server.User.Username);
- Server.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames);
+ Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Client.User.Username);
+ Client.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames);
_isReadyCheckCD[0] = true;
TaskUtility.RunTimer(() =>
{
@@ -593,7 +601,7 @@ namespace Milimoe.FunGame.Server.Controller
}
else
{
- Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Server.User.Username);
+ Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Client.User.Username);
}
}
else
@@ -601,12 +609,12 @@ namespace Milimoe.FunGame.Server.Controller
List users = FunGameSystem.RoomList.GetUsers(roomid);
if (users.Count < 2)
{
- Server.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Server.User.Username);
+ Client.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Client.User.Username);
}
else
{
usernames = [.. users.Select(user => user.Username)];
- Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames);
+ Client.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames);
StartGame(roomid, users, usernames);
result = true;
}
@@ -615,8 +623,8 @@ namespace Milimoe.FunGame.Server.Controller
else if (_isReadyCheckCD[1] == false)
{
// 提醒房主开始游戏
- Server.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Server.User.Username);
- Server.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username);
+ Client.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Client.User.Username);
+ Client.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username);
_isReadyCheckCD[1] = true;
TaskUtility.RunTimer(() =>
{
@@ -625,7 +633,7 @@ namespace Milimoe.FunGame.Server.Controller
}
else
{
- Server.SendSystemMessage(ShowMessageType.None, "15秒内只能发送一次提醒,请稍后再试。", "", 0, Server.User.Username);
+ Client.SendSystemMessage(ShowMessageType.None, "15秒内只能发送一次提醒,请稍后再试。", "", 0, Client.User.Username);
}
}
@@ -651,20 +659,20 @@ namespace Milimoe.FunGame.Server.Controller
if (FunGameSystem.GameModuleLoader != null && FunGameSystem.GameModuleLoader.ModuleServers.ContainsKey(room.GameModule))
{
room.RoomState = RoomState.Gaming;
- Server.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule);
- Server.User.OnlineState = OnlineState.Gaming;
- Dictionary all = Server.Listener.UserList.Cast().ToDictionary(k => k.User.Username, v => v);
+ Client.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule);
+ Client.User.OnlineState = OnlineState.Gaming;
+ Dictionary all = Client.Listener.UserList.Cast().ToDictionary(k => k.User.Username, v => v);
// 给其他玩家赋值模组服务器
- foreach (IServerModel model in all.Values.Where(s => s.User.Username != Server.User.Username))
+ foreach (IServerModel model in all.Values.Where(s => s.User.Username != Client.User.Username))
{
- model.NowGamingServer = Server.NowGamingServer;
+ model.NowGamingServer = Client.NowGamingServer;
model.User.OnlineState = OnlineState.Gaming;
}
- GamingObject obj = new(room, users, Server, all);
- if (Server.NowGamingServer.StartServer(obj))
+ GamingObject obj = new(room, users, Client, all);
+ if (Client.NowGamingServer.StartServer(obj))
{
- Server.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj);
- foreach (IServerModel serverTask in Server.Listener.UserList.Where(model => usernames.Contains(model.User.Username)))
+ Client.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj);
+ foreach (IServerModel serverTask in Client.Listener.UserList.Where(model => usernames.Contains(model.User.Username)))
{
if (serverTask != null && serverTask.Socket != null)
{
@@ -697,7 +705,7 @@ namespace Milimoe.FunGame.Server.Controller
string password = DataRequest.GetDictionaryJsonObject(requestData, "password") ?? "";
string email = DataRequest.GetDictionaryJsonObject(requestData, "email") ?? "";
string verifycode = DataRequest.GetDictionaryJsonObject(requestData, "verifycode") ?? "";
- (msg, returnType, success) = DataRequestService.Reg(Server, username, password, email, verifycode, Server.Socket?.ClientIP ?? "");
+ (msg, returnType, success) = DataRequestService.Reg(Client, username, password, email, verifycode, Client.Socket?.ClientIP ?? "");
}
else
{
@@ -741,10 +749,10 @@ namespace Milimoe.FunGame.Server.Controller
// CheckLogin的情况
if (key != Guid.Empty)
{
- if (Server.IsLoginKey(key))
+ if (Client.IsLoginKey(key))
{
- await Server.CheckLogin();
- user = Server.User;
+ await Client.CheckLogin();
+ user = Client.User;
}
else
{
@@ -758,7 +766,7 @@ namespace Milimoe.FunGame.Server.Controller
(bool success, DataSet dsUser, msg, key) = DataRequestService.PreLogin(this, username, password, autokey);
if (success)
{
- Server.PreLogin(dsUser, key);
+ Client.PreLogin(dsUser, key);
resultData.Add("key", key);
}
}
@@ -797,7 +805,7 @@ namespace Milimoe.FunGame.Server.Controller
}
if ((DateTime.Now - SendTime).TotalMinutes >= 10)
{
- ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期");
+ ServerHelper.WriteLine(Client.GetClientName() + " 验证码已过期");
msg = "此验证码已过期,请重新找回密码。";
SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email));
}
@@ -847,18 +855,18 @@ namespace Milimoe.FunGame.Server.Controller
string[] To = [email];
if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success)
{
- ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{forgetVerify}");
+ ServerHelper.WriteLine(Client.GetClientName() + $" 已向{email}发送验证码:{forgetVerify}");
msg = "";
}
else
{
- ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码");
+ ServerHelper.WriteLine(Client.GetClientName() + " 无法发送验证码");
ServerHelper.WriteLine(MailSender.ErrorMsg);
}
}
else // 不使用MailSender的情况
{
- ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户");
+ ServerHelper.WriteLine(Client.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户");
msg = "";
}
}
@@ -867,7 +875,7 @@ namespace Milimoe.FunGame.Server.Controller
{
// 发送过验证码且验证码没有过期
string ForgetVerifyCode = (string)dr[ForgetVerifyCodes.Column_ForgetVerifyCode];
- ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}");
+ ServerHelper.WriteLine(Client.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}");
msg = "";
}
}
@@ -896,7 +904,7 @@ namespace Milimoe.FunGame.Server.Controller
int newMaxUsers = DataRequest.GetDictionaryJsonObject(requestData, "maxUsers");
string newModule = DataRequest.GetDictionaryJsonObject(requestData, "module") ?? "";
string newMap = DataRequest.GetDictionaryJsonObject(requestData, "map") ?? "";
- User user = Server.User;
+ User user = Client.User;
if (roomid != "-1" && FunGameSystem.RoomList.Exists(roomid))
{
Room room = FunGameSystem.RoomList[roomid];
@@ -995,7 +1003,7 @@ namespace Milimoe.FunGame.Server.Controller
SQLHelper.UpdateRoomMaster(roomid, newMaster.Id);
if (SQLHelper.Result == SQLResult.Success)
{
- await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && c.InRoom.Roomid == roomid), SocketMessageType.UpdateRoomMaster, room);
+ await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && c.InRoom.Roomid == roomid), SocketMessageType.UpdateRoomMaster, room);
ServerHelper.WriteLine($"[UpdateRoomMaster] RoomID: {roomid} 房主变更: {oldMaster.Username} -> {newMaster.Username}");
}
}
@@ -1024,15 +1032,15 @@ namespace Milimoe.FunGame.Server.Controller
{
_isMatching = true;
if (user.OnlineState == OnlineState.Online) user.OnlineState = OnlineState.Matching;
- ServerHelper.WriteLine(Server.GetClientName() + " 开始匹配。类型:" + RoomSet.GetTypeString(type));
+ ServerHelper.WriteLine(Client.GetClientName() + " 开始匹配。类型:" + RoomSet.GetTypeString(type));
TaskUtility.NewTask(async () =>
{
if (_isMatching)
{
Room room = await MatchingRoom(type, user);
- if (_isMatching && Server.Socket != null)
+ if (_isMatching && Client.Socket != null)
{
- await Server.Send(SocketMessageType.MatchRoom, room);
+ await Client.Send(SocketMessageType.MatchRoom, room);
}
_isMatching = false;
}
@@ -1050,8 +1058,8 @@ namespace Milimoe.FunGame.Server.Controller
{
if (_isMatching)
{
- ServerHelper.WriteLine(Server.GetClientName() + " 取消了匹配。");
- if (Server.User.OnlineState == OnlineState.Matching) Server.User.OnlineState = OnlineState.Online;
+ ServerHelper.WriteLine(Client.GetClientName() + " 取消了匹配。");
+ if (Client.User.OnlineState == OnlineState.Matching) Client.User.OnlineState = OnlineState.Online;
_isMatching = false;
}
}
@@ -1239,7 +1247,7 @@ namespace Milimoe.FunGame.Server.Controller
}
else if (SQLHelper != null)
{
- long userId = Server.User.Id;
+ long userId = Client.User.Id;
if (userId != 0)
{
DataRow? dr = SQLHelper.ExecuteDataRow(UserSignIns.Select_GetUserSignIn(SQLHelper, userId));
@@ -1808,8 +1816,8 @@ namespace Milimoe.FunGame.Server.Controller
if (offer != null)
{
// 检查当前用户是否有权限查看(报价创建者或接收者)允许管理员使用 API 查询报价
- long userId = Server.User.Id;
- if ((apiQuery && Server.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId)
+ long userId = Client.User.Id;
+ if ((apiQuery && Client.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId)
{
resultData.Add("offer", offer);
msg = "";
@@ -1838,7 +1846,7 @@ namespace Milimoe.FunGame.Server.Controller
if (SQLHelper != null && requestData.Count >= 1)
{
long offeree = DataRequest.GetDictionaryJsonObject(requestData, "offeree");
- long offeror = Server.User.Id;
+ long offeror = Client.User.Id;
if (offeror != 0 && offeree != 0 && offeror != offeree)
{
SQLHelper.AddOffer(offeror, offeree);
@@ -1875,7 +1883,7 @@ namespace Milimoe.FunGame.Server.Controller
OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action");
List offerorItems = DataRequest.GetDictionaryJsonObject>(requestData, "offerorItems") ?? [];
List offereeItems = DataRequest.GetDictionaryJsonObject>(requestData, "offereeItems") ?? [];
- long userId = Server.User.Id;
+ long userId = Client.User.Id;
Offer? offer = SQLHelper.GetOffer(offerId);
if (offer != null && (offer.Offeror == userId || offer.Offeree == userId))
@@ -2063,7 +2071,7 @@ namespace Milimoe.FunGame.Server.Controller
{
long offerId = DataRequest.GetDictionaryJsonObject(requestData, "id");
OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action");
- long userId = Server.User.Id;
+ long userId = Client.User.Id;
Offer? offer = SQLHelper.GetOffer(offerId);
if (offer != null && offer.Offeree == userId)
@@ -2181,5 +2189,63 @@ namespace Milimoe.FunGame.Server.Controller
}
#endregion
+
+ #region Addon
+
+ private Dictionary HandleDataRequest_ServerPlugin(Dictionary requestData)
+ {
+ Dictionary result = [];
+ string fromPlugin = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_FromPlugin) ?? "";
+ string targetPlugin = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_TargetPlugin) ?? "";
+ AddonDataRequestEventArgs args = new(Client, fromPlugin, targetPlugin);
+ if (targetPlugin.Trim() != "")
+ {
+ if (FunGameSystem.ServerPluginLoader?.Plugins.TryGetValue(targetPlugin, out ServerPlugin? server) ?? false && server != null)
+ {
+ Dictionary dataServerPlugin = server.HandleDataRequest(requestData, args);
+ foreach (string key in dataServerPlugin.Keys)
+ {
+ result[key] = dataServerPlugin[key];
+ }
+ }
+ if (FunGameSystem.WebAPIPluginLoader?.Plugins.TryGetValue(targetPlugin, out WebAPIPlugin? webapi) ?? false && webapi != null)
+ {
+ Dictionary dataServerPlugin = webapi.HandleDataRequest(requestData, args);
+ foreach (string key in dataServerPlugin.Keys)
+ {
+ result[key] = dataServerPlugin[key];
+ }
+ }
+ return result;
+ }
+ Dictionary dataServerPlugins = FunGameSystem.ServerPluginLoader?.HandleDataRequest(requestData, args) ?? [];
+ Dictionary dataWebAPIPlugins = FunGameSystem.WebAPIPluginLoader?.HandleDataRequest(requestData, args) ?? [];
+ foreach (string key in dataServerPlugins.Keys)
+ {
+ result[key] = dataServerPlugins[key];
+ }
+ foreach (string key in dataWebAPIPlugins.Keys)
+ {
+ result[key] = dataWebAPIPlugins[key];
+ }
+ return result;
+ }
+
+ private Dictionary HandleDataRequest_GameModuleServer(Dictionary requestData)
+ {
+ string fromModule = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_FromModule) ?? "";
+ string targetModule = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_TargetModule) ?? "";
+ AddonDataRequestEventArgs args = new(Client, fromModule, targetModule);
+ if (targetModule.Trim() != "")
+ {
+ if (FunGameSystem.GameModuleLoader?.ModuleServers.TryGetValue(targetModule, out GameModuleServer? server) ?? false && server != null)
+ {
+ return server.HandleDataRequest(requestData, args);
+ }
+ }
+ return FunGameSystem.GameModuleLoader?.HandleDataRequest(requestData, args) ?? [];
+ }
+
+ #endregion
}
}
diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs
index f106fd0..0f341cb 100644
--- a/FunGame.Server/Main.cs
+++ b/FunGame.Server/Main.cs
@@ -164,7 +164,7 @@ void StartServerListening()
TaskUtility.NewTask(async () =>
{
clientip = socket.ClientIP;
- Config.ConnectingPlayerCount++;
+ Config.IncrementConnectingPlayerCount();
bool isConnected = false;
bool isDebugMode = false;
@@ -175,6 +175,7 @@ void StartServerListening()
SocketObject[] objs = socket.Receive();
(isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs);
eventArgs.Success = isConnected;
+ Config.DecrementConnectingPlayerCount();
if (isConnected)
{
eventArgs.ConnectResult = ConnectResult.Success;
@@ -191,13 +192,12 @@ void StartServerListening()
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
}
- Config.ConnectingPlayerCount--;
}).OnError(e =>
{
+ Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
- if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e);
});
@@ -241,7 +241,7 @@ void StartServerListening()
TaskUtility.NewTask(async () =>
{
clientip = socket.ClientIP;
- Config.ConnectingPlayerCount++;
+ Config.IncrementConnectingPlayerCount();
bool isConnected = false;
bool isDebugMode = false;
@@ -256,6 +256,7 @@ void StartServerListening()
}
(isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect));
eventArgs.Success = isConnected;
+ Config.DecrementConnectingPlayerCount();
if (isConnected)
{
eventArgs.ConnectResult = ConnectResult.Success;
@@ -273,13 +274,12 @@ void StartServerListening()
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
await socket.CloseAsync();
}
- Config.ConnectingPlayerCount--;
}).OnError(e =>
{
+ Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
- if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e);
});
diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs
index 59db27e..6239365 100644
--- a/FunGame.Server/Models/ServerModel.cs
+++ b/FunGame.Server/Models/ServerModel.cs
@@ -48,9 +48,9 @@ namespace Milimoe.FunGame.Server.Model
protected DataSet _dsUser = new();
protected Guid _checkLoginKey = Guid.Empty;
- public ServerModel(ISocketListener server, ISocketMessageProcessor socket, bool isDebugMode)
+ public ServerModel(ISocketListener listener, ISocketMessageProcessor socket, bool isDebugMode)
{
- Listener = server;
+ Listener = listener;
Socket = socket;
DataRequestController = new(this);
IsDebugMode = isDebugMode;
diff --git a/FunGame.Server/Others/Config.cs b/FunGame.Server/Others/Config.cs
index f6ce468..5e28820 100644
--- a/FunGame.Server/Others/Config.cs
+++ b/FunGame.Server/Others/Config.cs
@@ -137,7 +137,7 @@ namespace Milimoe.FunGame.Server.Others
///
/// 正在连接的玩家数量
///
- public static int ConnectingPlayerCount { get; set; } = 0;
+ public static int ConnectingPlayerCount => Math.Max(0, _connectingPlayerCount);
///
/// 默认传输字符集
@@ -158,6 +158,36 @@ namespace Milimoe.FunGame.Server.Others
/// 未Loadmodules时,此属性表示至少需要安装的模组
///
public static string[] GameModuleSupported { get; set; } = [];
+
+ ///
+ /// 正在连接的玩家数量
+ ///
+ private static int _connectingPlayerCount = 0;
+
+ ///
+ /// 线程安全的递增正在连接的玩家数量
+ ///
+ ///
+ public static int IncrementConnectingPlayerCount()
+ {
+ return Interlocked.Increment(ref _connectingPlayerCount);
+ }
+
+ ///
+ /// 线程安全的递减正在连接的玩家数量
+ ///
+ ///
+ public static int DecrementConnectingPlayerCount()
+ {
+ int original, newValue;
+ do
+ {
+ original = Volatile.Read(ref _connectingPlayerCount);
+ newValue = Math.Max(0, original - 1);
+ } while (Interlocked.CompareExchange(ref _connectingPlayerCount, newValue, original) != original);
+
+ return newValue;
+ }
}
///
diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs
index 626688d..da3fd5b 100644
--- a/FunGame.WebAPI/Controllers/UserController.cs
+++ b/FunGame.WebAPI/Controllers/UserController.cs
@@ -69,7 +69,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
public async Task Login([FromBody] LoginDTO dto)
{
string msg = "服务器暂时无法处理登录请求。";
- Config.ConnectingPlayerCount++;
+ Config.IncrementConnectingPlayerCount();
PayloadModel response = new()
{
Event = "user_login",
@@ -94,7 +94,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
// 确认登录
await model.CheckLogin();
string token = jwtTokenService.GenerateToken(username);
- Config.ConnectingPlayerCount--;
+ Config.DecrementConnectingPlayerCount();
response.StatusCode = 200;
response.Message = "登录成功!";
response.Data = new()
@@ -107,14 +107,14 @@ namespace Milimoe.FunGame.WebAPI.Controllers
await model.Send(SocketMessageType.Disconnect);
}
- Config.ConnectingPlayerCount--;
+ Config.DecrementConnectingPlayerCount();
response.Message = msg;
response.StatusCode = 401;
return Unauthorized(response);
}
catch (Exception e)
{
- Config.ConnectingPlayerCount--;
+ Config.DecrementConnectingPlayerCount();
logger.LogError("Error: {e}", e);
}
diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs
index b3edaa0..434a572 100644
--- a/FunGame.WebAPI/Program.cs
+++ b/FunGame.WebAPI/Program.cs
@@ -265,7 +265,7 @@ try
await app.StopAsync();
};
- Task order = Task.Factory.StartNew(GetConsoleOrder);
+ Task order = Task.Run(GetConsoleOrder);
otherobjs = [app, listener];
FunGameSystem.OnWebAPIStarted(otherobjs);
@@ -281,7 +281,7 @@ async Task GetConsoleOrder()
{
while (true)
{
- string order = Console.ReadLine() ?? "";
+ string order = await Console.In.ReadLineAsync() ?? "";
ServerHelper.Type();
if (order != "")
{
@@ -320,7 +320,7 @@ async Task WebSocketConnectionHandler(HttpContext context)
Guid token = Guid.NewGuid();
ServerWebSocket socket = new(listener, instance, clientip, clientip, token);
- Config.ConnectingPlayerCount++;
+ Config.IncrementConnectingPlayerCount();
try
{
bool isConnected = false;
@@ -337,6 +337,7 @@ async Task WebSocketConnectionHandler(HttpContext context)
}
(isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect));
eventArgs.Success = isConnected;
+ Config.DecrementConnectingPlayerCount();
if (isConnected)
{
eventArgs.ConnectResult = ConnectResult.Success;
@@ -354,14 +355,13 @@ async Task WebSocketConnectionHandler(HttpContext context)
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
await socket.CloseAsync();
}
- Config.ConnectingPlayerCount--;
}
catch (Exception e)
{
+ Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(context, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(context, eventArgs);
- if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e);
}