From 834b7071ee95a54a2053aa74241739945a3f6e6a Mon Sep 17 00:00:00 2001 From: YDL <1368269699@QQ.COM> Date: Thu, 22 Sep 2022 15:43:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=88=BF=E9=97=B4=E7=A6=BB?= =?UTF-8?q?=E5=BC=80=E6=88=BF=E9=97=B4=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AX.WebDrillServer/Hubs/FireDeductionHub.cs | 110 +++++++++++------- .../FireDeductionHub/FireDeductionRoom.cs | 13 --- .../FireDeductionRoomEnums.cs | 37 ++++++ .../FireDeductionHub/RoomEnterData.cs | 9 ++ .../FireDeductionHub/RoomLeaveData.cs | 8 ++ .../Services/FireDeductionHub/RoomManager.cs | 20 ++-- .../FireDeductionHub/RoommateChangeData.cs | 9 ++ 7 files changed, 140 insertions(+), 66 deletions(-) create mode 100644 AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoomEnums.cs create mode 100644 AX.WebDrillServer/Services/FireDeductionHub/RoomEnterData.cs create mode 100644 AX.WebDrillServer/Services/FireDeductionHub/RoomLeaveData.cs create mode 100644 AX.WebDrillServer/Services/FireDeductionHub/RoommateChangeData.cs diff --git a/AX.WebDrillServer/Hubs/FireDeductionHub.cs b/AX.WebDrillServer/Hubs/FireDeductionHub.cs index 3c18c64..f22f6b4 100644 --- a/AX.WebDrillServer/Hubs/FireDeductionHub.cs +++ b/AX.WebDrillServer/Hubs/FireDeductionHub.cs @@ -33,7 +33,11 @@ namespace AX.WebDrillServer.Hubs _logger = logger; this.roomManager = roomManager; } - + /// + /// 获取当前房间列表 + /// + /// + /// public List CallServer_GetRoomList(string userId) { return roomManager.GetAllRooms(); @@ -57,7 +61,7 @@ namespace AX.WebDrillServer.Hubs { try { - RoomCreateResultData resultData = new RoomCreateResultData(); + RoomCreateResultData resultData = new RoomCreateResultData()!; var user = roomManager.GetUser(createInfo.UserId); if (user == null)//查询不到创建房间的用户 { @@ -74,12 +78,14 @@ namespace AX.WebDrillServer.Hubs resultData.RoomCreateResult = RoomCreateResult.RoomReName; return resultData; } - FireDeductionRoom room = new FireDeductionRoom(); - room.Owner = createInfo.UserId; - room.OwnerName = user.UserName; - room.RoomId = Guid.NewGuid().ToString(); - room.RoomName = createInfo.Name = createInfo.Name; - room.Password = createInfo.Password; + FireDeductionRoom room = new() + { + Owner = createInfo.UserId, + OwnerName = user.UserName, + RoomId = Guid.NewGuid().ToString(), + RoomName = createInfo.Name, + Password = createInfo.Password + }; roomManager.AddRoom(room); user.RoomId = room.RoomId; @@ -97,29 +103,40 @@ namespace AX.WebDrillServer.Hubs throw new Exception(ex.Message); } } - public bool CallServer_EnterRoom(string roomId, FireDeductionUser user, string? password = null) + + public async Task CallServer_EnterRoom(RoomEnterData enterInfo) { - bool result = false; try { - var room = roomManager.GetRoom(roomId); - if (room != null && room.Password == password) + var room = roomManager.GetRoom(enterInfo.RoomId); + if (room == null)//根据id查不到房间 + { + return RoomEnterResult.RoomError; + } + var user = roomManager.GetUser(enterInfo.UserId); + if (user == null)//根据id查不到用户 { - if (!room.Users.Contains(user)) + return RoomEnterResult.NoUserExist; + } + var roomHas = roomManager.GetRoom(enterInfo.RoomId, enterInfo.Password); + if (roomHas != null)//获取到要进入的房间跟用户信息 + { + roomManager.AddUser(user); + user.RoomId = roomHas.RoomId; + RoommateChangeData data = new() { + ChangeType = RoommateChangeType.Add, + FireDeductionUser = user, + FireDeductionUsers = roomHas.Users + }; + //通知web端刷新房间用户列表 + await Clients.Group(roomHas.RoomId).SendAsync("callWeb_changeRoomate", data); - result = true; - room.Users.Add(user); - user.RoomId = room.RoomId; - } - else - { - throw new NotImplementedException("房间中已经存在该用户!"); - } + return RoomEnterResult.Success; } else { - throw new NotImplementedException("房间信息有误!"); + return RoomEnterResult.RoomError; } } catch (Exception) @@ -127,38 +144,41 @@ namespace AX.WebDrillServer.Hubs throw; } - return result; + } - public async Task LeaveRoom(string roomId, string userId) + public async Task CallServer_LeaveRoom(RoomLeaveData leaveInfo) { - bool result = false; - await Task.Run(() => + try { - var room = roomManager.GetRoom(roomId); - if (room != null) + var room = roomManager.GetRoom(leaveInfo.RoomId); + if (room == null)//根据id查不到房间 { - var user = room.Users.FirstOrDefault(u => u.UserId == userId); - if (user != null) - { - room.Users.Remove(user); - if (room.Users.Count == 0) - { - //TODO:保持空房间xx分钟 - } - } - else - { - throw new NotImplementedException("用户信息有误!"); - } + return RoomEnterResult.RoomError; } - else + var user = roomManager.GetUser(leaveInfo.UserId); + if (user == null)//根据id查不到用户 { - throw new NotImplementedException("房间信息有误!"); + return RoomEnterResult.NoUserExist; } - }); - return result; + roomManager.RemoveUser(leaveInfo.UserId); + user.RoomId = ""; + RoommateChangeData data = new() + { + ChangeType = RoommateChangeType.Remove, + FireDeductionUser = user, + FireDeductionUsers = room.Users + }; + //通知web端刷新房间用户列表 + await Clients.Group(room.RoomId).SendAsync("callWeb_changeRoomate", data); + + return RoomEnterResult.Success; + } + catch (Exception) + { + throw; + } } public async Task RoomSendMessage(string RoomId, string Message) { diff --git a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs index 59292e9..bc13d21 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs @@ -2,19 +2,6 @@ namespace AX.WebDrillServer.Services.FireDeductionHub { - public enum RoomCreateResult - { - Success = 0,//成功 - RoomReName,//房间重名 - RoomNameEmpty,//房间名为空 - NoUserExist,//用户不存在 - } - public enum RoomState - { - Ready = 0,//准备 - Playing,//进行中 - Over,//结束 - } /// /// 沙盘推演房间 /// diff --git a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoomEnums.cs b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoomEnums.cs new file mode 100644 index 0000000..ddf5a00 --- /dev/null +++ b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoomEnums.cs @@ -0,0 +1,37 @@ +namespace AX.WebDrillServer.Services.FireDeductionHub +{ + public enum RoomCreateResult + { + Success = 0,//成功 + RoomReName,//房间重名 + RoomNameEmpty,//房间名为空 + NoUserExist,//用户不存在 + } + public enum RoomState + { + Ready = 0,//准备 + Playing,//进行中 + Over,//结束 + } + public enum RoomEnterResult + { + Success = 0,//成功 + RoomError,//房间信息有误 + NoUserExist,//用户信息有误 + } + public enum RoomLeaveResult + { + Success = 0,//成功 + RoomError,//房间信息有误 + NoUserExist,//用户信息有误 + } + public enum RoommateChangeType + { + Add = 0,//新增 + Remove,//移除 + } + public class FireDeductionRoomEnums + { + + } +} diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomEnterData.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomEnterData.cs new file mode 100644 index 0000000..8a14130 --- /dev/null +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomEnterData.cs @@ -0,0 +1,9 @@ +namespace AX.WebDrillServer.Services.FireDeductionHub +{ + public class RoomEnterData + { + public string RoomId { get; set; } = null!; + public string UserId { get; set; } = null!; + public string? Password { get; set; } + } +} diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomLeaveData.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomLeaveData.cs new file mode 100644 index 0000000..4d7fc2b --- /dev/null +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomLeaveData.cs @@ -0,0 +1,8 @@ +namespace AX.WebDrillServer.Services.FireDeductionHub +{ + public class RoomLeaveData + { + public string RoomId { get; set; } = null!; + public string UserId { get; set; } = null!; + } +} diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs index bf4abf8..e45aef0 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs @@ -2,16 +2,13 @@ { public class RoomManager { - private List fireDeductionRooms = new List(); - private List fireDeductionUsers = new List(); + private readonly List fireDeductionRooms = new(); + private readonly List fireDeductionUsers = new(); - public RoomShowInfo RoomToInfo(FireDeductionRoom source, RoomShowInfo info = null!) + public RoomShowInfo RoomToInfo(FireDeductionRoom source, RoomShowInfo? info = null) { - if (info == null) - { - info = new RoomShowInfo(); - } + info ??= new(); info.RoomId = source.RoomId; info.RoomName = source.RoomName; info.Owner = source.Owner; @@ -34,7 +31,7 @@ { lock (this) { - List infos = new List(); + List infos = new(); foreach (var item in fireDeductionRooms) { infos.Add(RoomToInfo(item)); @@ -49,6 +46,13 @@ return fireDeductionUsers; } } + public FireDeductionRoom? GetRoom(string roomId, string? password) + { + lock (this) + { + return fireDeductionRooms.Where(r => r.RoomId == roomId && r.Password == password).SingleOrDefault(); + } + } public FireDeductionRoom? GetRoom(string roomId) { lock (this) diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoommateChangeData.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoommateChangeData.cs new file mode 100644 index 0000000..9629c4f --- /dev/null +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoommateChangeData.cs @@ -0,0 +1,9 @@ +namespace AX.WebDrillServer.Services.FireDeductionHub +{ + public class RoommateChangeData + { + public RoommateChangeType ChangeType { get; set; } + public FireDeductionUser FireDeductionUser { get; set; } = null!; + public List FireDeductionUsers { get; set; } = new List(); + } +}