Eric 2 年之前
父節點
當前提交
e886787d54

+ 226 - 29
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -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;
     }
 

+ 3 - 0
mec-common/common-core/src/main/java/com/ym/mec/common/entity/ImRoomMessage.java

@@ -24,6 +24,9 @@ public class ImRoomMessage extends BaseMessage {
     //objectName 类型-在黑名单中解除该用户
     public static final String UNBLOCK_BLACK_USER = "RC:UNBLOCK_BLACK_USER";
 
+    //objectName 类型-用户点赞数同步
+    public static final String LIKES_COUNT = "RC:Chatroom:LikeCount";
+
     /**
      * <p>必传
      * 消息类型

+ 1 - 1
mec-im/src/main/java/com/ym/controller/UserController.java

@@ -35,7 +35,7 @@ public class UserController {
     /**
      * 监听融云用户状态变更
      *
-     * @param userState
+     * @param userState List<ImUserState>
      */
     @PostMapping(value = "/statusImUser")
     public BaseResponse statusImUser(@RequestBody List<ImUserState> userState) {