From 29cea647b65dc5d9867976c9af30373028f7b3a6 Mon Sep 17 00:00:00 2001 From: tianfeng <769204422@qq.com> Date: Thu, 19 Mar 2026 15:39:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B8=A2=E5=87=BA=E6=88=BF=E9=97=B4=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/command/room/RoomBlackJoinCmdExe.java | 166 ++++-------------- 1 file changed, 39 insertions(+), 127 deletions(-) diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomBlackJoinCmdExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomBlackJoinCmdExe.java index 1bce99fd..6b2c3838 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomBlackJoinCmdExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/room/RoomBlackJoinCmdExe.java @@ -11,7 +11,7 @@ import com.red.circle.framework.core.response.ResponseErrorCode; import com.red.circle.live.inner.endpoint.LiveMicClient; import com.red.circle.other.app.dto.clientobject.room.RoomBlackProcessCO; import com.red.circle.other.app.dto.cmd.room.RoomBlackCmd; -import com.red.circle.other.domain.gateway.props.PropsNobleVipGateway; +import com.red.circle.other.domain.enums.VipAbilityType; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.infra.database.cache.service.other.EnumConfigCacheService; @@ -28,17 +28,13 @@ import com.red.circle.other.infra.database.rds.service.sys.AdministratorService; import com.red.circle.other.inner.asserts.RoomErrorCode; import com.red.circle.other.inner.asserts.user.UserErrorCode; import com.red.circle.other.inner.enums.config.EnumConfigKey; -import com.red.circle.other.inner.enums.live.RoomUserRolesEnum; -import com.red.circle.other.inner.enums.material.NobleVipEnum; -import com.red.circle.other.inner.enums.material.PropsCommodityType; -import com.red.circle.other.inner.enums.material.PropsVipActualEquityEnum; -import com.red.circle.other.inner.model.dto.material.props.PropsNobleVipAbilityDTO; import com.red.circle.tool.core.collection.CollectionUtils; import com.red.circle.tool.core.date.DateUtils; import com.red.circle.tool.core.date.TimestampUtils; import com.red.circle.tool.core.json.JacksonUtils; import com.red.circle.tool.core.sequence.IdWorkerUtils; import com.red.circle.tool.core.text.StringUtils; + import java.util.Collections; import java.util.List; import java.util.Objects; @@ -61,9 +57,7 @@ public class RoomBlackJoinCmdExe { private final RoomMemberService roomMemberService; private final UserProfileGateway userProfileGateway; private final AdministratorService administratorService; - private final PropsNobleVipGateway propsNobleVipGateway; private final ApiOperationLogService apiOperationLogService; - private final EnumConfigCacheService enumConfigCacheService; private final RoomUserBlacklistService roomUserBlacklistService; private final RoomProfileManagerService roomProfileManagerService; private final LiveMicClient liveMicClient; @@ -83,12 +77,13 @@ public class RoomBlackJoinCmdExe { .setCreateTime(DateUtils.now()) ); + // 时间参数校验 if (cmd.getOutTime() <= 0) { - log.warn("RoomBlackProcessCO 请求时间参数错误:{}", cmd.getOutTime()); ResponseAssert.failure(ResponseErrorCode.REQUEST_PARAMETER_ERROR); return null; } + // 操作者无踢出权限 List authResources = administratorAuthService.listAuthResources(cmd.getUserId()); ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, authResources.contains("KICK_ROOM")); @@ -96,118 +91,71 @@ public class RoomBlackJoinCmdExe { ResponseAssert.isFalse(UserErrorCode.NOT_OPERATION_ME, Objects.equals(cmd.getUserId(), cmd.requiredReqUserId())); - String superAdminIds = enumConfigCacheService.getValue(EnumConfigKey.ASWAT_ADMINS, - cmd.requireReqSysOrigin()); - // 权限不足: 不可操作管理员 + // 不可操作系统管理员 ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, - StringUtils.isNotBlank(superAdminIds) && superAdminIds - .contains(String.valueOf(cmd.getUserId()))); + administratorService.existsAdmin(cmd.getUserId())); + // 被踢用户信息 UserProfile beBlackUserProfile = userProfileGateway.getByUserId(cmd.getUserId()); - // 没有找到用户信息 ResponseAssert.notNull(UserErrorCode.USER_INFO_NOT_FOUND, beBlackUserProfile); - // 房间不存在 - RoomProfile beBlackRoomProfile = roomProfileManagerService.getProfileById(cmd.getRoomId()); - ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, beBlackRoomProfile); + // 房间信息 + RoomProfile roomProfile = roomProfileManagerService.getProfileById(cmd.getRoomId()); + ResponseAssert.notNull(RoomErrorCode.ROOM_NOT_EXISTS, roomProfile); - RoomMember requestMember = roomMemberService - .getRoomMember(cmd.getRoomId(), cmd.requiredReqUserId()); + // 操作者房间成员信息 + RoomMember requestMember = roomMemberService.getRoomMember(cmd.getRoomId(), cmd.requiredReqUserId()); ResponseAssert.notNull(UserErrorCode.USER_INFO_NOT_FOUND, requestMember); - if (!(StringUtils.isNotBlank(superAdminIds) && superAdminIds - .contains(String.valueOf(cmd.requiredReqUserId())))) { + // 被踢用户开启了防拉黑权限 + ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, + userProfileGateway.getUserVipAbility(cmd.getUserId(), VipAbilityType.ANTI_BLOCK)); - Long wearNobleVipSourceId = getWearNobleVipSourceId(beBlackUserProfile); - PropsNobleVipAbilityDTO vipAbilities = propsNobleVipGateway.getAbilityDTO( - wearNobleVipSourceId); - - Boolean vip = Objects.nonNull(vipAbilities) && (Objects.equals(vipAbilities.getVipType(), - NobleVipEnum.EMPEROR.name())||Objects.equals(vipAbilities.getVipType(), - NobleVipEnum.KING.name())); - - // 2043 权限不足 - ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, vip); - - // 2023-9-7仅房主可以踢VIP,vip5、6不能踢 - if (!requestMember.checkHomeowner()) { - // 实际VIP权益 - List vipActualList = listUserPropsVipActualEquity( - beBlackUserProfile); - // 2043 权限不足 - ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, - CollectionUtils.isNotEmpty(vipActualList) && vipActualList - .contains(PropsVipActualEquityEnum.PROHIBIT_KICK)); - } - } - - // 超级管理员除了不能拉黑本房间房主,其余都可以拉黑 - if (StringUtils.isNotBlank(superAdminIds) && superAdminIds - .contains(String.valueOf(cmd.requiredReqUserId()))) { - superAdminBlacklist(cmd, beBlackUserProfile, beBlackRoomProfile); - return new RoomBlackProcessCO() - .setRoomId(cmd.getRoomId()) - .setRoles("SUPER_ADMIN") - .setRemark("系统管理员"); - } - - // 权限不足(必须是房主/管理员) -// ResponseAssert.isTrue(CommonErrorCode.INSUFFICIENT_PERMISSION, -// requestMember.checkHomeownerOrAdmin()); - - RoomMember beOptMember = roomMemberService - .getRoomMember(cmd.getRoomId(), cmd.getUserId()); - - // 如果为空表示被操作人角色为游客 + // 被操作人角色校验 + RoomMember beOptMember = roomMemberService.getRoomMember(cmd.getRoomId(), cmd.getUserId()); if (Objects.nonNull(beOptMember)) { - // 不能是房主 - ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, - beOptMember.checkHomeowner()); - - // 权限不能相同 + // 不能踢房主 + ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, beOptMember.checkHomeowner()); + // 不能踢同级 ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, Objects.equals(beOptMember.getRoles(), requestMember.getRoles())); } - // 权限不足 + // 不能踢房间创建者 ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, - Objects.equals(beBlackRoomProfile.getUserId(), cmd.getUserId())); + Objects.equals(roomProfile.getUserId(), cmd.getUserId())); - List roomOnlineUserIds = ResponseAssert.requiredSuccess(liveMicClient.getLiveRoomUserIds(cmd.getRoomId(), 200)); + // 被踢用户不在房间中 + List roomOnlineUserIds = ResponseAssert.requiredSuccess( + liveMicClient.getLiveRoomUserIds(cmd.getRoomId(), 200)); if (CollectionUtils.isEmpty(roomOnlineUserIds) || !roomOnlineUserIds.contains(beBlackUserProfile.getId())) { - log.info("用户不在房间,无法拉黑 createUserId:{} roomOnlineUserIds:{} blackUserId:{}", cmd.requiredReqUserId(), roomOnlineUserIds, beBlackUserProfile.getId()); + log.info("用户不在房间,无法拉黑 reqUserId:{} blackUserId:{}", cmd.requiredReqUserId(), beBlackUserProfile.getId()); return null; } - Boolean isSuccess = ResponseAssert.requiredSuccess( + // 执行拉黑 + ResponseAssert.requiredSuccess( imGroupClient.banGroupMember(new GroupBanCmd() - .setGroupId(beBlackRoomProfile.getRoomAccount()) + .setGroupId(roomProfile.getRoomAccount()) .setUserId(beBlackUserProfile.getId()) .setDuration(cmd.getOutTime() * 60) - .setDescription(cmd.requiredReqUserId() - + "#" - + requestMember.getRoles() - + "#" - + beBlackUserProfile.getId()) + .setDescription(cmd.requiredReqUserId() + "#" + requestMember.getRoles() + "#" + beBlackUserProfile.getId()) ) ); - log.info("imGroupClient拉黑结果:{}", isSuccess); -// if (Objects.equals(isSuccess, Boolean.TRUE)) { roomUserBlacklistService.add(new RoomUserBlacklist() - .setTimingId(IdWorker.getId()) - .setSysOrigin(cmd.requireReqSysOrigin()) - .setUserId(beBlackUserProfile.getId()) - .setRoomId(beBlackRoomProfile.getId()) - .setCreateUserRoles(requestMember.getRoles()) - .setCreateUser(cmd.requiredReqUserId()) - .setExpiredTime(TimestampUtils.nowPlusMinutes(cmd.getOutTime())) - .setCreateTime(TimestampUtils.now()) + .setTimingId(IdWorker.getId()) + .setSysOrigin(cmd.requireReqSysOrigin()) + .setUserId(beBlackUserProfile.getId()) + .setRoomId(roomProfile.getId()) + .setCreateUserRoles(requestMember.getRoles()) + .setCreateUser(cmd.requiredReqUserId()) + .setExpiredTime(TimestampUtils.nowPlusMinutes(cmd.getOutTime())) + .setCreateTime(TimestampUtils.now()) ); -// } trtcClient.removeUser(new TrtcRemoveUserCmd() - .setRoomId(Long.parseLong(beBlackRoomProfile.getRoomAccount())) + .setRoomId(Long.parseLong(roomProfile.getRoomAccount())) .setUserIds(Collections.singletonList(beBlackUserProfile.getId())) .setLogOrigin("黑名单")); @@ -216,40 +164,4 @@ public class RoomBlackJoinCmdExe { .setRoles(requestMember.getRoles()) .setRemark("常规操作"); } - - private List listUserPropsVipActualEquity(UserProfile userProfile) { - return userProfileGateway.listUserActualEquityEnum(userProfile.getId()); - } - - private void superAdminBlacklist(RoomBlackCmd cmd, UserProfile baseInfo, - RoomProfile roomProfile) { - - RoomMember beOptMember = roomMemberService.getRoomMember(cmd.getRoomId(), cmd.getUserId()); - - ResponseAssert.isFalse(CommonErrorCode.INSUFFICIENT_PERMISSION, - Objects.nonNull(beOptMember) && beOptMember.checkHomeowner()); - - RoomMember requestMember = roomMemberService - .getRoomMember(cmd.getRoomId(), cmd.requiredReqUserId()); - - roomUserBlacklistService.add(new RoomUserBlacklist() - .setTimingId(IdWorker.getId()) - .setSysOrigin(cmd.requireReqSysOrigin()) - .setUserId(baseInfo.getId()) - .setRoomId(roomProfile.getId()) - .setCreateUserRoles(Objects.isNull(requestMember) ? RoomUserRolesEnum.ADMIN.name() - : requestMember.getRoles()) - .setCreateUser(cmd.requiredReqUserId()) - .setExpiredTime(TimestampUtils.nowPlusMinutes(cmd.getOutTime())) - ); - } - - private Long getWearNobleVipSourceId(UserProfile userProfile) { - return userProfile.filterProps( - props -> Objects.nonNull(props.getPropsResources()) && PropsCommodityType.NOBLE_VIP.eq( - props.getPropsResources().getType())).stream().findFirst() - .map(props -> props.getPropsResources().getId()) - .orElse(null); - } - }