|
|
@@ -43,6 +43,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import java.io.Serializable;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -97,12 +98,16 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
} else {
|
|
|
sysUser = getSysUser(userId);
|
|
|
}
|
|
|
+ return queryRoomAndCheck(roomUid, sysUser);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, SysUser sysUser) {
|
|
|
//直播间信息校验
|
|
|
Optional<ImLiveBroadcastRoomVo> optional = Optional.ofNullable(roomUid)
|
|
|
.map(this::queryRoomInfo);
|
|
|
optional.orElseThrow(() -> new BizException("直播间不存在"));
|
|
|
optional.filter(r -> r.getTenantId().equals(sysUser.getTenantId()))
|
|
|
- .orElseThrow(() -> new BizException("您不是该直播机构学员,不可观看!"));
|
|
|
+ .orElseThrow(() -> new BizException("您不是该直播机构人员,不可观看!"));
|
|
|
optional.filter(r -> r.getRoomState() != 1).orElseThrow(() -> new BizException("直播间不存在"));
|
|
|
ImLiveBroadcastRoomVo room = optional.get();
|
|
|
if (room.getLiveState() == 0) {
|
|
|
@@ -115,6 +120,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
return room;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 查询直播间信息
|
|
|
*
|
|
|
@@ -141,6 +147,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.getPageInfo(param);
|
|
|
pageInfo.setDesc("a.created_time_");
|
|
|
param.put("tenantId", TenantContextHolder.getTenantId());
|
|
|
+ Function<String, Optional<String>> timeFun = (s) -> Optional.ofNullable(param.get(s)).map(String::valueOf);
|
|
|
+ timeFun.apply("startTime").ifPresent(s -> param.put("startTime", s + " 00:00:00"));
|
|
|
+ timeFun.apply("endTime").ifPresent(s -> param.put("endTime", s + " 23:59:59"));
|
|
|
IPage<ImLiveBroadcastRoomVo> page = baseMapper.queryPage(pageInfo, param);
|
|
|
return PageUtil.pageInfo(page);
|
|
|
}
|
|
|
@@ -261,20 +270,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
//过期时间= 房间正式开始时间+expiredMinute 分钟
|
|
|
Date expiredTime = DateUtil.addMinutes(room.getCreatedTime(), expiredMinute);
|
|
|
- //当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)并且 主播没有进入房间
|
|
|
- if (now.getTime() >= expiredTime.getTime() && Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
|
- roomDestroy(room);
|
|
|
- log.info("roomDestroy not joinRoom >>>> roomId:{}", room.getId());
|
|
|
- return;
|
|
|
- }
|
|
|
+ //先决条件 当前时间 大于(创建房间时填入的开播时间 + 设置的过期分钟数)
|
|
|
+ if (now.getTime() >= expiredTime.getTime()) {
|
|
|
|
|
|
- if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
|
|
|
- Date comparedTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
|
|
|
- //当前时间 大于 创建房间时填入的开播时间 并且 当前时间 大于 (主播退出时间 + 设置的过期分钟数) 并且 是直播中断状态
|
|
|
- if (now.getTime() >= room.getCreatedTime().getTime() && now.getTime() >= comparedTime.getTime() && speakerInfo.getState() != 0) {
|
|
|
+ //1.主播没有进入房间,则直接销毁房间
|
|
|
+ if (Objects.isNull(speakerInfo.getJoinRoomTime())) {
|
|
|
roomDestroy(room);
|
|
|
- log.info("roomDestroy exitRoom >>>> roomId:{}", room.getId());
|
|
|
+ log.info("roomDestroy not joinRoom >>>> roomId:{}", room.getId());
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ //如果主播已经进入了房间 就判断是否退出过房间
|
|
|
+ if (Objects.nonNull(speakerInfo.getExitRoomTime())) {
|
|
|
+ //如果退出过房间 判断退出时间是否大于进入时间
|
|
|
+ if (speakerInfo.getExitRoomTime().getTime() > speakerInfo.getJoinRoomTime().getTime()) {
|
|
|
+ //如果退出时间大于进入时间,就将退出时间+expiredMinute分钟
|
|
|
+ Date exitExpiredTime = DateUtil.addMinutes(speakerInfo.getExitRoomTime(), expiredMinute);
|
|
|
+ if (now.getTime() >= exitExpiredTime.getTime()) {
|
|
|
+ roomDestroy(room);
|
|
|
+ log.info("roomDestroy exitExpiredTime >>>> roomId:{}", room.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -301,8 +319,18 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
log.error("roomDestroy>>>> room : {}", JSONObject.toJSONString(room));
|
|
|
String roomUid = room.getRoomUid();
|
|
|
Integer speakerId = room.getSpeakerId();
|
|
|
+
|
|
|
try {
|
|
|
+ //向聊天室发自定义消息踢出所有人
|
|
|
+ ImRoomMessage message = new ImRoomMessage();
|
|
|
+ message.setFromUserId(speakerId.toString());
|
|
|
+ message.setToChatroomId(roomUid);
|
|
|
+ message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
+ imFeignService.publishRoomMsg(message);
|
|
|
+ log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
+ //销毁直播间
|
|
|
imFeignService.destroyLiveRoom(roomUid);
|
|
|
+ log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
|
} catch (Exception e) {
|
|
|
log.error("roomDestroy>>>> errorMsg{}", e.getMessage(), e.getCause());
|
|
|
}
|
|
|
@@ -324,18 +352,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
room.setUpdatedTime(date);
|
|
|
room.setLiveEndTime(date);
|
|
|
this.updateById(room);
|
|
|
-
|
|
|
- //向聊天室发自定义消息踢出所有人
|
|
|
- ImRoomMessage message = new ImRoomMessage();
|
|
|
- message.setFromUserId(speakerId.toString());
|
|
|
- message.setToChatroomId(roomUid);
|
|
|
- message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
- try {
|
|
|
- imFeignService.publishRoomMsg(message);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("roomDestroy>>>> publishRoomErrorMsg{}", e.getMessage(), e.getCause());
|
|
|
- }
|
|
|
- log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
}
|
|
|
|
|
|
//获取该直播间所有数据写入数据库-并清理缓存
|
|
|
@@ -482,27 +498,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
*
|
|
|
* @param roomUid
|
|
|
*/
|
|
|
- public void speakerJoinRoom(String roomUid) {
|
|
|
- ImLiveBroadcastRoomVo roomVo = Optional.ofNullable(roomUid)
|
|
|
- .map(this::queryRoomInfo)
|
|
|
- .orElseThrow(() -> new BizException("直播间不存在"));
|
|
|
- Integer userId = getSysUser().getId();
|
|
|
+ public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid) {
|
|
|
+ SysUser sysUser = getSysUser();
|
|
|
+ ImLiveBroadcastRoomVo roomVo = queryRoomAndCheck(roomUid, sysUser);
|
|
|
+ Integer userId = sysUser.getId();
|
|
|
if (!userId.equals(roomVo.getSpeakerId())) {
|
|
|
throw new BizException("您不是该直播间的主讲人");
|
|
|
}
|
|
|
Date now = new Date();
|
|
|
//获取直播间信息
|
|
|
RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
|
|
|
- if (speakerCache.isExists()) {
|
|
|
- //判断有没有是房间号的主讲人
|
|
|
- RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
- if (roomUid.equals(speakerInfo.getRoomUid())) {
|
|
|
- speakerInfo.setJoinRoomTime(now);
|
|
|
- speakerCache.set(speakerInfo);
|
|
|
- }
|
|
|
- } else {
|
|
|
- throw new BizException("还未开启直播间");
|
|
|
- }
|
|
|
+ if (!speakerCache.isExists()) {
|
|
|
+ //没有主讲人信息则生成一个
|
|
|
+ createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
|
|
|
+ speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userId.toString()));
|
|
|
+ }
|
|
|
+ RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
+ speakerInfo.setJoinRoomTime(now);
|
|
|
+ speakerCache.set(speakerInfo);
|
|
|
+ return roomVo;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -619,43 +633,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
*/
|
|
|
private void createLiveRoom(ImLiveBroadcastRoom room) {
|
|
|
log.info("createLiveRoom>>>>>>roomUid:{}", room.getRoomUid());
|
|
|
- Date now = new Date();
|
|
|
try {
|
|
|
//生成主讲人信息到缓存
|
|
|
SysUser sysUser = getSysUser(room.getSpeakerId());
|
|
|
- RoomSpeakerInfo speakerInfo = new RoomSpeakerInfo();
|
|
|
- speakerInfo.setSpeakerId(sysUser.getId());
|
|
|
- speakerInfo.setSpeakerName(sysUser.getRealName());
|
|
|
- speakerInfo.setCreateRoomTime(now);
|
|
|
- speakerInfo.setRoomUid(room.getRoomUid());
|
|
|
- speakerInfo.setTenantId(sysUser.getTenantId());
|
|
|
- speakerInfo.setTotalLiveTime(0);
|
|
|
-
|
|
|
- //查询房间信息是否允许录像
|
|
|
- ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
|
|
|
- boolean video = getRoomConfig(one.getRoomConfig())
|
|
|
- .filter(c -> Objects.nonNull(c.getWhether_video()))
|
|
|
- .map(c -> c.getWhether_video() == 0)
|
|
|
- .orElse(false);
|
|
|
- if (video) {
|
|
|
- //可以录制视频
|
|
|
- speakerInfo.setWhetherVideo(0);
|
|
|
- } else {
|
|
|
- //不可以录制视频
|
|
|
- speakerInfo.setWhetherVideo(1);
|
|
|
- }
|
|
|
- //写入主讲人信息
|
|
|
- redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
|
|
|
-
|
|
|
- //生成0点赞
|
|
|
- redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
|
|
|
-
|
|
|
- //修改房间状态为开始
|
|
|
- room.setLiveState(1);
|
|
|
- room.setUpdatedTime(now);
|
|
|
- room.setUpdatedBy(-1);
|
|
|
- baseMapper.updateById(room);
|
|
|
-
|
|
|
+ createSpeakerInfo(room, sysUser);
|
|
|
//去融云创建房间
|
|
|
imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
} catch (Exception e) {
|
|
|
@@ -663,6 +644,43 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ //生成主讲人信息
|
|
|
+ private void createSpeakerInfo(ImLiveBroadcastRoom room, SysUser sysUser) {
|
|
|
+ Date now = new Date();
|
|
|
+ RoomSpeakerInfo speakerInfo = new RoomSpeakerInfo();
|
|
|
+ speakerInfo.setSpeakerId(sysUser.getId());
|
|
|
+ speakerInfo.setSpeakerName(sysUser.getRealName());
|
|
|
+ speakerInfo.setCreateRoomTime(now);
|
|
|
+ speakerInfo.setRoomUid(room.getRoomUid());
|
|
|
+ speakerInfo.setTenantId(sysUser.getTenantId());
|
|
|
+ speakerInfo.setTotalLiveTime(0);
|
|
|
+
|
|
|
+ //查询房间信息是否允许录像
|
|
|
+ ImLiveBroadcastRoom one = this.getOne(new QueryWrapper<ImLiveBroadcastRoom>().eq("room_uid_", room.getRoomUid()));
|
|
|
+ boolean video = getRoomConfig(one.getRoomConfig())
|
|
|
+ .filter(c -> Objects.nonNull(c.getWhether_video()))
|
|
|
+ .map(c -> c.getWhether_video() == 0)
|
|
|
+ .orElse(false);
|
|
|
+ if (video) {
|
|
|
+ //可以录制视频
|
|
|
+ speakerInfo.setWhetherVideo(0);
|
|
|
+ } else {
|
|
|
+ //不可以录制视频
|
|
|
+ speakerInfo.setWhetherVideo(1);
|
|
|
+ }
|
|
|
+ //写入主讲人信息
|
|
|
+ redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, room.getSpeakerId().toString())).set(speakerInfo);
|
|
|
+
|
|
|
+ //生成0点赞
|
|
|
+ redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
|
|
|
+
|
|
|
+ //修改房间状态为开始
|
|
|
+ room.setLiveState(1);
|
|
|
+ room.setUpdatedTime(now);
|
|
|
+ room.setUpdatedBy(-2);
|
|
|
+ baseMapper.updateById(room);
|
|
|
+ }
|
|
|
+
|
|
|
private Optional<ImLiveBroadcastRoomDto.RoomConfig> getRoomConfig(String roomConfig) {
|
|
|
return Optional.ofNullable(roomConfig)
|
|
|
.map(c -> JSON.parseObject(c, ImLiveBroadcastRoomDto.RoomConfig.class));
|