Commit 95d3766c by 罗长华

增加群设置(禁止群成员互加好友、禁止群成员发红包、禁止群成员发图片、禁止群成员发链接)接口

调整ImConversationServiceImpl部门逻辑 提取sendMsgToMembers sendEventMsgToMember sendConversationEventMsg接口
parent 22832b70
......@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
......@@ -207,5 +208,16 @@ public class ImConversationController extends BaseController {
return ApiResult.result(true);
}
/**
* 群聊设置
*/
@PostMapping("/groupChatSetting")
@ApiOperation(value = "群聊设置", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> groupChatSetting(@RequestBody @Validated GroupChatSettingParam param) {
log.info("群禁言、取消群禁言入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.groupChatSetting(param);
return ApiResult.ok(result);
}
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
/**
* 群聊设置入参
* @Author luozh
* @Date 2022年04月27日 11:20
* @Version 1.0
*/
@Data
public class GroupChatSettingParam {
@ApiModelProperty("设置类型FORBID_ADD_FRIEND 禁止群成员互加好友 FORBID_SEND_RED_PACKETS 禁止群成员发红包 FORBID_SEND_PIC 禁止群成员发图片 " +
"FORBID_SEND_LINK 禁止群成员发链接")
private GroupChatSettingTypeEnum type;
@NotNull
@ApiModelProperty("会话id")
private Long conversationId;
@ApiModelProperty("开启 true是 false否")
private Boolean on;
}
package com.wecloud.im.sdk.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
/**
* 群聊设置类型枚举
* @Author luozh
* @Date 2022年04月27日 11:23
* @Version 1.0
*/
public enum GroupChatSettingTypeEnum implements BaseEnum {
/**
* 1-禁止群成员互加好友
*/
FORBID_ADD_FRIEND(1, "禁止群成员互加好友"),
/**
* 2-禁止群成员发红包
*/
FORBID_SEND_RED_PACKETS(2, "禁止群成员发红包"),
/**
* 3-禁止群成员发图片
*/
FORBID_SEND_PIC(3, "禁止群成员发图片"),
/**
* 4-禁止群成员发链接
*/
FORBID_SEND_LINK(4, "禁止群成员发链接");
GroupChatSettingTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
@JsonValue
@EnumValue
private final Integer code;
private final String desc;
@Override
public Integer getCode() {
return null;
}
@Override
public String getDesc() {
return null;
}
}
......@@ -9,6 +9,7 @@ import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
......@@ -205,5 +206,12 @@ public interface ImConversationService extends BaseService<ImConversation> {
*/
Long getRepetitionConversationAttributes(Long clientId1, Long clientId2, String attributes);
/**
* 群禁言
* @param param
* @return
*/
Boolean groupChatSetting(GroupChatSettingParam param);
}
......@@ -7,8 +7,6 @@ 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.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
......@@ -41,6 +39,7 @@ import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
......@@ -57,6 +56,7 @@ 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.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum;
import com.wecloud.im.service.ContextService;
......@@ -76,6 +76,15 @@ import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_ADD_FRIEND;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_ADD_FRIEND_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_LINK;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_LINK_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_PIC_CANCEL;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_RED_PACKETS;
import static com.wecloud.im.ws.enums.MsgTypeEnum.CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL;
/**
* 会话表 服务实现类
*
......@@ -259,7 +268,10 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
sendEventMsgToMember(imApplication, client2.getId(), imMessage, createClient);
// 发送消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), createClient.getClientId(),
client2.getId(), imMessage.getId(), imMessage.getMsgType(),
content, Boolean.FALSE, Boolean.TRUE);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
......@@ -356,10 +368,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员
for (ImConversationMembers conversationMember : membersList) {
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender);
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
conversationMember.getFkClientId(), imMessage.getId(), imMessage.getMsgType(),
content, Boolean.FALSE, Boolean.TRUE);
}
// 发送给刚被拉入群的成员
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender);
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
clientToConversation.getId(), imMessage.getId(), imMessage.getMsgType(),
content, Boolean.FALSE, Boolean.TRUE);
}
// 将群成员数量减
......@@ -374,38 +389,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
private void sendEventMsgToMember(ImApplication imApplication, Long conversationMemberClientId, ImMessage imMessage,
ImClient clientSender) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMemberClientId));
if (imClientReceiver == null) {
return;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(clientSender.getClientId());
imMessageOnlineSend.setContent(JsonUtils.decodeJson2Map(imMessage.getContent()));
imMessageOnlineSend.setConversationId(imMessage.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
......@@ -477,37 +460,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId()));
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
}
Long conversationId = imClientToConversation.getConversationId();
Long appId = imApplication.getId();
String sender = imClientSender.getClientId();
Integer msgType = imMessage.getMsgType();
sendMsgToMembers(conversationId, membersList, appId, sender, messageId, msgType, content, Boolean.FALSE,
Boolean.TRUE);
}
// 将群成员数量减
......@@ -557,41 +516,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage);
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(param.getConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
Long conversationId = param.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
Long messageId = imMessage.getId();
Integer msgType = imMessage.getMsgType();
// 向接收方推送
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, imClientReceiver.getId());
} catch (Exception e) {
log.info("下发解散群事件失败,接收人 {}", JSON.toJSONString(member));
}
}
sendMsgToMembers(conversationId, membersList, appId, sender, messageId, msgType, content, Boolean.FALSE,
Boolean.TRUE);
}
@Override
......@@ -657,39 +590,14 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
throw new BusinessException("退出群聊错误");
}
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
// 向群成员发送退出群聊事件
Long conversationId = imClientToConversation.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
Integer msgType = MsgTypeEnum.LEAVE_CONVERSATION.getUriCode();
}
sendMsgToMembers(conversationId, membersList, appId, sender, messageId, msgType, null, Boolean.FALSE,
Boolean.TRUE);
// 群主退出 转移给下一个人
if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) {
ImConversationMembers conversationMember = membersList.get(0);
......@@ -792,72 +700,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMapper.updateById(muteGroupParam);
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())
);
if (membersList.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());
Integer msgType = MutedEnum.NO.getCode().equals(param.getMutedType()) ?
MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode()
: MsgTypeEnum.CONVERSATION_MUTED.getUriCode();
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(param.getConversationId());
imMessageService.save(imMessage);
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(param.getConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
} catch (Exception e) {
log.info("下发群禁言事件失败,接收人 {}", JSON.toJSONString(member));
}
}
return true;
}
......@@ -936,34 +781,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容
HashMap<String, String> content = Maps.newHashMap();
content.put("name", imConversationById.getName());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 发送消息至成员
sendMsgToMembers(param.getConversationId(), membersList, currentClient.getFkAppid(),
currentClient.getClientId(), null, MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode(), content,
Boolean.FALSE, Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
}
return ApiResult.ok();
} else {
return ApiResult.fail();
......@@ -1003,38 +825,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws下发拓展字段变动事件
HashMap<String, String> content = Maps.newHashMap();
content.put("attributes", imConversationById.getAttributes());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
// imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
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, imClientReceiver.getId());
}
// 向群成员发送拓展字段变动事件
Long conversationId = imConversationAttrUpdate.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
Integer msgType = MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode();
sendMsgToMembers(conversationId, membersList, appId, sender, null, msgType, content, Boolean.FALSE, Boolean.TRUE);
} else {
throw new BusinessException("修改错误");
}
......@@ -1157,4 +953,226 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return imConversationMapper.getRepetitionConversationAttributes(clientId1, clientId2, attributes);
}
@Override
public Boolean groupChatSetting(GroupChatSettingParam param) {
// 获取当前client
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
if (!imConversationService.isBelongToRole(currentClient.getClientId(), param.getConversationId(),
Lists.newArrayList(GroupRoleEnum.OWNER.getCode(), GroupRoleEnum.ADMIN.getCode()))) {
// 当前操作人不属于群主或管理人员
throw new BusinessException("操作人既不是群主也不是群管理员,无权限操作");
}
// 根据类型处理
GroupChatSettingTypeEnum typeEnum = param.getType();
ImConversation muteGroupParam = new ImConversation();
muteGroupParam.setId(param.getConversationId());
muteGroupParam.setUpdateTime(new Date());
switch (typeEnum) {
case FORBID_ADD_FRIEND:
muteGroupParam.setForbidAddFriend(param.getOn());
break;
case FORBID_SEND_RED_PACKETS:
muteGroupParam.setForbidSendRedPackets(param.getOn());
break;
case FORBID_SEND_PIC:
muteGroupParam.setForbidSendPic(param.getOn());
break;
case FORBID_SEND_LINK:
muteGroupParam.setForbidSendLink(param.getOn());
break;
default:
throw new BusinessException("设置类型错误");
}
// 更新会话
imConversationMapper.updateById(muteGroupParam);
deleteCacheImConversationById(param.getConversationId());
// 发送群聊配置变化消息
Integer msgType = getMsgType(typeEnum, param.getOn());
sendConversationSettingChangeMsg(currentClient, param.getConversationId(), msgType);
return true;
}
private Integer getMsgType(GroupChatSettingTypeEnum type, Boolean on) {
Integer msgType = null;
switch (type) {
case FORBID_ADD_FRIEND:
if (on) {
msgType = CONVERSATION_FORBID_ADD_FRIEND.getUriCode();
} else {
msgType = CONVERSATION_FORBID_ADD_FRIEND_CANCEL.getUriCode();
}
break;
case FORBID_SEND_RED_PACKETS:
if (on) {
msgType = CONVERSATION_FORBID_SEND_RED_PACKETS.getUriCode();
} else {
msgType = CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL.getUriCode();
}
break;
case FORBID_SEND_PIC:
if (on) {
msgType = CONVERSATION_FORBID_SEND_PIC.getUriCode();
} else {
msgType = CONVERSATION_FORBID_SEND_PIC_CANCEL.getUriCode();
}
break;
case FORBID_SEND_LINK:
if (on) {
msgType = CONVERSATION_FORBID_SEND_LINK.getUriCode();
} else {
msgType = CONVERSATION_FORBID_SEND_LINK_CANCEL.getUriCode();
}
break;
default:
throw new BusinessException("设置类型错误");
}
return msgType;
}
/**
* 发送会话配置变更事件
* @Author luozh
* @Date 2022年04月27日 01:52:54
* @param currentClient 当前client信息
* @param conversationId 会话id
* @param msgType 消息类型
* @Return
*/
private void sendConversationSettingChangeMsg(ImClient currentClient, Long conversationId, Integer msgType) {
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, conversationId)
.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);
imMessageService.save(imMessage);
// 发送消息至群成员
sendMsgToMembers(conversationId, membersList, currentClient.getFkAppid(), currentClient.getClientId(),
imMessage.getId(), imMessage.getMsgType(), content, Boolean.FALSE, Boolean.TRUE);
}
}
/**
* 发送会话事件消息至群成员列表
* @Author luozh
* @Date 2022年04月27日 02:11:19
* @param conversationId 会话id
* @param membersList 成员列表
* @param appId appId
* @param sender 发送者
* @param msgId 消息id
* @param msgType 消息类型
* @param content 消息内容
* @param withdraw 是否撤回
* @param event 是否事件
*/
private void sendMsgToMembers(Long conversationId, List<ImConversationMembers> membersList, Long appId,
String sender, Long msgId, Integer msgType, Map content, Boolean withdraw, Boolean event) {
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(), msgId, msgType, content, withdraw
, event);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", msgType, JSON.toJSONString(member));
}
}
}
/**
* 发送会话事件消息至指定成员
* @Author luozh
* @Date 2022年04月27日 03:11:00
* @param conversationId 会话id
* @param appId appId
* @param sender 发送者
* @param receiverClientId 接收者client id
* @param msgId 消息id
* @param msgType 消息类型
* @param content 消息内容
* @param withdraw 是否撤回
* @param event 是否事件
*/
private void sendEventMsgToMember(Long conversationId, Long appId, String sender,
Long receiverClientId, Long msgId, Integer msgType,
Map content, Boolean withdraw, Boolean event) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, appId)
.eq(ImClient::getId, receiverClientId));
if (imClientReceiver == null) {
return;
}
sendConversationEventMsg(conversationId, sender, receiverClientId, msgId, msgType, content, withdraw, event);
}
/**
* 发送会话事件消息
* @Author luozh
* @Date 2022年04月27日 03:11:34
* @param conversationId 会话id
* @param sender 发送者
* @param receiverClientId 接收者client id
* @param msgId 消息id
* @param msgType 消息类型
* @param content 消息内容
* @param withdraw 是否撤回
* @param event 是否事件
*/
private void sendConversationEventMsg(Long conversationId, String sender,
Long receiverClientId, Long msgId, Integer msgType,
Map content, Boolean withdraw, Boolean event) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(msgId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(msgType);
imMessageOnlineSend.setSender(sender);
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationId);
imMessageOnlineSend.setWithdraw(withdraw);
imMessageOnlineSend.setEvent(event);
// 向接收方推送
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);
}
}
......@@ -54,6 +54,29 @@ public enum MsgTypeEnum {
// 群成员备注修改 -1021
CONVERSATION_MEMBER_NAME_MODIFY(-1021),
// 禁止群成员互加好友
CONVERSATION_FORBID_ADD_FRIEND(-1022),
// 取消禁止群成员互加好友
CONVERSATION_FORBID_ADD_FRIEND_CANCEL(-1023),
// 禁止群成员发红包
CONVERSATION_FORBID_SEND_RED_PACKETS(-1024),
// 取消禁止群成员发红包
CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL(-1025),
// 禁止群成员发图片
CONVERSATION_FORBID_SEND_PIC_CANCEL(-1026),
// 取消禁止群成员发图片
CONVERSATION_FORBID_SEND_PIC(-1027),
// 禁止群成员发链接
CONVERSATION_FORBID_SEND_LINK(-1028),
// 取消禁止群成员发链接
CONVERSATION_FORBID_SEND_LINK_CANCEL(-1029),
;
private final int uriCode;
......
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