新增加载项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> /// <typeparam name="T"></typeparam>
public class DataRequestController<T> where T : ISocketMessageProcessor public class DataRequestController<T> where T : ISocketMessageProcessor
{ {
public ServerModel<T> Server { get; } public ServerModel<T> Client { get; }
public SQLHelper? SQLHelper => Server.SQLHelper; public SQLHelper? SQLHelper => Client.SQLHelper;
public MailSender? MailSender => Server.MailSender; public MailSender? MailSender => Client.MailSender;
public Authenticator? Authenticator { get; } public Authenticator? Authenticator { get; }
public DataRequestType LastRequest => _lastRequest; public DataRequestType LastRequest => _lastRequest;
@ -35,11 +35,11 @@ namespace Milimoe.FunGame.Server.Controller
/// <summary> /// <summary>
/// 数据请求控制器 /// 数据请求控制器
/// </summary> /// </summary>
/// <param name="server"></param> /// <param name="client"></param>
public DataRequestController(ServerModel<T> server) public DataRequestController(ServerModel<T> client)
{ {
Server = server; Client = client;
if (SQLHelper != null) Authenticator = new(Server, SQLHelper, MailSender); if (SQLHelper != null) Authenticator = new(Client, SQLHelper, MailSender);
} }
/// <summary> /// <summary>
@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Server.Controller
{ {
Dictionary<string, object> result = []; Dictionary<string, object> result = [];
_lastRequest = type; _lastRequest = type;
ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); ServerHelper.WriteLine(Client.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest);
switch (type) switch (type)
{ {
@ -199,6 +199,14 @@ namespace Milimoe.FunGame.Server.Controller
RespondOffer(data, result); RespondOffer(data, result);
break; break;
case DataRequestType.Addon_Plugin:
result = HandleDataRequest_ServerPlugin(data);
break;
case DataRequestType.Addon_Module:
result = HandleDataRequest_GameModuleServer(data);
break;
default: default:
break; break;
} }
@ -230,11 +238,11 @@ namespace Milimoe.FunGame.Server.Controller
msg = DataRequestService.GetPluginCancelString(DataRequestType.RunTime_Logout, eventArgs); msg = DataRequestService.GetPluginCancelString(DataRequestType.RunTime_Logout, eventArgs);
ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning); ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning);
} }
else if (Server.IsLoginKey(key)) else if (Client.IsLoginKey(key))
{ {
// 从玩家列表移除 // 从玩家列表移除
Server.RemoveUser(); Client.RemoveUser();
Server.GetUsersCount(); Client.GetUsersCount();
msg = "你已成功退出登录! "; msg = "你已成功退出登录! ";
} }
else eventArgs.Success = false; else eventArgs.Success = false;
@ -367,7 +375,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
else else
{ {
result = await Server.QuitRoom(roomid, isMaster); result = await Client.QuitRoom(roomid, isMaster);
} }
eventArgs.Success = result; eventArgs.Success = result;
@ -406,11 +414,11 @@ namespace Milimoe.FunGame.Server.Controller
SQLHelper.ExecuteDataSet(RoomQuery.Select_RoomByRoomId(SQLHelper, roomid)); SQLHelper.ExecuteDataSet(RoomQuery.Select_RoomByRoomId(SQLHelper, roomid));
if (SQLHelper.Success) if (SQLHelper.Success)
{ {
FunGameSystem.RoomList.IntoRoom(roomid, Server.User); FunGameSystem.RoomList.IntoRoom(roomid, Client.User);
Server.InRoom = room; Client.InRoom = room;
Server.User.OnlineState = OnlineState.InRoom; Client.User.OnlineState = OnlineState.InRoom;
await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0), await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0),
SocketMessageType.Chat, Server.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Server.User.Username + " ] 进入了房间。"); SocketMessageType.Chat, Client.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Client.User.Username + " ] 进入了房间。");
result = true; result = true;
} }
else else
@ -482,7 +490,7 @@ namespace Milimoe.FunGame.Server.Controller
if (requestData.Count >= 1) if (requestData.Count >= 1)
{ {
roomid = DataRequest.GetDictionaryJsonObject<string>(requestData, "roomid") ?? "-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)) 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) if (requestData.Count >= 1)
{ {
roomid = DataRequest.GetDictionaryJsonObject<string>(requestData, "roomid") ?? "-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)) 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() != "") else if (msg.Trim() != "")
{ {
await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && Server.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0), await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && Client.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0),
SocketMessageType.Chat, Server.User.Username, msg); SocketMessageType.Chat, Client.User.Username, msg);
} }
eventArgs.Success = !eventArgs.Cancel; eventArgs.Success = !eventArgs.Cancel;
@ -583,8 +591,8 @@ namespace Milimoe.FunGame.Server.Controller
if (_isReadyCheckCD[0] == false) if (_isReadyCheckCD[0] == false)
{ {
// 提醒玩家准备 // 提醒玩家准备
Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Server.User.Username); Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Client.User.Username);
Server.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames); Client.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames);
_isReadyCheckCD[0] = true; _isReadyCheckCD[0] = true;
TaskUtility.RunTimer(() => TaskUtility.RunTimer(() =>
{ {
@ -593,7 +601,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
else else
{ {
Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Server.User.Username); Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Client.User.Username);
} }
} }
else else
@ -601,12 +609,12 @@ namespace Milimoe.FunGame.Server.Controller
List<User> users = FunGameSystem.RoomList.GetUsers(roomid); List<User> users = FunGameSystem.RoomList.GetUsers(roomid);
if (users.Count < 2) if (users.Count < 2)
{ {
Server.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Server.User.Username); Client.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Client.User.Username);
} }
else else
{ {
usernames = [.. users.Select(user => user.Username)]; usernames = [.. users.Select(user => user.Username)];
Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备游戏将在10秒后开始。", "", 0, usernames); Client.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备游戏将在10秒后开始。", "", 0, usernames);
StartGame(roomid, users, usernames); StartGame(roomid, users, usernames);
result = true; result = true;
} }
@ -615,8 +623,8 @@ namespace Milimoe.FunGame.Server.Controller
else if (_isReadyCheckCD[1] == false) else if (_isReadyCheckCD[1] == false)
{ {
// 提醒房主开始游戏 // 提醒房主开始游戏
Server.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Server.User.Username); Client.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Client.User.Username);
Server.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username); Client.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username);
_isReadyCheckCD[1] = true; _isReadyCheckCD[1] = true;
TaskUtility.RunTimer(() => TaskUtility.RunTimer(() =>
{ {
@ -625,7 +633,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
else 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)) if (FunGameSystem.GameModuleLoader != null && FunGameSystem.GameModuleLoader.ModuleServers.ContainsKey(room.GameModule))
{ {
room.RoomState = RoomState.Gaming; room.RoomState = RoomState.Gaming;
Server.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule); Client.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule);
Server.User.OnlineState = OnlineState.Gaming; Client.User.OnlineState = OnlineState.Gaming;
Dictionary<string, IServerModel> all = Server.Listener.UserList.Cast<IServerModel>().ToDictionary(k => k.User.Username, v => v); 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; model.User.OnlineState = OnlineState.Gaming;
} }
GamingObject obj = new(room, users, Server, all); GamingObject obj = new(room, users, Client, all);
if (Server.NowGamingServer.StartServer(obj)) if (Client.NowGamingServer.StartServer(obj))
{ {
Server.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj); Client.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj);
foreach (IServerModel serverTask in Server.Listener.UserList.Where(model => usernames.Contains(model.User.Username))) foreach (IServerModel serverTask in Client.Listener.UserList.Where(model => usernames.Contains(model.User.Username)))
{ {
if (serverTask != null && serverTask.Socket != null) if (serverTask != null && serverTask.Socket != null)
{ {
@ -697,7 +705,7 @@ namespace Milimoe.FunGame.Server.Controller
string password = DataRequest.GetDictionaryJsonObject<string>(requestData, "password") ?? ""; string password = DataRequest.GetDictionaryJsonObject<string>(requestData, "password") ?? "";
string email = DataRequest.GetDictionaryJsonObject<string>(requestData, "email") ?? ""; string email = DataRequest.GetDictionaryJsonObject<string>(requestData, "email") ?? "";
string verifycode = DataRequest.GetDictionaryJsonObject<string>(requestData, "verifycode") ?? ""; 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 else
{ {
@ -741,10 +749,10 @@ namespace Milimoe.FunGame.Server.Controller
// CheckLogin的情况 // CheckLogin的情况
if (key != Guid.Empty) if (key != Guid.Empty)
{ {
if (Server.IsLoginKey(key)) if (Client.IsLoginKey(key))
{ {
await Server.CheckLogin(); await Client.CheckLogin();
user = Server.User; user = Client.User;
} }
else else
{ {
@ -758,7 +766,7 @@ namespace Milimoe.FunGame.Server.Controller
(bool success, DataSet dsUser, msg, key) = DataRequestService.PreLogin(this, username, password, autokey); (bool success, DataSet dsUser, msg, key) = DataRequestService.PreLogin(this, username, password, autokey);
if (success) if (success)
{ {
Server.PreLogin(dsUser, key); Client.PreLogin(dsUser, key);
resultData.Add("key", key); resultData.Add("key", key);
} }
} }
@ -797,7 +805,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
if ((DateTime.Now - SendTime).TotalMinutes >= 10) if ((DateTime.Now - SendTime).TotalMinutes >= 10)
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); ServerHelper.WriteLine(Client.GetClientName() + " 验证码已过期");
msg = "此验证码已过期,请重新找回密码。"; msg = "此验证码已过期,请重新找回密码。";
SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email));
} }
@ -847,18 +855,18 @@ namespace Milimoe.FunGame.Server.Controller
string[] To = [email]; string[] To = [email];
if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) 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 = ""; msg = "";
} }
else else
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码"); ServerHelper.WriteLine(Client.GetClientName() + " 无法发送验证码");
ServerHelper.WriteLine(MailSender.ErrorMsg); ServerHelper.WriteLine(MailSender.ErrorMsg);
} }
} }
else // 不使用MailSender的情况 else // 不使用MailSender的情况
{ {
ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户"); ServerHelper.WriteLine(Client.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户");
msg = ""; msg = "";
} }
} }
@ -867,7 +875,7 @@ namespace Milimoe.FunGame.Server.Controller
{ {
// 发送过验证码且验证码没有过期 // 发送过验证码且验证码没有过期
string ForgetVerifyCode = (string)dr[ForgetVerifyCodes.Column_ForgetVerifyCode]; string ForgetVerifyCode = (string)dr[ForgetVerifyCodes.Column_ForgetVerifyCode];
ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}"); ServerHelper.WriteLine(Client.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}");
msg = ""; msg = "";
} }
} }
@ -896,7 +904,7 @@ namespace Milimoe.FunGame.Server.Controller
int newMaxUsers = DataRequest.GetDictionaryJsonObject<int>(requestData, "maxUsers"); int newMaxUsers = DataRequest.GetDictionaryJsonObject<int>(requestData, "maxUsers");
string newModule = DataRequest.GetDictionaryJsonObject<string>(requestData, "module") ?? ""; string newModule = DataRequest.GetDictionaryJsonObject<string>(requestData, "module") ?? "";
string newMap = DataRequest.GetDictionaryJsonObject<string>(requestData, "map") ?? ""; string newMap = DataRequest.GetDictionaryJsonObject<string>(requestData, "map") ?? "";
User user = Server.User; User user = Client.User;
if (roomid != "-1" && FunGameSystem.RoomList.Exists(roomid)) if (roomid != "-1" && FunGameSystem.RoomList.Exists(roomid))
{ {
Room room = FunGameSystem.RoomList[roomid]; Room room = FunGameSystem.RoomList[roomid];
@ -995,7 +1003,7 @@ namespace Milimoe.FunGame.Server.Controller
SQLHelper.UpdateRoomMaster(roomid, newMaster.Id); SQLHelper.UpdateRoomMaster(roomid, newMaster.Id);
if (SQLHelper.Result == SQLResult.Success) 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}"); ServerHelper.WriteLine($"[UpdateRoomMaster] RoomID: {roomid} 房主变更: {oldMaster.Username} -> {newMaster.Username}");
} }
} }
@ -1024,15 +1032,15 @@ namespace Milimoe.FunGame.Server.Controller
{ {
_isMatching = true; _isMatching = true;
if (user.OnlineState == OnlineState.Online) user.OnlineState = OnlineState.Matching; 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 () => TaskUtility.NewTask(async () =>
{ {
if (_isMatching) if (_isMatching)
{ {
Room room = await MatchingRoom(type, user); 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; _isMatching = false;
} }
@ -1050,8 +1058,8 @@ namespace Milimoe.FunGame.Server.Controller
{ {
if (_isMatching) if (_isMatching)
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 取消了匹配。"); ServerHelper.WriteLine(Client.GetClientName() + " 取消了匹配。");
if (Server.User.OnlineState == OnlineState.Matching) Server.User.OnlineState = OnlineState.Online; if (Client.User.OnlineState == OnlineState.Matching) Client.User.OnlineState = OnlineState.Online;
_isMatching = false; _isMatching = false;
} }
} }
@ -1239,7 +1247,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
else if (SQLHelper != null) else if (SQLHelper != null)
{ {
long userId = Server.User.Id; long userId = Client.User.Id;
if (userId != 0) if (userId != 0)
{ {
DataRow? dr = SQLHelper.ExecuteDataRow(UserSignIns.Select_GetUserSignIn(SQLHelper, userId)); DataRow? dr = SQLHelper.ExecuteDataRow(UserSignIns.Select_GetUserSignIn(SQLHelper, userId));
@ -1808,8 +1816,8 @@ namespace Milimoe.FunGame.Server.Controller
if (offer != null) if (offer != null)
{ {
// 检查当前用户是否有权限查看(报价创建者或接收者)允许管理员使用 API 查询报价 // 检查当前用户是否有权限查看(报价创建者或接收者)允许管理员使用 API 查询报价
long userId = Server.User.Id; long userId = Client.User.Id;
if ((apiQuery && Server.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId) if ((apiQuery && Client.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId)
{ {
resultData.Add("offer", offer); resultData.Add("offer", offer);
msg = ""; msg = "";
@ -1838,7 +1846,7 @@ namespace Milimoe.FunGame.Server.Controller
if (SQLHelper != null && requestData.Count >= 1) if (SQLHelper != null && requestData.Count >= 1)
{ {
long offeree = DataRequest.GetDictionaryJsonObject<long>(requestData, "offeree"); long offeree = DataRequest.GetDictionaryJsonObject<long>(requestData, "offeree");
long offeror = Server.User.Id; long offeror = Client.User.Id;
if (offeror != 0 && offeree != 0 && offeror != offeree) if (offeror != 0 && offeree != 0 && offeror != offeree)
{ {
SQLHelper.AddOffer(offeror, offeree); SQLHelper.AddOffer(offeror, offeree);
@ -1875,7 +1883,7 @@ namespace Milimoe.FunGame.Server.Controller
OfferActionType action = DataRequest.GetDictionaryJsonObject<OfferActionType>(requestData, "action"); OfferActionType action = DataRequest.GetDictionaryJsonObject<OfferActionType>(requestData, "action");
List<Guid> offerorItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(requestData, "offerorItems") ?? []; List<Guid> offerorItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(requestData, "offerorItems") ?? [];
List<Guid> offereeItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(requestData, "offereeItems") ?? []; List<Guid> offereeItems = DataRequest.GetDictionaryJsonObject<List<Guid>>(requestData, "offereeItems") ?? [];
long userId = Server.User.Id; long userId = Client.User.Id;
Offer? offer = SQLHelper.GetOffer(offerId); Offer? offer = SQLHelper.GetOffer(offerId);
if (offer != null && (offer.Offeror == userId || offer.Offeree == userId)) 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"); long offerId = DataRequest.GetDictionaryJsonObject<long>(requestData, "id");
OfferActionType action = DataRequest.GetDictionaryJsonObject<OfferActionType>(requestData, "action"); OfferActionType action = DataRequest.GetDictionaryJsonObject<OfferActionType>(requestData, "action");
long userId = Server.User.Id; long userId = Client.User.Id;
Offer? offer = SQLHelper.GetOffer(offerId); Offer? offer = SQLHelper.GetOffer(offerId);
if (offer != null && offer.Offeree == userId) if (offer != null && offer.Offeree == userId)
@ -2181,5 +2189,63 @@ namespace Milimoe.FunGame.Server.Controller
} }
#endregion #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 () => TaskUtility.NewTask(async () =>
{ {
clientip = socket.ClientIP; clientip = socket.ClientIP;
Config.ConnectingPlayerCount++; Config.IncrementConnectingPlayerCount();
bool isConnected = false; bool isConnected = false;
bool isDebugMode = false; bool isDebugMode = false;
@ -175,6 +175,7 @@ void StartServerListening()
SocketObject[] objs = socket.Receive(); SocketObject[] objs = socket.Receive();
(isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs); (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs);
eventArgs.Success = isConnected; eventArgs.Success = isConnected;
Config.DecrementConnectingPlayerCount();
if (isConnected) if (isConnected)
{ {
eventArgs.ConnectResult = ConnectResult.Success; eventArgs.ConnectResult = ConnectResult.Success;
@ -191,13 +192,12 @@ void StartServerListening()
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
} }
Config.ConnectingPlayerCount--;
}).OnError(e => }).OnError(e =>
{ {
Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e); ServerHelper.Error(e);
}); });
@ -241,7 +241,7 @@ void StartServerListening()
TaskUtility.NewTask(async () => TaskUtility.NewTask(async () =>
{ {
clientip = socket.ClientIP; clientip = socket.ClientIP;
Config.ConnectingPlayerCount++; Config.IncrementConnectingPlayerCount();
bool isConnected = false; bool isConnected = false;
bool isDebugMode = 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)); (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect));
eventArgs.Success = isConnected; eventArgs.Success = isConnected;
Config.DecrementConnectingPlayerCount();
if (isConnected) if (isConnected)
{ {
eventArgs.ConnectResult = ConnectResult.Success; eventArgs.ConnectResult = ConnectResult.Success;
@ -273,13 +274,12 @@ void StartServerListening()
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
await socket.CloseAsync(); await socket.CloseAsync();
} }
Config.ConnectingPlayerCount--;
}).OnError(e => }).OnError(e =>
{ {
Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs);
if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e); ServerHelper.Error(e);
}); });

View File

@ -48,9 +48,9 @@ namespace Milimoe.FunGame.Server.Model
protected DataSet _dsUser = new(); protected DataSet _dsUser = new();
protected Guid _checkLoginKey = Guid.Empty; 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; Socket = socket;
DataRequestController = new(this); DataRequestController = new(this);
IsDebugMode = isDebugMode; IsDebugMode = isDebugMode;

View File

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

View File

@ -69,7 +69,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
public async Task<IActionResult> Login([FromBody] LoginDTO dto) public async Task<IActionResult> Login([FromBody] LoginDTO dto)
{ {
string msg = "服务器暂时无法处理登录请求。"; string msg = "服务器暂时无法处理登录请求。";
Config.ConnectingPlayerCount++; Config.IncrementConnectingPlayerCount();
PayloadModel<DataRequestType> response = new() PayloadModel<DataRequestType> response = new()
{ {
Event = "user_login", Event = "user_login",
@ -94,7 +94,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
// 确认登录 // 确认登录
await model.CheckLogin(); await model.CheckLogin();
string token = jwtTokenService.GenerateToken(username); string token = jwtTokenService.GenerateToken(username);
Config.ConnectingPlayerCount--; Config.DecrementConnectingPlayerCount();
response.StatusCode = 200; response.StatusCode = 200;
response.Message = "登录成功!"; response.Message = "登录成功!";
response.Data = new() response.Data = new()
@ -107,14 +107,14 @@ namespace Milimoe.FunGame.WebAPI.Controllers
await model.Send(SocketMessageType.Disconnect); await model.Send(SocketMessageType.Disconnect);
} }
Config.ConnectingPlayerCount--; Config.DecrementConnectingPlayerCount();
response.Message = msg; response.Message = msg;
response.StatusCode = 401; response.StatusCode = 401;
return Unauthorized(response); return Unauthorized(response);
} }
catch (Exception e) catch (Exception e)
{ {
Config.ConnectingPlayerCount--; Config.DecrementConnectingPlayerCount();
logger.LogError("Error: {e}", e); logger.LogError("Error: {e}", e);
} }

View File

@ -265,7 +265,7 @@ try
await app.StopAsync(); await app.StopAsync();
}; };
Task order = Task.Factory.StartNew(GetConsoleOrder); Task order = Task.Run(GetConsoleOrder);
otherobjs = [app, listener]; otherobjs = [app, listener];
FunGameSystem.OnWebAPIStarted(otherobjs); FunGameSystem.OnWebAPIStarted(otherobjs);
@ -281,7 +281,7 @@ async Task GetConsoleOrder()
{ {
while (true) while (true)
{ {
string order = Console.ReadLine() ?? ""; string order = await Console.In.ReadLineAsync() ?? "";
ServerHelper.Type(); ServerHelper.Type();
if (order != "") if (order != "")
{ {
@ -320,7 +320,7 @@ async Task WebSocketConnectionHandler(HttpContext context)
Guid token = Guid.NewGuid(); Guid token = Guid.NewGuid();
ServerWebSocket socket = new(listener, instance, clientip, clientip, token); ServerWebSocket socket = new(listener, instance, clientip, clientip, token);
Config.ConnectingPlayerCount++; Config.IncrementConnectingPlayerCount();
try try
{ {
bool isConnected = false; 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)); (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect));
eventArgs.Success = isConnected; eventArgs.Success = isConnected;
Config.DecrementConnectingPlayerCount();
if (isConnected) if (isConnected)
{ {
eventArgs.ConnectResult = ConnectResult.Success; eventArgs.ConnectResult = ConnectResult.Success;
@ -354,14 +355,13 @@ async Task WebSocketConnectionHandler(HttpContext context)
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core);
await socket.CloseAsync(); await socket.CloseAsync();
} }
Config.ConnectingPlayerCount--;
} }
catch (Exception e) catch (Exception e)
{ {
Config.DecrementConnectingPlayerCount();
ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect);
FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(context, eventArgs); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(context, eventArgs);
FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(context, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(context, eventArgs);
if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core);
ServerHelper.Error(e); ServerHelper.Error(e);
} }