|
@@ -336,7 +336,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
/**
|
|
|
* 修改直播间信息
|
|
|
*
|
|
|
- * @param dto
|
|
|
+ * @param dto ImLiveBroadcastRoomDto
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -777,11 +777,31 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (isSpeaker(user, now, userid, roomUid)) {
|
|
|
return;
|
|
|
}
|
|
|
+
|
|
|
+ //向直播间发送当前在线人数消息
|
|
|
+ ImLiveBroadcastRoomVo roomVo = this.getImLiveBroadcastRoomVo(roomUid);
|
|
|
+ if (Objects.isNull(roomVo)) {
|
|
|
+ log.info("opsRoom>>>> roomVo is null, userState: {}", JSON.toJSONString(userState));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer userId = Integer.valueOf(userid);
|
|
|
//这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
|
|
|
if (user.getStatus().equals("0")) {
|
|
|
+
|
|
|
+ // 用户进入直播间,发送统计数据
|
|
|
+ sendLiveRoomStatMessage(userid, roomVo);
|
|
|
+
|
|
|
+ // 更新用户在线状态
|
|
|
+ liveBroadcastRoomMemberService.lambdaUpdate()
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getTenantId, roomVo.getTenantId())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getRoomUid, roomVo.getRoomUid())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getUserId, userId)
|
|
|
+ .set(ImLiveBroadcastRoomMember::getOnlineStatus, 1)
|
|
|
+ .update();
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
- Integer userId = Integer.valueOf(userid);
|
|
|
|
|
|
//从房间累计用户信息中查询该用户的信息
|
|
|
RMap<Integer, String> roomTotalUser = this.getTotalUserCache(roomUid);
|
|
@@ -809,29 +829,130 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
}
|
|
|
//从在线人员列表删除该人员
|
|
|
onlineUserInfo.fastRemove(userId);
|
|
|
- //向直播间发送当前在线人数消息
|
|
|
- ImLiveBroadcastRoomVo roomVo = this.getImLiveBroadcastRoomVo(roomUid);
|
|
|
- this.sendOnlineUserCount(roomVo, userId, onlineUserInfo.size());
|
|
|
- log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
|
|
|
- //用户离开直播间发送退出房间消息给主讲人
|
|
|
- LiveRoomMessage message = new LiveRoomMessage();
|
|
|
- message.setIsIncludeSender(1);
|
|
|
- message.setFromUserId(userId.toString());
|
|
|
- message.setToChatRoomId(roomUid);
|
|
|
- message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
|
|
|
- message.setContent(userId);
|
|
|
- try {
|
|
|
- LivePluginService pluginService = livePluginContext.getPluginService(roomVo.getServiceProvider());
|
|
|
- pluginService.sendChatRoomMessage(message);
|
|
|
- log.info("opsRoom>>>> looker LOOKER_LOGIN_OUT : {}", JSONObject.toJSONString(userInfo));
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("opsRoom>>>> looker error LOOKER_LOGIN_OUT {}", e.getMessage());
|
|
|
- log.error("opsRoom>>>> looker error sendMessage {} : LOOKER_LOGIN_OUT : {}", message, JSONObject.toJSONString(userInfo));
|
|
|
+
|
|
|
+ // 更新用户离线状态
|
|
|
+ ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
|
|
|
+ roomMember.setOnlineStatus(0);
|
|
|
+
|
|
|
+ // 用户离开直播间
|
|
|
+ if (user.getStatus().equals("3")) {
|
|
|
+ roomMember.setLiveRoomStatus(0);
|
|
|
}
|
|
|
+ // 更新用户在线状态为离线
|
|
|
+ liveBroadcastRoomMemberService.lambdaUpdate()
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getTenantId, roomVo.getTenantId())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getRoomUid, roomVo.getRoomUid())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getUserId, userId)
|
|
|
+ .update(roomMember);
|
|
|
+
|
|
|
+ log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
|
|
|
+ // 在线用户消息同步
|
|
|
+ sendOnlineUserCount(roomVo, userId, onlineUserInfo.size());
|
|
|
+
|
|
|
+ // 直播间统计数据
|
|
|
+ sendLiveRoomStatMessage(userid, roomVo);
|
|
|
+
|
|
|
+ // 直播间用户离开消息
|
|
|
+ sendLiveRoomLoginOutMessage(userid, roomVo);
|
|
|
+
|
|
|
});
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 直播间统计数据同步
|
|
|
+ * @param userid 用户Id
|
|
|
+ * @param roomVo ImLiveBroadcastRoomVo
|
|
|
+ */
|
|
|
+ private void sendLiveRoomStatMessage(String userid, ImLiveBroadcastRoomVo roomVo) {
|
|
|
+
|
|
|
+ // 直播间统计数据
|
|
|
+ getRoomData(roomVo);
|
|
|
+
|
|
|
+ // 消息发送用户
|
|
|
+ LiveRoomMessage.MessageUser messageUser = null;
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
+ // 发送用户信息
|
|
|
+ messageUser = LiveRoomMessage.MessageUser
|
|
|
+ .builder()
|
|
|
+ .sendUserId(sysUser.getId().toString())
|
|
|
+ .sendUserName(sysUser.getUsername())
|
|
|
+ .avatarUrl(sysUser.getAvatar())
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ LiveRoomMessage.MessageContent messageContent = LiveRoomMessage.MessageContent
|
|
|
+ .builder()
|
|
|
+ .onlineUsers(roomVo.getLookNum().longValue())
|
|
|
+ .viewers(roomVo.getTotalLookNum().longValue())
|
|
|
+ .likes(roomVo.getLikeNum().longValue())
|
|
|
+ .sendUserInfo(messageUser)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ LiveRoomMessage message = LiveRoomMessage.builder()
|
|
|
+ .isIncludeSender(1)
|
|
|
+ .objectName(LiveRoomMessage.STAT_SYNC)
|
|
|
+ .fromUserId(userid)
|
|
|
+ .toChatRoomId(roomVo.getRoomUid())
|
|
|
+ .content(messageContent)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ //发送消息
|
|
|
+ try {
|
|
|
+ livePluginContext.getPluginService(roomVo.getServiceProvider()).sendChatRoomMessage(message);
|
|
|
+ log.info("sendLiveRoomStatMessage>>>> message: {}", JSONObject.toJSONString(message));
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("sendLiveRoomStatMessage>>>> error {}", e.getMessage());
|
|
|
+ log.error("sendLiveRoomStatMessage>>>> sendMessage {} :", JSONObject.toJSONString(message));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 直播间用户离开消息
|
|
|
+ * @param userid 用户id
|
|
|
+ * @param roomVo ImLiveBroadcastRoomVo
|
|
|
+ */
|
|
|
+ private void sendLiveRoomLoginOutMessage(String userid, ImLiveBroadcastRoomVo roomVo) {
|
|
|
+
|
|
|
+ // 消息发送用户
|
|
|
+ LiveRoomMessage.MessageUser messageUser = null;
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
+ // 发送用户信息
|
|
|
+ messageUser = LiveRoomMessage.MessageUser
|
|
|
+ .builder()
|
|
|
+ .sendUserId(sysUser.getId().toString())
|
|
|
+ .sendUserName(sysUser.getUsername())
|
|
|
+ .avatarUrl(sysUser.getAvatar())
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ LiveRoomMessage.MessageContent messageContent = LiveRoomMessage.MessageContent
|
|
|
+ .builder()
|
|
|
+ .targetId(userid)
|
|
|
+ .sendUserInfo(messageUser)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ LiveRoomMessage message = LiveRoomMessage.builder()
|
|
|
+ .isIncludeSender(1)
|
|
|
+ .objectName(LiveRoomMessage.LOOKER_LOGIN_OUT)
|
|
|
+ .fromUserId(userid)
|
|
|
+ .toChatRoomId(roomVo.getRoomUid())
|
|
|
+ .content(messageContent)
|
|
|
+ .build();
|
|
|
+ try {
|
|
|
+ //用户离开直播间发送退出房间消息给主讲人
|
|
|
+ LivePluginService pluginService = livePluginContext.getPluginService(roomVo.getServiceProvider());
|
|
|
+ pluginService.sendChatRoomMessage(message);
|
|
|
+ log.info("sendLiveRoomLoginOutMessage>>>> looker LOOKER_LOGIN_OUT : roomId={}, userId={}", roomVo.getRoomUid(), userid);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("sendLiveRoomLoginOutMessage>>>> looker error LOOKER_LOGIN_OUT {}", e.getMessage());
|
|
|
+ log.error("sendLiveRoomLoginOutMessage>>>> looker error sendMessage {} : LOOKER_LOGIN_OUT : : roomId={}, userId={}", message, roomVo.getRoomUid(), userid);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 向直播间发送当前在线人数消息
|
|
|
*
|
|
|
* @param roomVo 直播间
|
|
@@ -839,20 +960,47 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
* @param count 人数
|
|
|
*/
|
|
|
private void sendOnlineUserCount(ImLiveBroadcastRoomVo roomVo, Integer fromUserId, Integer count) {
|
|
|
+
|
|
|
String roomUid = roomVo.getRoomUid();
|
|
|
//校验传入参数,房间uid和发送人id不能为空
|
|
|
if (!WrapperUtil.checkObj(roomUid, fromUserId, count)) {
|
|
|
log.info(" sendOnlineUserCount>>>> param is null roomUid: {} fromUserId:{} count:{}", roomUid, fromUserId, count);
|
|
|
return;
|
|
|
}
|
|
|
- LiveRoomMessage message = new LiveRoomMessage();
|
|
|
- message.setIsIncludeSender(1);
|
|
|
- message.setObjectName(ImRoomMessage.MEMBER_COUNT);
|
|
|
- message.setToChatRoomId(roomUid);
|
|
|
- HashMap<String, Integer> sendMap = new HashMap<>();
|
|
|
- sendMap.put("count", count);
|
|
|
- message.setFromUserId(fromUserId.toString());
|
|
|
- message.setContent(sendMap);
|
|
|
+
|
|
|
+ // 直播间统计数据
|
|
|
+ getRoomData(roomVo);
|
|
|
+
|
|
|
+ // 消息发送用户
|
|
|
+ LiveRoomMessage.MessageUser messageUser = null;
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
+ // 发送用户信息
|
|
|
+ messageUser = LiveRoomMessage.MessageUser
|
|
|
+ .builder()
|
|
|
+ .sendUserId(sysUser.getId().toString())
|
|
|
+ .sendUserName(sysUser.getUsername())
|
|
|
+ .avatarUrl(sysUser.getAvatar())
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+ LiveRoomMessage.MessageContent messageContent = LiveRoomMessage.MessageContent
|
|
|
+ .builder()
|
|
|
+ .count(count.longValue())
|
|
|
+ .onlineUsers(roomVo.getLookNum().longValue())
|
|
|
+ .viewers(roomVo.getTotalLookNum().longValue())
|
|
|
+ .likes(roomVo.getLikeNum().longValue())
|
|
|
+ .sendUserInfo(messageUser)
|
|
|
+ .build();
|
|
|
+
|
|
|
+ LiveRoomMessage message = LiveRoomMessage.builder()
|
|
|
+ .isIncludeSender(1)
|
|
|
+ .objectName(LiveRoomMessage.MEMBER_COUNT)
|
|
|
+ .fromUserId(fromUserId.toString())
|
|
|
+ .toChatRoomId(roomUid)
|
|
|
+ .content(messageContent)
|
|
|
+ .build();
|
|
|
+
|
|
|
//发送消息
|
|
|
try {
|
|
|
livePluginContext.getPluginService(roomVo.getServiceProvider()).sendChatRoomMessage(message);
|
|
@@ -869,15 +1017,19 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
* @return true 是主讲人 false 不是主讲人
|
|
|
*/
|
|
|
private boolean isSpeaker(ImUserState user, Date now, String userid, String roomUid) {
|
|
|
+
|
|
|
RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userid);
|
|
|
if (!speakerCache.isExists()) {
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ // 当前用户为主播
|
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
|
//最后一次进入房间的clientIp
|
|
|
RBucket<String> lastClientIp = redissonClient.getBucket(LIVE_SPEAKER_LAST_CLIENT_IP.replace(ROOM_UID, roomUid).replace(USER_ID, userid));
|
|
|
//主讲人进入房间
|
|
|
if (user.getStatus().equals("0")) {
|
|
|
+
|
|
|
speakerInfo.setJoinRoomTime(now);
|
|
|
log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
|
|
|
speakerCache.set(speakerInfo);
|
|
@@ -885,6 +1037,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (StringUtils.isNotBlank(user.getClientIp())) {
|
|
|
lastClientIp.set(user.getClientIp());
|
|
|
}
|
|
|
+
|
|
|
+ // 更新主播在线状态
|
|
|
+ lambdaUpdate()
|
|
|
+ .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
|
|
|
+ .eq(ImLiveBroadcastRoom::getSpeakerId, Integer.parseInt(userid))
|
|
|
+ .set(ImLiveBroadcastRoom::getSpeakerStatus, 1)
|
|
|
+ .update();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
//校验本次退出直播间的clientIp 是不是上次进入房间的clientIp
|
|
@@ -900,18 +1060,48 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (compareDate.apply(speakerInfo.getExitRoomTime(), speakerInfo.getJoinRoomTime())) {
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
//主讲人退出房间关闭录像
|
|
|
closeLive(speakerInfo);
|
|
|
+
|
|
|
+ //主讲人退出房间
|
|
|
speakerInfo.setExitRoomTime(now);
|
|
|
log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
|
|
|
speakerCache.set(speakerInfo);
|
|
|
+
|
|
|
+ //向直播间发送当前在线人数消息
|
|
|
+ ImLiveBroadcastRoomVo roomVo = this.getImLiveBroadcastRoomVo(roomUid);
|
|
|
+ if (Objects.isNull(roomVo)) {
|
|
|
+ log.info("opsRoom>>>> roomVo is null, roomId: {}, userId={}", roomUid, userid);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ ImLiveBroadcastRoom room = new ImLiveBroadcastRoom();
|
|
|
+ room.setSpeakerStatus(0);
|
|
|
+
|
|
|
+ // 更新推流状态
|
|
|
+ if (user.getStatus().equals("3")) {
|
|
|
+ room.setPushStatus(0);
|
|
|
+ }
|
|
|
+ // 更新主播状态
|
|
|
+ lambdaUpdate()
|
|
|
+ .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
|
|
|
+ .eq(ImLiveBroadcastRoom::getSpeakerId, Integer.parseInt(userid))
|
|
|
+ .update(room);
|
|
|
+
|
|
|
+ // 腾讯云直播方案,推送主播离开消息
|
|
|
+ if (roomVo.getServiceProvider().equals("tencentCloud")) {
|
|
|
+ // 主播离开消息通知
|
|
|
+ sendLiveRoomLoginOutMessage(userid, roomVo);
|
|
|
+ }
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 主讲人登录专用
|
|
|
*
|
|
|
- * @param roomUid
|
|
|
+ * @param roomUid 直播间Id
|
|
|
*/
|
|
|
public ImLiveBroadcastRoomVo speakerJoinRoom(String roomUid, String os) {
|
|
|
SysUser sysUser = getSysUser();
|
|
@@ -942,6 +1132,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
//记录用户当前房间uid
|
|
|
redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString())).set(roomUid, 12L, TimeUnit.HOURS);
|
|
|
|
|
|
+ // 更新直播间主播状态
|
|
|
+ lambdaUpdate()
|
|
|
+ .eq(ImLiveBroadcastRoom::getRoomUid, roomUid)
|
|
|
+ .eq(ImLiveBroadcastRoom::getSpeakerId, userId)
|
|
|
+ .set(ImLiveBroadcastRoom::getSpeakerStatus, 1)
|
|
|
+ .update();
|
|
|
+
|
|
|
return roomVo;
|
|
|
}
|
|
|
|