|
@@ -12,14 +12,19 @@ import com.microsvc.toolkit.middleware.live.LivePluginContext;
|
|
|
import com.microsvc.toolkit.middleware.live.LivePluginService;
|
|
|
import com.microsvc.toolkit.middleware.live.message.LiveRoomMessage;
|
|
|
import com.microsvc.toolkit.middleware.live.message.LiveRoomUser;
|
|
|
+import com.microsvc.toolkit.middleware.live.message.RTCRequest;
|
|
|
import com.microsvc.toolkit.middleware.live.message.RTCRoom;
|
|
|
import com.ym.mec.auth.api.client.SysUserFeignService;
|
|
|
import com.ym.mec.auth.api.entity.SysUser;
|
|
|
+import com.ym.mec.auth.api.enums.SysUserType;
|
|
|
import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomDao;
|
|
|
+import com.ym.mec.biz.dal.dao.ImLiveBroadcastRoomMemberDao;
|
|
|
import com.ym.mec.biz.dal.dao.LiveGoodsMapperDao;
|
|
|
import com.ym.mec.biz.dal.dao.SysConfigDao;
|
|
|
import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
|
|
|
+import com.ym.mec.biz.dal.dto.LiveRoomStatus;
|
|
|
import com.ym.mec.biz.dal.dto.RoomReservationUserSearch;
|
|
|
+import com.ym.mec.biz.dal.dto.TencentData;
|
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
|
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomData;
|
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoomMember;
|
|
@@ -43,6 +48,8 @@ import com.ym.mec.util.http.HttpUtil;
|
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.jetbrains.annotations.NotNull;
|
|
|
+import org.joda.time.DateTime;
|
|
|
import org.redisson.api.RBucket;
|
|
|
import org.redisson.api.RLock;
|
|
|
import org.redisson.api.RMap;
|
|
@@ -58,6 +65,9 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.IOException;
|
|
|
import java.io.OutputStream;
|
|
|
import java.io.Serializable;
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneId;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CompletableFuture;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
@@ -87,6 +97,8 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
@Autowired
|
|
|
private ImLiveBroadcastRoomMemberService liveBroadcastRoomMemberService;
|
|
|
@Autowired
|
|
|
+ private ImLiveBroadcastRoomMemberDao liveBroadcastRoomMemberDao;
|
|
|
+ @Autowired
|
|
|
private ImLiveBroadcastRoomDataService liveBroadcastRoomDataService;
|
|
|
@Autowired
|
|
|
private LiveGoodsMapperDao liveGoodsMapperDao;
|
|
@@ -228,6 +240,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
log.error("直播房间用户注册失败: userId={}", sysUser.getId(), e);
|
|
|
}
|
|
|
|
|
|
+ // 直播房间统计信息
|
|
|
+ getRoomData(room);
|
|
|
+
|
|
|
// 直播间配置信息
|
|
|
return room.userSig(userSig).liveRoomConfig(pluginService.getLiveRoomConfig());
|
|
|
}
|
|
@@ -266,6 +281,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
String os = WrapperUtil.toStr(param, "os");
|
|
|
if (StringUtils.isNotBlank(os) && os.equals("teacher")) {
|
|
|
param.put("speakerId", getSysUser().getId());
|
|
|
+ param.put("clientType", SysUserType.TEACHER.getCode());
|
|
|
}
|
|
|
Page<ImLiveBroadcastRoomVo> pageInfo = PageUtil.concatTimePage(param, "startTime", "endTime");
|
|
|
pageInfo.setDesc("a.created_time_");
|
|
@@ -289,9 +305,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
continue;
|
|
|
}
|
|
|
record.setRoomReservationNum(imLiveBroadcastRoomVos.get(0).getRoomReservationNum());
|
|
|
-
|
|
|
- // 设置直播间参数信息
|
|
|
-
|
|
|
}
|
|
|
|
|
|
return PageUtil.pageInfo(page);
|
|
@@ -328,7 +341,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
/**
|
|
|
* 修改直播间信息
|
|
|
*
|
|
|
- * @param dto
|
|
|
+ * @param dto ImLiveBroadcastRoomDto
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@@ -587,19 +600,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
log.info("roomDestroy>>>> insertAndCleanLiveData {}", JSONObject.toJSONString(room));
|
|
|
|
|
|
//将房间状态改为已销毁
|
|
|
+ ImLiveBroadcastRoom liveRoomUpdate = new ImLiveBroadcastRoom();
|
|
|
+ liveRoomUpdate.setId(room.getId());
|
|
|
+
|
|
|
Date date = new Date();
|
|
|
- room.setRoomState(2);
|
|
|
- room.setLiveState(2);
|
|
|
+ liveRoomUpdate.setRoomState(2);
|
|
|
+ liveRoomUpdate.setLiveState(2);
|
|
|
Integer userId = -1;
|
|
|
try {
|
|
|
userId = getSysUser().getId();
|
|
|
} catch (Exception ignored) {
|
|
|
}
|
|
|
- room.setUpdatedBy(userId);
|
|
|
- room.setUpdatedTime(date);
|
|
|
- room.setLiveEndTime(date);
|
|
|
- room.setPopularize(0);//销毁直播间后要关闭推广
|
|
|
- this.updateById(room);
|
|
|
+ liveRoomUpdate.setSpeakerStatus(0);
|
|
|
+ liveRoomUpdate.setPushStatus(0);
|
|
|
+ liveRoomUpdate.setUpdatedBy(userId);
|
|
|
+ liveRoomUpdate.setUpdatedTime(date);
|
|
|
+ liveRoomUpdate.setLiveEndTime(date);
|
|
|
+ //销毁直播间后要关闭推广
|
|
|
+ liveRoomUpdate.setPopularize(0);
|
|
|
+
|
|
|
+ this.updateById(liveRoomUpdate);
|
|
|
|
|
|
//下架商品
|
|
|
liveGoodsMapperDao.updateStatus(room.getRoomUid(), null, false);
|
|
@@ -611,10 +631,25 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
message.setFromUserId(speakerId.toString());
|
|
|
message.setToChatRoomId(roomUid);
|
|
|
message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
+
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserInfo();
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
+
|
|
|
+ // 发送用户信息
|
|
|
+ LiveRoomMessage.MessageUser messageUser = LiveRoomMessage.MessageUser.builder()
|
|
|
+ .sendUserId(String.valueOf(speakerId))
|
|
|
+ .sendUserName(sysUser.getUsername())
|
|
|
+ .avatarUrl(sysUser.getAvatar())
|
|
|
+ .build();
|
|
|
+
|
|
|
+ message.setContent(LiveRoomMessage.MessageContent.builder().sendUserInfo(messageUser).build());
|
|
|
+ }
|
|
|
+
|
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
|
pluginService.sendChatRoomMessage(message);
|
|
|
log.info("roomDestroy>>>> FORCED_OFFLINE {}", JSONObject.toJSONString(message));
|
|
|
//销毁直播间
|
|
|
+ pluginService.chatRoomDestroy(roomUid);
|
|
|
// imFeignService.destroyLiveRoom(roomUid);
|
|
|
log.info("roomDestroy>>>> destroyLiveRoom {}", JSONObject.toJSONString(message));
|
|
|
} catch (Exception e) {
|
|
@@ -747,11 +782,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);
|
|
@@ -779,29 +834,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 直播间
|
|
@@ -809,20 +965,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);
|
|
@@ -839,15 +1022,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);
|
|
@@ -855,6 +1042,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
|
|
@@ -870,18 +1065,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();
|
|
@@ -899,8 +1124,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
//获取直播间信息
|
|
|
RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
|
|
|
if (!speakerCache.isExists()) {
|
|
|
+
|
|
|
//没有主讲人信息则生成一个
|
|
|
createSpeakerInfo(this.getById(roomVo.getId()), sysUser);
|
|
|
+
|
|
|
+ // 查询主播缓存信息
|
|
|
speakerCache = getRoomSpeakerInfoCache(roomUid, userId.toString());
|
|
|
}
|
|
|
RoomSpeakerInfo speakerInfo = speakerCache.get();
|
|
@@ -908,6 +1136,14 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
speakerCache.set(speakerInfo);
|
|
|
//记录用户当前房间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;
|
|
|
}
|
|
|
|
|
@@ -934,11 +1170,30 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (roomTotalUser.containsKey(userId)) {
|
|
|
//多次进入更新动态进入时间
|
|
|
userInfo = JSONObject.toJavaObject(JSONObject.parseObject(roomTotalUser.get(userId)), RoomUserInfoVo.class);
|
|
|
+
|
|
|
+ ImLiveBroadcastRoomMember liveRoomMember = liveBroadcastRoomMemberService.lambdaQuery()
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getTenantId, userInfo.getTenantId())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getRoomUid, imLiveBroadcastRoomVo.getRoomUid())
|
|
|
+ .eq(ImLiveBroadcastRoomMember::getUserId, userInfo.getUserId())
|
|
|
+ .list().stream().findFirst().orElse(null);
|
|
|
+
|
|
|
+ if (Objects.isNull(liveRoomMember)) {
|
|
|
+
|
|
|
+ // 初次进入房间
|
|
|
+ getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
|
|
|
+ } else {
|
|
|
+ // 更新直播间用户信息
|
|
|
+ ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
|
|
|
+ roomMember.setId(liveRoomMember.getId());
|
|
|
+ roomMember.setOnlineStatus(1);
|
|
|
+ roomMember.setLiveRoomStatus(1);
|
|
|
+
|
|
|
+ liveBroadcastRoomMemberService.updateById(roomMember);
|
|
|
+ }
|
|
|
+
|
|
|
} else {
|
|
|
//第一次进该房间 写入用户首次进入时间
|
|
|
- userInfo = getUserInfo(userId);
|
|
|
- userInfo.setFirstJoinTime(now);
|
|
|
- userInfo.setTotalViewTime(0);
|
|
|
+ userInfo = getLiveRoomUserInfo(userId, imLiveBroadcastRoomVo, now);
|
|
|
}
|
|
|
//查询主讲人信息
|
|
|
RBucket<RoomSpeakerInfo> speakerCache = getRoomSpeakerInfoCache(roomUid, imLiveBroadcastRoomVo.getSpeakerId().toString());
|
|
@@ -961,6 +1216,37 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 获取直播间用户信息
|
|
|
+ * @param userId 用户id
|
|
|
+ * @param imLiveBroadcastRoomVo 直播间信息
|
|
|
+ * @param now 当前时间
|
|
|
+ * @return RoomUserInfoVo
|
|
|
+ */
|
|
|
+ @NotNull
|
|
|
+ private RoomUserInfoVo getLiveRoomUserInfo(Integer userId, ImLiveBroadcastRoomVo imLiveBroadcastRoomVo, Date now) {
|
|
|
+
|
|
|
+ RoomUserInfoVo userInfo = getUserInfo(userId);
|
|
|
+ userInfo.setFirstJoinTime(now);
|
|
|
+ userInfo.setTotalViewTime(0);
|
|
|
+
|
|
|
+ // 记录直播间用户信息
|
|
|
+ ImLiveBroadcastRoomMember roomMember = new ImLiveBroadcastRoomMember();
|
|
|
+ roomMember.setTenantId(userInfo.getTenantId());
|
|
|
+ roomMember.setRoomUid(imLiveBroadcastRoomVo.getRoomUid());
|
|
|
+ roomMember.setUserId(userInfo.getUserId());
|
|
|
+ roomMember.setJoinTime(DateTime.now().toDate());
|
|
|
+ roomMember.setTotalTime(0);
|
|
|
+ roomMember.setOnlineStatus(1);
|
|
|
+ roomMember.setBanStatus(0);
|
|
|
+ roomMember.setLiveRoomStatus(1);
|
|
|
+
|
|
|
+ // 保存直播间用户信息
|
|
|
+ liveBroadcastRoomMemberService.save(roomMember);
|
|
|
+
|
|
|
+ return userInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 开始直播-录像
|
|
|
*
|
|
|
* @param roomUid 房间uid
|
|
@@ -995,8 +1281,19 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- pluginService.rtcRoomRecordStop(rtcRoom.getSessionId());
|
|
|
- // pluginService.rtcRoomRecordStart(roomUid, videoResolution);
|
|
|
+ // 直播开始时间
|
|
|
+ DateTime dateTime = new DateTime(imLiveBroadcastRoomVo.getLiveStartTime());
|
|
|
+
|
|
|
+ RTCRoom.RecordResp recordResp = pluginService.rtcRoomRecordStart(RTCRequest.RecordStart.builder()
|
|
|
+ .startTime(dateTime.plusMillis(5).getMillis() / 1000)
|
|
|
+ .endTime(dateTime.plusDays(1).getMillis() / 1000)
|
|
|
+ .steamName(MessageFormat.format("{0}_{1}", imLiveBroadcastRoomVo.getRoomUid(), String.valueOf(imLiveBroadcastRoomVo.getSpeakerId())))
|
|
|
+ .sessionId(rtcRoom.getSessionId())
|
|
|
+ .config(RTCRequest.RecordConfig.builder()
|
|
|
+ .videoResolution(videoResolution)
|
|
|
+ .build())
|
|
|
+ .build());
|
|
|
+ log.info("startLive 直播录录开启: recordResp={}", JSON.toJSONString(recordResp));
|
|
|
} catch (Exception e) {
|
|
|
log.error("startRecord error: {}", e.getMessage());
|
|
|
}
|
|
@@ -1058,6 +1355,11 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ // 若返回的sessionId为空,则手动查询录制任务taskId
|
|
|
+ if (StringUtils.isBlank(rtcRoom.getSessionId())) {
|
|
|
+ // FIXME: 获取腾讯云直播录制任务Id
|
|
|
+ }
|
|
|
+
|
|
|
pluginService.rtcRoomRecordStop(rtcRoom.getSessionId());
|
|
|
} catch (Exception e) {
|
|
|
log.error("stopRecord error: {}", e.getMessage());
|
|
@@ -1140,7 +1442,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
List<ImLiveBroadcastRoom> list = this.list(new WrapperUtil<ImLiveBroadcastRoom>()
|
|
|
.hasEq("live_state_", 0)
|
|
|
.hasEq("room_state_", 0)
|
|
|
- .hasGe("live_start_time_", now)
|
|
|
+ // .hasGe("live_start_time_", now)
|
|
|
.hasLe("live_start_time_", endTime)
|
|
|
.queryWrapper());
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
@@ -1159,15 +1461,22 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
//生成主讲人信息到缓存
|
|
|
SysUser sysUser = getSysUser(room.getSpeakerId());
|
|
|
createSpeakerInfo(room, sysUser);
|
|
|
+
|
|
|
//去融云创建房间
|
|
|
LivePluginService pluginService = livePluginContext.getPluginService(room.getServiceProvider());
|
|
|
- pluginService.chatRoomCreate(room.getRoomUid(),room.getRoomTitle(),sysUser.getId().toString());
|
|
|
+
|
|
|
+ // 注册主播用户信息到三方平台
|
|
|
+ pluginService.register(sysUser.getId().toString(), sysUser.getUsername(), sysUser.getAvatar());
|
|
|
+ // 创建直播间IM群
|
|
|
+ pluginService.chatRoomCreate(room.getRoomUid(), room.getRoomTitle(),sysUser.getId().toString());
|
|
|
|
|
|
// imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
//推送预约直播间消息
|
|
|
imLiveRoomReservationService.push(room);
|
|
|
+
|
|
|
//推送直播开始消息
|
|
|
this.sendRoomLiveState(sysUser, room, MessageTypeEnum.JIGUANG_LIVE_STARTED);
|
|
|
+
|
|
|
} catch (Exception e) {
|
|
|
log.error(">>>>>>>>>> createLiveRoom error roomUid:{} msg:{}", room.getRoomUid(), e.getMessage());
|
|
|
}
|
|
@@ -1204,10 +1513,13 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
redissonClient.getBucket(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
|
|
|
|
|
|
//修改房间状态为开始
|
|
|
- room.setLiveState(1);
|
|
|
- room.setUpdatedTime(now);
|
|
|
- room.setUpdatedBy(-2);
|
|
|
- baseMapper.updateById(room);
|
|
|
+ ImLiveBroadcastRoom liveRoomUpdate = new ImLiveBroadcastRoom();
|
|
|
+ liveRoomUpdate.setId(room.getId());
|
|
|
+ liveRoomUpdate.setLiveState(1);
|
|
|
+ liveRoomUpdate.setUpdatedTime(now);
|
|
|
+ liveRoomUpdate.setUpdatedBy(-2);
|
|
|
+ liveRoomUpdate.setSpeakerStatus(1);
|
|
|
+ baseMapper.updateById(liveRoomUpdate);
|
|
|
}
|
|
|
|
|
|
private Optional<ImLiveBroadcastRoomDto.RoomConfig> getRoomConfig(String roomConfig) {
|
|
@@ -1225,12 +1537,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
* <P>/#/liveRoomList 直播中
|
|
|
*/
|
|
|
private void sendRoomLiveState(SysUser user, ImLiveBroadcastRoom room, MessageTypeEnum en) {
|
|
|
- String teacherBaseUrl = sysConfigDao.findConfigValue(SysConfigService.TEACHER_BASE_URL);
|
|
|
- if (StringUtils.isBlank(teacherBaseUrl)) {
|
|
|
+ String baseUrl;
|
|
|
+ if (room.getClientType().equals(SysUserType.EDUCATION)) {
|
|
|
+ baseUrl=sysConfigDao.findConfigValue(SysConfigService.EDU_TEACHER_BASE_URL);
|
|
|
+ } else {
|
|
|
+ baseUrl=sysConfigDao.findConfigValue(SysConfigService.TEACHER_BASE_URL);
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(baseUrl)) {
|
|
|
log.error("sendRoomState error: teacherBaseUrl is null");
|
|
|
return;
|
|
|
}
|
|
|
- teacherBaseUrl = "13?" + teacherBaseUrl;
|
|
|
+ baseUrl = "13?" + baseUrl;
|
|
|
Map<Integer, String> pushMap = new HashMap<>();
|
|
|
pushMap.put(user.getId(), user.getId().toString());
|
|
|
String memo;
|
|
@@ -1240,12 +1557,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
//创建直播间
|
|
|
if (en.equals(MessageTypeEnum.JIGUANG_LIVE_CREATED)) {
|
|
|
//创建直播间-发送消息-跳到未开始页面
|
|
|
- memo = teacherBaseUrl + "/#/liveRoomList?t=0";
|
|
|
+ memo = baseUrl + "/#/liveRoomList?t=0";
|
|
|
SysUser createUser = getSysUser(room.getCreatedBy());
|
|
|
objs = new Object[]{createUser.getUsername(), liveDateStr, room.getLiveRemark()};
|
|
|
} else if (en.equals(MessageTypeEnum.JIGUANG_LIVE_STARTED)) {
|
|
|
//直播开始-发送消息-跳到直播中页面
|
|
|
- memo = teacherBaseUrl + "/#/liveRoomList";
|
|
|
+ memo = baseUrl + "/#/liveRoomList";
|
|
|
objs = new Object[]{liveDateStr, room.getRoomTitle()};
|
|
|
} else {
|
|
|
log.error("sendRoomState error: MessageTypeEnum error " + en);
|
|
@@ -1493,6 +1810,156 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
this.updateById(imLiveBroadcastRoom);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 更新主播直播间状态
|
|
|
+ *
|
|
|
+ * @param liveRoom 直播间状态
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean updateRoomStatus(LiveRoomStatus liveRoom) {
|
|
|
+ // 获取直播间信息
|
|
|
+ ImLiveBroadcastRoomVo room = this.getImLiveBroadcastRoomVo(liveRoom.getRoomUid());
|
|
|
+ if (room == null) {
|
|
|
+ throw new BizException("直播间不存在");
|
|
|
+ }
|
|
|
+ ImLiveBroadcastRoom imLiveBroadcastRoom = new ImLiveBroadcastRoom();
|
|
|
+ imLiveBroadcastRoom.setId(room.getId());
|
|
|
+ imLiveBroadcastRoom.setSpeakerStatus(liveRoom.getSpeakerStatus());
|
|
|
+ imLiveBroadcastRoom.setPushStatus(liveRoom.getPushStatus());
|
|
|
+ imLiveBroadcastRoom.setBanStatus(liveRoom.getBanStatus());
|
|
|
+ imLiveBroadcastRoom.setLiveTotalTime(liveRoom.getLiveTotalTime());
|
|
|
+
|
|
|
+ return this.updateById(imLiveBroadcastRoom);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 直播群成员在线状态回调处理
|
|
|
+ *
|
|
|
+ * @param callbackOnMemberStateChange
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void callbackOnMemberStateChange(TencentData.CallbackOnMemberStateChange callbackOnMemberStateChange) {
|
|
|
+
|
|
|
+ if (callbackOnMemberStateChange == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer onlineStatus = callbackOnMemberStateChange.getEventType().equals("Online")?1:0;
|
|
|
+
|
|
|
+ // 用户id
|
|
|
+ if (CollectionUtils.isEmpty(callbackOnMemberStateChange.getMemberList())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<Long> userIds = callbackOnMemberStateChange.getMemberList()
|
|
|
+ .stream()
|
|
|
+ .map(o -> Long.parseLong(o.getMemberAccount()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+
|
|
|
+ List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
|
|
|
+ callbackOnMemberStateChange.getGroupId());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(imLiveBroadcastRoomMembers)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据用户id分组
|
|
|
+ Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
|
|
|
+ .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
|
|
|
+
|
|
|
+ List<ImUserState> imUserStates = new ArrayList<>();
|
|
|
+ for (Long userId : userIds) {
|
|
|
+ Integer liveRoomStatus = userMap.getOrDefault(userId.intValue(), new ImLiveBroadcastRoomMember())
|
|
|
+ .getLiveRoomStatus();
|
|
|
+ ImUserState imUserState = new ImUserState();
|
|
|
+ imUserState.setUserid(userId.toString());
|
|
|
+ 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);
|
|
|
+ liveBroadcastRoomMemberDao.updateOnlineStatus(userIds, callbackOnMemberStateChange.getGroupId(),onlineStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void callbackAfterMemberExit(TencentData.CallbackAfterMemberExit callbackAfterMemberExit) {
|
|
|
+ if (callbackAfterMemberExit == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer liveRoomStatus = 0;
|
|
|
+
|
|
|
+ // 用户id
|
|
|
+ if (CollectionUtils.isEmpty(callbackAfterMemberExit.getExitMemberList())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<Long> userIds = callbackAfterMemberExit.getExitMemberList()
|
|
|
+ .stream()
|
|
|
+ .map(o -> Long.parseLong(o.getMemberAccount()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+
|
|
|
+ List<ImUserState> imUserStates = new ArrayList<>();
|
|
|
+ for (Long userId : userIds) {
|
|
|
+ ImUserState imUserState = new ImUserState();
|
|
|
+ imUserState.setUserid(userId.toString());
|
|
|
+ imUserState.setStatus("3");
|
|
|
+ imUserState.setOs(callbackAfterMemberExit.getOptPlatform());
|
|
|
+ imUserState.setTime(callbackAfterMemberExit.getEventTime().atZone(ZoneId.systemDefault()).toEpochSecond());
|
|
|
+ imUserState.setClientIp(callbackAfterMemberExit.getClientIP());
|
|
|
+ imUserStates.add(imUserState);
|
|
|
+ }
|
|
|
+ opsRoom(imUserStates);
|
|
|
+ liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterMemberExit.getGroupId(),liveRoomStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void callbackAfterNewMemberJoin(TencentData.CallbackAfterNewMemberJoin callbackAfterNewMemberJoin) {
|
|
|
+ if (callbackAfterNewMemberJoin == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer liveRoomStatus = 1;
|
|
|
+
|
|
|
+ // 用户id
|
|
|
+ if (CollectionUtils.isEmpty(callbackAfterNewMemberJoin.getNewMemberList())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<Long> userIds = callbackAfterNewMemberJoin.getNewMemberList()
|
|
|
+ .stream()
|
|
|
+ .map(o -> Long.parseLong(o.getMemberAccount()))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+
|
|
|
+ List<ImLiveBroadcastRoomMember> imLiveBroadcastRoomMembers = liveBroadcastRoomMemberDao.queryMember(userIds,
|
|
|
+ callbackAfterNewMemberJoin.getGroupId());
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(imLiveBroadcastRoomMembers)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据用户id分组
|
|
|
+ Map<Integer, ImLiveBroadcastRoomMember> userMap = imLiveBroadcastRoomMembers.stream()
|
|
|
+ .collect(Collectors.toMap(ImLiveBroadcastRoomMember::getUserId,o ->o, (k1, k2) -> k1));
|
|
|
+
|
|
|
+ List<ImUserState> imUserStates = new ArrayList<>();
|
|
|
+ for (Long userId : userIds) {
|
|
|
+ ImUserState imUserState = new ImUserState();
|
|
|
+ imUserState.setUserid(userId.toString());
|
|
|
+ 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);
|
|
|
+ liveBroadcastRoomMemberDao.updateLiveRoomStatus(userIds, callbackAfterNewMemberJoin.getGroupId(),liveRoomStatus);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 查询直播间所有用户信息
|