修改: 发送消息使用WebSocketSenderApi
This commit is contained in:
parent
51e724fc90
commit
84cea03752
|
@ -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 发送者编号
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
||||
}
|
Loading…
Reference in New Issue