Commit 7f6f9a9f by 罗长华

抽象出Couriers和MessageBuilder类,重构会话发送消息方法

parent 819498c8
...@@ -16,8 +16,11 @@ import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum; ...@@ -16,8 +16,11 @@ import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
@Data @Data
public class GroupChatSettingParam { public class GroupChatSettingParam {
@ApiModelProperty("设置类型FORBID_ADD_FRIEND 禁止群成员互加好友 FORBID_SEND_RED_PACKETS 禁止群成员发红包 FORBID_SEND_PIC 禁止群成员发图片 " + @ApiModelProperty("操作人客户端Id server sdk调用传入")
"FORBID_SEND_LINK 禁止群成员发链接") private String operatorClientId;
@ApiModelProperty("设置类型FORBID_ADD_FRIEND 禁止群成员互加好友 FORBID_SEND_PIC 禁止群成员发图片 FORBID_SEND_LINK 禁止群成员发链接" +
"MUTED 群禁言 NAME修改群名 HEAD_PORTRAIT 修改群头像")
private GroupChatSettingTypeEnum type; private GroupChatSettingTypeEnum type;
@NotNull @NotNull
...@@ -26,4 +29,12 @@ public class GroupChatSettingParam { ...@@ -26,4 +29,12 @@ public class GroupChatSettingParam {
@ApiModelProperty("开启 true是 false否") @ApiModelProperty("开启 true是 false否")
private Boolean on; private Boolean on;
@ApiModelProperty("群名称 修改群名称时传值")
private String name;
@ApiModelProperty("头像 修改群头像时传值")
private String headPortrait;
} }
package com.wecloud.im.post;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import lombok.AllArgsConstructor;
import java.util.Date;
import org.springframework.stereotype.Service;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
/**
* 投递员 负责投送消息
* @Author luozh
* @Date 2022年05月13日 14:19
* @Version 1.0
*/
@AllArgsConstructor
@Service
public class Couriers {
private final ChannelSender channelSender;
/**
* 投递消息
* @Author luozh
* @Date 2022年05月13日 02:34:29
* @param message 消息实体
* @param sender 发件人
* @param receiver 收件人
* @param cmd ws命令类型
* @Return
*/
public void deliver(ImMessage message, ImClient sender, ImClient receiver, WsResponseCmdEnum cmd) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(message.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(message.getMsgType());
imMessageOnlineSend.setSender(sender.getClientId());
imMessageOnlineSend.setContent(message.getContent());
imMessageOnlineSend.setConversationId(message.getFkConversationId());
imMessageOnlineSend.setWithdraw(message.getWithdraw());
imMessageOnlineSend.setEvent(message.getEvent());
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(cmd.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, receiver.getId());
}
}
package com.wecloud.im.post;
import java.util.Date;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.utils.SnowflakeUtil;
/**
* 消息构造者
* @Author luozh
* @Date 2022年05月13日 14:20
* @Version 1.0
*/
public class MessageBuilder {
/**
* 构建普通消息
* @Author luozh
* @Date 2022年05月13日 02:30:27
* @param type
* @param application
* @param sender
* @param receiver
* @Return
*/
public static ImMessage buildNormalMessage(MsgTypeEnum type, ImApplication application,
ImClient sender, ImConversation conversation) {
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setMsgType(type.getUriCode());
imMessage.setFkAppid(application.getId());
imMessage.setSender(sender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(false);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(conversation.getId());
imMessage.setCreateTime(new Date());
return imMessage;
}
/**
* 构建事件消息
* @Author luozh
* @Date 2022年05月13日 02:30:27
* @param type
* @param application
* @param sender
* @param receiver
* @Return
*/
public static ImMessage buildEventMessage(MsgTypeEnum type, ImApplication application,
ImClient sender, ImConversation conversation,
String content) {
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setMsgType(type.getUriCode());
imMessage.setFkAppid(application.getId());
imMessage.setSender(sender.getId());
imMessage.setContent(content);
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(conversation.getId());
imMessage.setCreateTime(new Date());
return imMessage;
}
}
...@@ -6,9 +6,9 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging; ...@@ -6,9 +6,9 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
...@@ -233,6 +233,13 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -233,6 +233,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
Boolean groupChatSetting(GroupChatSettingParam param); Boolean groupChatSetting(GroupChatSettingParam param);
/** /**
* 群聊设置
* @param param
* @return
*/
Boolean groupChatSettingForSdk(GroupChatSettingParam param);
/**
* 群头像设置 * 群头像设置
* @param param * @param param
* @return * @return
...@@ -288,8 +295,8 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -288,8 +295,8 @@ public interface ImConversationService extends BaseService<ImConversation> {
* @param message * @param message
* @Return * @Return
*/ */
void sendMsgToMembers(Long conversationId, List<ImConversationMembers> membersList, Long appId, void sendMsgToMembers(ImConversation conversation, List<ImConversationMembers> membersList, ImClient sender,
String sender, Map content, ImMessage message); ImMessage message);
} }
...@@ -7,6 +7,7 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException; ...@@ -7,6 +7,7 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -32,6 +33,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -32,6 +33,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chanjx.utils.StringUtils; import com.chanjx.utils.StringUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
...@@ -42,7 +44,6 @@ import com.wecloud.im.entity.ImClient; ...@@ -42,7 +44,6 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ChatRoomMemberPageParam; import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
...@@ -67,6 +68,8 @@ import com.wecloud.im.param.add.ImConversationCreate; ...@@ -67,6 +68,8 @@ import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate; import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.post.Couriers;
import com.wecloud.im.post.MessageBuilder;
import com.wecloud.im.sdk.enums.ChatTypeEnum; import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum; import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum; import com.wecloud.im.sdk.enums.GroupRoleEnum;
...@@ -84,8 +87,6 @@ import com.wecloud.im.vo.ImConversationCreateVo; ...@@ -84,8 +87,6 @@ import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.vo.OfflineMsgDto; import com.wecloud.im.vo.OfflineMsgDto;
import com.wecloud.im.ws.enums.MsgTypeEnum; import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.im.ws.utils.RedisUtils; import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
...@@ -110,7 +111,7 @@ import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC_C ...@@ -110,7 +111,7 @@ import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC_C
public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMapper, ImConversation> implements ImConversationService { public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMapper, ImConversation> implements ImConversationService {
@Autowired @Autowired
private ChannelSender channelSender; private Couriers couriers;
@Autowired @Autowired
private ImConversationMapper imConversationMapper; private ImConversationMapper imConversationMapper;
...@@ -157,10 +158,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -157,10 +158,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
// 成员不存在,不能创建会话 // 成员不存在,不能创建会话
for (String clientId : imConversationCreate.getClientIds()) { for (String clientId : imConversationCreate.getClientIds()) {
ImClient imClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient imClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda().select(ImClient::getId).eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, clientId));
.select(ImClient::getId)
.eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, clientId));
if (imClient == null) { if (imClient == null) {
log.info("成员不存在,不能创建会话 clientId:{}", clientId); log.info("成员不存在,不能创建会话 clientId:{}", clientId);
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT); throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
...@@ -175,9 +173,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -175,9 +173,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 判断是否已经存在单聊类型会话 // 判断是否已经存在单聊类型会话
// size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话 // size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话
if (imConversationCreate.getClientIds().size() == 1) { if (imConversationCreate.getClientIds().size() == 1) {
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
.eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
// 如果存在重复单聊类型会话,则不会为空 // 如果存在重复单聊类型会话,则不会为空
ImConversation repetitionConversationInfo = imConversationMapper.getRepetitionConversationSingle(createClient.getId(), client2.getId()); ImConversation repetitionConversationInfo = imConversationMapper.getRepetitionConversationSingle(createClient.getId(), client2.getId());
...@@ -194,9 +190,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -194,9 +190,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
if (imApplication.getContrastExtendedFieldStatus() == 1) { if (imApplication.getContrastExtendedFieldStatus() == 1) {
// 被邀请client // 被邀请client
ImClient inviteClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient inviteClient = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
.eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, imConversationCreate.getClientIds().get(0)));
log.info("RequestAttributes:" + imConversationCreate.getAttributes()); log.info("RequestAttributes:" + imConversationCreate.getAttributes());
...@@ -252,15 +246,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -252,15 +246,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode()); imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode());
String joinTypeMsg = ""; String joinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) { if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该会话";
+ "<@>创建了该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) { } else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该群聊";
+ "<@>创建了该群聊";
; ;
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) { } else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() joinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>创建了该聊天室";
+ "<@>创建了该聊天室";
; ;
} }
imConversationMembers.setJoinTypeMsg(joinTypeMsg); imConversationMembers.setJoinTypeMsg(joinTypeMsg);
...@@ -268,9 +259,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -268,9 +259,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将他人添加到会话 // 将他人添加到会话
for (String id : imConversationCreate.getClientIds()) { for (String id : imConversationCreate.getClientIds()) {
ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient client2 = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, createClient.getFkAppid()).eq(ImClient::getClientId, id));
.eq(ImClient::getFkAppid, createClient.getFkAppid())
.eq(ImClient::getClientId, id));
ImConversationMembers imConversationMembers2 = new ImConversationMembers(); ImConversationMembers imConversationMembers2 = new ImConversationMembers();
imConversationMembers2.setId(SnowflakeUtil.getId()); imConversationMembers2.setId(SnowflakeUtil.getId());
imConversationMembers2.setCreateTime(new Date()); imConversationMembers2.setCreateTime(new Date());
...@@ -284,42 +273,27 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -284,42 +273,27 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode()); imConversationMembers.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = ""; String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) { if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = "由 <@>" + createClient.getClientId() memberJoinTypeMsg = "由 <@>" + createClient.getClientId() + "<@>邀请加入该会话";
+ "<@>邀请加入该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) { } else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversationCreate.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进聊";
+ "<@>邀请进聊";
; ;
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) { } else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() memberJoinTypeMsg = joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进入聊天室";
+ "<@>邀请进入聊天室";
; ;
} }
imConversationMembersService.save(imConversationMembers2); imConversationMembersService.save(imConversationMembers2);
if (imConversationCreate.getClientIds().size() > 1) { if (imConversationCreate.getClientIds().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发 // 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage imMessage = new ImMessage();
Map<String, Object> content = Maps.newHashMap(); Map<String, Object> content = Maps.newHashMap();
content.put("operator", createClient.getClientId()); //操作的client ID content.put("operator", createClient.getClientId()); //操作的client ID
content.put("passivityOperator", client2.getClientId()); //被操作的client ID content.put("passivityOperator", client2.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表 ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION, imApplication, createClient, imConversation, JsonUtils.encodeJson(content));
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CLIENT_JOIN_NEW_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(createClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
// 发送消息 // 投递消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), createClient.getClientId(), couriers.deliver(imMessage, createClient, client2, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
client2.getId(), content, imMessage);
} }
} }
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
...@@ -351,8 +325,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -351,8 +325,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
if (imConversationCreate.getMembers().size() == 1) { if (imConversationCreate.getMembers().size() == 1) {
ImClient member = imConversationCreate.getMembers().get(0); ImClient member = imConversationCreate.getMembers().get(0);
// 如果存在重复单聊类型会话,则不会为空 // 如果存在重复单聊类型会话,则不会为空
ImConversation repetitionConversationInfo = ImConversation repetitionConversationInfo = imConversationMapper.getRepetitionConversationSingle(creator.getId(), member.getId());
imConversationMapper.getRepetitionConversationSingle(creator.getId(), member.getId());
if (repetitionConversationInfo != null) { if (repetitionConversationInfo != null) {
log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", repetitionConversationInfo.getId()); log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", repetitionConversationInfo.getId());
// 返回已存在的会话 // 返回已存在的会话
...@@ -368,8 +341,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -368,8 +341,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
log.info("RequestAttributes:" + imConversationCreate.getAttributes()); log.info("RequestAttributes:" + imConversationCreate.getAttributes());
Long repetitionConversation = getRepetitionConversationAttributes(creator.getId(), member.getId(), Long repetitionConversation = getRepetitionConversationAttributes(creator.getId(), member.getId(), imConversationCreate.getAttributes());
imConversationCreate.getAttributes());
// 存在重复会话 // 存在重复会话
if (repetitionConversation != null) { if (repetitionConversation != null) {
...@@ -418,8 +390,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -418,8 +390,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
conversationCreator.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode()); conversationCreator.setJoinTypeCode(JoinConversationTypeEnum.OWNER.getCode());
String joinTypeMsg = ""; String joinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) { if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + creatorImClientId joinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + creatorImClientId + "<@>创建了该会话";
+ "<@>创建了该会话";
} }
imConversationMembersService.save(conversationCreator); imConversationMembersService.save(conversationCreator);
...@@ -439,8 +410,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -439,8 +410,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMember.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode()); imConversationMember.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = ""; String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) { if (ChatTypeEnum.SINGLE.getCode().equals(imConversationCreate.getChatType())) {
memberJoinTypeMsg = "由 <@>" + creatorImClientId memberJoinTypeMsg = "由 <@>" + creatorImClientId + "<@>邀请加入该会话";
+ "<@>邀请加入该会话";
} }
imConversationMembersService.save(imConversationMember); imConversationMembersService.save(imConversationMember);
if (imConversationCreate.getMembers().size() > 1) { if (imConversationCreate.getMembers().size() > 1) {
...@@ -463,9 +433,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -463,9 +433,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2); imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId()); imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
// 发送消息 // 投递消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), creator.getClientId(), couriers.deliver(imMessage, creator, member, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
member.getId(), content, imMessage);
} }
} }
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
...@@ -488,13 +457,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -488,13 +457,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, imApplication.getId())
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()) .eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).ne(ImConversationMembers::getFkClientId, imClientSender.getId()));
.ne(ImConversationMembers::getFkClientId, imClientSender.getId())
);
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId()); log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
throw new BusinessException("没有成员"); throw new BusinessException("没有成员");
...@@ -504,18 +469,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -504,18 +469,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 将他人添加到会话 // 将他人添加到会话
for (String id : imClientToConversation.getClientIds()) { for (String id : imClientToConversation.getClientIds()) {
ImClient clientToConversation = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient clientToConversation = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, imApplication.getId()).eq(ImClient::getClientId, id));
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, id));
if (clientToConversation == null) { if (clientToConversation == null) {
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT); throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
} }
// 判断用户是否已经在该会话 // 判断用户是否已经在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, imApplication.getId()).eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).eq(ImConversationMembers::getFkClientId, clientToConversation.getId()));
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, clientToConversation.getId())
);
// 已经在该会话 则跳过 // 已经在该会话 则跳过
if (members != null) { if (members != null) {
...@@ -538,15 +497,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -538,15 +497,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembers2.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode()); imConversationMembers2.setJoinTypeCode(JoinConversationTypeEnum.BE_INVITED.getCode());
String memberJoinTypeMsg = ""; String memberJoinTypeMsg = "";
if (ChatTypeEnum.SINGLE.getCode().equals(imConversation.getChatType())) { if (ChatTypeEnum.SINGLE.getCode().equals(imConversation.getChatType())) {
memberJoinTypeMsg = "由 <@>" + createClient.getClientId() memberJoinTypeMsg = "由 <@>" + createClient.getClientId() + "<@>邀请加入该会话";
+ "<@>邀请加入该会话";
} else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversation.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversation.getChatType())) { } else if (ChatTypeEnum.NORMAL_GROUP.getCode().equals(imConversation.getChatType()) || ChatTypeEnum.THOUSAND_GROUP.getCode().equals(imConversation.getChatType())) {
memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进聊";
+ "<@>邀请进聊";
; ;
} else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversation.getChatType())) { } else if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversation.getChatType())) {
memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() memberJoinTypeMsg = DateUtil.format(now, CHINESE_DATE_PATTERN) + " <@>" + createClient.getClientId() + "<@>邀请进入聊天室";
+ "<@>邀请进入聊天室";
; ;
} }
...@@ -555,37 +511,16 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -555,37 +511,16 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
needAddCount++; needAddCount++;
// ws邀请事件通知给群内其他人 ---------- // ws邀请事件通知给群内其他人 ----------
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", clientToConversation.getClientId()); //被操作的client ID content.put("passivityOperator", clientToConversation.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content)); ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION, imApplication, createClient, imConversation, JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imClientToConversation.getConversationId());
boolean save = imMessageService.save(imMessage); boolean save = imMessageService.save(imMessage);
// 发送给在群内的成员
// 遍历发送给已在群内的成员 sendMsgToMembers(imConversation, membersList, createClient, imMessage);
for (ImConversationMembers conversationMember : membersList) { // 发送给被邀请人
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(), couriers.deliver(imMessage, createClient, clientToConversation, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
conversationMember.getFkClientId(), content, imMessage);
}
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
clientToConversation.getId(), content, imMessage);
} }
// 将群成员数量减 // 将群成员数量减
...@@ -608,22 +543,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -608,22 +543,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 根据appId查询application // 根据appId查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(createClient.getFkAppid());
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 查询当前会话
ImConversation imConversation = this.getById(imClientToConversation.getConversationId());
// 判断是否为群主 // 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).eq(ImConversationMembers::getFkClientId, imClientSender.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, imClientSender.getId())
);
if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) { if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) {
return false; return false;
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, imApplication.getId()).eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).ne(ImConversationMembers::getFkClientId, imClientSender.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.ne(ImConversationMembers::getFkClientId, imClientSender.getId())
);
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId()); log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
throw new BusinessException("没有成员"); throw new BusinessException("没有成员");
...@@ -632,16 +560,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -632,16 +560,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
int needAddCount = 0; int needAddCount = 0;
// 将client从会话移除 // 将client从会话移除
for (String clientId : imClientToConversation.getClientIds()) { for (String clientId : imClientToConversation.getClientIds()) {
ImClient clientToBeRemove = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient clientToBeRemove = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, imApplication.getId()).eq(ImClient::getClientId, clientId));
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, clientId));
// 判断用户是否已经在该会话 // 判断用户是否已经在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, imApplication.getId()).eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).eq(ImConversationMembers::getFkClientId, clientToBeRemove.getId()));
.eq(ImConversationMembers::getFkAppid, imApplication.getId())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, clientToBeRemove.getId())
);
if (members == null) { if (members == null) {
continue; continue;
} }
...@@ -649,25 +571,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -649,25 +571,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws移除事件通知给群内其他人 ---------- // ws移除事件通知给群内其他人 ----------
needAddCount--; needAddCount--;
// 生成消息id
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", clientToBeRemove.getClientId()); //被操作的client ID content.put("passivityOperator", clientToBeRemove.getClientId()); //被操作的client ID
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表 ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.REMOVE_CLIENT_CONVERSATION, imApplication, createClient, imConversation, JsonUtils.encodeJson(content));
imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.REMOVE_CLIENT_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(imApplication.getId());
imMessage.setSender(imClientSender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imClientToConversation.getConversationId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId())); membersList.removeIf(e -> e.getId().equals(members.getId()));
...@@ -676,7 +584,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -676,7 +584,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
Long appId = imApplication.getId(); Long appId = imApplication.getId();
String sender = imClientSender.getClientId(); String sender = imClientSender.getClientId();
Integer msgType = imMessage.getMsgType(); Integer msgType = imMessage.getMsgType();
sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage); sendMsgToMembers(imConversation, membersList, createClient, imMessage);
} }
// 将群成员数量减 // 将群成员数量减
...@@ -687,6 +595,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -687,6 +595,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
@Override @Override
public void disband(DisbandConversationParam param) { public void disband(DisbandConversationParam param) {
ImConversation imConversation = imConversationMapper.selectById(param.getConversationId()); ImConversation imConversation = imConversationMapper.selectById(param.getConversationId());
// 根据appId查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
if (imConversation == null) { if (imConversation == null) {
throw new BusinessException("查无会话信息"); throw new BusinessException("查无会话信息");
} }
...@@ -698,49 +608,25 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -698,49 +608,25 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return; return;
} }
// 判断是否为群主 // 判断是否为群主
ImConversationMembers conversationMember = imConversationMembersService.getOne( ImConversationMembers conversationMember = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, param.getConversationId()).eq(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.eq(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) { if (conversationMember == null || !GroupRoleEnum.OWNER.getCode().equals(conversationMember.getRole())) {
throw new BusinessException("非群主无权限解散群聊"); throw new BusinessException("非群主无权限解散群聊");
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()).eq(ImConversationMembers::getFkConversationId, param.getConversationId()).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
throw new BusinessException("群聊成员列表为空"); throw new BusinessException("群聊成员列表为空");
} }
// 删除所有成员 // 删除所有成员
imConversationMembersService.deleteByConversationId(param.getConversationId()); imConversationMembersService.deleteByConversationId(param.getConversationId());
// 保存事件消息 // 保存事件消息
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", currentClient.getClientId()); content.put("operator", currentClient.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content)); ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_DISBAND, imApplication, currentClient, imConversation, JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CONVERSATION_DISBAND.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
Long conversationId = param.getConversationId(); sendMsgToMembers(imConversation, membersList, currentClient, imMessage);
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage);
} }
/** /**
...@@ -749,31 +635,30 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -749,31 +635,30 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
* @param currentClient * @param currentClient
*/ */
private void disbandChatRoom(Long conversationId, ImClient currentClient) { private void disbandChatRoom(Long conversationId, ImClient currentClient) {
ImConversation imConversation = imConversationMapper.selectById(conversationId);
// 根据appId查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
Map<String, String> chatRoomMembers = chatRoomCacheManager.findOnlineClientsByChatRoomId(conversationId); Map<String, String> chatRoomMembers = chatRoomCacheManager.findOnlineClientsByChatRoomId(conversationId);
if (chatRoomMembers.isEmpty()) { if (chatRoomMembers.isEmpty()) {
throw new BusinessException("聊天室成员列为空"); throw new BusinessException("聊天室成员列为空");
} }
// 保存事件消息 // 保存事件消息
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", currentClient.getClientId()); content.put("operator", currentClient.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表 ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_DISBAND, imApplication, currentClient, imConversation, JsonUtils.encodeJson(content));
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CONVERSATION_DISBAND.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(conversationId);
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { List<Long> fkClientIds = chatRoomMembers.keySet().stream().map(key -> Long.valueOf(key.split(RedisUtils.SPLIT)[0])).collect(Collectors.toList());
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); List<ImClient> clientReceivers = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, imApplication.getId()).in(ImClient::getId, fkClientIds));
sendEventMsgToMember(conversationId, currentClient.getFkAppid(), currentClient.getClientId(),
fkClientId, null, imMessage); for (ImClient receiver : clientReceivers) {
// 投递消息
try {
couriers.deliver(imMessage, currentClient, receiver, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", imMessage.getMsgType(), JSON.toJSONString(receiver));
}
} }
} }
...@@ -782,19 +667,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -782,19 +667,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public Boolean leaveConversation(ImClientLeaveConversation imClientToConversation) { public Boolean leaveConversation(ImClientLeaveConversation imClientToConversation) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId()); ImConversation imConversation = imConversationService.getById(imClientToConversation.getConversationId());
// 根据appId查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
if (imConversation == null) { if (imConversation == null) {
throw new BusinessException("查无会话消息"); throw new BusinessException("查无会话消息");
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).orderByAsc(ImConversationMembers::getCreateTime).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.orderByAsc(ImConversationMembers::getCreateTime)
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (membersList.isEmpty()) { if (membersList.isEmpty()) {
log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId()); log.info("membersList为空,toConversationId:" + imClientToConversation.getConversationId());
...@@ -802,11 +683,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -802,11 +683,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
// 判断用户是否在该会话 // 判断用户是否在该会话
ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda() ImConversationMembers members = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()).eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId()).eq(ImConversationMembers::getFkClientId, currentClient.getId()));
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, imClientToConversation.getConversationId())
.eq(ImConversationMembers::getFkClientId, currentClient.getId())
);
// 将client从会话移除 // 将client从会话移除
boolean b = imConversationMembersService.deleteImConversationMembers(members.getId()); boolean b = imConversationMembersService.deleteImConversationMembers(members.getId());
...@@ -821,32 +698,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -821,32 +698,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId(); ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.LEAVE_CONVERSATION, imApplication, currentClient, imConversation, "");
ImMessage imMessage = new ImMessage();
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imClientToConversation.getConversationId());
boolean save = imMessageService.save(imMessage); boolean save = imMessageService.save(imMessage);
if (!save) { if (!save) {
throw new BusinessException("退出群聊错误"); throw new BusinessException("退出群聊错误");
} }
// 向群成员发送退出群聊事件 sendMsgToMembers(imConversation, membersList, currentClient, imMessage);
Long conversationId = imClientToConversation.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
Integer msgType = MsgTypeEnum.LEAVE_CONVERSATION.getUriCode();
sendMsgToMembers(conversationId, membersList, appId, sender, null, imMessage);
// 群主退出 转移给下一个人 // 群主退出 转移给下一个人
if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) { if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) {
ImConversationMembers conversationMember = membersList.get(0); ImConversationMembers conversationMember = membersList.get(0);
...@@ -874,11 +733,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -874,11 +733,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient imClientSender = imClientService.getCurrentClient(); ImClient imClientSender = imClientService.getCurrentClient();
// 判断操作人是否为群主 // 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne( ImConversationMembers currentMember = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, param.getConversationId()).eq(ImConversationMembers::getFkClientId, imClientSender.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.eq(ImConversationMembers::getFkClientId, imClientSender.getId())
);
if (currentMember == null || !GroupRoleEnum.OWNER.getCode().equals(currentMember.getRole())) { if (currentMember == null || !GroupRoleEnum.OWNER.getCode().equals(currentMember.getRole())) {
throw new BusinessException("非群主无权操作"); throw new BusinessException("非群主无权操作");
} }
...@@ -887,11 +742,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -887,11 +742,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMembersService.updateById(currentMember); imConversationMembersService.updateById(currentMember);
// 将入参成员设置为群主 // 将入参成员设置为群主
ImClient transferClient = imClientService.getCacheImClient(imApplication.getId(), param.getClientId()); ImClient transferClient = imClientService.getCacheImClient(imApplication.getId(), param.getClientId());
ImConversationMembers transferMember = imConversationMembersService.getOne( ImConversationMembers transferMember = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, param.getConversationId()).eq(ImConversationMembers::getFkClientId, transferClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.eq(ImConversationMembers::getFkClientId, transferClient.getId())
);
transferMember.setRole(GroupRoleEnum.OWNER.getCode()); transferMember.setRole(GroupRoleEnum.OWNER.getCode());
imConversationMembersService.updateById(transferMember); imConversationMembersService.updateById(transferMember);
return true; return true;
...@@ -908,11 +759,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -908,11 +759,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
// 判断操作人是否为群主 // 判断操作人是否为群主
ImConversationMembers currentMember = imConversationMembersService.getOne( ImConversationMembers currentMember = imConversationMembersService.getOne(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, param.getConversationId()).eq(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.eq(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (currentMember == null || !GroupRoleEnum.OWNER.getCode().equals(currentMember.getRole())) { if (currentMember == null || !GroupRoleEnum.OWNER.getCode().equals(currentMember.getRole())) {
throw new BusinessException("非群主无权操作"); throw new BusinessException("非群主无权操作");
} }
...@@ -920,9 +767,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -920,9 +767,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
if (CollectionUtils.isEmpty(simpleClients)) { if (CollectionUtils.isEmpty(simpleClients)) {
throw new BusinessException("未查询得到真实管理员信息"); throw new BusinessException("未查询得到真实管理员信息");
} }
List<Long> fkClientIds = simpleClients.stream() List<Long> fkClientIds = simpleClients.stream().filter(s -> !currentMember.getId().equals(s.getId())).map(ImClientSimpleDto::getId).collect(Collectors.toList());
.filter(s -> !currentMember.getId().equals(s.getId()))
.map(ImClientSimpleDto::getId).collect(Collectors.toList());
imConversationMembersService.setAdminsForConversation(param, fkClientIds); imConversationMembersService.setAdminsForConversation(param, fkClientIds);
return true; return true;
} }
...@@ -937,8 +782,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -937,8 +782,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public Boolean mutedGroup(MutedGroupParam param) { public Boolean mutedGroup(MutedGroupParam param) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作"); throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
} }
...@@ -949,9 +793,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -949,9 +793,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMapper.updateById(muteGroupParam); imConversationMapper.updateById(muteGroupParam);
deleteCacheImConversationById(param.getConversationId()); deleteCacheImConversationById(param.getConversationId());
// 下发事件通知 开启、取消 群禁言 // 下发事件通知 开启、取消 群禁言
Integer msgType = MutedEnum.NO.getCode().equals(param.getMutedType()) ? Integer msgType = MutedEnum.NO.getCode().equals(param.getMutedType()) ? MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode() : MsgTypeEnum.CONVERSATION_MUTED.getUriCode();
MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode()
: MsgTypeEnum.CONVERSATION_MUTED.getUriCode();
return true; return true;
} }
...@@ -959,8 +801,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -959,8 +801,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public Boolean mutedGroupMember(MutedGroupMemberParam param) { public Boolean mutedGroupMember(MutedGroupMemberParam param) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作"); throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
} }
...@@ -1011,34 +852,24 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1011,34 +852,24 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate param) { public ApiResult<Boolean> saveOrUpdateName(ImConversationNameUpdate param) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImConversation imConversationById = imConversationService.getById(param.getConversationId()); ImConversation imConversation = imConversationService.getById(param.getConversationId());
if (!this.isBelongToRole(currentClient.getClientId(), param.getConversationId(), ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { if (!this.isBelongToRole(currentClient.getClientId(), param.getConversationId(), Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作"); throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkConversationId, param.getConversationId()).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda() imConversation.setName(param.getName());
.eq(ImConversationMembers::getFkConversationId, param.getConversationId()) boolean b = imConversationService.updateById(imConversation);
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
imConversationById.setName(param.getName());
boolean b = imConversationService.updateById(imConversationById);
// 删除redis中该会话的缓存 // 删除redis中该会话的缓存
deleteCacheImConversationById(param.getConversationId()); deleteCacheImConversationById(param.getConversationId());
if (b) { if (b) {
// 内容 // 内容
HashMap<String, String> content = Maps.newHashMap(); HashMap<String, String> content = Maps.newHashMap();
content.put("name", imConversationById.getName()); content.put("name", imConversation.getName());
// 发送消息至成员 // 发送消息至成员
ImMessage message = new ImMessage(); ImMessage message = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_NAME_CHANGE, imApplication, currentClient, imConversation, "");
message.setWithdraw(Boolean.FALSE); sendMsgToMembers(imConversation, membersList, currentClient, message);
message.setEvent(Boolean.TRUE);
message.setMsgType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
sendMsgToMembers(param.getConversationId(), membersList, currentClient.getFkAppid(),
currentClient.getClientId(), content, message);
return ApiResult.ok(); return ApiResult.ok();
} else { } else {
return ApiResult.fail(); return ApiResult.fail();
...@@ -1050,27 +881,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1050,27 +881,23 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public void saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) { public void saveOrUpdateAttr(ImConversationAttrUpdate imConversationAttrUpdate) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
ImConversation imConversationById = imConversationService.getById(imConversationAttrUpdate.getConversationId()); ImConversation imConversation = imConversationService.getById(imConversationAttrUpdate.getConversationId());
imConversationById.setAttributes(imConversationAttrUpdate.getAttributes()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
boolean b = imConversationService.updateById(imConversationById); imConversation.setAttributes(imConversationAttrUpdate.getAttributes());
boolean b = imConversationService.updateById(imConversation);
// 删除redis中该会话的缓存 // 删除redis中该会话的缓存
deleteCacheImConversationById(imConversationAttrUpdate.getConversationId()); deleteCacheImConversationById(imConversationAttrUpdate.getConversationId());
if (b) { if (b) {
if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversationById.getChatType())) { if (ChatTypeEnum.CHAT_ROOM.getCode().equals(imConversation.getChatType())) {
// 聊天室事件发送逻辑 // 聊天室事件发送逻辑
chatRoomAttrChanged(imConversationById, currentClient); chatRoomAttrChanged(imConversation, currentClient);
return; return;
} }
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()).eq(ImConversationMembers::getFkConversationId, imConversationAttrUpdate.getConversationId()).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, imConversationAttrUpdate.getConversationId())
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
// ws下发拓展字段变动事件 // ws下发拓展字段变动事件
HashMap<String, String> content = Maps.newHashMap(); HashMap<String, String> content = Maps.newHashMap();
content.put("attributes", imConversationById.getAttributes()); content.put("attributes", imConversation.getAttributes());
// 向群成员发送拓展字段变动事件 // 向群成员发送拓展字段变动事件
Long conversationId = imConversationAttrUpdate.getConversationId(); Long conversationId = imConversationAttrUpdate.getConversationId();
Long appId = currentClient.getFkAppid(); Long appId = currentClient.getFkAppid();
...@@ -1079,7 +906,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1079,7 +906,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
message.setWithdraw(Boolean.FALSE); message.setWithdraw(Boolean.FALSE);
message.setEvent(Boolean.TRUE); message.setEvent(Boolean.TRUE);
message.setMsgType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode()); message.setMsgType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
sendMsgToMembers(conversationId, membersList, appId, sender, content, message); sendMsgToMembers(imConversation, membersList, currentClient, message);
} else { } else {
throw new BusinessException("修改错误"); throw new BusinessException("修改错误");
} }
...@@ -1093,29 +920,27 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1093,29 +920,27 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
*/ */
private void chatRoomAttrChanged(ImConversation imConversation, ImClient currentClient) { private void chatRoomAttrChanged(ImConversation imConversation, ImClient currentClient) {
Map<String, String> chatRoomMembers = chatRoomCacheManager.findOnlineClientsByChatRoomId(imConversation.getId()); Map<String, String> chatRoomMembers = chatRoomCacheManager.findOnlineClientsByChatRoomId(imConversation.getId());
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imConversation.getFkAppid());
if (chatRoomMembers.isEmpty()) { if (chatRoomMembers.isEmpty()) {
throw new BusinessException("聊天室成员列为空"); throw new BusinessException("聊天室成员列为空");
} }
// 保存事件消息 // 保存事件消息
ImMessage imMessage = new ImMessage();
HashMap<String, Object> contentMap = Maps.newHashMap(); HashMap<String, Object> contentMap = Maps.newHashMap();
contentMap.put("attributes", imConversation.getAttributes()); contentMap.put("attributes", imConversation.getAttributes());
imMessage.setContent(JsonUtils.encodeJson(contentMap));
imMessage.setId(SnowflakeUtil.getId()); ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE, imApplication, currentClient, imConversation, JsonUtils.encodeJson(contentMap));
imMessage.setMsgType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { List<Long> fkClientIds = chatRoomMembers.keySet().stream().map(key -> Long.valueOf(key.split(RedisUtils.SPLIT)[0])).collect(Collectors.toList());
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); List<ImClient> clientReceivers = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, imApplication.getId()).in(ImClient::getId, fkClientIds));
sendEventMsgToMember(imConversation.getId(), currentClient.getFkAppid(), currentClient.getClientId(),
fkClientId, contentMap, imMessage); for (ImClient receiver : clientReceivers) {
// 投递消息
try {
couriers.deliver(imMessage, currentClient, receiver, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", imMessage.getMsgType(), JSON.toJSONString(receiver));
}
} }
} }
...@@ -1138,12 +963,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1138,12 +963,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient curentClient = contextService.getImClientIfNotNullOrThrow(); ImClient curentClient = contextService.getImClientIfNotNullOrThrow();
for (Long id : imConversationDisplayUpdate.getConversationIds()) { for (Long id : imConversationDisplayUpdate.getConversationIds()) {
// 修改为删除隐藏状态 // 修改为删除隐藏状态
boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>() boolean update = imConversationMembersService.update(new UpdateWrapper<ImConversationMembers>().set("display_status", imConversationDisplayUpdate.getDisplayStatus()).eq("fk_client_id", curentClient.getId()).eq("fk_conversation_id", id).eq("fk_appid", curentClient.getFkAppid()));
.set("display_status", imConversationDisplayUpdate.getDisplayStatus())
.eq("fk_client_id", curentClient.getId())
.eq("fk_conversation_id", id)
.eq("fk_appid", curentClient.getFkAppid())
);
} }
return true; return true;
} }
...@@ -1248,36 +1068,59 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1248,36 +1068,59 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public Boolean groupChatSetting(GroupChatSettingParam param) { public Boolean groupChatSetting(GroupChatSettingParam param) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getGroupId(), ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(currentClient.getFkAppid());
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getGroupId(), Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作"); throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
} }
ImConversation group = getOne(Wrappers.<ImConversation>lambdaQuery().eq(ImConversation::getFkAppid, currentClient.getFkAppid()).eq(ImConversation::getId, param.getGroupId()));
if (group == null) {
throw new BusinessException("群不存在");
}
return this.groupChatSetting(imApplication, currentClient, group, param);
}
@Override
public Boolean groupChatSettingForSdk(GroupChatSettingParam param) {
ImClient operatorClient = imClientService.getCacheImClient(SecurityUtils.getCurrentAppId(), param.getOperatorClientId());
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(operatorClient.getFkAppid());
ImConversation group = getOne(Wrappers.<ImConversation>lambdaQuery().eq(ImConversation::getFkAppid, SecurityUtils.getCurrentAppId()).eq(ImConversation::getId, param.getGroupId()));
if (group == null) {
throw new BusinessException("群不存在");
}
return this.groupChatSetting(imApplication, operatorClient, group, param);
}
private Boolean groupChatSetting(ImApplication application, ImClient operatorClient, ImConversation conversation, GroupChatSettingParam param) {
// 根据类型处理 // 根据类型处理
GroupChatSettingTypeEnum typeEnum = param.getType(); GroupChatSettingTypeEnum typeEnum = param.getType();
ImConversation muteGroupParam = new ImConversation();
muteGroupParam.setId(param.getGroupId());
muteGroupParam.setUpdateTime(new Date());
switch (typeEnum) { switch (typeEnum) {
case FORBID_ADD_FRIEND: case FORBID_ADD_FRIEND:
muteGroupParam.setForbidAddFriend(param.getOn()); conversation.setForbidAddFriend(param.getOn());
break; break;
case FORBID_SEND_PIC: case FORBID_SEND_PIC:
muteGroupParam.setForbidSendPic(param.getOn()); conversation.setForbidSendPic(param.getOn());
break; break;
case FORBID_SEND_LINK: case FORBID_SEND_LINK:
muteGroupParam.setForbidSendLink(param.getOn()); conversation.setForbidSendLink(param.getOn());
break; break;
default: default:
throw new BusinessException("设置类型错误"); throw new BusinessException("设置类型错误");
} }
// 更新会话 // 更新会话
imConversationMapper.updateById(muteGroupParam); imConversationMapper.updateById(conversation);
deleteCacheImConversationById(param.getGroupId()); deleteCacheImConversationById(param.getGroupId());
// 发送群聊配置变化消息 // 发送群聊配置变化消息
Integer msgType = getMsgType(typeEnum, param.getOn()); MsgTypeEnum msgType = getMsgType(typeEnum, param.getOn());
sendConversationSettingChangeMsg(currentClient, param.getGroupId(), msgType); sendConversationSettingChangeMsg(application, operatorClient, conversation, msgType);
return true; return true;
} }
...@@ -1286,8 +1129,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1286,8 +1129,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
public Boolean setHeadPortrait(SetHeadPortraitParam param) { public Boolean setHeadPortrait(SetHeadPortraitParam param) {
// 获取当前client // 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(currentClient.getFkAppid());
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) { if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(), Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员 // 当前操作人不属于群主或管理人员
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作"); throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
} }
...@@ -1298,17 +1141,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1298,17 +1141,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 删除redis中该会话的缓存 // 删除redis中该会话的缓存
deleteCacheImConversationById(param.getConversationId()); deleteCacheImConversationById(param.getConversationId());
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()).eq(ImConversationMembers::getFkConversationId, param.getConversationId()).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda() ImMessage message = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_SET_GROUP_PORTRAIT, imApplication, currentClient, imConversation, "");
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()) sendMsgToMembers(imConversation, membersList, currentClient, message);
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
ImMessage message = new ImMessage();
message.setWithdraw(Boolean.FALSE);
message.setEvent(Boolean.TRUE);
message.setMsgType(MsgTypeEnum.CONVERSATION_SET_GROUP_PORTRAIT.getUriCode());
sendMsgToMembers(param.getConversationId(), membersList, currentClient.getFkAppid(), currentClient.getClientId(), null, message);
} else { } else {
throw new BusinessException("修改错误"); throw new BusinessException("修改错误");
} }
...@@ -1324,11 +1159,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1324,11 +1159,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
ImClient imClientSender = contextService.getImClientIfNotNullOrThrow(); ImClient imClientSender = contextService.getImClientIfNotNullOrThrow();
// 根据appId查询application // 根据appId查询application
ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imClientSender.getFkAppid()); ImApplication imApplication = contextService.getImApplicationIfNotNullOrThrow(imClientSender.getFkAppid());
// 获取会话
ImConversation imConversation = getById(param.getChatRoomId());
// 添加到会话成员列表中 // 添加到会话成员列表中
ImClient clientToConversation = imClientService.getOne(new QueryWrapper<ImClient>().lambda() ImClient clientToConversation = imClientService.getOne(new QueryWrapper<ImClient>().lambda().eq(ImClient::getFkAppid, imApplication.getId()).eq(ImClient::getClientId, param.getClientId()));
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getClientId, param.getClientId()));
if (clientToConversation == null) { if (clientToConversation == null) {
throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT); throw new BusinessException(ApiCode.CLIENT_NOT_FOUNT);
} }
...@@ -1344,11 +1179,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1344,11 +1179,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws邀请事件通知给群内其他人 ---------- // ws邀请事件通知给群内其他人 ----------
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId(); long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", imClientSender.getClientId()); //操作的client ID content.put("operator", imClientSender.getClientId()); //操作的client ID
content.put("passivityOperator", clientToConversation.getClientId()); //被操作的client ID content.put("passivityOperator", clientToConversation.getClientId()); //被操作的client ID
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION, imApplication, imClientSender, imConversation, "");
imMessage.setContent(JsonUtils.encodeJson(content)); imMessage.setContent(JsonUtils.encodeJson(content));
imMessage.setId(messageId); imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION.getUriCode()); imMessage.setMsgType(MsgTypeEnum.INVITE_CLIENT_JOIN_CONVERSATION.getUriCode());
...@@ -1362,12 +1200,17 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1362,12 +1200,17 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setFkConversationId(param.getChatRoomId()); imMessage.setFkConversationId(param.getChatRoomId());
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { List<Long> fkClientIds = chatRoomMembers.keySet().stream().map(key -> Long.valueOf(key.split(RedisUtils.SPLIT)[0])).collect(Collectors.toList());
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); List<ImClient> clientReceivers = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, imApplication.getId()).in(ImClient::getId, fkClientIds));
sendEventMsgToMember(param.getChatRoomId(), imApplication.getId(), imClientSender.getClientId(),
fkClientId, content, imMessage); for (ImClient receiver : clientReceivers) {
// 投递消息
try {
couriers.deliver(imMessage, imClientSender, receiver, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", imMessage.getMsgType(), JSON.toJSONString(receiver));
}
} }
imConversationMapper.addMemberCount(imApplication.getId(), param.getChatRoomId(), 1);
return true; return true;
} }
...@@ -1405,24 +1248,18 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1405,24 +1248,18 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws 退出事件通知给房间内其他人 ---------- // ws 退出事件通知给房间内其他人 ----------
// 生成消息id // 生成消息id
long messageId = SnowflakeUtil.getId(); long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage(); ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.LEAVE_CONVERSATION, imApplication, currentClient, imConversation, "");
// 保存消息至消息表
imMessage.setId(messageId);
imMessage.setMsgType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getChatRoomId());
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { List<Long> fkClientIds = chatRoomMembers.keySet().stream().map(key -> Long.valueOf(key.split(RedisUtils.SPLIT)[0])).collect(Collectors.toList());
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); List<ImClient> clientReceivers = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, imApplication.getId()).in(ImClient::getId, fkClientIds));
sendEventMsgToMember(param.getChatRoomId(), imApplication.getId(), currentClient.getClientId(),
fkClientId, null, imMessage); for (ImClient receiver : clientReceivers) {
// 投递消息
try {
couriers.deliver(imMessage, currentClient, receiver, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", imMessage.getMsgType(), JSON.toJSONString(receiver));
}
} }
return true; return true;
} }
...@@ -1448,12 +1285,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1448,12 +1285,7 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
List<Long> conversationIds = (List) JSON.parse(param.getConversationIds()); List<Long> conversationIds = (List) JSON.parse(param.getConversationIds());
List<ConversationVo> conversationVoList = Lists.newArrayList(); List<ConversationVo> conversationVoList = Lists.newArrayList();
List<ImConversation> conversations = imConversationMapper.selectList( List<ImConversation> conversations = imConversationMapper.selectList(new QueryWrapper<ImConversation>().lambda().eq(ImConversation::getChatType, param.getChatType()).in(ImConversation::getId, conversationIds).orderByDesc(ImConversation::getId));
new QueryWrapper<ImConversation>().lambda()
.eq(ImConversation::getChatType, param.getChatType())
.in(ImConversation::getId, conversationIds)
.orderByDesc(ImConversation::getId)
);
if (CollectionUtils.isEmpty(conversations)) { if (CollectionUtils.isEmpty(conversations)) {
return conversationVoList; return conversationVoList;
} }
...@@ -1502,28 +1334,28 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1502,28 +1334,28 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return imConversationCreateVo; return imConversationCreateVo;
} }
private Integer getMsgType(GroupChatSettingTypeEnum type, Boolean on) { private MsgTypeEnum getMsgType(GroupChatSettingTypeEnum type, Boolean on) {
Integer msgType = null; MsgTypeEnum msgType = null;
switch (type) { switch (type) {
case FORBID_ADD_FRIEND: case FORBID_ADD_FRIEND:
if (on) { if (on) {
msgType = CONVERSATION_FORBID_ADD_FRIEND.getUriCode(); msgType = CONVERSATION_FORBID_ADD_FRIEND;
} else { } else {
msgType = CONVERSATION_FORBID_ADD_FRIEND_CANCEL.getUriCode(); msgType = CONVERSATION_FORBID_ADD_FRIEND_CANCEL;
} }
break; break;
case FORBID_SEND_PIC: case FORBID_SEND_PIC:
if (on) { if (on) {
msgType = CONVERSATION_FORBID_SEND_PIC.getUriCode(); msgType = CONVERSATION_FORBID_SEND_PIC;
} else { } else {
msgType = CONVERSATION_FORBID_SEND_PIC_CANCEL.getUriCode(); msgType = CONVERSATION_FORBID_SEND_PIC_CANCEL;
} }
break; break;
case FORBID_SEND_LINK: case FORBID_SEND_LINK:
if (on) { if (on) {
msgType = CONVERSATION_FORBID_SEND_LINK.getUriCode(); msgType = CONVERSATION_FORBID_SEND_LINK;
} else { } else {
msgType = CONVERSATION_FORBID_SEND_LINK_CANCEL.getUriCode(); msgType = CONVERSATION_FORBID_SEND_LINK_CANCEL;
} }
break; break;
default: default:
...@@ -1536,140 +1368,54 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1536,140 +1368,54 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
/** /**
* 发送会话配置变更事件 * 发送会话配置变更事件
* *
* @param application 应用
* @param currentClient 当前client信息 * @param currentClient 当前client信息
* @param conversationId 会话id * @param conversation 会话
* @param msgType 消息类型 * @param msgType 消息类型
* @Author luozh * @Author luozh
* @Date 2022年04月27日 01:52:54 * @Date 2022年04月27日 01:52:54
* @Return * @Return
*/ */
private void sendConversationSettingChangeMsg(ImClient currentClient, Long conversationId, Integer msgType) { private void sendConversationSettingChangeMsg(ImApplication application, ImClient currentClient, ImConversation conversation, MsgTypeEnum msgType) {
// 查询该会话所有成员 // 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list( List<ImConversationMembers> membersList = imConversationMembersService.list(new QueryWrapper<ImConversationMembers>().lambda().eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid()).eq(ImConversationMembers::getFkConversationId, conversation.getId()).ne(ImConversationMembers::getFkClientId, currentClient.getId()));
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, conversationId)
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (!membersList.isEmpty()) { if (!membersList.isEmpty()) {
// 保存事件消息 // 消息内容
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", currentClient.getClientId()); content.put("operator", currentClient.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content)); // 保存事件消息
// 保存消息至消息表 ImMessage imMessage = MessageBuilder.buildEventMessage(msgType, application, currentClient, conversation, JsonUtils.encodeJson(content));
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(msgType);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(conversationId);
imMessageService.save(imMessage); imMessageService.save(imMessage);
// 发送消息至群成员 // 发送消息至群成员
sendMsgToMembers(conversationId, membersList, currentClient.getFkAppid(), currentClient.getClientId(), sendMsgToMembers(conversation, membersList, currentClient, imMessage);
content, imMessage);
} }
} }
/** /**
* 发送会话事件消息至群成员列表 * 发送会话事件消息至群成员列表
* *
* @param conversationId 会话id * @param conversation 会话
* @param membersList 成员列表 * @param membersList 成员列表
* @param appId appId
* @param sender 发送者 * @param sender 发送者
* @param content 消息内容 * @param message 消息
* @Author luozh * @Author luozh
* @Date 2022年04月27日 02:11:19 * @Date 2022年04月27日 02:11:19
*/ */
@Override @Override
public void sendMsgToMembers(Long conversationId, List<ImConversationMembers> membersList, Long appId, public void sendMsgToMembers(ImConversation conversation, List<ImConversationMembers> membersList, ImClient sender, ImMessage message) {
String sender, Map content, ImMessage message) { Long appId = conversation.getId();
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, appId)
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
sendConversationEventMsg(conversationId, sender, imClientReceiver.getId(), content, message); List<Long> receiverClientIds = membersList.stream().map(ImConversationMembers::getFkClientId).collect(Collectors.toList());
} catch (Exception e) { List<ImClient> clientReceivers = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, appId).in(ImClient::getId, receiverClientIds));
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", message.getMsgType(), JSON.toJSONString(member));
}
}
}
/** for (ImClient receiver : clientReceivers) {
* 发送会话事件消息至指定成员 // 投递消息
* try {
* @param conversationId 会话id couriers.deliver(message, sender, receiver, WsResponseCmdEnum.CONVERSATION_EVENT_MSG);
* @param appId appId } catch (Exception e) {
* @param sender 发送者 log.info("下发群会话事件失败,事件类型 {} 接收人 {}", message.getMsgType(), JSON.toJSONString(receiver));
* @param receiverClientId 接收者client id
* @param message
* @Author luozh
* @Date 2022年04月27日 03:11:00
*/
private void sendEventMsgToMember(Long conversationId, Long appId, String sender,
Long receiverClientId, Map<String, Object> content, ImMessage message) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, appId)
.eq(ImClient::getId, receiverClientId));
if (imClientReceiver == null) {
return;
} }
sendConversationEventMsg(conversationId, sender, receiverClientId, content, message);
} }
/**
* 发送会话事件消息
*
* @param conversationId 会话id
* @param sender 发送者
* @param receiverClientId 接收者client id
* @param content 消息内容
* @Author luozh
* @Date 2022年04月27日 03:11:34
*/
private void sendConversationEventMsg(Long conversationId, String sender,
Long receiverClientId, Map<String, Object> content, ImMessage message) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(message.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(message.getMsgType());
imMessageOnlineSend.setSender(sender);
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationId);
imMessageOnlineSend.setWithdraw(message.getWithdraw());
imMessageOnlineSend.setEvent(message.getEvent());
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, receiverClientId);
}
private String buildJoinConversationTypeMsg(JoinConversationTypeEnum joinConversationType, String inviterClientId) {
return "";
} }
} }
...@@ -22,6 +22,7 @@ import com.wecloud.im.entity.ImConversationMembers; ...@@ -22,6 +22,7 @@ import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.add.ServerImConversationCreate; import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.post.MessageBuilder;
import com.wecloud.im.sdk.enums.ChatTypeEnum; import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum; import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum; import com.wecloud.im.sdk.enums.MutedEnum;
...@@ -141,26 +142,15 @@ public class ImGroupServiceImpl implements ImGroupService { ...@@ -141,26 +142,15 @@ public class ImGroupServiceImpl implements ImGroupService {
conversationMembersService.deleteByConversationId(conversation.getId()); conversationMembersService.deleteByConversationId(conversation.getId());
// 保存事件消息 // 保存事件消息
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>(); Map<String, Object> content = new HashMap<>();
content.put("operator", operator.getClientId()); content.put("operator", operator.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content));
ImMessage imMessage = MessageBuilder.buildEventMessage(MsgTypeEnum.CONVERSATION_DISBAND, application,
operator, conversation, JsonUtils.encodeJson(content));
// 保存消息至消息表 // 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
imMessage.setMsgType(MsgTypeEnum.CONVERSATION_DISBAND.getUriCode());
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(operator.getFkAppid());
imMessage.setSender(operator.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(conversation.getId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
conversationService.sendMsgToMembers(conversation, membersList, operator, imMessage);
conversationService.sendMsgToMembers(conversation.getId(), membersList, appId, operator.getClientId(), content,
imMessage);
return true; return true;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment