完成消息撤回功能

This commit is contained in:
KilLze
2026-01-08 01:20:11 +08:00
parent 0a17eb8deb
commit cf6f9b8b7c
7 changed files with 166 additions and 8 deletions

View File

@@ -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))
);
}
}
/**
* 用户断开连接(下线)