|
|
@@ -17,6 +17,7 @@ import com.bx.implatform.enums.MessageType;
|
|
|
import com.bx.implatform.exception.GlobalException;
|
|
|
import com.bx.implatform.service.IGroupMemberService;
|
|
|
import com.bx.implatform.service.IGroupMessageService;
|
|
|
+import com.bx.implatform.service.IGroupService;
|
|
|
import com.bx.implatform.service.IWebrtcGroupService;
|
|
|
import com.bx.implatform.session.SessionContext;
|
|
|
import com.bx.implatform.session.UserSession;
|
|
|
@@ -39,7 +40,7 @@ import java.util.stream.Collectors;
|
|
|
/**
|
|
|
* 群语音通话服务类,所有涉及修改webtcSession的方法都要挂分布式锁
|
|
|
*
|
|
|
- * @author: blue
|
|
|
+ * @author: blue
|
|
|
* @date: 2024-06-01
|
|
|
* @version: 1.0
|
|
|
*/
|
|
|
@@ -47,7 +48,7 @@ import java.util.stream.Collectors;
|
|
|
@Service
|
|
|
@RequiredArgsConstructor
|
|
|
public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
-
|
|
|
+ private final IGroupService groupService;
|
|
|
private final IGroupMemberService groupMemberService;
|
|
|
private final IGroupMessageService groupMessageService;
|
|
|
private final RedisTemplate<String, Object> redisTemplate;
|
|
|
@@ -55,15 +56,12 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
private final UserStateUtils userStateUtils;
|
|
|
private final WebrtcConfig webrtcConfig;
|
|
|
|
|
|
-
|
|
|
@OnlineCheck
|
|
|
@RedisLock(prefixKey = RedisKey.IM_LOCK_RTC_GROUP, key = "#dto.groupId")
|
|
|
@Override
|
|
|
public void setup(WebrtcGroupSetupDTO dto) {
|
|
|
UserSession userSession = SessionContext.getSession();
|
|
|
- if(!imClient.isOnline(userSession.getUserId())){
|
|
|
- throw new GlobalException("您已断开连接,请重新登陆");
|
|
|
- }
|
|
|
+ groupService.getAndCheckById(dto.getGroupId());
|
|
|
if (dto.getUserInfos().size() > webrtcConfig.getMaxChannel()) {
|
|
|
throw new GlobalException("最多支持" + webrtcConfig.getMaxChannel() + "人进行通话");
|
|
|
}
|
|
|
@@ -72,7 +70,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
throw new GlobalException("部分用户不在群聊中");
|
|
|
}
|
|
|
String key = buildWebrtcSessionKey(dto.getGroupId());
|
|
|
- if (redisTemplate.hasKey(key)) {
|
|
|
+ if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
|
|
|
throw new GlobalException("该群聊已存在一个通话");
|
|
|
}
|
|
|
// 有效用户
|
|
|
@@ -116,11 +114,11 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
}
|
|
|
// 向被邀请的用户广播消息,发起呼叫
|
|
|
List<Long> recvIds = getRecvIds(userInfos);
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_SETUP, dto.getGroupId(), recvIds, JSON.toJSONString(userInfos),false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_SETUP, dto.getGroupId(), recvIds, JSON.toJSONString(userInfos), false);
|
|
|
// 发送文字提示信息
|
|
|
- WebrtcUserInfo mineInfo = findUserInfo(webrtcSession,userSession.getUserId());
|
|
|
+ WebrtcUserInfo mineInfo = findUserInfo(webrtcSession, userSession.getUserId());
|
|
|
String content = mineInfo.getNickName() + " 发起了语音通话";
|
|
|
- sendTipMessage(dto.getGroupId(),content);
|
|
|
+ sendTipMessage(dto.getGroupId(), content);
|
|
|
log.info("发起群通话,userId:{},groupId:{}", userSession.getUserId(), dto.getGroupId());
|
|
|
}
|
|
|
|
|
|
@@ -142,7 +140,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
saveWebrtcSession(groupId, webrtcSession);
|
|
|
// 广播信令
|
|
|
List<Long> recvIds = getRecvIds(webrtcSession.getUserInfos());
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_ACCEPT, groupId, recvIds, "",true);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_ACCEPT, groupId, recvIds, "", true);
|
|
|
log.info("加入群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
|
|
|
}
|
|
|
|
|
|
@@ -169,7 +167,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
userStateUtils.setFree(userSession.getUserId());
|
|
|
// 广播消息给的所有用户
|
|
|
List<Long> recvIds = getRecvIds(userInfos);
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_REJECT, groupId, recvIds, "",true);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_REJECT, groupId, recvIds, "", true);
|
|
|
log.info("拒绝群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
|
|
|
}
|
|
|
|
|
|
@@ -198,8 +196,8 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
vo.setUserIds(Arrays.asList(userSession.getUserId()));
|
|
|
vo.setReason(dto.getReason());
|
|
|
List<Long> recvIds = getRecvIds(userInfos);
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_FAILED, dto.getGroupId(), recvIds, JSON.toJSONString(vo),false);
|
|
|
- log.info("群通话失败,userId:{},groupId:{},原因:{}", userSession.getUserId(), dto.getReason());
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_FAILED, dto.getGroupId(), recvIds, JSON.toJSONString(vo), false);
|
|
|
+ log.info("群通话失败,userId:{},groupId:{},原因:{}", userSession.getUserId(),dto.getGroupId(), dto.getReason());
|
|
|
}
|
|
|
|
|
|
@OnlineCheck
|
|
|
@@ -216,7 +214,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
throw new GlobalException("您不在群里中");
|
|
|
}
|
|
|
IMUserInfo mine = findInChatUser(webrtcSession, userSession.getUserId());
|
|
|
- if(!Objects.isNull(mine) && mine.getTerminal() != userSession.getTerminal()){
|
|
|
+ if (!Objects.isNull(mine) && mine.getTerminal().equals(userSession.getTerminal())) {
|
|
|
throw new GlobalException("已在其他设备加入通话");
|
|
|
}
|
|
|
WebrtcUserInfo userInfo = new WebrtcUserInfo();
|
|
|
@@ -238,7 +236,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
userStateUtils.setBusy(userSession.getUserId());
|
|
|
// 广播信令
|
|
|
List<Long> recvIds = getRecvIds(webrtcSession.getUserInfos());
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_JOIN, groupId, recvIds, JSON.toJSONString(userInfo),false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_JOIN, groupId, recvIds, JSON.toJSONString(userInfo), false);
|
|
|
log.info("加入群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
|
|
|
}
|
|
|
|
|
|
@@ -271,8 +269,6 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
}
|
|
|
if (!imClient.isOnline(userInfo.getId())) {
|
|
|
offlineUserIds.add(userInfo.getId());
|
|
|
-// userStateUtils.setBusy(userInfo.getId());
|
|
|
-// newUserInfos.add(userInfo);
|
|
|
} else if (userStateUtils.isBusy(userInfo.getId())) {
|
|
|
busyUserIds.add(userInfo.getId());
|
|
|
} else {
|
|
|
@@ -301,9 +297,10 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
}
|
|
|
// 向被邀请的发起呼叫
|
|
|
List<Long> newUserIds = getRecvIds(newUserInfos);
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_SETUP, dto.getGroupId(), newUserIds, JSON.toJSONString(userInfos),false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_SETUP, dto.getGroupId(), newUserIds, JSON.toJSONString(userInfos), false);
|
|
|
// 向已在通话中的用户同步新邀请的用户信息
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_INVITE, dto.getGroupId(), userIds, JSON.toJSONString(newUserInfos),false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_INVITE, dto.getGroupId(), userIds, JSON.toJSONString(newUserInfos),
|
|
|
+ false);
|
|
|
log.info("邀请加入群通话,userId:{},groupId:{},邀请用户:{}", userSession.getUserId(), dto.getGroupId(),
|
|
|
newUserIds);
|
|
|
}
|
|
|
@@ -323,9 +320,9 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
webrtcSession.getUserInfos().forEach(user -> userStateUtils.setFree(user.getId()));
|
|
|
// 广播消息给的所有用户
|
|
|
List<Long> recvIds = getRecvIds(webrtcSession.getUserInfos());
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "",false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "", false);
|
|
|
// 发送文字提示信息
|
|
|
- sendTipMessage(groupId,"通话结束");
|
|
|
+ sendTipMessage(groupId, "通话结束");
|
|
|
log.info("发起人取消群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
|
|
|
}
|
|
|
|
|
|
@@ -351,9 +348,9 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
webrtcSession.getUserInfos().forEach(user -> userStateUtils.setFree(user.getId()));
|
|
|
// 广播给还在呼叫中的用户,取消通话
|
|
|
List<Long> recvIds = getRecvIds(webrtcSession.getUserInfos());
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "",false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_CANCEL, groupId, recvIds, "", false);
|
|
|
// 发送文字提示信息
|
|
|
- sendTipMessage(groupId,"通话结束");
|
|
|
+ sendTipMessage(groupId, "通话结束");
|
|
|
log.info("群通话结束,groupId:{}", groupId);
|
|
|
} else {
|
|
|
// 更新会话信息
|
|
|
@@ -364,7 +361,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
userStateUtils.setFree(userSession.getUserId());
|
|
|
// 广播信令
|
|
|
List<Long> recvIds = getRecvIds(userInfos);
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_QUIT, groupId, recvIds, "",false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_QUIT, groupId, recvIds, "", false);
|
|
|
log.info("用户退出群通话,userId:{},groupId:{}", userSession.getUserId(), groupId);
|
|
|
}
|
|
|
}
|
|
|
@@ -434,7 +431,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
saveWebrtcSession(dto.getGroupId(), webrtcSession);
|
|
|
// 广播信令
|
|
|
List<Long> recvIds = getRecvIds(webrtcSession.getUserInfos());
|
|
|
- sendRtcMessage1(MessageType.RTC_GROUP_DEVICE, dto.getGroupId(), recvIds, JSON.toJSONString(dto),false);
|
|
|
+ sendRtcMessage1(MessageType.RTC_GROUP_DEVICE, dto.getGroupId(), recvIds, JSON.toJSONString(dto), false);
|
|
|
log.info("设备操作,userId:{},groupId:{},摄像头:{}", userSession.getUserId(), dto.getGroupId(),
|
|
|
dto.getIsCamera());
|
|
|
}
|
|
|
@@ -526,7 +523,8 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
return webrtcSession.getUserInfos().stream().anyMatch(user -> user.getId().equals(userId));
|
|
|
}
|
|
|
|
|
|
- private void sendRtcMessage1(MessageType messageType, Long groupId, List<Long> recvIds, String content,Boolean sendSelf) {
|
|
|
+ private void sendRtcMessage1(MessageType messageType, Long groupId, List<Long> recvIds, String content,
|
|
|
+ Boolean sendSelf) {
|
|
|
UserSession userSession = SessionContext.getSession();
|
|
|
GroupMessageVO messageInfo = new GroupMessageVO();
|
|
|
messageInfo.setType(messageType.code());
|
|
|
@@ -559,7 +557,7 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
imClient.sendGroupMessage(sendMessage);
|
|
|
}
|
|
|
|
|
|
- private void sendTipMessage(Long groupId,String content){
|
|
|
+ private void sendTipMessage(Long groupId, String content) {
|
|
|
UserSession userSession = SessionContext.getSession();
|
|
|
// 群聊成员列表
|
|
|
List<Long> userIds = groupMemberService.findUserIdsByGroupId(groupId);
|
|
|
@@ -581,5 +579,5 @@ public class WebrtcGroupServiceImpl implements IWebrtcGroupService {
|
|
|
sendMessage.setSendResult(false);
|
|
|
sendMessage.setData(msgInfo);
|
|
|
imClient.sendGroupMessage(sendMessage);
|
|
|
- };
|
|
|
+ }
|
|
|
}
|