Commit 7f6f9a9f by 罗长华

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

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