diff --git a/AX.WebDrillServer/Hubs/FireDeductionHub.cs b/AX.WebDrillServer/Hubs/FireDeductionHub.cs index 1315797..c0f2864 100644 --- a/AX.WebDrillServer/Hubs/FireDeductionHub.cs +++ b/AX.WebDrillServer/Hubs/FireDeductionHub.cs @@ -7,7 +7,10 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; +using Microsoft.VisualBasic; +using NPOI.SS.Util; using System.Collections.Concurrent; +using System.Runtime.CompilerServices; using System.Security.Claims; namespace AX.WebDrillServer.Hubs @@ -30,16 +33,48 @@ namespace AX.WebDrillServer.Hubs _logger = logger; this.roomManager = roomManager; } - public async Task CreateRoom(RoomCreateDto createInfo, FireDeductionUser user) + + public List CallServer_GetRoomList(string userId) { - FireDeductionRoom room = new FireDeductionRoom(); - room.Owner = createInfo.UserId; - room.RoomId = Guid.NewGuid().ToString(); - room.RoomName = createInfo.RoomName; - room.Password = createInfo.RoomPassword; - room.Users.Add(user); - await Groups.AddToGroupAsync(user.ConnectionId, room.RoomId); - return room; + return roomManager.GetAllRooms(); + } + + public FireDeductionUser? CallServer_GetUser(string connectionId) + { + return roomManager.GetUserByConnectionId(connectionId); + } + + public async Task CallServer_CreateRoom(RoomCreateDto createInfo) + { + try + { + RoomCreateResultData resultData = new RoomCreateResultData(); + var user = roomManager.GetUser(createInfo.UserId); + if (user == null) + { + resultData.RoomCreateResult = RoomCreateResult.用户不存在; + return resultData; + } + FireDeductionRoom room = new FireDeductionRoom(); + room.Owner = createInfo.UserId; + room.RoomId = Guid.NewGuid().ToString(); + room.RoomName = createInfo.RoomName; + room.Password = createInfo.RoomPassword; + roomManager.AddRoom(room); + + user.RoomId = room.RoomId; + room.Users.Add(user); + + await Groups.AddToGroupAsync(user.ConnectionId, room.RoomId); + await Clients.All.SendAsync("callWeb_refreshRoomList", roomManager.GetAllRooms()); + + resultData.RoomCreateResult = RoomCreateResult.成功; + return resultData; + } + catch (Exception ex) + { + throw new Exception(ex.Message); + } } public async Task EnterRoom(string roomId, FireDeductionUser user, string? password = null) { @@ -106,6 +141,7 @@ namespace AX.WebDrillServer.Hubs { await Clients.All.SendAsync(Message); //TODO:保存数据 + } public override async Task OnConnectedAsync() @@ -119,6 +155,8 @@ namespace AX.WebDrillServer.Hubs if (user != null) { user.Online = true; + if (user.ConnectionId != Context.ConnectionId) + user.ConnectionId = Context.ConnectionId; var room = roomManager.GetRoomByUserId(user.UserId); if (room != null) { @@ -131,6 +169,8 @@ namespace AX.WebDrillServer.Hubs user.ConnectionId = Context.ConnectionId; user.UserId = userId!; user.UserName = userName!; + + roomManager.AddUser(user); } _logger.LogInformation("[{userId}][{name}] connected", userId, userName); diff --git a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs index 64e06c6..f6e6dd6 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs @@ -2,6 +2,12 @@ namespace AX.WebDrillServer.Services.FireDeductionHub { + public enum RoomCreateResult + { + 成功 = 0, + 房间重名, + 用户不存在 + } public enum RoomState { 准备 = 0, diff --git a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionUser.cs b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionUser.cs index 2e937ca..da2866a 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionUser.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/FireDeductionUser.cs @@ -9,6 +9,7 @@ public string UserName { get; set; } = null!; public bool Online { get; set; } = true; public bool Left { get; set; } + public string? RoomId { get; set; } public string ConnectionId { get; set; } = null!; } } diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateDto.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateDto.cs index 4246cf8..301ff45 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateDto.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateDto.cs @@ -5,7 +5,5 @@ public string UserId { get; set; } = null!; public string? RoomPassword { get; set; } public string RoomName { get; set; } = null!; - public int MaxPerson { get; set; } = 20; - } } diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateResultData.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateResultData.cs new file mode 100644 index 0000000..8cc0bb0 --- /dev/null +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomCreateResultData.cs @@ -0,0 +1,8 @@ +namespace AX.WebDrillServer.Services.FireDeductionHub +{ + public class RoomCreateResultData + { + public RoomCreateResult RoomCreateResult { get; set; } + public FireDeductionRoom? CreatedRoom { get; set; } + } +} diff --git a/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs b/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs index e6ac7cd..1ebf7c0 100644 --- a/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs +++ b/AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs @@ -6,7 +6,20 @@ private List fireDeductionRooms = new List(); private List fireDeductionUsers = new List(); - + public List GetAllRooms() + { + lock (this) + { + return fireDeductionRooms; + } + } + public List GetAllUsers() + { + lock (this) + { + return fireDeductionUsers; + } + } public FireDeductionRoom? GetRoom(string roomId) { lock (this) @@ -21,6 +34,13 @@ return fireDeductionUsers.Where(r => r.UserId == userId).SingleOrDefault(); } } + public FireDeductionUser? GetUserByConnectionId(string conneciontId) + { + lock (this) + { + return fireDeductionUsers.Where(r => r.ConnectionId == conneciontId).SingleOrDefault(); + } + } public FireDeductionRoom? GetRoomByUserId(string userId) { lock (this)