ソースを参照

Merge remote-tracking branch 'origin/saas_2022_05_17_activity' into saas_2022_05_17_activity

zouxuan 3 年 前
コミット
3a879ddb35

+ 57 - 37
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ImLiveBroadcastRoomServiceImpl.java

@@ -546,25 +546,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             }
             //将最新的时间写入缓存
             userStateTimeCache.set(userStateTime, 5L, TimeUnit.MINUTES);
-            //查询主讲人userId,若是主讲人
-            RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
-            if (speakerCache.isExists()) {
-                RoomSpeakerInfo speakerInfo = speakerCache.get();
-                //主讲人进入房间
-                if (user.getStatus().equals("0")) {
-                    speakerInfo.setJoinRoomTime(now);
-                    log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
-                    speakerCache.set(speakerInfo);
-                    return;
-                }
-                //主讲人退出房间关闭录像
-                closeLive(speakerInfo);
-                speakerInfo.setExitRoomTime(now);
-                log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
-                speakerCache.set(speakerInfo);
+            //查询userId是不是主讲人 ,如果是主讲人则返回
+            if (isSpeaker(user, now, userid)) {
                 return;
             }
-            //未查询到主讲人信息,观看者只接受退出消息 status=0 是进入房间
+            //这里开始只处理观看者的数据,观看者只接受退出消息 status=0 是进入房间
             if (user.getStatus().equals("0")) {
                 return;
             }
@@ -582,32 +568,42 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
             if (!roomTotalUser.isExists() && !roomTotalUser.containsKey(userId)) {
                 return;
             }
-            //查询用户数据
+            //查询用户数据
             RoomUserInfoVo userInfo = roomTotalUser.get(userId);
-            //查询在线人员列表
-            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
-            //获取当前用户是否在房间状态 true在 false不在
-            boolean userOnline = onlineUserInfo.isExists() && onlineUserInfo.containsKey(userId);
-            //用户是在房间的状态 并且 突然离线 - 那么融云会发送用户离线消息-此刻就发送退出房间消息给主讲人
-            if (userOnline && user.getStatus().equals("1")) {
-                ImRoomMessage message = new ImRoomMessage();
-                message.setFromUserId(userId.toString());
-                message.setToChatroomId(roomUid);
-                message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
-                try {
-                    imFeignService.publishRoomMsg(message);
-                } catch (Exception e) {
-                    log.error("opsRoom>>>>  looker error {}", e.getMessage());
-                    log.error("opsRoom>>>>  looker error sendMessage {} : LOOKER_LOGIN_OUT : {}", message, JSONObject.toJSONString(userInfo));
-                }
-                log.info("opsRoom>>>> looker LOOKER_LOGIN_OUT : {}", JSONObject.toJSONString(userInfo));
-            }
-            //只有在主播开播后用户才有观看时间,才需要计算当前用户观看时长
+            //如果有动态观看时间则证明主播开播过,需要计算当前用户观看时长
             if (Objects.nonNull(userInfo.getDynamicLookTime())) {
                 userInfo.setTotalViewTime(getLookMinutes(userInfo.getDynamicLookTime(), userInfo.getTotalViewTime()));
                 userInfo.setDynamicLookTime(null);
             }
             roomTotalUser.fastPut(userId, userInfo);
+
+            //查询在线人员列表
+            RMap<Integer, BaseRoomUserVo> onlineUserInfo = getOnlineUserCache(roomUid);
+            if (!onlineUserInfo.isExists()) {
+                return;
+            }
+            //发消息给主播 告知现在人数
+            int size = 0;
+            ImRoomMessage message = new ImRoomMessage();
+            message.setIsIncludeSender(1);
+            message.setObjectName(ImRoomMessage.MEMBER_COUNT);
+            message.setToChatroomId(roomUid);
+            //大于1就发送实际人数,如果是最后一个人离开房间则发送一条0人数消息给主播
+            if (onlineUserInfo.size() > 1) {
+                size = onlineUserInfo.size();
+            }
+            HashMap<String, Integer> sendMap = new HashMap<>();
+            sendMap.put("count", size);
+            message.setFromUserId(userId.toString());
+            message.setContent(sendMap);
+            //发送消息
+            try {
+                imFeignService.publishRoomMsg(message);
+                log.info("opsRoom>>>> sendLiveOnlineNum>>>> speakerId  room:{}", JSONObject.toJSONString(message));
+            } catch (Exception e) {
+                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId error {}", e.getMessage());
+                log.error("opsRoom>>>> sendLiveOnlineNum>>>>  speakerId sendMessage {} :", JSONObject.toJSONString(message));
+            }
             //从在线人员列表删除该人员
             onlineUserInfo.fastRemove(userId);
             log.info("opsRoom>>>> looker userInfo: {}", JSONObject.toJSONString(userInfo));
@@ -615,6 +611,30 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
     }
 
     /**
+     * 查询userId是不是主讲人
+     */
+    private boolean isSpeaker(ImUserState user, Date now, String userid) {
+        RBucket<RoomSpeakerInfo> speakerCache = redissonClient.getBucket(LIVE_SPEAKER_INFO.replace(USER_ID, userid));
+        if (speakerCache.isExists()) {
+            RoomSpeakerInfo speakerInfo = speakerCache.get();
+            //主讲人进入房间
+            if (user.getStatus().equals("0")) {
+                speakerInfo.setJoinRoomTime(now);
+                log.info("opsRoom>>>> join speakerCache {}", JSONObject.toJSONString(speakerInfo));
+                speakerCache.set(speakerInfo);
+                return true;
+            }
+            //主讲人退出房间关闭录像
+            closeLive(speakerInfo);
+            speakerInfo.setExitRoomTime(now);
+            log.info("opsRoom>>>> exit speakerCache {}", JSONObject.toJSONString(speakerInfo));
+            speakerCache.set(speakerInfo);
+            return true;
+        }
+        return false;
+    }
+
+    /**
      * 主讲人登录专用
      *
      * @param roomUid

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

@@ -12,26 +12,49 @@ public class ImRoomMessage extends BaseMessage {
     //objectName 类型-观看者退出房间
     public static final String LOOKER_LOGIN_OUT = "RC:LookerLoginOut";
 
+    //objectName 类型-观看者数量-该消息只有主播端接
+    public static final String MEMBER_COUNT = "RC:Chatroom:MemberCountUp";
+
     /**
+     * <p>必传
      * 消息类型
      */
     private String objectName;
 
     /**
+     * <p>必传
      * 消息内容
      */
     private Object content;
 
     /**
+     * <p>必传
      * 发送者id
      */
     private String fromUserId;
 
     /**
+     * <p>必传
      * 发送到的房间uid
      */
     private String toChatroomId;
 
