完成消息撤回功能
This commit is contained in:
@@ -1,11 +1,13 @@
|
||||
package com.bao.dating.controller.websocket;
|
||||
|
||||
import com.bao.dating.message.WsMessage;
|
||||
import com.bao.dating.pojo.dto.ChatRecallDTO;
|
||||
import com.bao.dating.pojo.dto.ChatRecordSendDTO;
|
||||
import com.bao.dating.pojo.vo.ChatRecordsVO;
|
||||
import com.bao.dating.service.ChatService;
|
||||
import com.bao.dating.session.WsSessionManager;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -57,14 +59,23 @@ public class ChatWebSocketHandler extends TextWebSocketHandler {
|
||||
log.error("WebSocket session 中未找到 userId");
|
||||
return;
|
||||
}
|
||||
// 解析消息
|
||||
WsMessage<ChatRecordSendDTO> wsMessage =
|
||||
objectMapper.readValue(message.getPayload(),
|
||||
new TypeReference<WsMessage<ChatRecordSendDTO>>(){});
|
||||
|
||||
// 处理私聊消息
|
||||
if ("chat".equals(wsMessage.getType())) {
|
||||
handlePrivateChat(session, senderUserId, wsMessage.getData());
|
||||
JsonNode node = objectMapper.readTree(message.getPayload());
|
||||
String type = node.get("type").asText();
|
||||
// 根据消息类型解析消息
|
||||
WsMessage wsMessage = objectMapper.readValue(message.getPayload(), WsMessage.class);
|
||||
|
||||
// 先获取消息类型,再根据类型进行相应处理和转换
|
||||
if ("chat".equals(type)) {
|
||||
// 处理私聊消息
|
||||
WsMessage<ChatRecordSendDTO> chatWsMessage =
|
||||
objectMapper.convertValue(node, new TypeReference<WsMessage<ChatRecordSendDTO>>(){});
|
||||
handlePrivateChat(session, senderUserId, chatWsMessage.getData());
|
||||
} else if ("recall".equals(type)) {
|
||||
// 处理撤回消息
|
||||
WsMessage<ChatRecallDTO> recallWsMessage =
|
||||
objectMapper.convertValue(node, new TypeReference<WsMessage<ChatRecallDTO>>(){});
|
||||
handleRecallMessage(session, senderUserId, recallWsMessage.getData());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +90,7 @@ public class ChatWebSocketHandler extends TextWebSocketHandler {
|
||||
WsMessage<String> errorMsg = new WsMessage<>();
|
||||
errorMsg.setType("error");
|
||||
errorMsg.setData("会话已删除,无法发送消息");
|
||||
// 返回错误信息
|
||||
session.sendMessage(new TextMessage(objectMapper.writeValueAsString(errorMsg)));
|
||||
return;
|
||||
}
|
||||
@@ -97,6 +109,46 @@ public class ChatWebSocketHandler extends TextWebSocketHandler {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 消息撤回处理
|
||||
*/
|
||||
private void handleRecallMessage(WebSocketSession session, Long senderUserId, Object data) throws Exception {
|
||||
|
||||
// 转 DTO
|
||||
ChatRecallDTO dto = objectMapper.convertValue(data, ChatRecallDTO.class);
|
||||
|
||||
// 撤回逻辑
|
||||
boolean success = chatService.recallMessage(senderUserId, dto.getChatId());
|
||||
// 如果返回false,说明消息撤回失败
|
||||
if (!success) {
|
||||
WsMessage<String> errorMsg = new WsMessage<>();
|
||||
errorMsg.setType("error");
|
||||
errorMsg.setData("撤回失败,消息可能无法撤回或不存在");
|
||||
// 返回错误信息
|
||||
session.sendMessage(new TextMessage(objectMapper.writeValueAsString(errorMsg)));
|
||||
return;
|
||||
}
|
||||
|
||||
// 创建撤回通知消息
|
||||
WsMessage<ChatRecallDTO> pushMsg = new WsMessage<>();
|
||||
pushMsg.setType("recall");
|
||||
pushMsg.setData(dto);
|
||||
|
||||
// 通知自己
|
||||
if (session.isOpen()) {
|
||||
session.sendMessage(new TextMessage(objectMapper.writeValueAsString(pushMsg)));
|
||||
}
|
||||
|
||||
// 通知对方
|
||||
WebSocketSession receiverSession =
|
||||
sessionManager.getSession(dto.getReceiverUserId());
|
||||
|
||||
if (receiverSession != null && receiverSession.isOpen()) {
|
||||
receiverSession.sendMessage(new TextMessage(objectMapper.writeValueAsString(pushMsg))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 用户断开连接(下线)
|
||||
|
||||
Reference in New Issue
Block a user