Browse Source

加入房间离开房间接口实现

develop
杨栋梁 3 years ago
parent
commit
834b7071ee
  1. 110
      AX.WebDrillServer/Hubs/FireDeductionHub.cs
  2. 13
      AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs
  3. 37
      AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoomEnums.cs
  4. 9
      AX.WebDrillServer/Services/FireDeductionHub/RoomEnterData.cs
  5. 8
      AX.WebDrillServer/Services/FireDeductionHub/RoomLeaveData.cs
  6. 20
      AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs
  7. 9
      AX.WebDrillServer/Services/FireDeductionHub/RoommateChangeData.cs

110
AX.WebDrillServer/Hubs/FireDeductionHub.cs

@ -33,7 +33,11 @@ namespace AX.WebDrillServer.Hubs
_logger = logger; _logger = logger;
this.roomManager = roomManager; this.roomManager = roomManager;
} }
/// <summary>
/// 获取当前房间列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<RoomShowInfo> CallServer_GetRoomList(string userId) public List<RoomShowInfo> CallServer_GetRoomList(string userId)
{ {
return roomManager.GetAllRooms(); return roomManager.GetAllRooms();
@ -57,7 +61,7 @@ namespace AX.WebDrillServer.Hubs
{ {
try try
{ {
RoomCreateResultData resultData = new RoomCreateResultData(); RoomCreateResultData resultData = new RoomCreateResultData()!;
var user = roomManager.GetUser(createInfo.UserId); var user = roomManager.GetUser(createInfo.UserId);
if (user == null)//查询不到创建房间的用户 if (user == null)//查询不到创建房间的用户
{ {
@ -74,12 +78,14 @@ namespace AX.WebDrillServer.Hubs
resultData.RoomCreateResult = RoomCreateResult.RoomReName; resultData.RoomCreateResult = RoomCreateResult.RoomReName;
return resultData; return resultData;
} }
FireDeductionRoom room = new FireDeductionRoom(); FireDeductionRoom room = new()
room.Owner = createInfo.UserId; {
room.OwnerName = user.UserName; Owner = createInfo.UserId,
room.RoomId = Guid.NewGuid().ToString(); OwnerName = user.UserName,
room.RoomName = createInfo.Name = createInfo.Name; RoomId = Guid.NewGuid().ToString(),
room.Password = createInfo.Password; RoomName = createInfo.Name,
Password = createInfo.Password
};
roomManager.AddRoom(room); roomManager.AddRoom(room);
user.RoomId = room.RoomId; user.RoomId = room.RoomId;
@ -97,29 +103,40 @@ namespace AX.WebDrillServer.Hubs
throw new Exception(ex.Message); throw new Exception(ex.Message);
} }
} }
public bool CallServer_EnterRoom(string roomId, FireDeductionUser user, string? password = null)
public async Task<RoomEnterResult> CallServer_EnterRoom(RoomEnterData enterInfo)
{ {
bool result = false;
try try
{ {
var room = roomManager.GetRoom(roomId); var room = roomManager.GetRoom(enterInfo.RoomId);
if (room != null && room.Password == password) 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; return RoomEnterResult.Success;
room.Users.Add(user);
user.RoomId = room.RoomId;
}
else
{
throw new NotImplementedException("房间中已经存在该用户!");
}
} }
else else
{ {
throw new NotImplementedException("房间信息有误!"); return RoomEnterResult.RoomError;
} }
} }
catch (Exception) catch (Exception)
@ -127,38 +144,41 @@ namespace AX.WebDrillServer.Hubs
throw; throw;
} }
return result;
} }
public async Task<bool> LeaveRoom(string roomId, string userId) public async Task<RoomEnterResult> CallServer_LeaveRoom(RoomLeaveData leaveInfo)
{ {
bool result = false; try
await Task.Run(() =>
{ {
var room = roomManager.GetRoom(roomId); var room = roomManager.GetRoom(leaveInfo.RoomId);
if (room != null) if (room == null)//根据id查不到房间
{ {
var user = room.Users.FirstOrDefault(u => u.UserId == userId); return RoomEnterResult.RoomError;
if (user != null)
{
room.Users.Remove(user);
if (room.Users.Count == 0)
{
//TODO:保持空房间xx分钟
}
}
else
{
throw new NotImplementedException("用户信息有误!");
}
} }
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) public async Task RoomSendMessage(string RoomId, string Message)
{ {

13
AX.WebDrillServer/Services/FireDeductionHub/FireDeductionRoom.cs

@ -2,19 +2,6 @@
namespace AX.WebDrillServer.Services.FireDeductionHub namespace AX.WebDrillServer.Services.FireDeductionHub
{ {
public enum RoomCreateResult
{
Success = 0,//成功
RoomReName,//房间重名
RoomNameEmpty,//房间名为空
NoUserExist,//用户不存在
}
public enum RoomState
{
Ready = 0,//准备
Playing,//进行中
Over,//结束
}
/// <summary> /// <summary>
/// 沙盘推演房间 /// 沙盘推演房间
/// </summary> /// </summary>

37
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
{
}
}

9
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; }
}
}

8
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!;
}
}

20
AX.WebDrillServer/Services/FireDeductionHub/RoomManager.cs

@ -2,16 +2,13 @@
{ {
public class RoomManager public class RoomManager
{ {
private List<FireDeductionRoom> fireDeductionRooms = new List<FireDeductionRoom>(); private readonly List<FireDeductionRoom> fireDeductionRooms = new();
private List<FireDeductionUser> fireDeductionUsers = new List<FireDeductionUser>(); private readonly List<FireDeductionUser> fireDeductionUsers = new();
public RoomShowInfo RoomToInfo(FireDeductionRoom source, RoomShowInfo info = null!) public RoomShowInfo RoomToInfo(FireDeductionRoom source, RoomShowInfo? info = null)
{ {
if (info == null) info ??= new();
{
info = new RoomShowInfo();
}
info.RoomId = source.RoomId; info.RoomId = source.RoomId;
info.RoomName = source.RoomName; info.RoomName = source.RoomName;
info.Owner = source.Owner; info.Owner = source.Owner;
@ -34,7 +31,7 @@
{ {
lock (this) lock (this)
{ {
List<RoomShowInfo> infos = new List<RoomShowInfo>(); List<RoomShowInfo> infos = new();
foreach (var item in fireDeductionRooms) foreach (var item in fireDeductionRooms)
{ {
infos.Add(RoomToInfo(item)); infos.Add(RoomToInfo(item));
@ -49,6 +46,13 @@
return fireDeductionUsers; 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) public FireDeductionRoom? GetRoom(string roomId)
{ {
lock (this) lock (this)

9
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<FireDeductionUser> FireDeductionUsers { get; set; } = new List<FireDeductionUser>();
}
}
Loading…
Cancel
Save