+    /**
+     * <p>非必传
+     * <p>开通“聊天室消息云存储”服务情况下,针对融云服务端历史消息中是否存储此条消息,
+     * <p>0 表示为不存储、 1 表示为存储,默认为 1 存储消息。
+     * <p>客户端发送自定义消息时则根据消息注册的 ISPERSISTED 标识判断是否在服务端存储。
+     */
+    private Integer isPersisted = 1;
+
+    /**
+     * <p>非必传
+     * <p>发送用户自己是否接收消息,0 表示为不接收,1 表示为接收,
+     * <p>默认为 0 不接收,只有向一个聊天室发送消息时此参数有效。
+     * <p>如开通了聊天室消息云存储功能,不为 1 时该消息不会存储到历史消息中。
+     */
+    private Integer isIncludeSender = 0;
+
     @Override
     public String getObjectName() {
         return objectName;
@@ -64,4 +87,32 @@ public class ImRoomMessage extends BaseMessage {
     public void setToChatroomId(String toChatroomId) {
         this.toChatroomId = toChatroomId;
     }
+
+    /**
+     * 0 表示为不存储、 1 表示为存储
+     */
+    public Integer getIsPersisted() {
+        return isPersisted;
+    }
+
+    /**
+     * 0 表示为不存储、 1 表示为存储
+     */
+    public void setIsPersisted(Integer isPersisted) {
+        this.isPersisted = isPersisted;
+    }
+
+    /**
+     * 0 表示为不接收,1 表示为接收
+     */
+    public Integer getIsIncludeSender() {
+        return isIncludeSender;
+    }
+
+    /**
+     * 0 表示为不接收,1 表示为接收
+     */
+    public void setIsIncludeSender(Integer isIncludeSender) {
+        this.isIncludeSender = isIncludeSender;
+    }
 }