关闭SQL时会自动提交事务; Fix #28 (#29)

* 关闭SQL时会自动提交事务;Fix #28

* 将客户端踢出服务器时也会先移出房间
This commit is contained in:
milimoe 2023-11-25 01:53:18 +08:00 committed by GitHub
parent 5f8ae48859
commit c7310dc54e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 68 additions and 60 deletions

View File

@ -74,15 +74,15 @@ namespace Milimoe.FunGame.Server.Controller
case DataRequestType.Main_Chat: case DataRequestType.Main_Chat:
Chat(data); Chat(data);
break; break;
case DataRequestType.Main_Ready: case DataRequestType.Main_Ready:
SetReady(data, result); SetReady(data, result);
break; break;
case DataRequestType.Main_CancelReady: case DataRequestType.Main_CancelReady:
CancelReady(data, result); CancelReady(data, result);
break; break;
case DataRequestType.Main_StartGame: case DataRequestType.Main_StartGame:
StartGame(data, result); StartGame(data, result);
break; break;
@ -221,44 +221,7 @@ namespace Milimoe.FunGame.Server.Controller
if (roomid != "-1" && Config.RoomList.IsExist(roomid)) if (roomid != "-1" && Config.RoomList.IsExist(roomid))
{ {
Config.RoomList.CancelReady(roomid, Server.User); result = Server.QuitRoom(roomid, isMaster);
Config.RoomList.QuitRoom(roomid, Server.User);
Room Room = Config.RoomList[roomid] ?? General.HallInstance;
// 是否是房主
if (isMaster)
{
List<User> 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;
}
} }
} }
ResultData.Add("result", result); ResultData.Add("result", result);
@ -348,7 +311,7 @@ namespace Milimoe.FunGame.Server.Controller
ResultData.Add("ready", Config.RoomList.GetReadyPlayerList(roomid)); ResultData.Add("ready", Config.RoomList.GetReadyPlayerList(roomid));
ResultData.Add("notready", Config.RoomList.GetNotReadyPlayerList(roomid)); ResultData.Add("notready", Config.RoomList.GetNotReadyPlayerList(roomid));
} }
/// <summary> /// <summary>
/// 取消已准备状态 /// 取消已准备状态
/// </summary> /// </summary>

View File

