liujunchi 2 年 前
コミット
2e96e8d2f1

+ 3 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/LiveRoomStatus.java

@@ -29,6 +29,9 @@ public class LiveRoomStatus {
     @ApiModelProperty(value = "禁言状态: 0 取消;1禁言")
     private Integer banStatus;
 
+    @ApiModelProperty(value = "主播摄像头状态 1:开启 0:关闭")
+    private Integer cameraStatus;
+
     @ApiModelProperty(value = "直播时长")
     private Integer liveTotalTime;
 

+ 27 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EGroupDefinedDataType.java

@@ -16,7 +16,33 @@ public enum EGroupDefinedDataType {
     /**
      * 全局禁言
      */
-    GLOBAL_BAN("全局禁言"), //  0允许 1不允许
+    GLOBAL_BAN("全局禁言"), // 开启禁言"ON" 关闭禁言 "OFF"
+
+    /**
+     * 点赞数
+     */
+    LIKES("点赞数"), // 点赞数
+
+    /**
+     * 在线人数
+     */
+    MEMBER_ONLINE("在线人数"), // 在线人数
+
+
+    /**
+     * 累计观看人数
+     */
+    MEMBER_TOTAL("累计观看人数"), // 累计观看人数
+
+    /**
+     * 当前房间推流状态
+     */
+    ANCHOR_LIVESTATUS("当前房间推流状态"), //开播 "ON" 暂停直播 "OFF"
+
+    /**
+     * 主播摄像头状态
+     */
+    ANCHOR_CAMERA("主播摄像头状态"), // 开启摄像头 "ON" 关闭摄像头 "OFF"
 
     ;
     private String code;

+ 63 - 11
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -798,6 +798,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     @Override
     public void syncLike(String roomUid, Integer likeNum) {
         redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, roomUid)).set(likeNum);
+
+        // 同步点赞数到直播间数据表
+        ImLiveBroadcastRoomVo roomVo = getImLiveBroadcastRoomVo(roomUid);
+        setGroupDefinedData(roomVo,EGroupDefinedDataType.LIKES,likeNum.toString());
         //增加房间心跳
         redissonClient.getBucket(LIVE_ROOM_SPEAKER_HEART_BEAT.replace(ROOM_UID, roomUid)).set(new Date());
     }
@@ -830,18 +834,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                     return;
                 }
             }
-            //将最新的时间写入缓存
-            userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
             //获取当前用户所在房间的uid
             RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userid));
             if (!userRoom.isExists()) {
                 return;
             }
             String roomUid = userRoom.get();
-            //查询userId是不是主讲人 ,如果是主讲人则返回
-            if (isSpeaker(user, now, userid, roomUid)) {
-                return;
-            }
 
             //向直播间发送当前在线人数消息
             ImLiveBroadcastRoomVo roomVo = this.getImLiveBroadcastRoomVo(roomUid);
@@ -850,6 +848,20 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
                 return;
             }
 
+            // 腾讯云直播不需要处理融云im的消息
+            if (roomVo.getServiceProvider().equals(TencentCloudLivePlugin.PLUGIN_NAME) && StringUtils.isNotBlank(user.getClientIp())) {
+                return;
+            }
+
+            //将最新的时间写入缓存
+            userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
+
+            //查询userId是不是主讲人 ,如果是主讲人则返回
+            if (isSpeaker(user, now, userid, roomUid)) {
+                return;
+            }
+
+
             Integer userId = Integer.valueOf(userid);
             //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
@@ -1041,6 +1053,10 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         // 直播间统计数据
         getRoomData(roomVo);
 
+        // 设置群组属性
+        setGroupDefinedData(roomVo,EGroupDefinedDataType.MEMBER_ONLINE,roomVo.getLookNum().toString());
+        setGroupDefinedData(roomVo,EGroupDefinedDataType.MEMBER_TOTAL,roomVo.getTotalLookNum().toString());
+
         // 消息发送用户
         LiveRoomMessage.MessageUser messageUser = null;
         SysUser sysUser = sysUserFeignService.queryUserInfo();
@@ -1056,7 +1072,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
 
         LiveRoomMessage.MessageContent messageContent = LiveRoomMessage.MessageContent
                 .builder()
-                .count(count.longValue())
+                .count(roomVo.getLookNum().longValue())
                 .onlineUsers(roomVo.getLookNum().longValue())
                 .viewers(roomVo.getTotalLookNum().longValue())
                 .likes(roomVo.getLikeNum().longValue())
