|
@@ -1,17 +1,15 @@
|
|
|
package com.webchat.connect.websocket.handler;
|
|
|
|
|
|
-import com.webchat.common.enums.AccountRelationTypeEnum;
|
|
|
import com.webchat.common.enums.ChatMessageTypeEnum;
|
|
|
import com.webchat.common.enums.VideoSDPMessageType;
|
|
|
import com.webchat.common.enums.messagequeue.MessageBroadChannelEnum;
|
|
|
import com.webchat.common.service.messagequeue.producer.MessageQueueProducer;
|
|
|
import com.webchat.common.util.JsonUtil;
|
|
|
-import com.webchat.connect.service.AccountService;
|
|
|
+import com.webchat.connect.service.GroupVideoBizService;
|
|
|
import com.webchat.domain.vo.request.mess.MessageNotifyVO;
|
|
|
import com.webchat.domain.vo.request.mess.VideoChatMessageRequestVO;
|
|
|
-import com.webchat.domain.vo.response.UserBaseResponseInfoVO;
|
|
|
+import com.webchat.domain.vo.request.mess.VideoUserChangeMessageVO;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.apache.commons.collections.CollectionUtils;
|
|
|
import org.apache.commons.collections.MapUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -21,7 +19,6 @@ import org.springframework.web.socket.WebSocketSession;
|
|
|
import org.springframework.web.socket.handler.TextWebSocketHandler;
|
|
|
|
|
|
import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
|
|
@Slf4j
|
|
@@ -31,7 +28,7 @@ public class GroupVideoWebSocketEndPointServletHandler extends TextWebSocketHand
|
|
|
private MessageQueueProducer<Object, Long> messageQueueProducer;
|
|
|
|
|
|
@Autowired
|
|
|
- private AccountService accountService;
|
|
|
+ private GroupVideoBizService groupVideoBizService;
|
|
|
|
|
|
/**
|
|
|
* Map<KEY1, Map<KEY2, WebSocketSession>>
|
|
@@ -63,18 +60,38 @@ public class GroupVideoWebSocketEndPointServletHandler extends TextWebSocketHand
|
|
|
groupUserSessions = new ConcurrentHashMap<>();
|
|
|
userSessions = new ConcurrentHashMap<>();
|
|
|
groupUserSessions.put(groupId, userSessions);
|
|
|
+ sessions.put(bizCode, groupUserSessions);
|
|
|
} else {
|
|
|
// 初始化处理首页群聊下多人音视频ws session结构
|
|
|
- userSessions = groupUserSessions.get(userId);
|
|
|
- if (userSessions == null) {
|
|
|
- userSessions = new ConcurrentHashMap<>();
|
|
|
- groupUserSessions.put(groupId, userSessions);
|
|
|
- }
|
|
|
+ userSessions = groupUserSessions.get(groupId);
|
|
|
}
|
|
|
userSessions.put(userId, session);
|
|
|
log.info("Chat WebSocket connection ====> groupId:{} userId:{}, sessionId:{}", groupId, userId, session.getId());
|
|
|
- // TODO 新用户加入群聊音视频,通知其他在线用户(创建已在线跟新上线用的webRTC链接)--- MESH
|
|
|
+ // 记录当前在线用户到redis
|
|
|
+ groupVideoBizService.online(groupId, userId);
|
|
|
+ // 新用户加入群聊音视频,通知其他在线用户(创建已在线跟新上线用的webRTC链接)--- MESH
|
|
|
+ this.doNotifyUserChangeEventForCurrOnlineUsers(groupId, userId, true);
|
|
|
+ }
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 断开连接
|
|
|
+ *
|
|
|
+ * @param session
|
|
|
+ * @param status
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
|
|
|
+ System.out.println("Chat WebSocket Connection closed: " + session.getId());
|
|
|
+ Map<String, Object> attributes = session.getAttributes();
|
|
|
+ String bizCode = (String) attributes.get("bizCode");
|
|
|
+ String groupId = (String) attributes.get("groupId");
|
|
|
+ String userId = (String) attributes.get("userId");
|
|
|
+ // 剔除当前离线线用户
|
|
|
+ groupVideoBizService.offline(groupId, userId);
|
|
|
+ // 通知群聊音视频其他在线用户有人下线
|
|
|
+ this.doNotifyUserChangeEventForCurrOnlineUsers(groupId, userId, false);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -116,15 +133,15 @@ public class GroupVideoWebSocketEndPointServletHandler extends TextWebSocketHand
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 断开连接
|
|
|
- *
|
|
|
- * @param session
|
|
|
- * @param status
|
|
|
- * @throws Exception
|
|
|
+ * 通知当前群聊多人音视频在线用户:有新用户加入音视频群聊/离线
|
|
|
*/
|
|
|
- @Override
|
|
|
- public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
|
|
|
- System.out.println("Chat WebSocket Connection closed: " + session.getId());
|
|
|
+ private void doNotifyUserChangeEventForCurrOnlineUsers(String groupId, String eventUser, boolean isOnline) {
|
|
|
+
|
|
|
+ VideoUserChangeMessageVO message = new VideoUserChangeMessageVO();
|
|
|
+ message.setEventUserId(eventUser);
|
|
|
+ message.setGroupId(groupId);
|
|
|
+ message.setIsOnline(isOnline);
|
|
|
+ messageQueueProducer.broadSend(MessageBroadChannelEnum.QUEUE_GROUP_VIDEO_USER_CHANGE, message);
|
|
|
}
|
|
|
|
|
|
public static WebSocketSession getSession(String bizCode, String groupId, String userId) {
|
|
@@ -141,4 +158,19 @@ public class GroupVideoWebSocketEndPointServletHandler extends TextWebSocketHand
|
|
|
}
|
|
|
return userSessions.get(userId);
|
|
|
}
|
|
|
+
|
|
|
+ public static WebSocketSession getSession(String groupId, String userId) {
|
|
|
+ if (MapUtils.isEmpty(sessions)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ for (Map.Entry<String, Map<String, Map<String, WebSocketSession>>> session : sessions.entrySet()) {
|
|
|
+ Map<String, Map<String, WebSocketSession>> groupUserSessions = session.getValue();
|
|
|
+ Map<String, WebSocketSession> userSessions = groupUserSessions.get(groupId);
|
|
|
+ WebSocketSession userSession = userSessions.get(userId);
|
|
|
+ if (userSession != null) {
|
|
|
+ return userSession;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
}
|