Files
BuYuHouDuan/ChessGameSrc/ChessGameService/Subscribers/AdminKickChessPlayerSubscriber.cs
T
2026-10-12 16:22:04 +08:00

67 lines
2.3 KiB
C#

using CommonDomain;
using DotNetCore.CAP;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
namespace ChessGameService.Subscribers;
public sealed class AdminKickChessPlayerSubscriber : ICapSubscribe
{
private readonly IChessGameService _chessService;
private readonly IHubContext<ChessGameHub> _hubContext;
public AdminKickChessPlayerSubscriber(
IChessGameService chessService,
IHubContext<ChessGameHub> hubContext)
{
_chessService = chessService;
_hubContext = hubContext;
}
[CapSubscribe(TopicKeys.后台踢出象棋玩家)]
public async Task Handle(AdminKickChessPlayerMessage message)
{
if (string.IsNullOrWhiteSpace(message.RoomId) || string.IsNullOrWhiteSpace(message.UserId))
{
return;
}
var room = _chessService.GetRoom(message.RoomId);
var target = room?.users?.FirstOrDefault(u => u.userId == message.UserId);
if (room == null || target == null)
{
return;
}
if (room.state == 2)
{
return;
}
var targetCid = target.Cid;
var (success, resultMessage, updatedRoom) = _chessService.AdminKickPlayer(message.RoomId, message.UserId);
if (!success || updatedRoom == null)
{
return;
}
await _chessService.UpdateUserGameType(message.UserId, 0);
if (!string.IsNullOrWhiteSpace(targetCid))
{
await _hubContext.Clients.Client(targetCid).SendAsync("KickedFromRoom", new
{
gameId = message.RoomId,
userId = message.UserId,
reason = string.IsNullOrWhiteSpace(message.Reason) ? "被管理员移出房间" : message.Reason,
source = "admin"
});
await _hubContext.Groups.RemoveFromGroupAsync(targetCid, message.RoomId);
await _hubContext.Groups.AddToGroupAsync(targetCid, ChessGameHub.LobbyGroup);
}
await _hubContext.Clients.Group(message.RoomId).SendAsync("RoomStateNotice", updatedRoom);
await _hubContext.Clients.Group(message.RoomId).SendAsync("BeginGame", updatedRoom);
await _hubContext.Clients.Group(ChessGameHub.LobbyGroup).SendAsync("ExitRoomNotice", updatedRoom);
}
}