From e462dc7b71d8e811decb9ff75cbf0aad34187560 Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 3 Apr 2025 01:13:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A1=AB=E5=85=85=E4=B8=80=E4=BA=9B=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=8E=A7=E5=88=B6=E5=99=A8=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DataRequestController.cs | 432 +++++++++++++++--- FunGame.Server/Models/ServerModel.cs | 29 +- FunGame.WebAPI/Program.cs | 11 +- 3 files changed, 387 insertions(+), 85 deletions(-) diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 6382cf1..1e4e839 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -4,13 +4,13 @@ using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Common.Addon; -using Milimoe.FunGame.Core.Library.Common.Event; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Services; +using ProjectRedbud.FunGame.SQLQueryExtension; namespace Milimoe.FunGame.Server.Controller { @@ -51,6 +51,7 @@ namespace Milimoe.FunGame.Server.Controller { Dictionary result = []; _lastRequest = type; + ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); switch (type) { @@ -118,6 +119,7 @@ namespace Milimoe.FunGame.Server.Controller break; case DataRequestType.Room_GetRoomSettings: + GetRoomSettings(data, result); break; case DataRequestType.Room_GetRoomPlayerCount: @@ -128,6 +130,78 @@ namespace Milimoe.FunGame.Server.Controller await UpdateRoomMaster(data, result); break; + case DataRequestType.UserCenter_GetUserProfile: + GetUserProfile(data, result); + break; + + case DataRequestType.UserCenter_GetUserStatistics: + GetUserStatistics(data, result); + break; + + case DataRequestType.UserCenter_UpdateUser: + UpdateUser(data, result); + break; + + case DataRequestType.UserCenter_UpdatePassword: + UpdatePassword(data, result); + break; + + case DataRequestType.UserCenter_DailySignIn: + DailySignIn(result); + break; + + case DataRequestType.Inventory_GetStore: + GetStore(data, result); + break; + + case DataRequestType.Inventory_GetMarket: + GetMarket(data, result); + break; + + case DataRequestType.Inventory_StoreBuy: + StoreBuy(data, result); + break; + + case DataRequestType.Inventory_MarketBuy: + MarketBuy(data, result); + break; + + case DataRequestType.Inventory_GetInventory: + GetInventory(data, result); + break; + + case DataRequestType.Inventory_Use: + Use(data, result); + break; + + case DataRequestType.Inventory_StoreSell: + StoreSell(data, result); + break; + + case DataRequestType.Inventory_MarketSell: + MarketSell(data, result); + break; + + case DataRequestType.Inventory_UpdateMarketPrice: + UpdateMarketPrice(data, result); + break; + + case DataRequestType.Inventory_GetOffer: + GetOffer(data, result); + break; + + case DataRequestType.Inventory_MakeOffer: + MakeOffer(data, result); + break; + + case DataRequestType.Inventory_ReviseOffer: + ReviseOffer(data, result); + break; + + case DataRequestType.Inventory_RespondOffer: + RespondOffer(data, result); + break; + default: break; } @@ -148,7 +222,6 @@ namespace Milimoe.FunGame.Server.Controller Guid key = Guid.Empty; if (requestData.Count >= 1) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); key = DataRequest.GetDictionaryJsonObject(requestData, "key"); if (Server.IsLoginKey(key)) { @@ -170,9 +243,8 @@ namespace Milimoe.FunGame.Server.Controller /// 获取公告 /// /// - private void GetServerNotice(Dictionary resultData) + private static void GetServerNotice(Dictionary resultData) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); resultData.Add("notice", Config.ServerNotice); } @@ -190,7 +262,7 @@ namespace Milimoe.FunGame.Server.Controller string gamemodule = DataRequest.GetDictionaryJsonObject(requestData, "gamemoduleserver") ?? ""; string gamemap = DataRequest.GetDictionaryJsonObject(requestData, "gamemap") ?? ""; bool isrank = DataRequest.GetDictionaryJsonObject(requestData, "isrank"); - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest) + " : " + RoomSet.GetTypeString(type) + " (" + string.Join(", ", [gamemodule, gamemap]) + ")", InvokeMessageType.DataRequest); + ServerHelper.WriteLine("[CreateRoom] " + RoomSet.GetTypeString(type) + " (" + string.Join(", ", [gamemodule, gamemap]) + ")", InvokeMessageType.DataRequest); if (gamemodule == "" || gamemap == "" || FunGameSystem.GameModuleLoader is null || !FunGameSystem.GameModuleLoader.ModuleServers.ContainsKey(gamemodule) || !FunGameSystem.GameModuleLoader.Maps.ContainsKey(gamemap)) { ServerHelper.WriteLine("缺少对应的模组或地图,无法创建房间。"); @@ -219,10 +291,10 @@ namespace Milimoe.FunGame.Server.Controller if (SQLHelper.Result == SQLResult.Success) { ServerHelper.WriteLine("[CreateRoom] Master: " + user.Username + " RoomID: " + roomid); - SQLHelper.ExecuteDataSet(RoomQuery.Select_IsExistRoom(SQLHelper, roomid)); - if (SQLHelper.Result == SQLResult.Success && SQLHelper.DataSet.Tables[0].Rows.Count > 0) + DataRow? dr = SQLHelper.ExecuteDataRow(RoomQuery.Select_IsExistRoom(SQLHelper, roomid)); + if (dr != null) { - room = Factory.GetRoom(SQLHelper.DataSet.Tables[0].Rows[0], user); + room = Factory.GetRoom(dr, user); FunGameSystem.RoomList.AddRoom(room); } } @@ -236,9 +308,8 @@ namespace Milimoe.FunGame.Server.Controller /// 更新房间列表 /// /// - private void UpdateRoom(Dictionary resultData) + private static void UpdateRoom(Dictionary resultData) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); resultData.Add("rooms", FunGameSystem.RoomList.ListRoom); // 传RoomList } @@ -252,7 +323,6 @@ namespace Milimoe.FunGame.Server.Controller bool result = false; if (requestData.Count >= 2) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; bool isMaster = DataRequest.GetDictionaryJsonObject(requestData, "isMaster"); @@ -274,7 +344,6 @@ namespace Milimoe.FunGame.Server.Controller bool result = false; if (requestData.Count >= 1) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; if (roomid != "-1") @@ -313,7 +382,7 @@ namespace Milimoe.FunGame.Server.Controller bool iscancel = DataRequest.GetDictionaryJsonObject(requestData, "iscancel"); if (!iscancel) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest) + " : Start", InvokeMessageType.DataRequest); + ServerHelper.WriteLine("[MatchRoom] Start", InvokeMessageType.DataRequest); RoomType type = DataRequest.GetDictionaryJsonObject(requestData, "roomtype"); User user = DataRequest.GetDictionaryJsonObject(requestData, "matcher") ?? Factory.GetUser(); StartMatching(type, user); @@ -321,7 +390,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 取消匹配 - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest) + " : Cancel", InvokeMessageType.DataRequest); + ServerHelper.WriteLine("[MatchRoom] Cancel", InvokeMessageType.DataRequest); StopMatching(); } } @@ -339,7 +408,6 @@ namespace Milimoe.FunGame.Server.Controller string roomid = "-1"; if (requestData.Count >= 1) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; User user = Server.User; @@ -365,7 +433,6 @@ namespace Milimoe.FunGame.Server.Controller string roomid = "-1"; if (requestData.Count >= 1) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; User user = Server.User; @@ -407,7 +474,6 @@ namespace Milimoe.FunGame.Server.Controller bool result = false; if (requestData.Count >= 2) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; bool isMaster = DataRequest.GetDictionaryJsonObject(requestData, "isMaster"); @@ -523,7 +589,6 @@ namespace Milimoe.FunGame.Server.Controller bool success = false; if (requestData.Count >= 4) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string username = DataRequest.GetDictionaryJsonObject(requestData, "username") ?? ""; string password = DataRequest.GetDictionaryJsonObject(requestData, "password") ?? ""; string email = DataRequest.GetDictionaryJsonObject(requestData, "email") ?? ""; @@ -550,7 +615,6 @@ namespace Milimoe.FunGame.Server.Controller /// private async Task Login(Dictionary requestData, Dictionary resultData) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string msg = ""; User user = Factory.GetUser(); @@ -609,7 +673,6 @@ namespace Milimoe.FunGame.Server.Controller string msg = "无法找回您的密码,请稍后再试。"; // 返回的验证信息 if (requestData.Count >= 3) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string username = DataRequest.GetDictionaryJsonObject(requestData, ForgetVerifyCodes.Column_Username) ?? ""; string email = DataRequest.GetDictionaryJsonObject(requestData, ForgetVerifyCodes.Column_Email) ?? ""; string verifycode = DataRequest.GetDictionaryJsonObject(requestData, ForgetVerifyCodes.Column_ForgetVerifyCode) ?? ""; @@ -620,11 +683,11 @@ namespace Milimoe.FunGame.Server.Controller // 先检查验证码 if (SQLHelper != null) { - SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_ForgetVerifyCode(SQLHelper, username, email, verifycode)); - if (SQLHelper.Result == SQLResult.Success) + DataRow? dr = SQLHelper.ExecuteDataRow(ForgetVerifyCodes.Select_ForgetVerifyCode(SQLHelper, username, email, verifycode)); + if (dr != null) { // 检查验证码是否过期 - if (!DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime)) + if (!DateTime.TryParse(dr[ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime)) { SendTime = General.DefaultTime; } @@ -637,7 +700,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查验证码是否正确 - if (verifycode.Equals(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode])) + if (verifycode.Equals(dr[ForgetVerifyCodes.Column_ForgetVerifyCode])) { ServerHelper.WriteLine("[ForgerPassword] Username: " + username + " Email: " + email); SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); @@ -662,8 +725,8 @@ namespace Milimoe.FunGame.Server.Controller else { // 检查验证码是否发送过和是否过期 - SQLHelper.ExecuteDataSet(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(SQLHelper, username, email)); - if (SQLHelper.Result != SQLResult.Success || (DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime) && (DateTime.Now - SendTime).TotalMinutes >= 10)) + DataRow? dr = SQLHelper.ExecuteDataRow(ForgetVerifyCodes.Select_HasSentForgetVerifyCode(SQLHelper, username, email)); + if (dr is null || (DateTime.TryParse(dr[ForgetVerifyCodes.Column_SendTime].ToString(), out DateTime SendTime) && (DateTime.Now - SendTime).TotalMinutes >= 10)) { // 发送验证码,需要先删除之前过期的验证码 SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); @@ -691,7 +754,7 @@ namespace Milimoe.FunGame.Server.Controller } else // 不使用MailSender的情况 { - ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},请服务器管理员告知此用户"); + ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户"); msg = ""; } } @@ -699,7 +762,7 @@ namespace Milimoe.FunGame.Server.Controller else { // 发送过验证码且验证码没有过期 - string ForgetVerifyCode = (string)SQLHelper.DataSet.Tables[0].Rows[0][ForgetVerifyCodes.Column_ForgetVerifyCode]; + string ForgetVerifyCode = (string)dr[ForgetVerifyCodes.Column_ForgetVerifyCode]; ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}"); msg = ""; } @@ -710,49 +773,30 @@ namespace Milimoe.FunGame.Server.Controller resultData.Add("msg", msg); } - /// - /// 更新用户的密码 - /// - /// - /// - private void UpdatePassword(Dictionary requestData, Dictionary resultData) - { - string msg = "无法更新您的密码,请稍后再试。"; - if (requestData.Count >= 2) - { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); - string username = DataRequest.GetDictionaryJsonObject(requestData, UserQuery.Column_Username) ?? ""; - string password = DataRequest.GetDictionaryJsonObject(requestData, UserQuery.Column_Password) ?? ""; - if (username.Trim() != "" && password.Trim() != "") - { - FunGameSystem.UpdateUserKey(username); - password = password.Encrypt(FunGameSystem.GetUserKey(username)); - SQLHelper?.Execute(UserQuery.Update_Password(SQLHelper, username, password)); - if (SQLHelper?.Success ?? false) - { - // 更新成功返回空值 - msg = ""; - } - } - } - resultData.Add("msg", msg); - } - #endregion #region Room + /// + /// 获取房间设置 + /// + /// + /// + private static void GetRoomSettings(Dictionary requestData, Dictionary resultData) + { + // TODO + } + /// /// 获取房间内玩家数量 /// /// /// - private void GetRoomPlayerCount(Dictionary requestData, Dictionary resultData) + private static void GetRoomPlayerCount(Dictionary requestData, Dictionary resultData) { string roomid = "-1"; if (requestData.Count >= 1) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; } resultData.Add("count", FunGameSystem.RoomList.GetUserCount(roomid)); @@ -770,7 +814,6 @@ namespace Milimoe.FunGame.Server.Controller if (requestData.Count >= 2) { - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); string roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; User newMaster = DataRequest.GetDictionaryJsonObject(requestData, "newMaster") ?? Factory.GetUser(); @@ -783,10 +826,10 @@ namespace Milimoe.FunGame.Server.Controller if (SQLHelper != null) { - SQLHelper.Execute(RoomQuery.Update_UpdateRoomMaster(SQLHelper, roomid, newMaster.Id)); + SQLHelper.UpdateRoomMaster(roomid, newMaster.Id); if (SQLHelper.Result == SQLResult.Success) { - await Server.UpdateRoomMaster(room, true); + await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && c.InRoom.Roomid == roomid), SocketMessageType.UpdateRoomMaster, room); ServerHelper.WriteLine($"[UpdateRoomMaster] RoomID: {roomid} 房主变更: {oldMaster.Username} -> {newMaster.Username}"); } } @@ -852,18 +895,32 @@ namespace Milimoe.FunGame.Server.Controller double time = 0; // 已经匹配的时间 double expandInterval = 10; // 扩大匹配范围的间隔时间 double maxTime = 50; // 最大匹配时间 + bool isRefreshRoom = false; // 是否刷新房间列表 + + // 匹配房间类型(如果是All,则匹配所有房间) + List targets; + if (roomtype == RoomType.All) + { + targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching)]; + } + else + { + targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => (r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching) && r.RoomType == roomtype)]; + } while (_isMatching) { - // 匹配房间类型(如果是All,则匹配所有房间) - List targets; - if (roomtype == RoomType.All) + if (isRefreshRoom) { - targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching)]; - } - else - { - targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => (r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching) && r.RoomType == roomtype)]; + isRefreshRoom = false; + if (roomtype == RoomType.All) + { + targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching)]; + } + else + { + targets = [.. FunGameSystem.RoomList.ListRoom.Where(r => (r.RoomState == RoomState.Created || r.RoomState == RoomState.Matching) && r.RoomType == roomtype)]; + } } // 如果匹配停止,则退出 @@ -895,6 +952,8 @@ namespace Milimoe.FunGame.Server.Controller if (time >= expandInterval * i) { i++; + // 刷新房间列表 + isRefreshRoom = true; } // 达到最大匹配时间后不再匹配Elo,直接返回第一个房间 if (time >= maxTime) @@ -910,5 +969,240 @@ namespace Milimoe.FunGame.Server.Controller } #endregion + + #region UserCenter + + /// + /// 获取用户资料信息 + /// + /// + /// + private void GetUserProfile(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 获取用户统计数据 + /// + /// + /// + private void GetUserStatistics(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 更新用户(全部数据) + /// + /// + /// + private void UpdateUser(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 更新用户的密码 + /// + /// + /// + private void UpdatePassword(Dictionary requestData, Dictionary resultData) + { + string msg = "无法更新您的密码,请稍后再试。"; + if (requestData.Count >= 2) + { + string username = DataRequest.GetDictionaryJsonObject(requestData, UserQuery.Column_Username) ?? ""; + string password = DataRequest.GetDictionaryJsonObject(requestData, UserQuery.Column_Password) ?? ""; + if (username.Trim() != "" && password.Trim() != "") + { + FunGameSystem.UpdateUserKey(username); + password = password.Encrypt(FunGameSystem.GetUserKey(username)); + SQLHelper?.UpdatePassword(username, password); + if (SQLHelper?.Success ?? false) + { + // 更新成功返回空值 + msg = ""; + } + } + } + resultData.Add("msg", msg); + } + + /// + /// 每日签到 + /// + /// + private void DailySignIn(Dictionary resultData) + { + if (SQLHelper != null) + { + long userId = Server.User.Id; + if (userId != 0) + { + DataRow? dr = SQLHelper.ExecuteDataRow(UserSignIns.Select_GetUserSignIn(SQLHelper, userId)); + if (dr != null) + { + int days = Convert.ToInt32(dr[UserSignIns.Column_Days]) + 1; + bool isSigned = Convert.ToInt32(dr[UserSignIns.Column_IsSigned]) != 0; + if (dr[UserSignIns.Column_LastTime] != DBNull.Value && DateTime.TryParseExact(dr[UserSignIns.Column_LastTime].ToString(), General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime dt)) + { + if (isSigned) + { + resultData.Add("msg", "今天已经签到过了,请明天再来。"); + return; + } + if ((DateTime.Now - dt).TotalDays > 1) + { + days = 1; + } + } + SQLHelper.Execute(UserSignIns.Update_UserSignIn(SQLHelper, userId, days)); + if (SQLHelper.Success) + { + resultData.Add("msg", $"签到成功!你已经连续签到 {days} 天!"); + return; + } + } + } + } + resultData.Add("msg", "签到失败!"); + } + + #endregion + + #region Inventory + + /// + /// 获取商店信息 + /// + /// + /// + private void GetStore(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 获取市场信息 + /// + /// + /// + private void GetMarket(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 购买物品(商店) + /// + /// + /// + private void StoreBuy(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 购买物品(市场) + /// + /// + /// + private void MarketBuy(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 获取库存信息 + /// + /// + /// + private void GetInventory(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 使用物品 + /// + /// + /// + private void Use(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 出售物品(商店) + /// + /// + /// + private void StoreSell(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 出售物品(市场) + /// + /// + /// + private void MarketSell(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 更新市场价格 + /// + /// + /// + private void UpdateMarketPrice(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 获取交易报价 + /// + /// + /// + private void GetOffer(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 创建交易报价 + /// + /// + /// + private void MakeOffer(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 修改交易报价 + /// + /// + /// + private void ReviseOffer(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + /// + /// 回应交易报价 + /// + /// + /// + private void RespondOffer(Dictionary requestData, Dictionary resultData) + { + // TODO + } + + #endregion } } diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 83ffd66..7cb5820 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -11,6 +11,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Services; +using ProjectRedbud.FunGame.SQLQueryExtension; namespace Milimoe.FunGame.Server.Model { @@ -382,6 +383,7 @@ namespace Milimoe.FunGame.Server.Model public async Task QuitRoom(string roomid, bool isMaster) { bool result; + SQLHelper?.NewTransaction(); FunGameSystem.RoomList.CancelReady(roomid, User); FunGameSystem.RoomList.QuitRoom(roomid, User); @@ -390,36 +392,37 @@ namespace Milimoe.FunGame.Server.Model if (isMaster) { List users = [.. FunGameSystem.RoomList[roomid].UserAndIsReady.Keys]; - if (users.Count > 0) // 如果此时房间还有人,更新房主 + User? newRoomMaster = null; + if (users.Count > 0) newRoomMaster = users[0]; + SQLHelper?.QuitRoomByRoomMaster(roomid, User.Id, newRoomMaster?.Id); + if (newRoomMaster != null) { - User NewMaster = users[0]; - Room.RoomMaster = NewMaster; - SQLHelper?.Execute(RoomQuery.Update_QuitRoom(SQLHelper, roomid, User.Id, NewMaster.Id)); - this.InRoom = General.HallInstance; - await UpdateRoomMaster(Room, true); - result = true; + Room.RoomMaster = users[0]; + ServerHelper.WriteLine("[ " + GetClientName() + " ] 退出了房间 " + roomid + ",并更新房主为:" + newRoomMaster); + await NotifyQuitRoom(Room, true); } - else // 没人了就解散房间 + else { FunGameSystem.RoomList.RemoveRoom(roomid); - SQLHelper?.Execute(RoomQuery.Delete_QuitRoom(SQLHelper, roomid, User.Id)); - this.InRoom = General.HallInstance; ServerHelper.WriteLine("[ " + GetClientName() + " ] 解散了房间 " + roomid); - result = true; } + InRoom = General.HallInstance; + result = true; } // 不是房主直接退出房间 else { this.InRoom = General.HallInstance; - await UpdateRoomMaster(Room); + await NotifyQuitRoom(Room); result = true; } + SQLHelper?.Commit(); + return result; } - public async Task UpdateRoomMaster(Room room, bool isUpdateRoomMaster = false) + public async Task NotifyQuitRoom(Room room, bool isUpdateRoomMaster = false) { foreach (IServerModel Client in Listener.ClientList.Where(c => c != null && c.User.Id != 0 && room.Roomid == c.InRoom?.Roomid)) { diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs index 9192c7b..b0dcece 100644 --- a/FunGame.WebAPI/Program.cs +++ b/FunGame.WebAPI/Program.cs @@ -215,11 +215,16 @@ try IExceptionHandlerFeature? contextFeature = context.Features.Get(); if (contextFeature != null) { - await context.Response.WriteAsync(new + await context.Response.WriteAsync(new PayloadModel() { - context.Response.StatusCode, + Event = "system_error", + RequestType = DataRequestType.UnKnown, + StatusCode = context.Response.StatusCode, Message = "Internal Server Error.", - Detailed = contextFeature.Error.Message + Data = new() + { + { "detail", contextFeature.Error.Message } + } }.ToString() ?? ""); } });