@@ -1309,7 +1325,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (speakerCache.isExists()) {
             //如果用户进来时主讲人已经开启直播则修改学生观看时间
             Integer state = speakerCache.get().getState();
-            if (Objects.nonNull(state) && state == 0) {
+            if (Objects.nonNull(state) && state == 0 && imLiveBroadcastRoomVo.getPushStatus() == 1) {
                 userInfo.setDynamicLookTime(now);
             }
         }
@@ -1371,6 +1387,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         if (intEquals(roomSpeakerInfo.getState(), 0)) {
             return;
         }
+
+
+        // 设置推流状态房间信息
+        setPushStatus(roomSpeakerInfo.getRoomUid(), 1);
+
         //是否允许录像
         if (intEquals(roomSpeakerInfo.getWhetherVideo(), 0)) {
             //开始录制视频
@@ -1447,6 +1468,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         boolean stateFlag = intEquals(roomSpeakerInfo.getState(), 0);
         //是否录像 true允许 false不允许
         boolean whetherVideoFlag = intEquals(roomSpeakerInfo.getWhetherVideo(), 0);
+
+
+        // 设置推流状态房间信息
+        setPushStatus(roomSpeakerInfo.getRoomUid(), 0);
+
         //允许录像并在直播中
         if (whetherVideoFlag && stateFlag) {
             try {
@@ -1494,6 +1520,29 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 设置推流状态房间信息
+     * @param roomUid 房间uid
+     * @param status 0:关闭直播 1:开启直播
+     */
+    private void setPushStatus(String roomUid, Integer status) {
+        if (status == null) {
+            return;
+        }
+        ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = getImLiveBroadcastRoomVo(roomUid);
+        if (imLiveBroadcastRoomVo == null) {
+            log.warn("setPushStatus imLiveBroadcastRoomVo is null");
+            return;
+        }
+
+        ImLiveBroadcastRoom imLiveBroadcastRoom = new ImLiveBroadcastRoom();
+        imLiveBroadcastRoom.setId(imLiveBroadcastRoomVo.getId());
+        imLiveBroadcastRoom.setPushStatus(status);
+        this.updateById(imLiveBroadcastRoom);
+        setGroupDefinedData(imLiveBroadcastRoomVo,EGroupDefinedDataType.ANCHOR_LIVESTATUS,status == 1?"ON":"OFF");
+
+    }
+
+    /**
      * 打开/关闭直播后-异步计算房间人员观看时长
      *
      * @param roomUid 房间uid
@@ -1994,6 +2043,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
         whetherChat(room.getId(), liveRoom.getBanStatus());
         // 不用前端传时间
         // imLiveBroadcastRoom.setLiveTotalTime(liveRoom.getLiveTotalTime());
+        // 设置摄像头状态
+        if (liveRoom.getCameraStatus() != null) {
+            setGroupDefinedData(room,EGroupDefinedDataType.ANCHOR_CAMERA,liveRoom.getCameraStatus() == 1?"ON":"OFF");
+        }
+        // 设置推流状态
+        setPushStatus(room.getRoomUid(), liveRoom.getPushStatus());
 
         return this.updateById(imLiveBroadcastRoom);
     }
@@ -2043,7 +2098,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imUserState.setStatus(onlineStatus == 1 && liveRoomStatus == 1?"0":"1");
             imUserState.setOs(callbackOnMemberStateChange.getOptPlatform());
             imUserState.setTime(new Date().getTime());
-            imUserState.setClientIp(callbackOnMemberStateChange.getClientIP());
             imUserStates.add(imUserState);
         }
         opsRoom(imUserStates);
@@ -2076,7 +2130,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imUserState.setStatus("3");
             imUserState.setOs(callbackAfterMemberExit.getOptPlatform());
             imUserState.setTime(callbackAfterMemberExit.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
-            imUserState.setClientIp(callbackAfterMemberExit.getClientIP());
             imUserStates.add(imUserState);
         }
         opsRoom(imUserStates);
@@ -2120,7 +2173,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             imUserState.setStatus(userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember()).getOnlineStatus() == 1 ? "0" : "1");
             imUserState.setOs(callbackAfterNewMemberJoin.getOptPlatform());
             imUserState.setTime(callbackAfterNewMemberJoin.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
-            imUserState.setClientIp(callbackAfterNewMemberJoin.getClientIP());
             imUserStates.add(imUserState);
         }
         opsRoom(imUserStates);