新增加载项DataRequest控制分支;变量名优化 (#56)

* 新增加载项DataRequest控制分支;变量名优化

* 线程安全优化

---------

Co-authored-by: milimoe <mili@wrss.org>
This commit is contained in:
yeziuku 2026-04-05 22:47:02 +08:00 committed by GitHub
parent 3d2cf46631
commit 4498a6fbf8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 175 additions and 79 deletions

View File

@ -21,9 +21,9 @@ namespace Milimoe.FunGame.Server.Controller
/// <typeparam name="T"></typeparam>
public class DataRequestController<T> where T : ISocketMessageProcessor
{
public ServerModel<T> Server { get; }
public SQLHelper? SQLHelper => Server.SQLHelper;
public MailSender? MailSender => Server.MailSender;
public ServerModel<T> 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
/// <summary>
/// 数据请求控制器
/// </summary>
/// <param name="server"></param>
public DataRequestController(ServerModel<T> server)
/// <param name="client"></param>
public DataRequestController(ServerModel<T> client)
{
Server = server;
if (SQLHelper != null) Authenticator = new(Server, SQLHelper, MailSender);
Client = client;
if (SQLHelper != null) Authenticator = new(Client, SQLHelper, MailSender);
}
/// <summary>
@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Server.Controller
{
Dictionary<string, object> 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<string>(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<string>(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<User> 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<string, IServerModel> all = Server.Listener.UserList.Cast<IServerModel>().ToDictionary(k => k.User.Username, v => v);
Client.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule);
Client.User.OnlineState = OnlineState.Gaming;
Dictionary<string, IServerModel> all = Client.Listener.UserList.Cast<IServerModel>().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<string>(requestData, "password") ?? "";
string email = DataRequest.GetDictionaryJsonObject<string>(requestData, "email") ?? "";
string verifycode = DataRequest.GetDictionaryJsonObject<string>(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<int>(requestData, "maxUsers");
string newModule = DataRequest.GetDictionaryJsonObject<string>(requestData, "module") ?? "";
string newMap = DataRequest.GetDictionaryJsonObject<string>(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<long>(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<OfferActionType>(requestData, "action");
List<Guid> offerorItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(requestData, "offerorItems") ?? [];
List<Guid> offereeItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(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<long>(requestData, "id");
OfferActionType action = DataRequest.GetDictionaryJsonObject<OfferActionType>(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<string, object> HandleDataRequest_ServerPlugin(Dictionary<string, object> requestData)
{
Dictionary<string, object> result = [];
string fromPlugin = DataRequest.GetDictionaryJsonObject<string>(requestData, SocketSet.AddonDataRequestMark_FromPlugin) ?? "";
string targetPlugin = DataRequest.GetDictionaryJsonObject<string>(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<string, object> 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<string, object> dataServerPlugin = webapi.HandleDataRequest(requestData, args);
foreach (string key in dataServerPlugin.Keys)
{
result[key] = dataServerPlugin[key];
}
}
return result;
}
Dictionary<string, object> dataServerPlugins = FunGameSystem.ServerPluginLoader?.HandleDataRequest(requestData, args) ?? [];
Dictionary<string, object> 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<string, object> HandleDataRequest_GameModuleServer(Dictionary<string, object> requestData)
{
string fromModule = DataRequest.GetDictionaryJsonObject<string>(requestData, SocketSet.AddonDataRequestMark_FromModule) ?? "";
string targetModule = DataRequest.GetDictionaryJsonObject<string>(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
}
}

View File

@ -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);
});

View File

@ -48,9 +48,9 @@ namespace Milimoe.FunGame.Server.Model
protected DataSet _dsUser = new();
protected Guid _checkLoginKey = Guid.Empty;
public ServerModel(ISocketListener<T> server, ISocketMessageProcessor socket, bool isDebugMode)
public ServerModel(ISocketListener<T> listener, ISocketMessageProcessor socket, bool isDebugMode)
{
Listener = server;
Listener = listener;
Socket = socket;
DataRequestController = new(this);
IsDebugMode = isDebugMode;

View File

@ -137,7 +137,7 @@ namespace Milimoe.FunGame.Server.Others
/// <summary>
/// 正在连接的玩家数量
/// </summary>
public static int ConnectingPlayerCount { get; set; } = 0;
public static int ConnectingPlayerCount => Math.Max(0, _connectingPlayerCount);
/// <summary>
/// 默认传输字符集
@ -158,6 +158,36 @@ namespace Milimoe.FunGame.Server.Others
/// 未Loadmodules时此属性表示至少需要安装的模组
/// </summary>
public static string[] GameModuleSupported { get; set; } = [];
/// <summary>
/// 正在连接的玩家数量
/// </summary>
private static int _connectingPlayerCount = 0;
/// <summary>
/// 线程安全的递增正在连接的玩家数量
/// </summary>
/// <returns></returns>
public static int IncrementConnectingPlayerCount()
{
return Interlocked.Increment(ref _connectingPlayerCount);
}
/// <summary>
/// 线程安全的递减正在连接的玩家数量
/// </summary>
/// <returns></returns>
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;
}
}
/// <summary>

View File

@ -69,7 +69,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
public async Task<IActionResult> Login([FromBody] LoginDTO dto)
{
string msg = "服务器暂时无法处理登录请求。";
Config.ConnectingPlayerCount++;
Config.IncrementConnectingPlayerCount();
PayloadModel<DataRequestType> 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);
}

View File

@ -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);
}