修改: 发送消息使用WebSocketSenderApi

This commit is contained in:
安浩浩 2024-03-28 22:33:01 +08:00
parent 51e724fc90
commit 84cea03752
6 changed files with 140 additions and 10 deletions

View File

@ -1,8 +1,11 @@
package cn.iocoder.yudao.module.im.enums.conversation;
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* IM 会话类型枚举
* 参考 <a href="https://doc.rentsoft.cn/zh-Hans/sdks/enum/conversationType">会话类型</a> 文档
@ -11,12 +14,14 @@ import lombok.Getter;
*/
@Getter
@AllArgsConstructor
public enum ConversationTypeEnum {
public enum ConversationTypeEnum implements IntArrayValuable {
SINGLE(1, "单聊"),
GROUP(3, "群聊"),
NOTIFICATION(4, "通知会话");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ConversationTypeEnum::getType).toArray();
/**
* 类型
*/
@ -27,6 +32,11 @@ public enum ConversationTypeEnum {
*/
private final String name;
@Override
public int[] array() {
return ARRAYS;
}
/**
* 生成会话编号
* @param fromUserId 发送者编号

View File

@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.im.dal.redis.inbox.InboxLockRedisDAO;
import cn.iocoder.yudao.module.im.dal.redis.inbox.SequenceRedisDao;
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
import cn.iocoder.yudao.module.im.service.groupmember.GroupMemberService;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import jakarta.annotation.Resource;
import org.dromara.hutool.core.date.DateUnit;
import org.springframework.stereotype.Service;
@ -38,7 +39,7 @@ public class InboxServiceImpl implements InboxService {
@Resource
private InboxLockRedisDAO inboxLockRedisDAO; // 收件箱的锁 Redis DAO
@Resource
private WebSocketMessageSender webSocketMessageSender; // WebSocket消息发送器
private WebSocketSenderApi webSocketSenderApi;
@Resource
private GroupMemberService groupMemberService;
@ -71,7 +72,7 @@ public class InboxServiceImpl implements InboxService {
InboxSendMessageReqVO message = BeanUtils.toBean(inboxSaveMessage, InboxSendMessageReqVO.class);
message.setSequence(userSequence);
webSocketMessageSender.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
webSocketSenderApi.sendObject(UserTypeEnum.ADMIN.getValue(), userId, IM_MESSAGE_RECEIVE, message);
});
}

View File

@ -88,13 +88,15 @@ public class MessageServiceImpl implements MessageService {
messageMapper.insert(messageDO);
// 设置 InboxSaveMessageReqVO 对象
inboxSaveMessageReqVO.setConversationType(message.getConversationType());
inboxSaveMessageReqVO.setFromId(fromUserId);
inboxSaveMessageReqVO.setReceiverId(message.getReceiverId());
inboxSaveMessageReqVO.setMessageId(messageDO.getId());
inboxSaveMessageReqVO.setContentType(message.getContentType());
inboxSaveMessageReqVO.setContent(message.getContent());
inboxSaveMessageReqVO.setSendTime(messageDO.getSendTime());
inboxSaveMessageReqVO.setConversationType(message.getConversationType())
.setFromId(fromUserId)
.setReceiverId(message.getReceiverId())
.setMessageId(messageDO.getId())
.setContentType(message.getContentType())
.setContent(message.getContent())
.setSendTime(messageDO.getSendTime())
.setSenderNickname(fromUser.getNickname())
.setSenderAvatar(fromUser.getAvatar());
// 返回 SendMessageRespVO 对象
return new SendMessageRespVO(messageDO.getId(), messageDO.getSendTime());

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.im.websocket;
import cn.iocoder.yudao.framework.websocket.core.listener.WebSocketMessageListener;
import cn.iocoder.yudao.framework.websocket.core.util.WebSocketFrameworkUtils;
import cn.iocoder.yudao.module.im.websocket.message.ImSendMessage;
import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;
// TODO @hao消息发送使用 http 上行因为在 cloud 框架下我们比较难去 Listener因为 im-server 不会自己启动 websocket 路径
/**
* WebSocket im
*
* @author 芋道源码
*/
@Component
@Slf4j
public class ImWebSocketMessageListener implements WebSocketMessageListener<ImSendMessage> {
public static final String IM_MESSAGE_RECEIVE = "im-message-receive";
@Resource
private WebSocketSenderApi webSocketSenderApi; // WebSocket消息发送器
/**
* 处理WebSocket消息
*
* @param session WebSocket会话
* @param message 发送的IM消息
*/
@Override
public void onMessage(WebSocketSession session, ImSendMessage message) {
Long fromUserId = WebSocketFrameworkUtils.getLoginUserId(session); // 获取登录用户ID
log.info(message.toString());
}
/**
* 获取类型
*
* @return 类型
*/
@Override
public String getType() {
return "im-message-send";
}
}

View File

@ -0,0 +1,38 @@
package cn.iocoder.yudao.module.im.websocket.message;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 消息发送 receive")
@Data
public class ImReceiveMessage {
@Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@InEnum(ConversationTypeEnum.class)
private Integer conversationType;
@Schema(description = "发送人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long fromId; // 根据 conversationType 区分
// TODO @hao昵称和头像也直接发给接收人好了
@Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12454")
private Long messageId;
@Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer contentType; // 参见 ImMessageTypeEnum 枚举
@Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
private String content;
@Schema(description = "发送时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime sendTime;
@Schema(description = "序号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long sequence;
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.im.websocket.message;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.im.enums.conversation.ConversationTypeEnum;
import cn.iocoder.yudao.module.im.enums.message.MessageContentTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - IM 消息发送 send")
@Data
public class ImSendMessage {
@Schema(description = "客户端消息编号 uuid用于排重", requiredMode = Schema.RequiredMode.REQUIRED, example = "3331")
private String clientMessageId;
@Schema(description = "会话类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@InEnum(ConversationTypeEnum.class)
private Integer conversationType;
@Schema(description = "接收人编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long receiverId; // 根据 conversationType 区分
@Schema(description = "内容类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@InEnum(MessageContentTypeEnum.class)
private Integer contentType;
@Schema(description = "消息内容", requiredMode = Schema.RequiredMode.REQUIRED)
private String content;
}