feat: 添加房间详情 API
This commit is contained in:
@@ -9,6 +9,7 @@ import com.webgame.webgamebackend.repository.*;
|
||||
import com.webgame.webgamebackend.common.event.SseEventPublisher;
|
||||
import com.webgame.webgamebackend.common.event.SseEventType;
|
||||
import com.webgame.webgamebackend.service.GameService;
|
||||
import com.webgame.webgamebackend.service.GomokuGameService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
@@ -427,6 +428,65 @@ public class GameServiceImpl implements GameService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public RoomDetailResponse getRoomDetail(String roomId) {
|
||||
GameRoomEntity room = gameRoomRepository.findById(roomId)
|
||||
.orElseThrow(() -> new BusinessException(ErrorCode.ROOM_NOT_FOUND));
|
||||
|
||||
GameConfigEntity gameConfig = gameConfigRepository.findByGameId(room.getGameId())
|
||||
.orElseThrow(() -> new BusinessException(ErrorCode.GAME_NOT_FOUND));
|
||||
|
||||
// 组装玩家详情(含座位号和准备状态)
|
||||
List<RoomPlayerEntity> roomPlayers = roomPlayerRepository.findByRoomId(roomId);
|
||||
List<String> userIds = roomPlayers.stream()
|
||||
.map(RoomPlayerEntity::getUserId).toList();
|
||||
Map<String, UserEntity> userMap = userRepository.findByAccountIdIn(userIds).stream()
|
||||
.collect(Collectors.toMap(u -> u.getAccount().getId(), u -> u));
|
||||
|
||||
List<RoomDetailResponse.RoomPlayerDetail> playerDetails = roomPlayers.stream()
|
||||
.map(rp -> {
|
||||
UserEntity user = userMap.get(rp.getUserId());
|
||||
return new RoomDetailResponse.RoomPlayerDetail(
|
||||
rp.getUserId(),
|
||||
user != null ? user.getAvatar() : "",
|
||||
user != null ? user.getNickName() : "未知玩家",
|
||||
rp.getSeatNumber(),
|
||||
rp.getReadyStatus()
|
||||
);
|
||||
}).toList();
|
||||
|
||||
String creatorName = getNickname(room.getCreatorId());
|
||||
|
||||
// 对局中或有对局记录时,查询棋盘状态
|
||||
int[][] boardState = null;
|
||||
String currentTurn = null;
|
||||
List<RoomDetailResponse.MoveItem> moves = List.of();
|
||||
|
||||
if ("playing".equals(room.getStatus()) || "finished".equals(room.getStatus())) {
|
||||
// 查询走棋记录
|
||||
List<GameMoveEntity> moveEntities = gameMoveRepository.findByRoomIdOrderByMoveIndexAsc(roomId);
|
||||
moves = moveEntities.stream()
|
||||
.map(m -> new RoomDetailResponse.MoveItem(
|
||||
m.getMoveIndex(), m.getPlayerId(), m.getRowNum(), m.getColNum()))
|
||||
.toList();
|
||||
|
||||
// 从走棋记录重建棋盘
|
||||
boardState = GomokuGameService.rebuildBoard(moveEntities, room.getMaxPlayers());
|
||||
// currentTurn 由服务端运行时管理,HTTP 快照中暂不返回
|
||||
}
|
||||
|
||||
log.info("[游戏服务] 获取房间详情, roomId={}, status={}, 玩家数={}",
|
||||
roomId, room.getStatus(), playerDetails.size());
|
||||
|
||||
return new RoomDetailResponse(
|
||||
room.getId(), room.getName(), room.getGameId(),
|
||||
gameConfig.getIcon(), gameConfig.getName(),
|
||||
room.getMaxPlayers(), room.getMode(), room.getStakes(),
|
||||
room.getStatus(), room.getCreatorId(), creatorName,
|
||||
room.getAllowSpectate(), playerDetails, boardState, currentTurn, moves
|
||||
);
|
||||
}
|
||||
|
||||
// ==================== 私有辅助方法 ====================
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user