@ -234,17 +234,67 @@ namespace Milimoe.FunGame.Server.Model
ServerModel serverTask = (ServerModel)Server.GetUser(username == "" ? UserName : username); ServerModel serverTask = (ServerModel)Server.GetUser(username == "" ? UserName : username);
if (serverTask.Socket != null) if (serverTask.Socket != null)
{ {
serverTask.Room = General.HallInstance;
foreach (Room room in Config.RoomList.Cast<Room>())
{
QuitRoom(room.Roomid, room.RoomMaster.Id == User.Id);
}
serverTask.Send(serverTask.Socket, SocketMessageType.ForceLogout, msg); 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<User> 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 = "") public void Kick(string msg, string clientname = "")
{ {
// 将客户端踢出服务器 // 将客户端踢出服务器
RemoveUser();
ServerModel serverTask = (ServerModel)Server.GetClient(clientname == "" ? ClientName : clientname); ServerModel serverTask = (ServerModel)Server.GetClient(clientname == "" ? ClientName : clientname);
if (serverTask.Socket != null) if (serverTask.Socket != null)
{ {
serverTask.Room = General.HallInstance;
foreach (Room room in Config.RoomList.Cast<Room>())
{
QuitRoom(room.Roomid, room.RoomMaster.Id == User.Id);
}
RemoveUser();
serverTask.Send(serverTask.Socket, SocketMessageType.Disconnect, msg); serverTask.Send(serverTask.Socket, SocketMessageType.Disconnect, msg);
} }
Close(); Close();
@ -264,7 +314,7 @@ namespace Milimoe.FunGame.Server.Model
} }
} }
} }
public void SendSystemMessage(ShowMessageType showtype, string msg, string title, int autoclose, params string[] usernames) public void SendSystemMessage(ShowMessageType showtype, string msg, string title, int autoclose, params string[] usernames)
{ {
foreach (ServerModel serverTask in Server.UserList.Cast<ServerModel>().Where(model => usernames.Length > 0 && usernames.Contains(model.UserName))) foreach (ServerModel serverTask in Server.UserList.Cast<ServerModel>().Where(model => usernames.Length > 0 && usernames.Contains(model.UserName)))
@ -275,7 +325,7 @@ namespace Milimoe.FunGame.Server.Model
} }
} }
} }
public void StartGame(string roomid, List<User> users, params string[] usernames) public void StartGame(string roomid, List<User> users, params string[] usernames)
{ {
Room room = General.HallInstance; Room room = General.HallInstance;

View File

@ -1,9 +1,6 @@
using System.Collections; using System.Collections;
using System.Data;
using System.Text; using System.Text;
using Milimoe.FunGame.Core.Api.Transmittal; 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.Constant;
using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
@ -52,7 +49,7 @@ namespace Milimoe.FunGame.Server.Others
{ {
SQLMode = true; SQLMode = true;
ServerLogin(); ServerLogin();
InitRoomList(); ClearRoomList();
} }
} }
catch (Exception e) catch (Exception e)
@ -65,19 +62,16 @@ namespace Milimoe.FunGame.Server.Others
{ {
if (SQLMode) 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) if (SQLMode)
{ {
// 初始化服务器中的房间列表 // 重启服务器后,所有房间都会被删除
DataSet DsRoomTemp = SQLHelper.ExecuteDataSet(RoomQuery.Select_Rooms); SQLHelper.Execute(RoomQuery.Delete_Rooms());
DataSet DsUserTemp = SQLHelper.ExecuteDataSet(UserQuery.Select_Users);
List<Room> rooms = Factory.GetRooms(DsRoomTemp, DsUserTemp);
RoomList.AddRooms(rooms);
} }
} }
} }

View File

@ -93,11 +93,12 @@ namespace Milimoe.FunGame.Server.Utility
} }
/// <summary> /// <summary>
/// 关闭连接 /// 关闭连接 如有事务会自动提交事务
/// </summary> /// </summary>
public override void Close() public override void Close()
{ {
// _IsOneTime = false需要手动调用此方法 // _IsOneTime = false需要手动调用此方法
Commit();
_Connection?.Close(); _Connection?.Close();
ServerHelper.WriteLine($"{(GetClientName() == string.Empty ? "" : GetClientName())}已释放MySQL连接"); ServerHelper.WriteLine($"{(GetClientName() == string.Empty ? "" : GetClientName())}已释放MySQL连接");
} }
@ -134,7 +135,7 @@ namespace Milimoe.FunGame.Server.Utility
/// <summary> /// <summary>
/// 创建一个SQL事务 /// 创建一个SQL事务
/// </summary> /// </summary>
public void NewTransaction() public override void NewTransaction()
{ {
_Transaction ??= _Connection?.Connection?.BeginTransaction(); _Transaction ??= _Connection?.Connection?.BeginTransaction();
} }
@ -142,7 +143,7 @@ namespace Milimoe.FunGame.Server.Utility
/// <summary> /// <summary>
/// 提交事务 /// 提交事务
/// </summary> /// </summary>
public void Commit() public override void Commit()
{ {
_Transaction?.Commit(); _Transaction?.Commit();
_Transaction = null; _Transaction = null;
@ -151,7 +152,7 @@ namespace Milimoe.FunGame.Server.Utility
/// <summary> /// <summary>
/// 回滚事务 /// 回滚事务
/// </summary> /// </summary>
public void Rollback() public override void Rollback()
{ {
_Transaction?.Rollback(); _Transaction?.Rollback();
_Transaction = null; _Transaction = null;