|
@@ -11,8 +11,11 @@ import com.ym.mec.biz.dal.dto.ImLiveBroadcastRoomDto;
|
|
|
import com.ym.mec.biz.dal.entity.ImLiveBroadcastRoom;
|
|
|
import com.ym.mec.biz.dal.enums.MessageTypeEnum;
|
|
|
import com.ym.mec.biz.dal.vo.ImLiveBroadcastRoomVo;
|
|
|
+import com.ym.mec.biz.dal.vo.RoomUserInfoVo;
|
|
|
import com.ym.mec.biz.service.ImLiveBroadcastRoomService;
|
|
|
import com.ym.mec.biz.service.SysMessageService;
|
|
|
+import com.ym.mec.common.entity.ImRoomMessage;
|
|
|
+import com.ym.mec.common.entity.ImUserState;
|
|
|
import com.ym.mec.common.exception.BizException;
|
|
|
import com.ym.mec.common.page.PageInfo;
|
|
|
import com.ym.mec.common.page.PageUtil;
|
|
@@ -24,6 +27,7 @@ import com.ym.mec.util.http.HttpUtil;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.redisson.api.RBucket;
|
|
|
import org.redisson.api.RList;
|
|
|
+import org.redisson.api.RMap;
|
|
|
import org.redisson.api.RedissonClient;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
@@ -32,7 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
-import java.io.Serializable;
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
@@ -60,18 +63,12 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
|
|
|
|
|
|
public static final String LIVE_ROOM_USER_LIST = "IM:LIVE_ROOM_USER_LIST:" + ROOM_UID;
|
|
|
+
|
|
|
+ public static final String LIVE_ROOM_TOTAL_USER_LIST = "IM:LIVE_ROOM_TOTAL_USER_LIST:" + ROOM_UID;
|
|
|
|
|
|
public static final String LIVE_USER_ROOM = "IM:LIVE_ROOM_USER:" + USER_ID;
|
|
|
-
|
|
|
- public static final String LIVE_ROOM_USER_JOIN_TIME = "IM:LIVE_ROOM_USER_JOIN_TIME:" + USER_ID;
|
|
|
-
|
|
|
- public static final String LIVE_ROOM_USER_QUIT_TIME = "IM:LIVE_ROOM_USER_QUIT_TIME:" + USER_ID;
|
|
|
-
|
|
|
- public static final String LIVE_ROOM_INFO = "IM:LIVE_ROOM_INFO:" + ROOM_UID;
|
|
|
-
|
|
|
- public static final String LIVE_ROOM_LOOK = "IM:LIVE_ROOM_LOOK:" + ROOM_UID;
|
|
|
-
|
|
|
- public static final String LIVE_ROOM_TOTAL_LOOK = "IM:LIVE_ROOM_TOTAL_LOOK:" + ROOM_UID;
|
|
|
+
|
|
|
+ public static final String LIVE_ROOM_SPEAKERID = "IM:LIVE_ROOM_SPEAKERID:" + ROOM_UID;
|
|
|
|
|
|
public static final String LIVE_ROOM_LIKE = "IM:LIVE_ROOM_LIKE:" + ROOM_UID;
|
|
|
|
|
@@ -82,7 +79,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
* @param userId 用户id
|
|
|
*/
|
|
|
@Override
|
|
|
- public ImLiveBroadcastRoomVo queryRoom(String roomUid, Integer userId) {
|
|
|
+ public ImLiveBroadcastRoomVo queryRoomAndCheck(String roomUid, Integer userId) {
|
|
|
SysUser sysUser;
|
|
|
if (Objects.isNull(userId)) {
|
|
|
sysUser = getSysUser();
|
|
@@ -104,6 +101,7 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (room.getLiveState() == 2) {
|
|
|
throw new BizException("直播已结束!");
|
|
|
}
|
|
|
+ getRoomData(room);
|
|
|
return room;
|
|
|
}
|
|
|
|
|
@@ -120,7 +118,9 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
if (CollectionUtils.isEmpty(list)) {
|
|
|
return null;
|
|
|
}
|
|
|
- return list.get(0);
|
|
|
+ ImLiveBroadcastRoomVo roomVo = list.get(0);
|
|
|
+ getRoomData(roomVo);
|
|
|
+ return roomVo;
|
|
|
}
|
|
|
|
|
|
|
|
@@ -164,13 +164,32 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
*/
|
|
|
@Override
|
|
|
public void update(ImLiveBroadcastRoomDto dto) {
|
|
|
- ImLiveBroadcastRoom obj = new ImLiveBroadcastRoom();
|
|
|
+ ImLiveBroadcastRoom obj = this.getById(dto.getId());
|
|
|
+ if (obj.getLiveState() == 1) {
|
|
|
+ throw new BizException("直播已经开始,无法修改");
|
|
|
+ }
|
|
|
BeanUtils.copyProperties(dto, obj);
|
|
|
log.info("update room >>> :{}", JSONObject.toJSONString(obj));
|
|
|
this.updateById(obj);
|
|
|
}
|
|
|
|
|
|
|
|
|
+ * 删除直播间
|
|
|
+ *
|
|
|
+ * @param id 直播间id
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void delete(Integer id) {
|
|
|
+ ImLiveBroadcastRoom obj = this.getById(id);
|
|
|
+ if (obj.getLiveState() == 1) {
|
|
|
+ throw new BizException("直播已经开始,无法删除");
|
|
|
+ }
|
|
|
+ obj.setId(id);
|
|
|
+ obj.setRoomState(1);
|
|
|
+ this.updateById(obj);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
* 关闭房间
|
|
|
*
|
|
|
* @param id 直播房间表id
|
|
@@ -190,7 +209,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
log.error(e.getMessage(), e.getCause());
|
|
|
throw new BizException(e.getMessage());
|
|
|
}
|
|
|
-
|
|
|
|
|
|
|
|
|
|
|
@@ -201,26 +219,17 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
room.setUpdatedTime(date);
|
|
|
room.setLiveEndTime(date);
|
|
|
this.updateById(room);
|
|
|
- }
|
|
|
|
|
|
-
|
|
|
- * 删除直播间
|
|
|
- *
|
|
|
- * @param id 直播间id
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void delete(Integer id) {
|
|
|
- ImLiveBroadcastRoom obj = new ImLiveBroadcastRoom();
|
|
|
- if (obj.getLiveState() == 1) {
|
|
|
- throw new BizException("直播已经开始,无法删除");
|
|
|
- }
|
|
|
- obj.setId(id);
|
|
|
- obj.setRoomState(1);
|
|
|
- this.updateById(obj);
|
|
|
+
|
|
|
+ ImRoomMessage message = new ImRoomMessage();
|
|
|
+ message.setFromUserId(room.getSpeakerId().toString());
|
|
|
+ message.setToChatroomId(room.getRoomUid());
|
|
|
+ message.setObjectName(ImRoomMessage.FORCED_OFFLINE);
|
|
|
+ imFeignService.publishRoomMsg(message);
|
|
|
}
|
|
|
|
|
|
|
|
|
- * 同步点赞数量-修改房间信息
|
|
|
+ * 同步点赞数量
|
|
|
*
|
|
|
* @param roomUid 房间uid
|
|
|
* @param likeNum 点赞数
|
|
@@ -230,81 +239,115 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
}
|
|
|
|
|
|
|
|
|
+ * 退出房间-修改用户对应的房间号信息
|
|
|
+ *
|
|
|
+ * @param userState 用户状态数据
|
|
|
+ */
|
|
|
+ public void quitRoom(List<ImUserState> userState) {
|
|
|
+ userState.forEach(user -> {
|
|
|
+
|
|
|
+ RBucket<String> userRoom = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, user.getUserid()));
|
|
|
+ if (!userRoom.isExists()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String roomUid = userRoom.get();
|
|
|
+ Integer userId = Integer.valueOf(user.getUserid());
|
|
|
+
|
|
|
+
|
|
|
+ ImRoomMessage message = new ImRoomMessage();
|
|
|
+ message.setFromUserId(userId.toString());
|
|
|
+ message.setToChatroomId(roomUid);
|
|
|
+ message.setObjectName(ImRoomMessage.LOOKER_LOGIN_OUT);
|
|
|
+ imFeignService.publishRoomMsg(message);
|
|
|
+
|
|
|
+
|
|
|
+ removeUserCache(userId, roomUid);
|
|
|
+
|
|
|
+
|
|
|
+ RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
|
|
|
+ Date now = new Date();
|
|
|
+ RoomUserInfoVo userInfo;
|
|
|
+
|
|
|
+ if (roomTotalUser.containsKey(userId)) {
|
|
|
+
|
|
|
+ userInfo = roomTotalUser.get(userId);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ userInfo = getUserInfo(userId);
|
|
|
+ ImLiveBroadcastRoomVo imLiveBroadcastRoomVo = queryRoomInfo(roomUid);
|
|
|
+ userInfo.setFirstJoinTime(imLiveBroadcastRoomVo.getLiveStartTime());
|
|
|
+ userInfo.setDynamicJoinTime(imLiveBroadcastRoomVo.getLiveStartTime());
|
|
|
+ }
|
|
|
+
|
|
|
+ int minutesBetween = getMinutesBetween(userInfo.getDynamicJoinTime(), now);
|
|
|
+ userInfo.setTotalViewTime(userInfo.getTotalViewTime() + minutesBetween);
|
|
|
+
|
|
|
+ userInfo.setLastOutTime(now);
|
|
|
+ roomTotalUser.put(userId, userInfo);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
* 进入房间-修改用户对应的房间号信息
|
|
|
*
|
|
|
* @param roomUid 房间uid
|
|
|
* @param userId 用户id
|
|
|
*/
|
|
|
public void joinRoom(String roomUid, Integer userId) {
|
|
|
-
|
|
|
+
|
|
|
RBucket<String> roomUserCache = redissonClient.getBucket(LIVE_USER_ROOM.replace(USER_ID, userId.toString()));
|
|
|
-
|
|
|
+
|
|
|
if (roomUserCache.isExists()) {
|
|
|
-
|
|
|
+
|
|
|
String lodRoomUid = roomUserCache.get();
|
|
|
|
|
|
if (roomUid.equals(lodRoomUid)) {
|
|
|
return;
|
|
|
} else {
|
|
|
-
|
|
|
- redissonClient.getAtomicLong(LIVE_ROOM_LOOK.replace(ROOM_UID, lodRoomUid)).decrementAndGet();
|
|
|
-
|
|
|
- RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, lodRoomUid));
|
|
|
- UserInfo userInfo = getUserInfo(userId);
|
|
|
- list.remove(userInfo);
|
|
|
+
|
|
|
+ removeUserCache(userId, lodRoomUid);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
roomUserCache.set(roomUid);
|
|
|
-
|
|
|
- redissonClient.getBucket(LIVE_ROOM_USER_JOIN_TIME.replace(USER_ID, userId.toString())).set(new Date());
|
|
|
-
|
|
|
- redissonClient.getAtomicLong(LIVE_ROOM_LOOK.replace(ROOM_UID, roomUid)).incrementAndGet();
|
|
|
-
|
|
|
- redissonClient.getAtomicLong(LIVE_ROOM_TOTAL_LOOK.replace(ROOM_UID, roomUid)).incrementAndGet();
|
|
|
-
|
|
|
- RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
|
|
|
- UserInfo userInfo = getUserInfo(userId);
|
|
|
- list.add(userInfo);
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- private UserInfo getUserInfo(Integer userId) {
|
|
|
- UserInfo userInfo = new UserInfo();
|
|
|
- userInfo.setUserId(userId);
|
|
|
- SysUser sysUser = sysUserFeignService.queryUserById(userId);
|
|
|
- String name = userId.toString();
|
|
|
- if (Objects.nonNull(sysUser)) {
|
|
|
- if (StringUtils.isNotBlank(sysUser.getRealName())) {
|
|
|
- name = sysUser.getRealName();
|
|
|
- } else {
|
|
|
- name = sysUser.getPhone();
|
|
|
- }
|
|
|
+
|
|
|
+ RMap<Integer, RoomUserInfoVo> roomTotalUser = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomUid));
|
|
|
+
|
|
|
+ Date now = new Date();
|
|
|
+ RoomUserInfoVo userInfo;
|
|
|
+ if (roomTotalUser.containsKey(userId)) {
|
|
|
+
|
|
|
+ userInfo = roomTotalUser.get(userId);
|
|
|
+ } else {
|
|
|
+
|
|
|
+ userInfo = getUserInfo(userId);
|
|
|
+ userInfo.setFirstJoinTime(now);
|
|
|
+ userInfo.setTotalViewTime(0);
|
|
|
}
|
|
|
- userInfo.setUserName(name);
|
|
|
- return userInfo;
|
|
|
+ userInfo.setDynamicJoinTime(now);
|
|
|
+ roomTotalUser.put(userId, userInfo);
|
|
|
+
|
|
|
+ redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid)).add(userInfo);
|
|
|
}
|
|
|
|
|
|
- static class UserInfo implements Serializable {
|
|
|
- private Integer userId;
|
|
|
- private String userName;
|
|
|
-
|
|
|
- public Integer getUserId() {
|
|
|
- return userId;
|
|
|
- }
|
|
|
-
|
|
|
- public void setUserId(Integer userId) {
|
|
|
- this.userId = userId;
|
|
|
- }
|
|
|
-
|
|
|
- public String getUserName() {
|
|
|
- return userName;
|
|
|
- }
|
|
|
+
|
|
|
+ * 开始直播
|
|
|
+ *
|
|
|
+ * @param roomUid
|
|
|
+ */
|
|
|
+ public void startLive(String roomUid) {
|
|
|
+
|
|
|
+ imFeignService.startRecord(roomUid);
|
|
|
+ }
|
|
|
|
|
|
- public void setUserName(String userName) {
|
|
|
- this.userName = userName;
|
|
|
- }
|
|
|
+
|
|
|
+ * 关闭直播
|
|
|
+ *
|
|
|
+ * @param roomUid
|
|
|
+ */
|
|
|
+ public void closeLive(String roomUid) {
|
|
|
+
|
|
|
+ imFeignService.stopRecord(roomUid);
|
|
|
}
|
|
|
|
|
|
|
|
@@ -327,6 +370,41 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
list.forEach(this::createLiveRoom);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private void removeUserCache(Integer userId, String lodRoomUid) {
|
|
|
+
|
|
|
+ RList<RoomUserInfoVo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, lodRoomUid));
|
|
|
+ RoomUserInfoVo userInfo = getUserInfo(userId);
|
|
|
+ list.remove(userInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ private RoomUserInfoVo getUserInfo(Integer userId) {
|
|
|
+ RoomUserInfoVo userInfo = new RoomUserInfoVo();
|
|
|
+ userInfo.setUserId(userId);
|
|
|
+ SysUser sysUser = sysUserFeignService.queryUserById(userId);
|
|
|
+ String name = userId.toString();
|
|
|
+ if (Objects.nonNull(sysUser)) {
|
|
|
+ if (StringUtils.isNotBlank(sysUser.getRealName())) {
|
|
|
+ name = sysUser.getRealName();
|
|
|
+ } else {
|
|
|
+ name = sysUser.getPhone();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ userInfo.setUserName(name);
|
|
|
+ return userInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private int getMinutesBetween(Date startDT, Date endDT) {
|
|
|
+ if (Objects.isNull(startDT) || Objects.isNull(endDT)) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ long durationTime = endDT.getTime() - startDT.getTime();
|
|
|
+
|
|
|
+ return new Long(durationTime / 1000 / 60).intValue();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
* 去融云创建房间
|
|
|
*/
|
|
@@ -335,11 +413,26 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
|
|
|
Object liveRoom = imFeignService.createLiveRoom(room.getRoomUid(), room.getRoomTitle());
|
|
|
} catch (Exception e) {
|
|
|
-
|
|
|
+ throw new BizException(e.getMessage());
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ redissonClient.getAtomicLong(LIVE_ROOM_LIKE.replace(ROOM_UID, room.getRoomUid())).set(0);
|
|
|
+
|
|
|
+ redissonClient.getBucket(LIVE_ROOM_SPEAKERID.replace(ROOM_UID, room.getRoomUid())).set(room.getSpeakerId());
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
+ private void getRoomData(ImLiveBroadcastRoomVo roomVo) {
|
|
|
+
|
|
|
+ long like = redissonClient.getAtomicLong(LIVE_ROOM_LIKE.replace(ROOM_UID, roomVo.getRoomUid())).get();
|
|
|
+ roomVo.setLikeNum((int) like);
|
|
|
+
|
|
|
+ int size = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomVo.getRoomUid())).size();
|
|
|
+ roomVo.setLookNum(size);
|
|
|
+
|
|
|
+ int totalLook = redissonClient.getMap(LIVE_ROOM_TOTAL_USER_LIST.replace(ROOM_UID, roomVo.getRoomUid())).size();
|
|
|
+ roomVo.setTotalLookNum(totalLook);
|
|
|
}
|
|
|
|
|
|
private SysUser getSysUser(Integer userId) {
|
|
@@ -358,15 +451,6 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
* 分享直播间
|
|
|
*/
|
|
|
public void test() {
|
|
|
-
|
|
|
- RList<UserInfo> list = redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, "roomUid"));
|
|
|
- UserInfo userInfo = new UserInfo();
|
|
|
- userInfo.setUserId(1);
|
|
|
- userInfo.setUserName("1");
|
|
|
- boolean contains = list.contains(userInfo);
|
|
|
- if (!contains) {
|
|
|
- list.add(userInfo);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
@@ -381,5 +465,15 @@ public class ImLiveBroadcastRoomServiceImpl extends ServiceImpl<ImLiveBroadcastR
|
|
|
DateUtil.format(imLiveBroadcastRoomVo.getLiveStartTime(), DateUtil.CHINESE_DATA_FORMAT_1),
|
|
|
imLiveBroadcastRoomVo.getLiveRemark(), HttpUtil.getSortUrl("https://test.dayaedu.com/"));
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ * 查询直播间用户信息
|
|
|
+ *
|
|
|
+ * @param roomUid 直播间uid
|
|
|
+ */
|
|
|
+ public List<RoomUserInfoVo> queryRoomUserInfo(String roomUid) {
|
|
|
+ return redissonClient.getList(LIVE_ROOM_USER_LIST.replace(ROOM_UID, roomUid));
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|