package com.ruoyi.call.listener; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.call.dto.CallMessage; import com.ruoyi.utils.websocket.util.WebSocketUtils; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * 处理websocket消息处理视频通话消息 * * @author liusuyi * @date 2024年08月12日15:56 **/ public class WebsocketHandler { public static void handleMessage(String userId, String message) { try { Map messageMap = JSONObject.parseObject(message, Map.class); if (messageMap.get("type") != null && messageMap.get("type").equals("callMessage")) { String msg = (String) messageMap.get("message"); CallMessage callMessage = JSONObject.parseObject(msg, CallMessage.class); //单聊 if (callMessage != null && callMessage.getType().equals(0)) { WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message); } //群聊 if (callMessage != null && callMessage.getType().equals(1)) { String step = callMessage.getStep(); switch (step) { case "joinRoom": Set userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>()); userSet.add(callMessage.getUserId()); WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet); WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message); break; case "inviteRoom": List targetIds = callMessage.getTargetIds(); targetIds.stream().forEach(targetId -> { WebSocketUtils.sendMessagePrefix(targetId, message); }); break; case "leaveRoom": userSet = WebSocketUtils.ROOM_USER_SET.getOrDefault(callMessage.getRoomId(), new HashSet<>()); if (userSet.size() > 0) { userSet.remove(callMessage.getUserId()); WebSocketUtils.ROOM_USER_SET.put(callMessage.getRoomId(), userSet); WebSocketUtils.sendRoomMessage(callMessage.getRoomId(), message); } break; default: WebSocketUtils.sendMessagePrefix(callMessage.getTargetId(), message); break; } } } else { WebSocketUtils.sendMessage(userId, "视频通话无法解析消息【" + message + "】"); } } catch (Exception ex) { WebSocketUtils.sendMessage(userId, "视频通话解析消息【" + message + "】异常:" + ex.getMessage()); } } }