From c7310dc54e299c8700b2ddb805b29833acb27b49 Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Sat, 25 Nov 2023 01:53:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=B3=E9=97=ADSQL=E6=97=B6=E4=BC=9A?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8F=90=E4=BA=A4=E4=BA=8B=E5=8A=A1;=20Fix?= =?UTF-8?q?=20#28=20(#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 关闭SQL时会自动提交事务;Fix #28 * 将客户端踢出服务器时也会先移出房间 --- .../Controllers/DataRequestController.cs | 47 ++-------------- FunGame.Server/Models/ServerModel.cs | 56 ++++++++++++++++++- FunGame.Server/Others/Config.cs | 16 ++---- FunGame.Server/Utilities/MySQLHelper.cs | 9 +-- 4 files changed, 68 insertions(+), 60 deletions(-) diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index d8032a0..a76610c 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -74,15 +74,15 @@ namespace Milimoe.FunGame.Server.Controller case DataRequestType.Main_Chat: Chat(data); break; - + case DataRequestType.Main_Ready: SetReady(data, result); break; - + case DataRequestType.Main_CancelReady: CancelReady(data, result); break; - + case DataRequestType.Main_StartGame: StartGame(data, result); break; @@ -221,44 +221,7 @@ namespace Milimoe.FunGame.Server.Controller if (roomid != "-1" && Config.RoomList.IsExist(roomid)) { - Config.RoomList.CancelReady(roomid, Server.User); - Config.RoomList.QuitRoom(roomid, Server.User); - Room Room = Config.RoomList[roomid] ?? General.HallInstance; - // 是否是房主 - if (isMaster) - { - List users = Config.RoomList.GetPlayerList(roomid); - if (users.Count > 0) // 如果此时房间还有人,更新房主 - { - User NewMaster = users[0]; - Room.RoomMaster = NewMaster; - SQLHelper.Execute(RoomQuery.Update_QuitRoom(roomid, Server.User.Id, NewMaster.Id)); - if (SQLHelper.Result == SQLResult.Success) - { - Server.Room = General.HallInstance; - Server.UpdateRoomMaster(Room, true); - result = true; - } - } - else // 没人了就解散房间 - { - Config.RoomList.RemoveRoom(roomid); - SQLHelper.Execute(RoomQuery.Delete_QuitRoom(roomid, Server.User.Id)); - if (SQLHelper.Result == SQLResult.Success) - { - Server.Room = General.HallInstance; - ServerHelper.WriteLine("[ " + Server.GetClientName() + " ] 解散了房间 " + roomid); - result = true; - } - } - } - // 不是房主直接退出房间 - else - { - Server.Room = General.HallInstance; - Server.UpdateRoomMaster(Room); - result = true; - } + result = Server.QuitRoom(roomid, isMaster); } } ResultData.Add("result", result); @@ -348,7 +311,7 @@ namespace Milimoe.FunGame.Server.Controller ResultData.Add("ready", Config.RoomList.GetReadyPlayerList(roomid)); ResultData.Add("notready", Config.RoomList.GetNotReadyPlayerList(roomid)); } - + /// /// 取消已准备状态 /// diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index a9d8d8d..d67342b 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -234,17 +234,67 @@ namespace Milimoe.FunGame.Server.Model ServerModel serverTask = (ServerModel)Server.GetUser(username == "" ? UserName : username); if (serverTask.Socket != null) { + serverTask.Room = General.HallInstance; + foreach (Room room in Config.RoomList.Cast()) + { + QuitRoom(room.Roomid, room.RoomMaster.Id == User.Id); + } serverTask.Send(serverTask.Socket, SocketMessageType.ForceLogout, msg); } } + public bool QuitRoom(string roomid, bool isMaster) + { + bool result; + + Config.RoomList.CancelReady(roomid, User); + Config.RoomList.QuitRoom(roomid, User); + Room Room = Config.RoomList[roomid] ?? General.HallInstance; + // 是否是房主 + if (isMaster) + { + List users = Config.RoomList.GetPlayerList(roomid); + if (users.Count > 0) // 如果此时房间还有人,更新房主 + { + User NewMaster = users[0]; + Room.RoomMaster = NewMaster; + SQLHelper?.Execute(RoomQuery.Update_QuitRoom(roomid, User.Id, NewMaster.Id)); + this.Room = General.HallInstance; + UpdateRoomMaster(Room, true); + result = true; + } + else // 没人了就解散房间 + { + Config.RoomList.RemoveRoom(roomid); + SQLHelper?.Execute(RoomQuery.Delete_QuitRoom(roomid, User.Id)); + this.Room = General.HallInstance; + ServerHelper.WriteLine("[ " + GetClientName() + " ] 解散了房间 " + roomid); + result = true; + } + } + // 不是房主直接退出房间 + else + { + this.Room = General.HallInstance; + UpdateRoomMaster(Room); + result = true; + } + + return result; + } + public void Kick(string msg, string clientname = "") { // 将客户端踢出服务器 - RemoveUser(); ServerModel serverTask = (ServerModel)Server.GetClient(clientname == "" ? ClientName : clientname); if (serverTask.Socket != null) { + serverTask.Room = General.HallInstance; + foreach (Room room in Config.RoomList.Cast()) + { + QuitRoom(room.Roomid, room.RoomMaster.Id == User.Id); + } + RemoveUser(); serverTask.Send(serverTask.Socket, SocketMessageType.Disconnect, msg); } Close(); @@ -264,7 +314,7 @@ namespace Milimoe.FunGame.Server.Model } } } - + public void SendSystemMessage(ShowMessageType showtype, string msg, string title, int autoclose, params string[] usernames) { foreach (ServerModel serverTask in Server.UserList.Cast().Where(model => usernames.Length > 0 && usernames.Contains(model.UserName))) @@ -275,7 +325,7 @@ namespace Milimoe.FunGame.Server.Model } } } - + public void StartGame(string roomid, List users, params string[] usernames) { Room room = General.HallInstance; diff --git a/FunGame.Server/Others/Config.cs b/FunGame.Server/Others/Config.cs index 18efad3..7cdb9e3 100644 --- a/FunGame.Server/Others/Config.cs +++ b/FunGame.Server/Others/Config.cs @@ -1,9 +1,6 @@ using System.Collections; -using System.Data; using System.Text; using Milimoe.FunGame.Core.Api.Transmittal; -using Milimoe.FunGame.Core.Api.Utility; -using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; @@ -52,7 +49,7 @@ namespace Milimoe.FunGame.Server.Others { SQLMode = true; ServerLogin(); - InitRoomList(); + ClearRoomList(); } } catch (Exception e) @@ -65,19 +62,16 @@ namespace Milimoe.FunGame.Server.Others { if (SQLMode) { - SQLHelper.Execute(ServerLoginLogs.Insert_ServerLoginLogs(Config.ServerName, Config.ServerKey)); + SQLHelper.Execute(ServerLoginLogs.Insert_ServerLoginLogs(ServerName, ServerKey)); } } - public static void InitRoomList() + public static void ClearRoomList() { if (SQLMode) { - // 初始化服务器中的房间列表 - DataSet DsRoomTemp = SQLHelper.ExecuteDataSet(RoomQuery.Select_Rooms); - DataSet DsUserTemp = SQLHelper.ExecuteDataSet(UserQuery.Select_Users); - List rooms = Factory.GetRooms(DsRoomTemp, DsUserTemp); - RoomList.AddRooms(rooms); + // 重启服务器后,所有房间都会被删除 + SQLHelper.Execute(RoomQuery.Delete_Rooms()); } } } diff --git a/FunGame.Server/Utilities/MySQLHelper.cs b/FunGame.Server/Utilities/MySQLHelper.cs index fa1e710..259a822 100644 --- a/FunGame.Server/Utilities/MySQLHelper.cs +++ b/FunGame.Server/Utilities/MySQLHelper.cs @@ -93,11 +93,12 @@ namespace Milimoe.FunGame.Server.Utility } /// - /// 关闭连接 + /// 关闭连接 如有事务会自动提交事务 /// public override void Close() { // _IsOneTime = false需要手动调用此方法 + Commit(); _Connection?.Close(); ServerHelper.WriteLine($"{(GetClientName() == string.Empty ? "" : GetClientName())}已释放MySQL连接"); } @@ -134,7 +135,7 @@ namespace Milimoe.FunGame.Server.Utility /// /// 创建一个SQL事务 /// - public void NewTransaction() + public override void NewTransaction() { _Transaction ??= _Connection?.Connection?.BeginTransaction(); } @@ -142,7 +143,7 @@ namespace Milimoe.FunGame.Server.Utility /// /// 提交事务 /// - public void Commit() + public override void Commit() { _Transaction?.Commit(); _Transaction = null; @@ -151,7 +152,7 @@ namespace Milimoe.FunGame.Server.Utility /// /// 回滚事务 /// - public void Rollback() + public override void Rollback() { _Transaction?.Rollback(); _Transaction = null;