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;
this.roomManager = roomManager;
}
/// <summary>
/// 获取当前房间列表
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<RoomShowInfo> 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<RoomEnterResult> 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<bool> LeaveRoom(string roomId, string userId)
public async Task<RoomEnterResult> 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)
{

13
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,//结束
}
/// <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
{
private List<FireDeductionRoom> fireDeductionRooms = new List<FireDeductionRoom>();
private List<FireDeductionUser> fireDeductionUsers = new List<FireDeductionUser>();
private readonly List<FireDeductionRoom> fireDeductionRooms = new();
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 RoomShowInfo();
}
info ??= new();
info.RoomId = source.RoomId;
info.RoomName = source.RoomName;
info.Owner = source.Owner;
@ -34,7 +31,7 @@
{
lock (this)
{
List<RoomShowInfo> infos = new List<RoomShowInfo>();
List<RoomShowInfo> 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)

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