Commit 910da5db by Future

Merge branch 'xiaohudou_20220427' into feature-cluster

parents 25532764 4aefa1a1
...@@ -20,7 +20,7 @@ spring: ...@@ -20,7 +20,7 @@ spring:
# password: 123456 # password: 123456
# 测试外网 # 测试外网
url: jdbc:mysql://121.37.22.224:3306/wecloud_im_feature_cluster?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true url: jdbc:mysql://124.71.83.11:3306/wecloud_im?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
username: root username: root
password: temple123456 password: temple123456
......
...@@ -63,3 +63,12 @@ rocketmq: ...@@ -63,3 +63,12 @@ rocketmq:
namesrvAddr: 124.71.83.11:9876 namesrvAddr: 124.71.83.11:9876
# 生产者的组名 # 生产者的组名
producerId: im-server producerId: im-server
sms:
huawei:
url: https://rtcsms.cn-north-1.myhuaweicloud.com:10743/sms/batchSendSms/v1
sender: 8820122113125
appKey: FKFPgk3X6VRYAMJ9r9CIJWG2709W
appSecret: gvS2S8nD01vKCA1v45qi379gu1T5
verifyCode: 666666
...@@ -2,10 +2,13 @@ package com.wecloud.im.action; ...@@ -2,10 +2,13 @@ package com.wecloud.im.action;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam; import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.IntoChatRoomParam; import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam; import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam; import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
...@@ -17,10 +20,12 @@ import com.wecloud.im.param.add.ImConversationCreate; ...@@ -17,10 +20,12 @@ import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.service.ImConversationService; import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo; import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.ws.model.WsResponse; import com.wecloud.im.ws.model.WsResponse;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
...@@ -28,6 +33,7 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -28,6 +33,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import java.util.HashMap; import java.util.HashMap;
...@@ -231,6 +237,19 @@ public class ConversationAction { ...@@ -231,6 +237,19 @@ public class ConversationAction {
} }
/** /**
* 群聊设置
*/
@ActionMapping("/groupChatSetting")
@ApiOperation(value = "群聊设置", notes = "权限:群主和管理员有权限操作")
public WsResponse<Map<String, Boolean>> groupChatSetting(@Validated GroupChatSettingParam data) {
log.info("群聊设置入参 {}", JSON.toJSONString(data));
Boolean r = imConversationService.groupChatSetting(data);
Map<String, Boolean> result = new HashMap<>();
result.put("result", r);
return WsResponse.ok(result);
}
/**
* 用户进入聊天室 * 用户进入聊天室
*/ */
@ActionMapping("/intoChatRoom") @ActionMapping("/intoChatRoom")
...@@ -258,4 +277,26 @@ public class ConversationAction { ...@@ -258,4 +277,26 @@ public class ConversationAction {
} }
/**
* 全量获取聊天室成员
*/
@PostMapping("/listChatRoomMember")
@ApiOperation(value = "全量获取聊天室成员", notes = "全量获取聊天室成员")
public WsResponse<List<ChatRoomMemberVo>> listChatRoomMember(ChatRoomMemberPageParam data) {
log.info("全量获取聊天室成员入参 {}", JSON.toJSONString(data));
List<ChatRoomMemberVo> r = imConversationService.listChatRoomMember(data);
return WsResponse.ok(r);
}
/**
* 查找会话信息
* @return
*/
@ActionMapping("/listConversation")
@ApiOperation(value = "批量查找会话信息", notes = "会话")
public WsResponse<List<ConversationVo>> listConversation(ListConversationParam data) {
List<ConversationVo> conversationList = imConversationService.listConversation(data);
return WsResponse.ok(conversationList);
}
} }
...@@ -11,8 +11,10 @@ import java.util.Map; ...@@ -11,8 +11,10 @@ import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam; import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ListConversationMembersParam; import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate; import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
...@@ -67,10 +69,23 @@ public class ConversationMembersAction { ...@@ -67,10 +69,23 @@ public class ConversationMembersAction {
@ActionMapping("/getList") @ActionMapping("/getList")
@ApiOperation(value = "获取会话中成员表列表") @ApiOperation(value = "获取会话中成员表列表")
public WsResponse<Map<String, List<ConversationMemberVo>>> getImConversationMembersList(@Validated ListConversationMembersParam data) throws Exception { public WsResponse<Map<String, List<ConversationMemberVo>>> getImConversationMembersList(@Validated ListConversationMembersParam data) throws Exception {
List<ConversationMemberVo> conversationMemberVoList = List<ConversationMemberVo> conversationMemberVoList = imConversationMembersService.getImConversationMembersList(data);
imConversationMembersService.getImConversationMembersList(data);
Map<String, List<ConversationMemberVo>> result = new HashMap<>(); Map<String, List<ConversationMemberVo>> result = new HashMap<>();
result.put("result", conversationMemberVoList); result.put("result", conversationMemberVoList);
return WsResponse.ok(result); return WsResponse.ok(result);
} }
/**
* 聊天设置
* @Author luozh
* @Date 2022年04月26日 11:48:59
* @param
* @Return
*/
@ApiOperation(value = "聊天设置")
@ActionMapping("/chatSetting")
public WsResponse<Map<String, Boolean>> chatSetting(@RequestBody ChatSettingParam param) {
imConversationMembersService.chatSetting(param);
return WsResponse.ok();
}
} }
...@@ -12,6 +12,8 @@ import java.util.Date; ...@@ -12,6 +12,8 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
...@@ -140,6 +142,11 @@ public class NormalChatAction { ...@@ -140,6 +142,11 @@ public class NormalChatAction {
if (muted(conversation, reqId, imClientSender, membersList, request.getSenderChannel())) { if (muted(conversation, reqId, imClientSender, membersList, request.getSenderChannel())) {
return; return;
} }
// 消息内容校验
if (checkMsg(conversation, reqId, data.getText(), request.getSenderChannel())) {
return;
}
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(data, imClientSender, imApplication.getId()); ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(data, imClientSender, imApplication.getId());
// 再给所有人发 todo 需要改成批量 // 再给所有人发 todo 需要改成批量
...@@ -378,9 +385,47 @@ public class NormalChatAction { ...@@ -378,9 +385,47 @@ public class NormalChatAction {
responseModel.setCode(apiResult.getCode()); responseModel.setCode(apiResult.getCode());
responseModel.setMsg(apiResult.getMessage()); responseModel.setMsg(apiResult.getMessage());
responseModel.setReqId(reqId); responseModel.setReqId(reqId);
channelSender.sendMsgLocal((NioSocketChannel)channel, responseModel); channelSender.sendMsgLocal((NioSocketChannel) channel, responseModel);
} }
return result; return result;
} }
/**
* 是否禁止发送链接
* @Author luozh
* @Date 2022年04月27日 04:39:04
* @Return
*/
private boolean checkMsg(ImConversationQueryVo conversation, String reqId,
String msgContent, Channel channel) {
boolean result = false;
// 判断是否开启禁止发送链接
if (conversation.getForbidSendLink()) {
String regex = "((ht|f)tp(s?)\\:\\/\\/)?[0-9a-zA-Z]([-.\\w]*[0-9a-zA-Z])*." +
"(html|htm|shtml|jsp|asp|php|com|cn|net|com.cn|org|vip)+(:(0-9)*)*(\\/?)([a-zA-Z0-9\\-\\.\\?\\," +
"\\'\\/\\\\&%\\+\\$#_=]*)?";
Pattern pat = Pattern.compile(regex);
Matcher mat = pat.matcher(msgContent.trim());
result = mat.find();
}
if (result) {
log.info("群: {}, 已被禁止发送链接", conversation.getName());
// 响应发送方
WsResponse<HashMap<String, Long>> responseModel = new WsResponse<>();
ApiResult<Boolean> apiResult = ApiResult.result(ApiCode.IS_BE_FORBID_SEND_LINK);
responseModel.setCmd(WsResponseCmdEnum.RES.getCmdCode());
responseModel.setCode(apiResult.getCode());
responseModel.setMsg(apiResult.getMessage());
responseModel.setReqId(reqId);
channelSender.sendMsgLocal((NioSocketChannel) channel, responseModel);
}
return result;
}
} }
package com.wecloud.im.chatroom.action; package com.wecloud.im.chatroom.action;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.Channel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.dispatch.common.BaseRequest; import com.wecloud.dispatch.common.BaseRequest;
import com.wecloud.dispatch.extend.ActionRequest; import com.wecloud.dispatch.extend.ActionRequest;
...@@ -18,19 +33,6 @@ import com.wecloud.im.ws.model.WsResponse; ...@@ -18,19 +33,6 @@ import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.Channel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/** /**
* @Author wenzhida * @Author wenzhida
......
...@@ -70,5 +70,17 @@ public class ImClientBlacklistController extends BaseController { ...@@ -70,5 +70,17 @@ public class ImClientBlacklistController extends BaseController {
return ApiResult.ok(blacklist); return ApiResult.ok(blacklist);
} }
/**
* 黑名单分页列表sdk用
*/
@PostMapping("/sdk/pageBlacklist")
@OperationLog(name = "黑名单分页列表", type = OperationLogType.PAGE)
@ApiOperation(value = "黑名单分页列表")
public ApiResult<Paging<ImClientBlacklistQueryVo>> getImClientBlacklistPageListSdk(@RequestBody ImClientBlacklistPageParam imClientBlacklistPageParam) throws Exception {
Paging<ImClientBlacklistQueryVo> blacklist =
imClientBlacklistService.getImClientBlacklistPageListSdk(imClientBlacklistPageParam);
return ApiResult.ok(blacklist);
}
} }
package com.wecloud.im.controller; package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.ChatRoomMemberPageParam; import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam; import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.IntoChatRoomParam; import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.TransferOwnerParam;
import com.wecloud.im.param.add.ImClientLeaveConversation;
import com.wecloud.im.param.add.ImClientToConversation;
import com.wecloud.im.param.add.ImConversationAttrUpdate;
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.service.ImConversationService;
import com.wecloud.im.vo.ChatRoomMemberVo; import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -22,22 +36,7 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -22,22 +36,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON; import java.util.List;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.TransferOwnerParam;
import com.wecloud.im.param.add.ImClientLeaveConversation;
import com.wecloud.im.param.add.ImClientToConversation;
import com.wecloud.im.param.add.ImConversationAttrUpdate;
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.service.ImConversationService;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
/** /**
* 会话表 控制器 * 会话表 控制器
...@@ -211,6 +210,17 @@ public class ImConversationController extends BaseController { ...@@ -211,6 +210,17 @@ public class ImConversationController extends BaseController {
return ApiResult.result(true); 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);
}
/** /**
* 用户进入聊天室 * 用户进入聊天室
...@@ -243,6 +253,16 @@ public class ImConversationController extends BaseController { ...@@ -243,6 +253,16 @@ public class ImConversationController extends BaseController {
return ApiResult.ok(imConversationService.listChatRoomMember(param)); return ApiResult.ok(imConversationService.listChatRoomMember(param));
} }
/**
* 查找会话信息
* @return
*/
@PostMapping("/listConversation")
@ApiOperation(value = "批量查找会话信息", notes = "会话")
public ApiResult<List<ConversationVo>> listConversation(@RequestBody ListConversationParam param) {
List<ConversationVo> conversationList = imConversationService.listConversation(param);
return ApiResult.ok(conversationList);
}
} }
package com.wecloud.im.controller; package com.wecloud.im.controller;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController; import io.geekidea.springbootplus.framework.common.controller.BaseController;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils; import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
...@@ -16,10 +18,10 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -16,10 +18,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.wecloud.im.friend.param.ImFriendApplyParam;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam; import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ListConversationMembersParam; import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.SetConversationDoNotDisturbParam;
import com.wecloud.im.param.SetConversationTopParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate; import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.vo.ConversationMemberVo; import com.wecloud.im.vo.ConversationMemberVo;
...@@ -77,39 +79,56 @@ public class ImConversationMembersController extends BaseController { ...@@ -77,39 +79,56 @@ public class ImConversationMembersController extends BaseController {
} }
/** /**
* 会话置顶 * 聊天设置
* @Author luozh * @Author luozh
* @Date 2022年04月26日 11:48:59 * @Date 2022年04月26日 11:48:59
* @param * @param
* @Return * @Return
*/ */
@ApiOperation(value = "会话置顶") @ApiOperation(value = "聊天设置")
@PostMapping("/sdk/setTop") @PostMapping("/chatSetting")
public ApiResult<Boolean> setTop(@RequestBody SetConversationTopParam param) { public ApiResult<Boolean> chatSetting(@RequestBody ChatSettingParam param) {
Long appId = SecurityUtils.getCurrentAppId(); return ApiResult.ok(imConversationMembersService.chatSetting(param));
String clientId = param.getClientId();
Long conversationId = param.getConversationId();
Boolean top = param.getTop();
imConversationMembersService.setTop(appId, clientId, conversationId, top);
return ApiResult.ok();
} }
/** /**
* 设置免打扰 * 群成员添加好友
* @Author luozh * @Author luozh
* @Date 2022年04月26日 11:49:55 * @Date 2022年04月28日 11:40:44
* @param * @param
* @Return * @Return
*/ */
@ApiOperation(value = "会话免打扰") @ApiOperation(value = "群成员添加好友")
@PostMapping("/sdk/setDoNotDisturb") @PostMapping("/addUser")
public ApiResult<Boolean> setDoNotDisturb(@RequestBody SetConversationDoNotDisturbParam param) { public ApiResult<Boolean> addUser(@RequestBody ImFriendApplyParam param) {
Long appId = SecurityUtils.getCurrentAppId(); if (param.getConversationId() == null) {
String clientId = param.getClientId(); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: conversationId 不能为空");
Long conversationId = param.getConversationId(); }
Boolean doNotDisturb = param.getDoNotDisturb(); if (StringUtils.isBlank(param.getFriendName())) {
imConversationMembersService.setDoNotDisturb(appId, clientId, conversationId, doNotDisturb); throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: friendName 不能为空");
return ApiResult.ok(); }
if (StringUtils.isBlank(param.getClientId())) {
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: clientId 不能为空");
}
if (StringUtils.isBlank(param.getFriendClientId())) {
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: friendClientId 不能为空");
}
return ApiResult.ok(imConversationMembersService.addUser(param));
}
/**
*
* @Author luozh
* @Date 2022年04月29日 03:59:54
* @param
* @Return
*/
@ApiOperation(value = "消息发布")
@PostMapping("/publish")
public ApiResult<Boolean> publish() {
return null;
} }
} }
......
...@@ -21,8 +21,12 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -21,8 +21,12 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.wecloud.im.param.GetReadersParam; import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.GroupChatMessageParam;
import com.wecloud.im.param.GroupChatStatusMessageParam;
import com.wecloud.im.param.ImHistoryMessagePageParam; import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam; import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.add.ImMsgRecall; import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgUpdate; import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.service.ImMessageService; import com.wecloud.im.service.ImMessageService;
...@@ -60,7 +64,7 @@ public class ImMessageController extends BaseController { ...@@ -60,7 +64,7 @@ public class ImMessageController extends BaseController {
@PostMapping("/delete") @PostMapping("/delete")
@ApiOperation(value = "删除消息", notes = "单条消息与批量消息删除共用") @ApiOperation(value = "删除消息", notes = "单条消息与批量消息删除共用")
public ApiResult<Boolean> deleteMsg(@RequestBody MsgDeleteParam param) { public ApiResult<Boolean> deleteMsg(@RequestBody MsgDeleteParam param) {
if(param == null) { if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
if (CollectionUtils.isEmpty(param.getMsgIds())) { if (CollectionUtils.isEmpty(param.getMsgIds())) {
...@@ -109,5 +113,30 @@ public class ImMessageController extends BaseController { ...@@ -109,5 +113,30 @@ public class ImMessageController extends BaseController {
return ApiResult.ok(readerList); return ApiResult.ok(readerList);
} }
@ApiOperation("发布群聊消息")
@PostMapping("/group/publish")
public ApiResult<Boolean> groupMessagePublish(@RequestBody @Validated GroupChatMessageParam param) {
// 参数校验
return ApiResult.ok(imMessageService.groupMessagePublish(param));
}
@ApiOperation("发布群聊状态消息")
@PostMapping("/group/status/publish")
public ApiResult<Boolean> groupStatusMessagePublish(@RequestBody @Validated GroupChatStatusMessageParam param) {
return ApiResult.ok(imMessageService.groupStatusMessagePublish(param));
}
@ApiOperation("发布单聊消息")
@PostMapping("/private/publish")
public ApiResult<Boolean> privateMessagePublish(@RequestBody @Validated PrivateChatMessageParam param) {
return ApiResult.ok(imMessageService.privateMessagePublish(param));
}
@ApiOperation("发布单聊状态消息")
@PostMapping("/private/status/publish")
public ApiResult<Boolean> privateStatusMessagePublish(@RequestBody @Validated PrivateChatStatusMessageParam param) {
return ApiResult.ok(imMessageService.privateStatusMessagePublish(param));
}
} }
package com.wecloud.im.entity; package com.wecloud.im.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity; import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
...@@ -9,9 +7,13 @@ import lombok.Data; ...@@ -9,9 +7,13 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
import javax.validation.constraints.NotNull;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
/** /**
* 消息存储表 * 消息存储表
* *
......
...@@ -7,9 +7,9 @@ import lombok.Data; ...@@ -7,9 +7,9 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date; import java.util.Date;
import java.util.Map;
import javax.validation.constraints.NotNull;
/** /**
* 消息在线推送 * 消息在线推送
...@@ -45,7 +45,7 @@ public class ImMessageOnlineSend extends BaseEntity { ...@@ -45,7 +45,7 @@ public class ImMessageOnlineSend extends BaseEntity {
private String sender; private String sender;
@ApiModelProperty("内容") @ApiModelProperty("内容")
private Map content; private Object content;
@ApiModelProperty("0未撤回; 1已撤回") @ApiModelProperty("0未撤回; 1已撤回")
private Boolean withdraw; private Boolean withdraw;
......
...@@ -94,10 +94,36 @@ public class ImFriendController extends BaseController { ...@@ -94,10 +94,36 @@ public class ImFriendController extends BaseController {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
ImClient friendClient = imClientService.getCacheImClient(currentClient.getFkAppid(), param.getFriendClientId()); ImClient friendClient = imClientService.getCacheImClient(currentClient.getFkAppid(), param.getFriendClientId());
if(friendClient == null) { if (friendClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
if (currentClient.getId().equals(friendClient.getId())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
imFriendService.applyFriend(currentClient, friendClient, param.getFriendName(), param.getRequestRemark());
log.info("申请添加好友逻辑完成");
return ApiResult.ok();
}
/**
* 申请添加好友
*/
@PostMapping("/sdk/apply")
@ApiOperation(value = "申请添加好友 sdk用")
public ApiResult<Boolean> applyFriendSdk(@RequestBody ImFriendApplyParam param) {
log.info("申请添加好友入参 {}", JSON.toJSONString(param));
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
ImClient currentClient = imClientService.getCacheImClient(SecurityUtils.getCurrentAppId(), param.getClientId());
if (currentClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
ImClient friendClient = imClientService.getCacheImClient(SecurityUtils.getCurrentAppId(), param.getFriendClientId());
if (friendClient == null) {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null); return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
} }
if(currentClient.getId().equals(friendClient.getId())) { if (currentClient.getId().equals(friendClient.getId())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null); return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
} }
imFriendService.applyFriend(currentClient, friendClient, param.getFriendName(), param.getRequestRemark()); imFriendService.applyFriend(currentClient, friendClient, param.getFriendName(), param.getRequestRemark());
......
...@@ -3,8 +3,6 @@ package com.wecloud.im.friend.param; ...@@ -3,8 +3,6 @@ package com.wecloud.im.friend.param;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
/** /**
* @Description 申请好友入参 * @Description 申请好友入参
* @Author lixiaozhong * @Author lixiaozhong
...@@ -14,6 +12,9 @@ import java.io.Serializable; ...@@ -14,6 +12,9 @@ import java.io.Serializable;
public class ImFriendApplyParam extends ImFriendBaseParam { public class ImFriendApplyParam extends ImFriendBaseParam {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ApiModelProperty("会话id,群成员添加好友时传参")
private Long conversationId;
@ApiModelProperty("备注好友名称") @ApiModelProperty("备注好友名称")
private String friendName; private String friendName;
......
package com.wecloud.im.mapper; package com.wecloud.im.mapper;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
...@@ -7,11 +14,6 @@ import com.wecloud.im.entity.ImConversation; ...@@ -7,11 +14,6 @@ import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ImConversationPageParam; import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.io.Serializable;
import java.util.List;
/** /**
* 会话表 Mapper 接口 * 会话表 Mapper 接口
...@@ -46,7 +48,7 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> { ...@@ -46,7 +48,7 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
* @param currentClientId * @param currentClientId
* @return * @return
*/ */
List<ConversationVo> getMyImConversationListAndMsgCount(@Param("currentClientId") Long currentClientId,@Param("clientId") String clientId, @Param("conversationId") Long conversationId); List<ConversationVo> getMyImConversationListAndMsgCount(@Param("currentClientId") Long currentClientId, @Param("clientId") String clientId, @Param("conversationId") Long conversationId);
/** /**
* 查询用户加入的所有会话 * 查询用户加入的所有会话
...@@ -91,4 +93,15 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> { ...@@ -91,4 +93,15 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
* @return 成功则返回true * @return 成功则返回true
*/ */
boolean upgradeToThousandChat(@Param("appId") Long appId, @Param("conversationId") Long conversationId); boolean upgradeToThousandChat(@Param("appId") Long appId, @Param("conversationId") Long conversationId);
/**
* 获取发件人和收件人会话列表
* @Author luozh
* @Date 2022年05月06日 07:15:05
* @param senderClientId 发件人im client id
* @param receiverClientIds 收件人 im client ids
* @Return
*/
List<ImConversation> getConversationBySenderAndReceivers(@Param("senderImClientId") Long senderImClientId, @Param(
"receiverImClientIds") Collection<Long> receiverImClientIds);
} }
...@@ -4,14 +4,14 @@ import io.swagger.annotations.ApiModelProperty; ...@@ -4,14 +4,14 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* 设置会话置顶入参 * 聊天设置入参
* @Author luozh * @Author luozh
* @Date 2022年04月26日 11:52 * @Date 2022年04月26日 11:52
* @Version 1.0 * @Version 1.0
*/ */
@Data @Data
public class SetConversationTopParam { public class ChatSettingParam {
@ApiModelProperty("客户端id") @ApiModelProperty("客户端id")
String clientId; String clientId;
...@@ -19,7 +19,10 @@ public class SetConversationTopParam { ...@@ -19,7 +19,10 @@ public class SetConversationTopParam {
@ApiModelProperty("会话id") @ApiModelProperty("会话id")
Long conversationId; Long conversationId;
@ApiModelProperty("设置类型")
ChatSettingTypeEnum type;
@ApiModelProperty("是否免打扰") @ApiModelProperty("是否免打扰")
private Boolean top; private Boolean on;
} }
package com.wecloud.im.param;
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日 17:26
* @Version 1.0
*/
public enum ChatSettingTypeEnum implements BaseEnum {
/**
* 1-置顶
*/
TOP(1, "置顶"),
/**
* 2-消息免打扰
*/
DO_NOT_DISTURB(2, "消息免打扰"),
;
ChatSettingTypeEnum(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;
}
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发送群聊消息入参
* @Author luozh
* @Date 2022年04月29日 16:00
* @Version 1.0
*/
@Data
public class GroupChatMessageParam {
@NotEmpty(message = "发送人id不能为空")
@ApiModelProperty("发送人id")
private String fromUserId;
@NotEmpty(message = "接收群id不能为空")
@ApiModelProperty("接收群id")
private String toGroupIds;
@ApiModelProperty("指定一个或多个用户")
private String toUserIds;
@NotEmpty(message = "消息类型不能为空")
@ApiModelProperty("消息类型")
private String messageType;
@NotEmpty(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
@ApiModelProperty("指定离线推送通知中的推送内容")
private String pushContent;
@ApiModelProperty("是否包含发送用户")
private Boolean includeSender;
@ApiModelProperty("是否为@消息")
private Boolean mentioned;
@ApiModelProperty("是否为静默消息")
private Boolean silent;
@ApiModelProperty("推送配置")
private PushExtParam pushExt;
}
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.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@Data
public class GroupChatStatusMessageParam {
/**
* 发送人客户端id
*/
@NotEmpty(message = "发送人id不能为空")
@ApiModelProperty("发送人id")
private String fromUserId;
/**
* 接收群id
*/
@NotEmpty(message = "接收群id不能为空")
@ApiModelProperty("接收群id")
private String toGroupIds;
/**
* 消息类型
*/
@NotEmpty(message = "消息类型不能为空")
@ApiModelProperty("消息类型")
private String messageType;
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
/**
* 是否过滤黑名单
*/
@ApiModelProperty("是否过滤黑名单")
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
@ApiModelProperty("发送用户是否接收")
private Boolean includeSender;
}
...@@ -19,5 +19,8 @@ import lombok.experimental.Accessors; ...@@ -19,5 +19,8 @@ import lombok.experimental.Accessors;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ApiModel(value = "黑名单分页参数") @ApiModel(value = "黑名单分页参数")
public class ImClientBlacklistPageParam extends BasePageOrderParam { public class ImClientBlacklistPageParam extends BasePageOrderParam {
private String clientId;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }
...@@ -61,4 +61,16 @@ public class ImConversationQueryVo implements Serializable { ...@@ -61,4 +61,16 @@ public class ImConversationQueryVo implements Serializable {
*/ */
@ApiModelProperty("禁言开关 1-未禁言 2-禁言") @ApiModelProperty("禁言开关 1-未禁言 2-禁言")
private Integer muted; private Integer muted;
@ApiModelProperty("禁止互加好友")
private Boolean forbidAddFriend;
@ApiModelProperty("禁止发红包")
private Boolean forbidSendRedPackets;
@ApiModelProperty("禁止发图片")
private Boolean forbidSendPic;
@ApiModelProperty("禁止发链接")
private Boolean forbidSendLink;
} }
package com.wecloud.im.param;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @Author wenzhida
* @Date 2022/5/1 9:35
* @Description 查找聊天室入参
*/
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "查找聊天室入参")
public class ListConversationParam extends BaseEntity {
private static final long serialVersionUID = -3602523207000275557L;
@ApiModelProperty("会话属性,1:单聊,2:普通群,3:万人群,4:聊天室")
private Integer chatType;
@ApiModelProperty("会话id列表")
private String conversationIds;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 单聊消息
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Data
public class PrivateChatMessageParam {
/**
* 发送人id
*/
@NotEmpty(message = "发送人id不能为空")
@ApiModelProperty("发送人id")
private String fromUserId;
/**
* 指定一个或多个用户
*/
@NotEmpty(message = "接收用户id不能为空")
@ApiModelProperty("接收用户id")
private String toUserIds;
/**
* 消息类型
*/
@NotEmpty(message = "消息类型不能为空")
@ApiModelProperty("消息类型")
private String messageType;
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
/**
* 指定离线推送通知中的推送内容
*/
@ApiModelProperty("指定离线推送通知中的推送内容")
private String pushContent;
/**
* 是否包含发送用户
*/
@ApiModelProperty("是否包含发送用户")
private Boolean includeSender;
/**
* 是否过滤黑名单
*/
@ApiModelProperty("是否过滤黑名单")
private Boolean includeBlacklist;
/**
* 是否存储此条消息
*/
@ApiModelProperty("是否存储此条消息")
private Boolean persisted;
/**
* 是否为静默消息
*/
@ApiModelProperty("是否为静默消息")
private Boolean silent;
/**
* 推送拓展配置
*/
@ApiModelProperty("推送拓展配置")
private PushExtParam pushExt;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@Data
public class PrivateChatStatusMessageParam {
/**
* 发送人客户端id
*/
@NotEmpty(message = "发送人id不能为空")
@ApiModelProperty("发送人id")
private String fromUserId;
/**
* 接收群id
*/
@NotEmpty(message = "接收用户id不能为空")
@ApiModelProperty("接收用户id")
private String toUserIds;
/**
* 消息类型
*/
@NotEmpty(message = "消息类型不能为空")
@ApiModelProperty("消息类型")
private String messageType;
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
/**
* 是否过滤黑名单
*/
@ApiModelProperty("是否过滤黑名单")
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
@ApiModelProperty("发送用户是否接收")
private Boolean includeSender;
}
package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 推送拓展参数
* @Author luozh
* @Date 2022年04月29日 17:07
* @Version 1.0
*/
@Data
public class PushExtParam {
@ApiModelProperty("通知栏显示主题")
private String title;
@ApiModelProperty("按厂商设置不同推送属性。支持的推送通道值为 `MI`(小米)、`HW`(华为)、`OPPO`、`VIVO`")
private String pushChannel;
@ApiModelProperty("通知渠道的 ID")
private String channelId;
@ApiModelProperty("华为通知栏消息优先级,取值 NORMAL、LOW,默认为 NORMAL 重要消息")
private String hwPriority;
@ApiModelProperty("华为推送自定义的通知栏消息右侧大图标 URL,如果不设置,则不展示通知栏右侧图标")
private String hwImage;
@ApiModelProperty("小米推送自定义的通知栏消息右侧图标 URL")
private String miLargeIconUri;
@ApiModelProperty("vivo 推送通道类型。0 为运营消息、1 为系统消息")
private String vivoChannelType;
@ApiModelProperty("iOS 平台通知栏分组 ID")
private String iosGroupId;
@ApiModelProperty("iOS 平台")
private String iosApnsCollapseId;
}
...@@ -7,10 +7,10 @@ import lombok.Data; ...@@ -7,10 +7,10 @@ import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotNull;
/** /**
* 会话表 * 会话表
* *
......
package com.wecloud.im.param.add;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.imserver.client.model.enums.DeviceTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月07日 10:13
* @Version 1.0
*/
@Data
@Accessors(chain = true)
@ApiModel(value = "ImConversationCreate")
public class ServerImConversationCreate implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 可选 对话的名字,可为群组命名。")
*/
private String name;
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
*/
private String attributes;
/**
* 应用, 前端")
*/
private ImApplication application;
/**
* 创建者 前端请求不传")
*/
private ImClient creator;
/**
* 可选 成员列表
*/
private List<ImClient> members;
/**
* @see com.wecloud.im.sdk.enums.ChatTypeEnum
*/
/**
* 会话属性,1:单聊,2:普通群,3:万人群, 4:聊天室")
*/
private ChatTypeEnum chatType;
/**
* 客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs, 需与生成sign时的值一致")
*/
private DeviceTypeEnum platform;
}
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;
}
}
...@@ -3,7 +3,6 @@ package com.wecloud.im.service; ...@@ -3,7 +3,6 @@ package com.wecloud.im.service;
import io.geekidea.springbootplus.framework.common.service.BaseService; import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.im.entity.ImClientBlacklist; import com.wecloud.im.entity.ImClientBlacklist;
import com.wecloud.im.param.ImClientBlacklistPageParam; import com.wecloud.im.param.ImClientBlacklistPageParam;
import com.wecloud.im.param.ImClientBlacklistQueryVo; import com.wecloud.im.param.ImClientBlacklistQueryVo;
...@@ -53,4 +52,12 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist> ...@@ -53,4 +52,12 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist>
*/ */
Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam); Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam);
/**
* 获取分页对象
*
* @return
* @throws Exception
*/
Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageListSdk(ImClientBlacklistPageParam imClientBlacklistPageParam);
} }
...@@ -6,10 +6,14 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging; ...@@ -6,10 +6,14 @@ import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.List; import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.friend.param.ImFriendApplyParam;
import com.wecloud.im.param.ApiImConversationMembersPageParam; import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo; import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam; import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ImConversationMembersPageParam; import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo; import com.wecloud.im.param.ImConversationMembersQueryVo;
...@@ -129,14 +133,14 @@ public interface ImConversationMembersService extends BaseService<ImConversation ...@@ -129,14 +133,14 @@ public interface ImConversationMembersService extends BaseService<ImConversation
* @param * @param
* @Return * @Return
*/ */
Boolean setTop(Long appId, String clientId, Long conversationId, Boolean top); Boolean chatSetting(ChatSettingParam param);
/** /**
* 设置免打扰 * 群成员添加好友
* @Author luozh * @Author luozh
* @Date 2022年04月25日 06:24:43 * @Date 2022年04月28日 11:48:42
* @param * @param param
* @Return * @Return
*/ */
Boolean setDoNotDisturb(Long appId, String clientId, Long conversationId, Boolean doNotDisturb); Boolean addUser(@RequestBody ImFriendApplyParam param);
} }
package com.wecloud.im.service; package com.wecloud.im.service;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.Collection;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ChatRoomMemberPageParam; import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam; import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationPageParam; import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.IntoChatRoomParam; import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam; import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam; import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
...@@ -19,14 +28,10 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate; ...@@ -19,14 +28,10 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate; import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.vo.ChatRoomMemberVo; import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo; import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import java.util.List;
/** /**
* 会话表 服务类 * 会话表 服务类
...@@ -54,6 +59,14 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -54,6 +59,14 @@ public interface ImConversationService extends BaseService<ImConversation> {
*/ */
ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate); ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate);
/**
* 创建会话 sdk用
*
* @param imConversationCreate
* @return
*/
ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate);
/** /**
* 将用户添加进会话 * 将用户添加进会话
...@@ -209,6 +222,13 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -209,6 +222,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
Long getRepetitionConversationAttributes(Long clientId1, Long clientId2, String attributes); Long getRepetitionConversationAttributes(Long clientId1, Long clientId2, String attributes);
/** /**
* 群禁言
* @param param
* @return
*/
Boolean groupChatSetting(GroupChatSettingParam param);
/**
* 用户主动进入聊天室 * 用户主动进入聊天室
* @param param * @param param
* @return * @return
...@@ -223,11 +243,27 @@ public interface ImConversationService extends BaseService<ImConversation> { ...@@ -223,11 +243,27 @@ public interface ImConversationService extends BaseService<ImConversation> {
Boolean exitChatRoom(ExitChatRoomParam param); Boolean exitChatRoom(ExitChatRoomParam param);
/** /**
* 分页获取聊天室成员入参 * 获取聊天室成员入参
* @param param * @param param
* @return * @return
*/ */
List<ChatRoomMemberVo> listChatRoomMember(ChatRoomMemberPageParam param); List<ChatRoomMemberVo> listChatRoomMember(ChatRoomMemberPageParam param);
/**
* 获取会话信息
* @param param
* @return
*/
List<ConversationVo> listConversation(ListConversationParam param);
/**
* @param senderClientId
* @param receiverClientIds
* @Author luozh
* @Date 2022年05月06日 07:18:34
* @Return
*/
List<ImConversation> getConversationBySenderAndReceivers(Long senderImClientId, Collection<Long> receiverImClientIds);
} }
...@@ -13,9 +13,13 @@ import com.wecloud.im.entity.ImClient; ...@@ -13,9 +13,13 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.param.ChatContentVo; import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam; import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.GroupChatMessageParam;
import com.wecloud.im.param.GroupChatStatusMessageParam;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImHistoryMessagePageParam; import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam; import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.add.ImMsgRecall; import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient; import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate; import com.wecloud.im.param.add.ImMsgUpdate;
...@@ -132,4 +136,38 @@ public interface ImMessageService extends BaseService<ImMessage> { ...@@ -132,4 +136,38 @@ public interface ImMessageService extends BaseService<ImMessage> {
*/ */
ReaderList getReaders(GetReadersParam param); ReaderList getReaders(GetReadersParam param);
/**
* 发送群聊消息
* @param param
* @return
*/
Boolean groupMessagePublish(GroupChatMessageParam param);
/**
* 发送群聊状态消息
* @Author luozh
* @Date 2022年05月05日 02:32:58
* @param param
* @Return
*/
Boolean groupStatusMessagePublish(GroupChatStatusMessageParam param);
/**
* 发送单聊消息
* @Author luozh
* @Date 2022年05月05日 02:33:26
* @param param
* @Return
*/
Boolean privateMessagePublish(PrivateChatMessageParam param);
/**
* 发送单聊状态消息
* @Author luozh
* @Date 2022年05月05日 02:33:56
* @param param
* @Return
*/
Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param);
} }
...@@ -4,12 +4,11 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException; ...@@ -4,12 +4,11 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.Date; import java.util.Date;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -101,11 +100,26 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl ...@@ -101,11 +100,26 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override @Override
public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam) { public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam) {
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
ImClient currentClient = contextService.getImClientIfNotNullOrThrow(); ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, currentClient.getClientId()); return getImClientBlacklistPageList(currentClient, imClientBlacklistPageParam);
}
@Override
public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageListSdk(ImClientBlacklistPageParam imClientBlacklistPageParam) {
Long appId = SecurityUtils.getCurrentAppId();
ImClient client = imClientService.getCacheImClient(appId, imClientBlacklistPageParam.getClientId());
if (client == null) {
throw new BusinessException("客户端不存在");
}
return getImClientBlacklistPageList(client, imClientBlacklistPageParam);
}
private Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClient client,
ImClientBlacklistPageParam imClientBlacklistPageParam) {
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
IPage<ImClientBlacklistQueryVo> imClientBlacklistPageList = imClientBlacklistMapper.getImClientBlacklistPageList(page, client.getClientId());
Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList); Paging<ImClientBlacklistQueryVo> imClientBlacklistQueryVoPaging = new Paging<>(imClientBlacklistPageList);
return imClientBlacklistQueryVoPaging; return imClientBlacklistQueryVoPaging;
} }
} }
...@@ -6,8 +6,10 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException; ...@@ -6,8 +6,10 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -25,12 +27,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -25,12 +27,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.friend.param.ImFriendApplyParam;
import com.wecloud.im.friend.service.ImFriendService;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.mapper.ImConversationMembersMapper; import com.wecloud.im.mapper.ImConversationMembersMapper;
import com.wecloud.im.param.ApiImConversationMembersPageParam; import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo; import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ChatSettingTypeEnum;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam; import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ImConversationMembersPageParam; import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo; import com.wecloud.im.param.ImConversationMembersQueryVo;
...@@ -38,11 +45,9 @@ import com.wecloud.im.param.ListConversationMembersParam; ...@@ -38,11 +45,9 @@ import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate; import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.service.ContextService; import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService; import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ConversationMemberVo; import com.wecloud.im.vo.ConversationMemberVo;
import com.wecloud.im.ws.enums.MsgTypeEnum; import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
...@@ -76,17 +81,14 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -76,17 +81,14 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
private ImClientService imClientService; private ImClientService imClientService;
@Autowired @Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImMessageService imMessageService;
@Autowired
private ImConversationMembersMapper imConversationMembersMapper; private ImConversationMembersMapper imConversationMembersMapper;
@Autowired @Autowired
private ContextService contextService; private ContextService contextService;
@Autowired
private ImFriendService imFriendService;
@Override @Override
public ApiResult<List<ApiImConversationMembersQueryVo>> getRestApiImConversationMembersList(ApiImConversationMembersPageParam apiImConversationMembersPageParam, ImApplication imApplication) { public ApiResult<List<ApiImConversationMembersQueryVo>> getRestApiImConversationMembersList(ApiImConversationMembersPageParam apiImConversationMembersPageParam, ImApplication imApplication) {
...@@ -259,7 +261,13 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -259,7 +261,13 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
} }
@Override @Override
public Boolean setTop(Long appId, String clientId, Long conversationId, Boolean top) { public Boolean chatSetting(ChatSettingParam param) {
Long appId = SecurityUtils.getCurrentAppId();
String clientId = param.getClientId();
Long conversationId = param.getConversationId();
ChatSettingTypeEnum type = param.getType();
Boolean on = param.getOn();
// 找到对应的会话 // 找到对应的会话
ImConversationMembers conversation = ImConversationMembers conversation =
baseMapper.selectOne(Wrappers.<ImConversationMembers>lambdaQuery() baseMapper.selectOne(Wrappers.<ImConversationMembers>lambdaQuery()
...@@ -269,22 +277,49 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa ...@@ -269,22 +277,49 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
if (conversation == null) { if (conversation == null) {
throw new BusinessException("会话不存在"); throw new BusinessException("会话不存在");
} }
return update(Wrappers.<ImConversationMembers>lambdaUpdate().eq(ImConversationMembers::getId, conversation.getId()).set(ImConversationMembers::getTop, top)); boolean result = false;
if (ChatSettingTypeEnum.TOP.equals(type)) {
result = update(Wrappers.<ImConversationMembers>lambdaUpdate().eq(ImConversationMembers::getId,
conversation.getId()).set(ImConversationMembers::getTop, on));
} else if (ChatSettingTypeEnum.DO_NOT_DISTURB.equals(type)) {
result = update(Wrappers.<ImConversationMembers>lambdaUpdate().eq(ImConversationMembers::getId,
conversation.getId()).set(ImConversationMembers::getDoNotDisturb, on));
}
return result;
} }
@Override @Override
public Boolean setDoNotDisturb(Long appId, String clientId, Long conversationId, Boolean doNotDisturb) { public Boolean addUser(ImFriendApplyParam param) {
// 找到对应的会话 Long appId = SecurityUtils.getCurrentAppId();
ImConversationMembers conversation = Long conversationId = param.getConversationId();
baseMapper.selectOne(Wrappers.<ImConversationMembers>lambdaQuery() // 判断会话是否存在
.eq(ImConversationMembers::getClientId, clientId) ImConversation conversation = imConversationService.getById(conversationId);
.eq(ImConversationMembers::getFkConversationId, conversationId)
.eq(ImConversationMembers::getFkAppid, appId));
if (conversation == null) { if (conversation == null) {
throw new BusinessException("会话不存在"); throw new BusinessException("会话不存在");
} }
return update(Wrappers.<ImConversationMembers>lambdaUpdate().eq(ImConversationMembers::getId, // 判断会话是否开启禁止群成员互加好友
conversation.getId()).set(ImConversationMembers::getDoNotDisturb, doNotDisturb)); boolean forbidAddFriend = conversation.getForbidAddFriend();
} if (forbidAddFriend) {
throw new BusinessException("群主/管理员开启了禁止群成员互加好友");
}
// 判断是否同一个会话成员
List<String> memberClientIds = new ArrayList<>();
memberClientIds.add(param.getClientId());
memberClientIds.add(param.getFriendClientId());
List<ImConversationMembers> members =
list(Wrappers.<ImConversationMembers>lambdaQuery()
.eq(ImConversationMembers::getFkAppid, appId)
.eq(ImConversationMembers::getFkConversationId, conversationId)
.in(ImConversationMembers::getClientId, memberClientIds));
if (members.size() != 2) {
throw new BusinessException("好友不属于同一个群");
}
// 校验通过,调用imFriendService apply方法
ImClient initiator = imClientService.getCacheImClient(appId, param.getClientId());
ImClient recipient = imClientService.getCacheImClient(appId, param.getFriendClientId());
return imFriendService.applyFriend(initiator, recipient, param.getFriendName(),
param.getRequestRemark());
}
} }
package com.wecloud.im.service.impl; package com.wecloud.im.service.impl;
import com.wecloud.im.chatroom.cache.ChatRoomCacheManager;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.ws.utils.RedisUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum; import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
...@@ -13,11 +7,10 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException; ...@@ -13,11 +7,10 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
...@@ -25,6 +18,7 @@ import java.util.Map; ...@@ -25,6 +18,7 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
...@@ -37,8 +31,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; ...@@ -37,8 +31,10 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chanjx.utils.StringUtils;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.wecloud.im.chatroom.cache.ChatRoomCacheManager;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
...@@ -46,12 +42,17 @@ import com.wecloud.im.entity.ImConversationMembers; ...@@ -46,12 +42,17 @@ import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper; import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam; import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationPageParam; import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam; import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo; import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationMembersParam; import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam; import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam; import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam; import com.wecloud.im.param.SetAdminsParam;
...@@ -62,15 +63,17 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate; ...@@ -62,15 +63,17 @@ import com.wecloud.im.param.add.ImConversationAttrUpdate;
import com.wecloud.im.param.add.ImConversationCreate; import com.wecloud.im.param.add.ImConversationCreate;
import com.wecloud.im.param.add.ImConversationDisplayUpdate; import com.wecloud.im.param.add.ImConversationDisplayUpdate;
import com.wecloud.im.param.add.ImConversationNameUpdate; import com.wecloud.im.param.add.ImConversationNameUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.sdk.enums.ChatTypeEnum; 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.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum; import com.wecloud.im.sdk.enums.MutedEnum;
import com.wecloud.im.service.ContextService; import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService; import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService; import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationMemberVo; import com.wecloud.im.vo.ConversationMemberVo;
import com.wecloud.im.vo.ConversationVo; import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo; import com.wecloud.im.vo.ImConversationCreateVo;
...@@ -79,9 +82,19 @@ import com.wecloud.im.ws.enums.MsgTypeEnum; ...@@ -79,9 +82,19 @@ import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse; import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
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;
/** /**
* 会话表 服务实现类 * 会话表 服务实现类
* *
...@@ -268,7 +281,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -268,7 +281,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2); imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId()); imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage); imMessageService.save(imMessage);
sendEventMsgToMember(imApplication, client2.getId(), imMessage, createClient); // 发送消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), createClient.getClientId(),
client2.getId(), content, imMessage);
} }
} }
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo(); ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
...@@ -278,6 +293,136 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -278,6 +293,136 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
@Override @Override
public ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate) {
if (ChatTypeEnum.CHAT_ROOM.equals(imConversationCreate.getChatType())) {
// 聊天室
throw new BusinessException("不允许创建聊天室");
}
ImApplication imApplication = imConversationCreate.getApplication();
ImClient creator = imConversationCreate.getCreator();
Long appId = creator.getFkAppid();
if (CollectionUtils.isEmpty(imConversationCreate.getMembers())) {
log.info("未找到群成员信息");
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION);
}
// 该应用 是否允许创建重复单聊类型会话 0不允许 1允许
if (imApplication.getRepeatSessionStatus() != null && imApplication.getRepeatSessionStatus() == 0) {
// 判断是否已经存在单聊类型会话
// size() == 1 为单聊不允许重复创建 两个用户如果已经创建过会话,不能重复创建会话
if (imConversationCreate.getMembers().size() == 1) {
ImClient member = imConversationCreate.getMembers().get(0);
// 如果存在重复单聊类型会话,则不会为空
ImConversation repetitionConversationInfo =
imConversationMapper.getRepetitionConversationSingle(creator.getId(), member.getId());
if (repetitionConversationInfo != null) {
log.info("存在重复的单聊会话,返回已存在的单聊类型会话id: {}", repetitionConversationInfo.getId());
// 返回已存在的会话
return repetitionConversationInfo;
}
}
} else {
//创建重复一对一会话时对比扩展字段 1是
if (imApplication.getContrastExtendedFieldStatus() == 1) {
// 被邀请client
ImClient member = imConversationCreate.getMembers().get(0);
log.info("RequestAttributes:" + imConversationCreate.getAttributes());
Long repetitionConversation = getRepetitionConversationAttributes(creator.getId(), member.getId(),
imConversationCreate.getAttributes());
// 存在重复会话
if (repetitionConversation != null) {
log.info("出现Attributes重复");
// 为重复
return getById(repetitionConversation);
}
}
}
// 会话id
Long imConversationId = SnowflakeUtil.getId();
// 创建者
Long creatorImClientId = creator.getId();
// 创建会话
ImConversation imConversation = new ImConversation();
imConversation.setId(imConversationId);
imConversation.setCreateTime(new Date());
imConversation.setLastMessage(null);
imConversation.setFkAppid(appId);
imConversation.setCreator(creatorImClientId);
imConversation.setMemberCount(imConversationCreate.getMembers().size() + 1);
imConversation.setChatType(imConversationCreate.getChatType().getCode());
imConversation.setName(imConversationCreate.getName());
imConversation.setSystemFlag(false);
// 拓展数据
String attributesStr = JsonUtils.encodeJson(imConversationCreate.getAttributes());
imConversation.setAttributes(attributesStr);
imConversationService.save(imConversation);
// 将创建者自己添加到会话
Long imConversationMembersId = SnowflakeUtil.getId();
ImConversationMembers conversationCreator = new ImConversationMembers();
conversationCreator.setId(imConversationMembersId);
conversationCreator.setCreateTime(new Date());
conversationCreator.setUpdateTime(new Date());
conversationCreator.setFkAppid(appId);
conversationCreator.setFkConversationId(imConversationId);
conversationCreator.setFkClientId(creatorImClientId);
conversationCreator.setClientId(creator.getClientId());
conversationCreator.setRole(GroupRoleEnum.OWNER.getCode());
imConversationMembersService.save(conversationCreator);
// 将他人添加到会话
for (ImClient member : imConversationCreate.getMembers()) {
ImConversationMembers imConversationMember = new ImConversationMembers();
imConversationMember.setId(SnowflakeUtil.getId());
imConversationMember.setCreateTime(new Date());
imConversationMember.setUpdateTime(new Date());
imConversationMember.setFkAppid(appId);
imConversationMember.setFkConversationId(imConversationId);
imConversationMember.setFkClientId(member.getId());
imConversationMember.setClientId(member.getClientId());
imConversationMember.setRole(GroupRoleEnum.NORMAL.getCode());
imConversationMembersService.save(imConversationMember);
if (imConversationCreate.getMembers().size() > 1) {
// 给被拉入群的成员下发事件消息 -- 单聊则不下发
ImMessage imMessage = new ImMessage();
Map<String, Object> content = Maps.newHashMap();
content.put("operator", creator.getClientId()); //操作的client ID
content.put("passivityOperator", member.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(creator.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
// 发送消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), creator.getClientId(),
member.getId(), content, imMessage);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
imConversationCreateVo.setId(imConversationId);
return imConversation;
}
@Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean addClientToConversation(ImClientToConversation imClientToConversation) { public Boolean addClientToConversation(ImClientToConversation imClientToConversation) {
...@@ -365,10 +510,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -365,10 +510,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (ImConversationMembers conversationMember : membersList) { for (ImConversationMembers conversationMember : membersList) {
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender); sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
conversationMember.getFkClientId(), content, imMessage);
} }
// 发送给刚被拉入群的成员 sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender); clientToConversation.getId(), content, imMessage);
} }
// 将群成员数量减 // 将群成员数量减
...@@ -383,38 +529,6 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -383,38 +529,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 @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception { public Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
...@@ -486,37 +600,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -486,37 +600,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessageService.save(imMessage); imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId())); 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;
}
// 封装响应的实体 Long conversationId = imClientToConversation.getConversationId();
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); Long appId = imApplication.getId();
imMessageOnlineSend.setMsgId(messageId); String sender = imClientSender.getClientId();
imMessageOnlineSend.setCreateTime(new Date()); Integer msgType = imMessage.getMsgType();
imMessageOnlineSend.setType(imMessage.getMsgType()); sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage);
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());
}
} }
// 将群成员数量减 // 将群成员数量减
...@@ -566,41 +655,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -566,41 +655,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2); imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId()); imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage); 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;
}
// 封装响应的实体 Long conversationId = param.getConversationId();
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend(); Long appId = currentClient.getFkAppid();
imMessageOnlineSend.setMsgId(imMessage.getId()); String sender = currentClient.getClientId();
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType()); sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage);
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));
}
}
} }
@Override @Override
...@@ -666,39 +726,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -666,39 +726,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
throw new BusinessException("退出群聊错误"); throw new BusinessException("退出群聊错误");
} }
// 遍历发送 // 向群成员发送退出群聊事件
for (ImConversationMembers conversationMembers : membersList) { Long conversationId = imClientToConversation.getConversationId();
Long appId = currentClient.getFkAppid();
// 查询接收方 String sender = currentClient.getClientId();
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() Integer msgType = MsgTypeEnum.LEAVE_CONVERSATION.getUriCode();
.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());
} sendMsgToMembers(conversationId, membersList, appId, sender, null, imMessage);
// 群主退出 转移给下一个人 // 群主退出 转移给下一个人
if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) { if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) {
ImConversationMembers conversationMember = membersList.get(0); ImConversationMembers conversationMember = membersList.get(0);
...@@ -801,72 +835,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -801,72 +835,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMapper.updateById(muteGroupParam); imConversationMapper.updateById(muteGroupParam);
deleteCacheImConversationById(param.getConversationId()); 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()) ? Integer msgType = MutedEnum.NO.getCode().equals(param.getMutedType()) ?
MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode() MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode()
: MsgTypeEnum.CONVERSATION_MUTED.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; return true;
} }
...@@ -945,34 +916,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -945,34 +916,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容 // 内容
HashMap<String, String> content = Maps.newHashMap(); HashMap<String, String> content = Maps.newHashMap();
content.put("name", imConversationById.getName()); content.put("name", imConversationById.getName());
// 遍历发送 // 发送消息至成员
for (ImConversationMembers conversationMembers : membersList) { ImMessage message = new ImMessage();
// 查询接收方 message.setWithdraw(Boolean.FALSE);
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() message.setEvent(Boolean.TRUE);
.eq(ImClient::getFkAppid, currentClient.getFkAppid()) message.setMsgType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) { sendMsgToMembers(param.getConversationId(), membersList, currentClient.getFkAppid(),
continue; currentClient.getClientId(), content, message);
}
// 封装响应的实体
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);
// 向接收方推送
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(); return ApiResult.ok();
} else { } else {
return ApiResult.fail(); return ApiResult.fail();
...@@ -1011,38 +963,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1011,38 +963,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws下发拓展字段变动事件 // ws下发拓展字段变动事件
HashMap<String, String> content = Maps.newHashMap(); HashMap<String, String> content = Maps.newHashMap();
content.put("attributes", imConversationById.getAttributes()); content.put("attributes", imConversationById.getAttributes());
// 遍历发送 // 向群成员发送拓展字段变动事件
for (ImConversationMembers conversationMembers : membersList) { Long conversationId = imConversationAttrUpdate.getConversationId();
// 查询接收方 Long appId = currentClient.getFkAppid();
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda() String sender = currentClient.getClientId();
.eq(ImClient::getFkAppid, imApplication.getId()) ImMessage message = new ImMessage();
.eq(ImClient::getId, conversationMembers.getFkClientId())); message.setWithdraw(Boolean.FALSE);
if (imClientReceiver == null) { message.setEvent(Boolean.TRUE);
continue; message.setMsgType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
} sendMsgToMembers(conversationId, membersList, appId, sender, content, message);
// 封装响应的实体
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());
}
} else { } else {
throw new BusinessException("修改错误"); throw new BusinessException("修改错误");
} }
...@@ -1166,6 +1095,47 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1166,6 +1095,47 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
} }
@Override @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;
}
@Override
public Boolean intoChatRoom(IntoChatRoomParam param) { public Boolean intoChatRoom(IntoChatRoomParam param) {
// 获取当前client // 获取当前client
ImClient imClientSender = contextService.getImClientIfNotNullOrThrow(); ImClient imClientSender = contextService.getImClientIfNotNullOrThrow();
...@@ -1213,10 +1183,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1213,10 +1183,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { for (String key : chatRoomMembers.keySet()) {
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]);
sendEventMsgToMember(imApplication, fkClientId, imMessage, imClientSender); sendEventMsgToMember(param.getChatRoomId(), imApplication.getId(), imClientSender.getClientId(),
fkClientId, content, imMessage);
} }
// 发送给刚被拉入群的成员
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender);
imConversationMapper.addMemberCount(imApplication.getId(), param.getChatRoomId(), 1); imConversationMapper.addMemberCount(imApplication.getId(), param.getChatRoomId(), 1);
return true; return true;
...@@ -1271,7 +1240,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1271,7 +1240,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员 // 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) { for (String key : chatRoomMembers.keySet()) {
Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]); Long fkClientId = Long.valueOf(key.split(RedisUtils.SPLIT)[0]);
sendEventMsgToMember(imApplication, fkClientId, imMessage, currentClient); sendEventMsgToMember(param.getChatRoomId(), imApplication.getId(), currentClient.getClientId(),
fkClientId, null, imMessage);
} }
return true; return true;
} }
...@@ -1290,6 +1260,35 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1290,6 +1260,35 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return result; return result;
} }
@Override
public List<ConversationVo> listConversation(ListConversationParam param) {
if (StringUtils.isBlank(param.getConversationIds())) {
throw new BusinessException("会话id列表不可为空");
}
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)
);
if (CollectionUtils.isEmpty(conversations)) {
return conversationVoList;
}
for (ImConversation conversation : conversations) {
ConversationVo conversationVo = new ConversationVo();
BeanUtils.copyProperties(conversation, conversationVo);
conversationVoList.add(conversationVo);
}
return conversationVoList;
}
@Override
public List<ImConversation> getConversationBySenderAndReceivers(Long senderImClientId, Collection<Long> receiverImClientIds) {
return baseMapper.getConversationBySenderAndReceivers(senderImClientId, receiverImClientIds);
}
private ImConversationCreateVo createChatRoom(ImConversationCreate imConversationCreate, ImClient createClient) { private ImConversationCreateVo createChatRoom(ImConversationCreate imConversationCreate, ImClient createClient) {
// 会话id // 会话id
Long chatRoomId = SnowflakeUtil.getId(); Long chatRoomId = SnowflakeUtil.getId();
...@@ -1319,4 +1318,175 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap ...@@ -1319,4 +1318,175 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
return imConversationCreateVo; return imConversationCreateVo;
} }
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;
}
/**
* 发送会话配置变更事件
*
* @param currentClient 当前client信息
* @param conversationId 会话id
* @param msgType 消息类型
* @Author luozh
* @Date 2022年04月27日 01:52:54
* @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(),
content, imMessage);
}
}
/**
* 发送会话事件消息至群成员列表
*
* @param conversationId 会话id
* @param membersList 成员列表
* @param appId appId
* @param sender 发送者
* @param content 消息内容
* @Author luozh
* @Date 2022年04月27日 02:11:19
*/
private 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;
}
sendConversationEventMsg(conversationId, sender, imClientReceiver.getId(), content, message);
} catch (Exception e) {
log.info("下发群会话事件失败,事件类型 {} 接收人 {}", message.getMsgType(), JSON.toJSONString(member));
}
}
}
/**
* 发送会话事件消息至指定成员
*
* @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);
}
} }
...@@ -6,12 +6,20 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException; ...@@ -6,12 +6,20 @@ import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl; import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo; import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging; import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
...@@ -19,35 +27,46 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -19,35 +27,46 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.wecloud.dispatch.common.BaseRequest;
import com.wecloud.im.entity.ImApiMessageOnlineSend; import com.wecloud.im.entity.ImApiMessageOnlineSend;
import com.wecloud.im.entity.ImApplication; import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers; import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend; import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImMessageMapper; import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender; import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo; import com.wecloud.im.param.ChatContentVo;
import com.wecloud.im.param.GetReadersParam; import com.wecloud.im.param.GetReadersParam;
import com.wecloud.im.param.GroupChatMessageParam;
import com.wecloud.im.param.GroupChatStatusMessageParam;
import com.wecloud.im.param.ImClientSimpleDto; import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImHistoryMessagePageParam; import com.wecloud.im.param.ImHistoryMessagePageParam;
import com.wecloud.im.param.MsgDeleteParam; import com.wecloud.im.param.MsgDeleteParam;
import com.wecloud.im.param.PrivateChatMessageParam;
import com.wecloud.im.param.PrivateChatStatusMessageParam;
import com.wecloud.im.param.PushExtParam;
import com.wecloud.im.param.add.ImMsgRecall; import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient; import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate; import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.param.add.ServerImConversationCreate;
import com.wecloud.im.sdk.enums.ChatTypeEnum; import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.service.ContextService; import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService; import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService; import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService; import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService; import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService; import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.service.ThousandChatService; import com.wecloud.im.thousandchat.service.ThousandChatService;
import com.wecloud.im.vo.ImMessageOfflineListVo; import com.wecloud.im.vo.ImMessageOfflineListVo;
...@@ -57,12 +76,14 @@ import com.wecloud.im.vo.ReaderVo; ...@@ -57,12 +76,14 @@ import com.wecloud.im.vo.ReaderVo;
import com.wecloud.im.ws.enums.MsgTypeEnum; import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse; import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveDataVO; import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.model.request.ReceiveVO; import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant; import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO; import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
/** /**
...@@ -87,7 +108,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -87,7 +108,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired @Autowired
private ImApplicationService imApplicationService; private ImApplicationService imApplicationService;
@Autowired @Autowired
private ImConversationMembersService imConversationMembersService; private ImConversationMembersService imConversationMembersService;
...@@ -103,6 +123,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -103,6 +123,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired @Autowired
private MqSender mqSender; private MqSender mqSender;
@Autowired
private ImInboxService imInboxService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) { public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) {
...@@ -214,7 +237,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -214,7 +237,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
ImMessage messageById = this.getById(imMsgRecall.getMsgId()); ImMessage messageById = this.getById(imMsgRecall.getMsgId());
// 判断该消息是否是该客户端发送 todo 单向撤回、双向撤回开关可配置 // 判断该消息是否是该客户端发送 todo 单向撤回、双向撤回开关可配置
Boolean withdrawOther = true; boolean withdrawOther = true;
if (!withdrawOther && !messageById.getSender().equals(imClientSender.getId())) { if (!withdrawOther && !messageById.getSender().equals(imClientSender.getId())) {
throw new BusinessException("不可撤回别人发送的消息"); throw new BusinessException("不可撤回别人发送的消息");
} }
...@@ -538,5 +561,416 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes ...@@ -538,5 +561,416 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
return imMessageMapper.getLastMsgByConversationId(conversationId); return imMessageMapper.getLastMsgByConversationId(conversationId);
} }
@Override
public Boolean groupMessagePublish(GroupChatMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
// 获取发件人信息
String senderClientId = param.getFromUserId();
ImClient sender = imClientService.getCacheImClient(appId, senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
// 获取群聊信息
String conversationIdsStr = param.getToGroupIds();
List<String> conversationIdList = Arrays.asList(conversationIdsStr.split(","));
List<ImConversation> conversationList = imConversationService.listByIds(conversationIdList);
// 校验群聊信息
if (conversationList.size() <= 0) {
throw new BusinessException("群聊ids为 " + conversationIdsStr + " 的群聊列表不存在");
}
conversationList.forEach(conversation -> {
// 获取群成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, conversation.getId()));
if (param.getToUserIds() != null && !param.getToUserIds().isEmpty()) {
// 定向发送
membersList =
membersList.stream().filter(members -> param.getToUserIds().contains(members.getClientId())).collect(Collectors.toList());
}
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), false, param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 入库 保存收件箱
saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
members, SnowflakeUtil.getId());
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
// 离线消息推送
pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
}
});
return true;
}
@Override
public Boolean groupStatusMessagePublish(GroupChatStatusMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
// 获取发件人信息
String senderClientId = param.getFromUserId();
ImClient sender = imClientService.getCacheImClient(appId, senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
// 获取群聊信息
String conversationIdsStr = param.getToGroupIds();
List<String> conversationIdList = Arrays.asList(conversationIdsStr.split(","));
List<ImConversation> conversationList = imConversationService.listByIds(conversationIdList);
// 校验群聊信息
if (conversationList.size() <= 0) {
throw new BusinessException("群聊ids为 " + conversationIdsStr + " 的群聊列表不存在");
}
conversationList.forEach(conversation -> {
// 获取群成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkConversationId, conversation.getId()));
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), true,
param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
}
});
return true;
}
@Override
public Boolean privateMessagePublish(PrivateChatMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
String senderClientId = param.getFromUserId();
String toUserIdsStr = param.getToUserIds();
List<String> toUserIdList = Arrays.asList(toUserIdsStr.split(","));
// 获取发件人信息
ImClient sender =
imClientService.getOne(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid, appId).eq(ImClient::getClientId, senderClientId));
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
Map<Long, ImConversation> conversationMapGroupById = new HashMap<>();
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId = new HashMap<>();
beforePublishPrivateMessage(application, sender, toUserIdList, conversationMapGroupById, conMembersMapGroupByConId);
// 开始发送消息
conversationMapGroupById.forEach((conversationId, conversation) -> {
List<ImConversationMembers> membersList = conMembersMapGroupByConId.getOrDefault(conversationId,
Collections.emptyList());
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), false, param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 入库 保存收件箱
saveImInbox(application, conversation.getId(), imMessageOnlineSend.getMsgId(),
members, SnowflakeUtil.getId());
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
// 离线消息推送
pushMsgToOfflineMembers(application, members, param.getPushContent(), param.getPushExt());
}
});
return true;
}
@Override
public Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param) {
Long appId = SecurityUtils.getCurrentAppId();
ImApplication application = imApplicationService.getCacheById(appId);
String senderClientId = param.getFromUserId();
String toUserIdsStr = param.getToUserIds();
List<String> toUserIdList = Arrays.asList(toUserIdsStr.split(","));
// 获取发件人信息
ImClient sender = imClientService.getCacheImClient(appId, senderClientId);
if (sender == null) {
throw new BusinessException("id为 " + senderClientId + " 的发件人不存在");
}
Map<Long, ImConversation> conversationMapGroupById = new HashMap<>();
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId = new HashMap<>();
beforePublishPrivateMessage(application, sender, toUserIdList, conversationMapGroupById, conMembersMapGroupByConId);
// 开始发送消息
conversationMapGroupById.forEach((conversationId, conversation) -> {
List<ImConversationMembers> membersList = conMembersMapGroupByConId.getOrDefault(conversationId,
Collections.emptyList());
// 组装消息
ImMessage message = assembleImMessage(appId, sender, conversation.getId(), param.getMessageType(), true,
param.getContent());
// 持久化
this.save(message);
// 拼装发送消息体
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(message, sender, appId);
// 发送消息
for (ImConversationMembers members : membersList) {
if (members.getClientId().equals(senderClientId) && !param.getIncludeSender()) {
// 是否是发送者 且includeSender不为true
continue;
}
// 在线用户直接发消息
sendMsgForOnline(members.getFkClientId(), imMessageOnlineSend);
}
});
return true;
}
/**
* 私聊消息发送前
* @Author luozh
* @Date 2022年05月07日 11:28:59
* @param application
* @param sender
* @param toUserIdList
* @param conversationMapGroupById
* @param conMembersMapGroupByConId
* @Return
*/
private void beforePublishPrivateMessage(ImApplication application,
ImClient sender,
List<String> toUserIdList,
Map<Long, ImConversation> conversationMapGroupById,
Map<Long, List<ImConversationMembers>> conMembersMapGroupByConId) {
Long appId = application.getId();
// 获取收件人信息
List<ImClient> receiverList = imClientService.list(Wrappers.<ImClient>lambdaQuery().eq(ImClient::getFkAppid,
appId).in(ImClient::getClientId, toUserIdList));
Map<Long, ImClient> clientMapById = receiverList.stream().collect(Collectors.toMap(ImClient::getId, Function.identity()));
if (receiverList.isEmpty()) {
throw new BusinessException("收件人列表为空");
}
// 查找conversation列表
Long senderImClientId = sender.getId();
Set<Long> receiverImClientIds = receiverList.stream().map(ImClient::getId).collect(Collectors.toSet());
List<ImConversation> conversationList =
imConversationService.getConversationBySenderAndReceivers(senderImClientId, receiverImClientIds);
conversationMapGroupById.putAll(conversationList.stream().collect(Collectors.toMap(ImConversation::getId,
Function.identity(), (v1, v2) -> v1)));
// 查找会话成员
List<Long> conversationIdList = conversationList.stream().map(ImConversation::getId).collect(Collectors.toList());
List<ImConversationMembers> conversationMembersList =
imConversationMembersService.list(Wrappers.<ImConversationMembers>lambdaQuery().in(ImConversationMembers::getFkConversationId, conversationIdList));
conMembersMapGroupByConId.putAll(conversationMembersList.stream().collect(Collectors.groupingBy(ImConversationMembers::getFkConversationId)));
if (conversationMapGroupById.size() == receiverList.size()) {
// 如果会话数量和收件人数量一致,后面的逻辑就不需要走了
return;
}
Set<Long> hasExistConversationReceiverImClientIds =
conversationMembersList.stream()
.map(ImConversationMembers::getFkClientId)
.filter(fkClientId -> !fkClientId.equals(senderImClientId)).collect(Collectors.toSet());
// 根据收件人imClientId对会话/会话成员进行分组
Set<Long> notExistConversationReceiverClientIds = new HashSet<>(receiverImClientIds);
notExistConversationReceiverClientIds.removeAll(hasExistConversationReceiverImClientIds);
// 不存在会话的先创建会话
for (Long receiverImClientId : notExistConversationReceiverClientIds) {
ImClient receiver = clientMapById.get(receiverImClientId);
List<ImClient> members = new ArrayList<>();
members.add(receiver);
// 创建会话
ServerImConversationCreate conversationCreate = new ServerImConversationCreate();
conversationCreate.setName(sender.getNickname());
conversationCreate.setAttributes(null);
conversationCreate.setCreator(sender);
conversationCreate.setMembers(members);
conversationCreate.setChatType(ChatTypeEnum.SINGLE);
conversationCreate.setApplication(application);
ImConversation conversation = imConversationService.serverCreateImConversation(conversationCreate);
// 构建ImConversationMembers(只保存必要信息)
ImConversationMembers receiverMember = new ImConversationMembers();
receiverMember.setClientId(receiver.getClientId());
receiverMember.setFkClientId(receiver.getId());
receiverMember.setFkConversationId(conversation.getId());
ImConversationMembers creatorMember = new ImConversationMembers();
creatorMember.setClientId(sender.getClientId());
creatorMember.setFkClientId(sender.getId());
creatorMember.setFkConversationId(conversation.getId());
List<ImConversationMembers> conversationMembers = new ArrayList<>();
conversationMembers.add(receiverMember);
conversationMembers.add(creatorMember);
conversationMapGroupById.put(conversation.getId(), conversation);
conMembersMapGroupByConId.put(conversation.getId(), conversationMembers);
}
}
/**
* 拼装发送消息体
* @param message
* @param imClientSender
* @param appId
* @return
*/
private ImMessageOnlineSend assembleImMessageOnlineSend(ImMessage message, ImClient imClientSender, Long appId) {
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(message.getId());
imMessageOnlineSend.setSender(imClientSender.getClientId());
Map<String, Object> content = JSONObject.parseObject(message.getContent(), Map.class);
//action的属性无需要返回
content.remove(BaseRequest.ACTION);
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(message.getFkConversationId());
imMessageOnlineSend.setCreateTime(message.getCreateTime());
imMessageOnlineSend.setWithdrawTime(message.getWithdrawTime());
imMessageOnlineSend.setWithdraw(message.getWithdraw());
imMessageOnlineSend.setEvent(message.getEvent());
imMessageOnlineSend.setSystemFlag(message.getSystemFlag());
imMessageOnlineSend.setType(message.getMsgType());
imMessageOnlineSend.setAt(message.getAt());
return imMessageOnlineSend;
}
/**
* 组装imMessage
* @Author luozh
* @Date 2022年05月05日 06:17:00
* @param appId 发送群聊消息入参
* @param sender 发送群聊消息入参
* @param toConversationId 发送群聊消息入参
* @param messageType 发送群聊消息入参
* @param content 发送群聊消息入参
* @Return ImMessage
*/
private ImMessage assembleImMessage(Long appId, ImClient sender, Long toConversationId, String messageType,
Boolean event, String content) {
long messageId = SnowflakeUtil.getId();
ImMessage imMessage = new ImMessage();
imMessage.setContent(content);
imMessage.setId(messageId);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(appId);
imMessage.setSender(sender.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(event);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setMsgType(Integer.valueOf(messageType));
imMessage.setAt("");
imMessage.setFkConversationId(toConversationId);
return imMessage;
}
/**
* 入库 保存收件箱
*
* @param imApplication
* @param toConversationId
* @param messageId
* @param conversationMembers
* @param imInboxId
*/
private void saveImInbox(ImApplication imApplication, Long toConversationId, long messageId, ImConversationMembers conversationMembers, long imInboxId) {
ImInbox imInbox = new ImInbox();
imInbox.setId(imInboxId);
imInbox.setCreateTime(new Date());
imInbox.setFkAppid(imApplication.getId());
imInbox.setReceiver(conversationMembers.getFkClientId());
imInbox.setFkMsgId(messageId);
imInbox.setReadMsgStatus(0);
imInbox.setReceiverMsgStatus(0);
imInbox.setFkConversationId(toConversationId);
imInboxService.save(imInbox);
}
/**
* 发送消息给在线客户
* @param receiverClientId
* @param imMessageOnlineSend
*/
private void sendMsgForOnline(Long receiverClientId, ImMessageOnlineSend imMessageOnlineSend) {
// 封装要推给接收方的消息
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.ONLINE_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);
}
/**
* 推送消息至离线成员
* @Author luozh
* @Date 2022年05月06日 05:23:58
* @param application
* @param members
* @param pushContent
* @param pushExt
* @Return
*/
private void pushMsgToOfflineMembers(ImApplication application, ImConversationMembers members,
String pushContent, PushExtParam pushExt) {
// 不是静默推送
PushVO pushVO = new PushVO();
pushVO.setData(JSONObject.parseObject(pushContent, HashMap.class));
if (pushExt != null) {
pushVO.setTitle(pushExt.getTitle());
}
ImClient receiver = new ImClient();
receiver.setId(members.getFkClientId());
receiver.setClientId(members.getClientId());
PushDTO pushDTO = mqSender.buildPushDto(pushVO, receiver, application);
if (pushDTO != null) {
mqSender.orderSend(MqConstant.Topic.IM_ORDER_MSG_TOPIC, MqConstant.Tag.IM_ORDER_MSG_TAG, pushDTO);
}
}
} }
package com.wecloud.im.thousandchat.action; package com.wecloud.im.thousandchat.action;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.Channel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.dispatch.annotation.ActionMapping; import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.dispatch.common.BaseRequest; import com.wecloud.dispatch.common.BaseRequest;
...@@ -29,23 +45,6 @@ import com.wecloud.pushserver.client.model.constant.MqConstant; ...@@ -29,23 +45,6 @@ import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO; import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils; import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.Channel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/** /**
* @Description 处理Cmd请求 * @Description 处理Cmd请求
......
package com.wecloud.im.thousandchat.service; package com.wecloud.im.thousandchat.service;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.wecloud.im.entity.ImClient; import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation; import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImMessage; import com.wecloud.im.entity.ImMessage;
...@@ -18,22 +35,7 @@ import com.wecloud.im.ws.enums.MsgTypeEnum; ...@@ -18,22 +35,7 @@ import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum; import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse; import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender; import com.wecloud.im.ws.sender.ChannelSender;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import com.wecloud.utils.SnowflakeUtil; import com.wecloud.utils.SnowflakeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/** /**
* 消息收件箱表 服务实现类 * 消息收件箱表 服务实现类
......
...@@ -76,4 +76,16 @@ public class ConversationVo implements Serializable { ...@@ -76,4 +76,16 @@ public class ConversationVo implements Serializable {
@ApiModelProperty("禁言开关 1-未禁言 2-禁言") @ApiModelProperty("禁言开关 1-未禁言 2-禁言")
private Integer beAtCount; private Integer beAtCount;
@ApiModelProperty("禁止互加好友")
private Boolean forbidAddFriend;
@ApiModelProperty("禁止发红包")
private Boolean forbidSendRedPackets;
@ApiModelProperty("禁止发图片")
private Boolean forbidSendPic;
@ApiModelProperty("禁止发链接")
private Boolean forbidSendLink;
} }
package com.wecloud.im.ws.cache; package com.wecloud.im.ws.cache;
import com.wecloud.utils.GetIpUtils;
import com.wecloud.im.ws.model.redis.ClientChannelInfo;
import com.wecloud.im.ws.utils.RedisUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.wecloud.im.ws.model.redis.ClientChannelInfo;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.GetIpUtils;
/** /**
* @author hewei123@163.com * @author hewei123@163.com
* @Description 用户与redis绑定 * @Description 用户与redis绑定
...@@ -48,8 +50,10 @@ public class UserStateCacheManager extends UserStateListener { ...@@ -48,8 +50,10 @@ public class UserStateCacheManager extends UserStateListener {
@Override @Override
public void offlineEvent(Long clientId, Integer platform, String longChannelId) { public void offlineEvent(Long clientId, Integer platform, String longChannelId) {
log.info("ws用户离线删除redis key,uid: {}, clientId: {}", longChannelId, clientId); String key = getUserStateCacheKey(clientId);
redisUtils.removeForSet(getUserStateCacheKey(clientId), platform + RedisUtils.SPLIT + GetIpUtils.getlanIp()); String value = platform + RedisUtils.SPLIT + GetIpUtils.getlanIp();
log.info("ws用户离线删除redis key: {}, value: {}, uid: {}, clientId: {}", key, value, longChannelId, clientId);
redisUtils.removeForSet(key, value);
} }
/** /**
......
...@@ -7,6 +7,18 @@ package com.wecloud.im.ws.enums; ...@@ -7,6 +7,18 @@ package com.wecloud.im.ws.enums;
*/ */
public enum MsgTypeEnum { public enum MsgTypeEnum {
// 位置
MEDIA_TYPE_NONE(0),
// 文本消息
MEDIA_TYPE_TEXT(-1),
// 图像消息
MEDIA_TYPE_IMAGE(-2),
// 音频消息
MEDIA_TYPE_AUDIO(-3),
// 视频消息
MEDIA_TYPE_VIDEO(-4),
// 文件消息
MEDIA_TYPE_FILE(-5),
// xx邀请xx加入会话 -1007 // xx邀请xx加入会话 -1007
INVITE_CLIENT_JOIN_CONVERSATION(-1007), INVITE_CLIENT_JOIN_CONVERSATION(-1007),
...@@ -54,6 +66,29 @@ public enum MsgTypeEnum { ...@@ -54,6 +66,29 @@ public enum MsgTypeEnum {
// 群成员备注修改 -1021 // 群成员备注修改 -1021
CONVERSATION_MEMBER_NAME_MODIFY(-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; private final int uriCode;
......
package com.wecloud.im.ws.sender; package com.wecloud.im.ws.sender;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.executor.SendMsgThreadPool;
import com.wecloud.im.router.RouterSendService;
import com.wecloud.im.ws.cache.UserStateCacheManager;
import com.wecloud.im.ws.manager.ChannelManager;
import com.wecloud.im.ws.model.ClientInfo;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.redis.ClientChannelInfo;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.utils.GetIpUtils;
import com.wecloud.utils.JsonUtils;
import io.geekidea.springbootplus.framework.common.api.ApiCode; import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult; import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame; import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.rpc.RpcContext; import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.cluster.router.address.Address; import org.apache.dubbo.rpc.cluster.router.address.Address;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap; import com.alibaba.fastjson.JSON;
import java.util.List; import com.wecloud.im.executor.SendMsgThreadPool;
import java.util.Map; import com.wecloud.im.router.RouterSendService;
import java.util.stream.Collectors; import com.wecloud.im.ws.cache.UserStateCacheManager;
import com.wecloud.im.ws.manager.ChannelManager;
import com.wecloud.im.ws.model.ClientInfo;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.redis.ClientChannelInfo;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.utils.GetIpUtils;
import com.wecloud.utils.JsonUtils;
/** /**
* @Description 下发数据 * @Description 下发数据
...@@ -144,6 +146,7 @@ public class ChannelSender { ...@@ -144,6 +146,7 @@ public class ChannelSender {
// 调用本地下发 // 调用本地下发
log.info("在线用户入参 {}, 具体ip结果 {}", toClientId, JSON.toJSONString(channelInfoEntry)); log.info("在线用户入参 {}, 具体ip结果 {}", toClientId, JSON.toJSONString(channelInfoEntry));
for(ClientChannelInfo clientChannelInfo : channelInfoEntry.getValue()) { for(ClientChannelInfo clientChannelInfo : channelInfoEntry.getValue()) {
log.info("客户端 {}, 推送消息内容 {}", toClientId, msgJson);
this.sendMsgLocal(toClientId, clientChannelInfo.getPlatform(), msgJson); this.sendMsgLocal(toClientId, clientChannelInfo.getPlatform(), msgJson);
} }
continue; continue;
......
...@@ -5,7 +5,9 @@ ...@@ -5,7 +5,9 @@
<!-- 通用查询结果列 --> <!-- 通用查询结果列 -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id id
, create_time, update_time, last_message, member_count, chat_type, fk_appid, creator, name, attributes, system_flag,muted , create_time, update_time, last_message, member_count, chat_type, fk_appid, creator, name, attributes,
system_flag,muted, is_forbid_add_friend as forbid_add_friend, is_forbid_send_red_packets as forbid_send_red_packets,
is_forbid_send_pic as forbid_send_pic, is_forbid_send_link as forbid_send_link
</sql> </sql>
<select id="getImConversationById" resultType="com.wecloud.im.param.ImConversationQueryVo"> <select id="getImConversationById" resultType="com.wecloud.im.param.ImConversationQueryVo">
...@@ -23,37 +25,41 @@ ...@@ -23,37 +25,41 @@
<select id="getMyImConversationListAndMsgCount" resultType="com.wecloud.im.vo.ConversationVo"> <select id="getMyImConversationListAndMsgCount" resultType="com.wecloud.im.vo.ConversationVo">
SELECT imConversation.id as id, SELECT imConversation.id as id,
imConversation.create_time, imConversation.create_time,
imConversation.`name`, imConversation.`name`,
imConversation.chat_type, imConversation.chat_type,
imConversation.member_count, imConversation.member_count,
imConversation.attributes as attribute, imConversation.attributes as attribute,
imConversation.system_flag, imConversation.system_flag,
imConversation.muted as muted, imConversation.muted as muted,
im_client.client_id AS creator, imConversation.is_forbid_add_friend as forbid_add_friend,
(SELECT COUNT(im_inbox.id) imConversation.is_forbid_send_red_packets as forbid_send_red_packets,
FROM im_inbox imConversation.is_forbid_send_pic as forbid_send_pic,
WHERE im_inbox.fk_conversation_id = imConversation.id imConversation.is_forbid_send_link as forbid_send_link,
AND im_inbox.receiver = #{currentClientId} im_client.client_id AS creator,
AND im_inbox.read_msg_status = 0) AS msg_not_read_count, (SELECT COUNT(im_inbox.id)
(SELECT COUNT(*) FROM im_inbox
FROM im_inbox INNER JOIN im_message ON im_inbox.fk_msg_id = im_message.id WHERE im_inbox.fk_conversation_id = imConversation.id
WHERE im_inbox.fk_conversation_id = imConversation.id AND im_inbox.receiver = #{currentClientId}
AND im_inbox.receiver = #{currentClientId} AND im_inbox.read_msg_status = 0) AS msg_not_read_count,
AND im_inbox.read_msg_status = 0 (SELECT COUNT(*)
AND (FIND_IN_SET(#{clientId},im_message.`at`) > 0 or FIND_IN_SET('-1',im_message.`at`) > 0)) AS beAtCount, FROM im_inbox INNER JOIN im_message ON im_inbox.fk_msg_id = im_message.id
( WHERE im_inbox.fk_conversation_id = imConversation.id
SELECT GROUP_CONCAT(im_client.client_id) AND im_inbox.receiver = #{currentClientId}
FROM im_conversation_members AS im_conversation_members AND im_inbox.read_msg_status = 0
INNER JOIN im_client AS im_client ON im_client.id = im_conversation_members.fk_client_id AND (FIND_IN_SET(#{clientId},im_message.`at`) > 0 or FIND_IN_SET('-1',im_message.`at`) > 0)) AS beAtCount,
WHERE im_conversation_members.fk_conversation_id = imConversation.id (
) AS members SELECT GROUP_CONCAT(im_client.client_id)
FROM im_conversation_members AS im_conversation_members
INNER JOIN im_client AS im_client ON im_client.id = im_conversation_members.fk_client_id
WHERE im_conversation_members.fk_conversation_id = imConversation.id
) AS members
FROM im_conversation_members AS imConversationMembers FROM im_conversation_members AS imConversationMembers
INNER JOIN im_conversation AS imConversation INNER JOIN im_conversation AS imConversation
ON imConversation.id = imConversationMembers.fk_conversation_id ON imConversation.id = imConversationMembers.fk_conversation_id
INNER JOIN im_client AS im_client ON im_client.id = imConversation.creator INNER JOIN im_client AS im_client ON im_client.id = imConversation.creator
WHERE imConversationMembers.fk_client_id = #{currentClientId} WHERE imConversationMembers.fk_client_id = #{currentClientId}
AND imConversationMembers.display_status = 1 AND imConversationMembers.display_status = 1
<if test="conversationId != null"> <if test="conversationId != null">
AND imConversation.id = #{conversationId} AND imConversation.id = #{conversationId}
</if> </if>
...@@ -70,12 +76,16 @@ ...@@ -70,12 +76,16 @@
<select id="getRepetitionConversationSingle" resultType="com.wecloud.im.entity.ImConversation"> <select id="getRepetitionConversationSingle" resultType="com.wecloud.im.entity.ImConversation">
-- 查询重复的单聊会话第一条 -- 查询重复的单聊会话第一条
select con.* from im_conversation con select con.*
inner join im_conversation_members mem1 from im_conversation con
on con.id = mem1.fk_conversation_id and mem1.fk_client_id = #{clientId1} inner join im_conversation_members mem1
inner join im_conversation_members mem2 on con.id = mem1.fk_conversation_id and mem1.fk_client_id = #{clientId1}
on con.id = mem2.fk_conversation_id and mem2.fk_client_id = #{clientId2} inner join im_conversation_members mem2
where con.chat_type = 1 and con.member_count = 2 order by con.id asc LIMIT 1 on con.id = mem2.fk_conversation_id and mem2.fk_client_id = #{clientId2}
where con.chat_type = 1
and con.member_count = 2
order by con.id asc
LIMIT 1
</select> </select>
<select id="getRepetitionConversationAttributes" resultType="java.lang.Long"> <select id="getRepetitionConversationAttributes" resultType="java.lang.Long">
...@@ -91,15 +101,65 @@ ...@@ -91,15 +101,65 @@
im_conversation_members2.fk_conversation_id im_conversation_members2.fk_conversation_id
WHERE im_conversation_members.fk_client_id = #{clientId1} WHERE im_conversation_members.fk_client_id = #{clientId1}
) )
AND attributes = CAST(#{attributes} AS json) LIMIT 1 AND attributes = CAST(#{attributes} AS json)
LIMIT 1
</select> </select>
<update id="addMemberCount"> <update id="addMemberCount">
update im_conversation set member_count = member_count + #{addCount} where fk_appid = #{appId} and id = #{conversationId} update im_conversation
set member_count = member_count + #{addCount}
where fk_appid = #{appId}
and id = #{conversationId}
</update> </update>
<update id="updateMemberCount"> <update id="updateMemberCount">
update im_conversation set chat_type = 3 where fk_appid = #{appId} and id = #{conversationId} update im_conversation
set chat_type = 3
where fk_appid = #{appId}
and id = #{conversationId}
</update> </update>
<select id="getConversationBySenderAndReceivers" resultType="com.wecloud.im.entity.ImConversation">
SELECT
c.id,
c.create_time,
c.update_time,
c.last_message,
c.member_count,
c.chat_type,
c.fk_appid,
c.creator,
c.name,
c.attributes,
c.system_flag,
c.muted,
c.is_forbid_add_friend as forbid_add_friend,
c.is_forbid_send_red_packets as forbid_send_red_packets,
c.is_forbid_send_pic as forbid_send_pic,
c.is_forbid_send_link as forbid_send_link
FROM
im_conversation c
LEFT JOIN im_conversation_members cm ON c.id = cm.fk_conversation_id
WHERE
c.chat_type = 1
AND (
(
c.creator = #{senderImClientId} AND cm.fk_client_id IN
<foreach collection="receiverImClientIds" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
)
OR (
c.creator IN
<foreach collection="receiverImClientIds" item="id" index="index" open="(" close=")"
separator=",">
#{id}
</foreach>
AND cm.fk_client_id = #{senderImClientId}
)
)
</select>
</mapper> </mapper>
...@@ -142,6 +142,11 @@ public enum ApiCode { ...@@ -142,6 +142,11 @@ public enum ApiCode {
*/ */
IS_BE_DISBAND(6016, "api.response.code.IS_BE_DISBAND"), IS_BE_DISBAND(6016, "api.response.code.IS_BE_DISBAND"),
/**
* 群已禁止发链接
*/
IS_BE_FORBID_SEND_LINK(6017, "api.response.code.IS_BE_FORBID_SEND_LINK"),
; ;
private final int code; private final int code;
......
...@@ -37,14 +37,54 @@ public class ResourcePathConstants { ...@@ -37,14 +37,54 @@ public class ResourcePathConstants {
public static final String GET_FRIENDS = "/api/friend/sdk/getFriends"; public static final String GET_FRIENDS = "/api/friend/sdk/getFriends";
/** /**
* 设置会话置顶 * 群设置
*/ */
public static final String SET_CONVERSATION_TOP = "/api/imConversationMembers/sdk/setTop"; public static final String CHAT_SETTING = "/api/imConversationMembers/chatSetting";
/** /**
* 设置会话免打扰 * 好友请求
*/ */
public static final String SET_CONVERSATION_DO_NOT_DISTURB = "/api/imConversationMembers/sdk/setDoNotDisturb"; public static final String FRIEND_REQUEST = "/api/friend/sdk/apply";
/**
* 好友请求
*/
public static final String PAGE_BLACKLIST_REQUEST = "/api/ClientBlacklist/sdk/pageBlacklist";
/**
* 群成员互加好友
*/
public static final String GROUP_MEMBERS_FRIEND_REQUEST = "/api/imConversationMembers/addUser";
/**
* 获取聊天室成员
*/
public static final String LIST_CHAT_ROOM_MEMBER_REQUEST = "/api/conversation/listChatRoomMember";
/**
* 批量获取会话信息
*/
public static final String LIST_CONVERSATION_REQUEST = "/api/conversation/listConversation";
/**
* 发布群消息
*/
public static final String PUBLISH_GROUP_CHAT_MESSAGE_REQUEST = "/api/imMessage/group/publish";
/**
* 发布群状态消息
*/
public static final String PUBLISH_GROUP_CHAT_STATUS_MESSAGE_REQUEST = "/api/imMessage/group/status/publish";
/**
* 发布群消息
*/
public static final String PUBLISH_PRIVATE_CHAT_MESSAGE_REQUEST = "/api/imMessage/private/publish";
/**
* 发布群状态消息
*/
public static final String PUBLISH_PRIVATE_CHAT_STATUS_MESSAGE_REQUEST = "/api/imMessage/private/status/publish";
} }
...@@ -2,8 +2,16 @@ package com.wecloud.im.sdk; ...@@ -2,8 +2,16 @@ package com.wecloud.im.sdk;
import java.util.List; import java.util.List;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.PrivateChatMessage;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
import com.wecloud.im.sdk.model.Token; import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend; import com.wecloud.im.sdk.model.UnsureFriend;
...@@ -69,6 +77,16 @@ public interface WecloudIm { ...@@ -69,6 +77,16 @@ public interface WecloudIm {
List<Friend> getFriends(String userId); List<Friend> getFriends(String userId);
/** /**
* 获取黑名单列表
* @Author luozh
* @Date 2022年05月07日 05:23:40
* @param userId
* @Return
* @return
*/
PageResult<Blacklist> pageBlacklist(Integer pageIndex, Integer pageSize, String userId);
/**
* 设置会话置顶 * 设置会话置顶
* @Author luozh * @Author luozh
* @Date 2022年04月26日 03:33:44 * @Date 2022年04月26日 03:33:44
...@@ -89,4 +107,79 @@ public interface WecloudIm { ...@@ -89,4 +107,79 @@ public interface WecloudIm {
* @Return * @Return
*/ */
Boolean setConversationDoNotDisturb(String userId, Long conversationId, Boolean doNotDisturb); Boolean setConversationDoNotDisturb(String userId, Long conversationId, Boolean doNotDisturb);
/**
* 好友申请
* @Author luozh
* @Date 2022年04月28日 02:05:11
* @param userId 用户id
* @param friendId 好友id
* @param friendName 备注好友名称
* @param requestRemark 请求备注
* @Return
*/
Boolean friendRequest(String userId, String friendId, String friendName, String requestRemark);
/**
* 群成员好友申请
* @Author luozh
* @Date 2022年04月28日 02:06:01
* @param
* @Return
*/
Boolean groupMembersFriendRequest(Long conversationId, String userId, String friendId, String friendName,
String requestRemark);
/**
* 全量获取聊天室成员
* @param chatRoomId 聊天室id
* @return
*/
List<ChatRoomMember> listChatRoomMember(Long chatRoomId);
/**
* 批量获取会话信息
* @param chatType 会话属性,1:单聊,2:普通群,3:万人群,4:聊天室
* @param conversationIds
* @return
*/
List<Conversation> listConversation(Integer chatType, List<Long> conversationIds);
/**
* 发布群聊消息
* @Author luozh
* @Date 2022年05月05日 09:38:34
* @param groupChatMessage 发布群聊消息参数
* @Return
*/
Boolean publishGroupChatMessage(GroupChatMessage groupChatMessage);
/**
* 发布群聊状态消息
* @Author luozh
* @Date 2022年05月05日 09:38:34
* @param groupChatStatusMessage 发布群聊消息参数
* @Return
*/
Boolean publishGroupChatStatusMessage(GroupChatStatusMessage groupChatStatusMessage);
/**
* 发布单聊消息
* @Author luozh
* @Date 2022年05月05日 09:38:34
* @param privateChatMessage 发布单聊消息参数
* @Return
*/
Boolean publishPrivateMessage(PrivateChatMessage privateChatMessage);
/**
* 发布群聊状态消息
* @Author luozh
* @Date 2022年05月05日 09:38:34
* @param privateChatStatusMessage 发布群聊消息参数
* @Return
*/
Boolean publishPrivateStatusMessage(PrivateChatStatusMessage privateChatStatusMessage);
} }
...@@ -3,14 +3,35 @@ package com.wecloud.im.sdk; ...@@ -3,14 +3,35 @@ package com.wecloud.im.sdk;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import com.wecloud.im.sdk.internal.WecloudImClientOperation; import com.wecloud.im.sdk.internal.WecloudImClientOperation;
import com.wecloud.im.sdk.internal.WecloudImConversationOperation; import com.wecloud.im.sdk.internal.WecloudImConversationOperation;
import com.wecloud.im.sdk.internal.WecloudImMessageOperation;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientLoginRequest; import com.wecloud.im.sdk.model.ClientLoginRequest;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.FriendRequestRequest;
import com.wecloud.im.sdk.model.GetFriendsRequest; import com.wecloud.im.sdk.model.GetFriendsRequest;
import com.wecloud.im.sdk.model.GetUnsureFriendsRequest; import com.wecloud.im.sdk.model.GetUnsureFriendsRequest;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
import com.wecloud.im.sdk.model.GroupMembersFriendRequestRequest;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ListChatRoomMemberRequest;
import com.wecloud.im.sdk.model.ListConversationRequest;
import com.wecloud.im.sdk.model.ModifyUserRequest; import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.PageBlacklistRequest;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.PrivateChatMessage;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
import com.wecloud.im.sdk.model.PublishGroupChatMessageRequest;
import com.wecloud.im.sdk.model.PublishGroupChatStatusMessageRequest;
import com.wecloud.im.sdk.model.PublishPrivateChatMessageRequest;
import com.wecloud.im.sdk.model.PublishPrivateChatStatusMessageRequest;
import com.wecloud.im.sdk.model.RegisterClientRequest; import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest; import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest;
import com.wecloud.im.sdk.model.SetConversationTopRequest; import com.wecloud.im.sdk.model.SetConversationTopRequest;
...@@ -45,6 +66,8 @@ public class WecloudImClient implements WecloudIm { ...@@ -45,6 +66,8 @@ public class WecloudImClient implements WecloudIm {
private WecloudImConversationOperation imConversationOperation; private WecloudImConversationOperation imConversationOperation;
private WecloudImMessageOperation wecloudImMessageOperation;
public WecloudImClient(URL apiDomain, String appKey, String appSecret) { public WecloudImClient(URL apiDomain, String appKey, String appSecret) {
this.apiDomain = apiDomain; this.apiDomain = apiDomain;
this.appKey = appKey; this.appKey = appKey;
...@@ -92,6 +115,44 @@ public class WecloudImClient implements WecloudIm { ...@@ -92,6 +115,44 @@ public class WecloudImClient implements WecloudIm {
} }
@Override @Override
public PageResult<Blacklist> pageBlacklist(Integer pageIndex, Integer pageSize, String userId) {
PageBlacklistRequest pageBlacklistRequest =
PageBlacklistRequest.builder().pageSize(pageSize).pageIndex(pageIndex).userId(userId).build();
return imClientOperation.pageBlacklist(pageBlacklistRequest);
}
@Override
public Boolean friendRequest(String userId, String friendId, String friendName, String requestRemark) {
FriendRequestRequest friendRequestRequest =
FriendRequestRequest.builder().userId(userId).friendId(friendId).friendName(friendName).requestRemark(requestRemark).build();
return imClientOperation.friendRequest(friendRequestRequest);
}
@Override
public Boolean groupMembersFriendRequest(Long conversationId, String userId, String friendId, String friendName, String requestRemark) {
GroupMembersFriendRequestRequest groupMembersFriendRequestRequest =
GroupMembersFriendRequestRequest.builder().conversationId(conversationId)
.userId(userId).friendId(friendId)
.friendName(friendName)
.requestRemark(requestRemark)
.build();
return imConversationOperation.groupMembersFriendRequest(groupMembersFriendRequestRequest);
}
@Override
public List<ChatRoomMember> listChatRoomMember(Long chatRoomId) {
ListChatRoomMemberRequest request = ListChatRoomMemberRequest.builder().chatRoomId(chatRoomId).build();
return imClientOperation.listChatRoomMember(request);
}
@Override
public List<Conversation> listConversation(Integer chatType, List<Long> conversationIds) {
ListConversationRequest request = ListConversationRequest.builder().chatType(chatType)
.conversationIds(conversationIds).build();
return imClientOperation.listConversation(request);
}
@Override
public Boolean setConversationTop(String userId, Long conversationId, Boolean top) { public Boolean setConversationTop(String userId, Long conversationId, Boolean top) {
SetConversationTopRequest setConversationTopRequest = SetConversationTopRequest setConversationTopRequest =
SetConversationTopRequest.builder().userId(userId).conversationId(conversationId).top(top).build(); SetConversationTopRequest.builder().userId(userId).conversationId(conversationId).top(top).build();
...@@ -105,9 +166,42 @@ public class WecloudImClient implements WecloudIm { ...@@ -105,9 +166,42 @@ public class WecloudImClient implements WecloudIm {
return imConversationOperation.setConversationDoNotDisturb(setConversationDoNotDisturbRequest); return imConversationOperation.setConversationDoNotDisturb(setConversationDoNotDisturbRequest);
} }
@Override
public Boolean publishGroupChatMessage(GroupChatMessage groupChatMessage) {
Assert.notNull(groupChatMessage);
PublishGroupChatMessageRequest request = BeanUtil.toBean(groupChatMessage,
PublishGroupChatMessageRequest.class);
return wecloudImMessageOperation.publishGroupChatMessage(request);
}
@Override
public Boolean publishGroupChatStatusMessage(GroupChatStatusMessage groupChatstatusMessage) {
Assert.notNull(groupChatstatusMessage);
PublishGroupChatStatusMessageRequest request = BeanUtil.toBean(groupChatstatusMessage,
PublishGroupChatStatusMessageRequest.class);
return wecloudImMessageOperation.publishGroupChatStatusMessage(request);
}
@Override
public Boolean publishPrivateMessage(PrivateChatMessage privateChatMessage) {
Assert.notNull(privateChatMessage);
PublishPrivateChatMessageRequest request = BeanUtil.toBean(privateChatMessage,
PublishPrivateChatMessageRequest.class);
return wecloudImMessageOperation.publishPrivateMessage(request);
}
@Override
public Boolean publishPrivateStatusMessage(PrivateChatStatusMessage privateChatStatusMessage) {
Assert.notNull(privateChatStatusMessage);
PublishPrivateChatStatusMessageRequest request = BeanUtil.toBean(privateChatStatusMessage,
PublishPrivateChatStatusMessageRequest.class);
return wecloudImMessageOperation.publishPrivateStatusMessage(request);
}
private void initOperations() { private void initOperations() {
this.imClientOperation = new WecloudImClientOperation(apiDomain, appKey, appSecret); this.imClientOperation = new WecloudImClientOperation(apiDomain, appKey, appSecret);
this.imConversationOperation = new WecloudImConversationOperation(apiDomain, appKey, appSecret); this.imConversationOperation = new WecloudImConversationOperation(apiDomain, appKey, appSecret);
this.wecloudImMessageOperation = new WecloudImMessageOperation(apiDomain, appKey, appSecret);
} }
......
package com.wecloud.im.sdk.enums;
import lombok.Getter;
/**
*
* @Author luozh
* @Date 2022年05月07日 13:44
* @Version 1.0
*/
public enum MessageTypeEnum {
// 位置
POSITION(0),
// 文本消息
TEXT(-1),
// 图像消息
IMAGE(-2),
// 音频消息
AUDIO(-3),
// 视频消息
VIDEO(-4),
// 文件消息
FILE(-5),
;
@Getter
private final int code;
MessageTypeEnum(int code) {
this.code = code;
}
/**
* 根据code获取
*
* @param code
* @return
*/
public static MessageTypeEnum getByCode(int code) {
for (MessageTypeEnum messageTypeEnum : values()) {
if (messageTypeEnum.getCode() == code) {
return messageTypeEnum;
}
}
return null;
}
}
...@@ -10,20 +10,32 @@ import com.alibaba.fastjson.JSON; ...@@ -10,20 +10,32 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod; import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage; import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientLoginRequest; import com.wecloud.im.sdk.model.ClientLoginRequest;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.Friend; import com.wecloud.im.sdk.model.Friend;
import com.wecloud.im.sdk.model.FriendRequestRequest;
import com.wecloud.im.sdk.model.GetFriendsRequest; import com.wecloud.im.sdk.model.GetFriendsRequest;
import com.wecloud.im.sdk.model.GetUnsureFriendsRequest; import com.wecloud.im.sdk.model.GetUnsureFriendsRequest;
import com.wecloud.im.sdk.model.ImClient; import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ListChatRoomMemberRequest;
import com.wecloud.im.sdk.model.ListConversationRequest;
import com.wecloud.im.sdk.model.ModifyUserRequest; import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.PageBlacklistRequest;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.RegisterClientRequest; import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token; import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend; import com.wecloud.im.sdk.model.UnsureFriend;
import static com.wecloud.im.sdk.ResourcePathConstants.FRIEND_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_FRIENDS; import static com.wecloud.im.sdk.ResourcePathConstants.GET_FRIENDS;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_TOKEN_URL; import static com.wecloud.im.sdk.ResourcePathConstants.GET_TOKEN_URL;
import static com.wecloud.im.sdk.ResourcePathConstants.GET_UNSURE_FRIENDS; import static com.wecloud.im.sdk.ResourcePathConstants.GET_UNSURE_FRIENDS;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_CHAT_ROOM_MEMBER_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_CONVERSATION_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.MODIFY_USER_URL; import static com.wecloud.im.sdk.ResourcePathConstants.MODIFY_USER_URL;
import static com.wecloud.im.sdk.ResourcePathConstants.PAGE_BLACKLIST_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.REGISTER_CLIENT_URL; import static com.wecloud.im.sdk.ResourcePathConstants.REGISTER_CLIENT_URL;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotBlank; import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotBlank;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull; import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
...@@ -151,6 +163,13 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -151,6 +163,13 @@ public class WecloudImClientOperation extends WecloudImOperation {
return unsureFriends; return unsureFriends;
} }
/**
* 获取好友列表(全量)
* @Author luozh
* @Date 2022年04月28日 03:01:21
* @param getFriendsRequest
* @Return
*/
public List<Friend> getFriends(GetFriendsRequest getFriendsRequest) { public List<Friend> getFriends(GetFriendsRequest getFriendsRequest) {
String userId = getFriendsRequest.getUserId(); String userId = getFriendsRequest.getUserId();
// 参数校验 // 参数校验
...@@ -169,4 +188,96 @@ public class WecloudImClientOperation extends WecloudImOperation { ...@@ -169,4 +188,96 @@ public class WecloudImClientOperation extends WecloudImOperation {
List<Friend> unsureFriends = JSON.parseObject(JSON.toJSONString(result), typeReference); List<Friend> unsureFriends = JSON.parseObject(JSON.toJSONString(result), typeReference);
return unsureFriends; return unsureFriends;
} }
/**
* 好友请求
* @Author luozh
* @Date 2022年04月28日 03:01:47
* @param friendRequestRequest
*/
public Boolean friendRequest(FriendRequestRequest friendRequestRequest) {
String userId = friendRequestRequest.getUserId();
String friendId = friendRequestRequest.getFriendId();
// 参数校验
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
param.put("friendName", Optional.ofNullable(friendRequestRequest.getFriendName()).orElse(""));
param.put("requestRemark", Optional.ofNullable(friendRequestRequest.getRequestRemark()).orElse(""));
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(FRIEND_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(friendRequestRequest).build();
Object result = doOperation(request);
Boolean flag = JSON.parseObject(JSON.toJSONString(result), Boolean.class);
return flag;
}
public List<ChatRoomMember> listChatRoomMember(ListChatRoomMemberRequest listChatRoomMemberRequest) {
// 参数校验
assertParameterNotNull(listChatRoomMemberRequest.getChatRoomId(), "chatRoomId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("chatRoomId", listChatRoomMemberRequest.getChatRoomId() + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_CHAT_ROOM_MEMBER_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(listChatRoomMemberRequest).build();
Object result = doOperation(request);
TypeReference<List<ChatRoomMember>> typeReference = new TypeReference<List<ChatRoomMember>>() {
};
List<ChatRoomMember> chatRoomMembers = JSON.parseObject(JSON.toJSONString(result), typeReference);
return chatRoomMembers;
}
public List<Conversation> listConversation(ListConversationRequest listConversationRequest) {
// 参数校验
assertParameterNotNull(listConversationRequest.getConversationIds(), "conversationIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("chatType", listConversationRequest.getChatType() + "");
param.put("conversationIds", JSON.toJSONString(listConversationRequest.getConversationIds()));
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_CONVERSATION_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(listConversationRequest).build();
Object result = doOperation(request);
TypeReference<List<Conversation>> typeReference = new TypeReference<List<Conversation>>() {
};
List<Conversation> conversations = JSON.parseObject(JSON.toJSONString(result), typeReference);
return conversations;
}
public PageResult<Blacklist> pageBlacklist(PageBlacklistRequest pageBlacklistRequest) {
// 参数校验
assertParameterNotNull(pageBlacklistRequest.getUserId(), "userId");
// 校验通过 构建参数
if (pageBlacklistRequest.getPageIndex() == null) {
pageBlacklistRequest.setPageIndex(1);
}
if (pageBlacklistRequest.getPageSize() == null) {
pageBlacklistRequest.setPageSize(10);
}
Map<String, String> param = new HashMap<>();
param.put("clientId", pageBlacklistRequest.getUserId());
param.put("pageIndex", pageBlacklistRequest.getPageIndex() + "");
param.put("pageSize", pageBlacklistRequest.getPageSize() + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PAGE_BLACKLIST_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(pageBlacklistRequest).build();
Object result = doOperation(request);
TypeReference<PageResult<Blacklist>> typeReference = new TypeReference<PageResult<Blacklist>>() {
};
PageResult<Blacklist> blacklistPage = JSON.parseObject(JSON.toJSONString(result), typeReference);
return blacklistPage;
}
} }
...@@ -3,13 +3,17 @@ package com.wecloud.im.sdk.internal; ...@@ -3,13 +3,17 @@ package com.wecloud.im.sdk.internal;
import java.net.URL; import java.net.URL;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.sdk.common.HttpMethod; import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage; import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.GroupMembersFriendRequestRequest;
import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest; import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest;
import com.wecloud.im.sdk.model.SetConversationTopRequest; import com.wecloud.im.sdk.model.SetConversationTopRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.REGISTER_CLIENT_URL; import static com.wecloud.im.sdk.ResourcePathConstants.CHAT_SETTING;
import static com.wecloud.im.sdk.ResourcePathConstants.GROUP_MEMBERS_FRIEND_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull; import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/** /**
...@@ -43,9 +47,10 @@ public class WecloudImConversationOperation extends WecloudImOperation { ...@@ -43,9 +47,10 @@ public class WecloudImConversationOperation extends WecloudImOperation {
Map<String, String> param = new HashMap<>(); Map<String, String> param = new HashMap<>();
param.put("clientId", userId); param.put("clientId", userId);
param.put("conversationId", conversationId.toString()); param.put("conversationId", conversationId.toString());
param.put("top", top.toString()); param.put("type", "TOP");
param.put("on", top.toString());
// 发送请求 // 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(REGISTER_CLIENT_URL) RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CHAT_SETTING)
.setMethod(HttpMethod.POST).setParameters(param) .setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(setConversationTopRequest).build(); .setOriginalRequest(setConversationTopRequest).build();
...@@ -72,13 +77,38 @@ public class WecloudImConversationOperation extends WecloudImOperation { ...@@ -72,13 +77,38 @@ public class WecloudImConversationOperation extends WecloudImOperation {
Map<String, String> param = new HashMap<>(); Map<String, String> param = new HashMap<>();
param.put("clientId", userId); param.put("clientId", userId);
param.put("conversationId", conversationId.toString()); param.put("conversationId", conversationId.toString());
param.put("doNotDisturb", doNotDisturb.toString()); param.put("type", "DO_NOT_DISTURB");
param.put("on", doNotDisturb.toString());
// 发送请求 // 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(REGISTER_CLIENT_URL) RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CHAT_SETTING)
.setMethod(HttpMethod.POST).setParameters(param) .setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(setConversationDoNotDisturbRequest).build(); .setOriginalRequest(setConversationDoNotDisturbRequest).build();
doOperation(request); doOperation(request);
return true; return true;
} }
public Boolean groupMembersFriendRequest(GroupMembersFriendRequestRequest groupMembersFriendRequestRequest) {
Long conversationId = groupMembersFriendRequestRequest.getConversationId();
String userId = groupMembersFriendRequestRequest.getUserId();
String friendId = groupMembersFriendRequestRequest.getFriendId();
// 参数校验
assertParameterNotNull(conversationId, "conversationId");
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("conversationId", conversationId + "");
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
param.put("friendName", Optional.ofNullable(groupMembersFriendRequestRequest.getFriendName()).orElse(""));
param.put("requestRemark", Optional.ofNullable(groupMembersFriendRequestRequest.getRequestRemark()).orElse(""));
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GROUP_MEMBERS_FRIEND_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(groupMembersFriendRequestRequest).build();
Object result = doOperation(request);
Boolean flag = JSON.parseObject(JSON.toJSONString(result), Boolean.class);
return flag;
}
} }
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.model.PublishGroupChatMessageRequest;
import com.wecloud.im.sdk.model.PublishGroupChatStatusMessageRequest;
import com.wecloud.im.sdk.model.PublishPrivateChatMessageRequest;
import com.wecloud.im.sdk.model.PublishPrivateChatStatusMessageRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.PUBLISH_GROUP_CHAT_MESSAGE_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.PUBLISH_GROUP_CHAT_STATUS_MESSAGE_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.PUBLISH_PRIVATE_CHAT_MESSAGE_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.PUBLISH_PRIVATE_CHAT_STATUS_MESSAGE_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:11
* @Version 1.0
*/
public class WecloudImMessageOperation extends WecloudImOperation {
public WecloudImMessageOperation(URL apiDomain, String appKey, String appSecret) {
super(apiDomain, appKey, appSecret);
}
/**
* 发布群消息
* @Author luozh
* @Date 2022年05月05日 10:49:47
* @param publishGroupChatMessageRequest
* @Return
*/
public Boolean publishGroupChatMessage(PublishGroupChatMessageRequest publishGroupChatMessageRequest) {
String fromUserId = publishGroupChatMessageRequest.getFromUserId();
String toGroupIds = publishGroupChatMessageRequest.getToGroupIds();
String messageType = publishGroupChatMessageRequest.getMessageType();
String content = publishGroupChatMessageRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toGroupIds, "toGroupIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(publishGroupChatMessageRequest).build();
doOperation(request);
return true;
}
/**
* 状态消息发送
* @Author luozh
* @Date 2022年05月05日 11:07:05
* @param publishGroupChatStatusMessageRequest
* @Return
*/
public Boolean publishGroupChatStatusMessage(PublishGroupChatStatusMessageRequest publishGroupChatStatusMessageRequest) {
String fromUserId = publishGroupChatStatusMessageRequest.getFromUserId();
String toGroupIds = publishGroupChatStatusMessageRequest.getToGroupIds();
String messageType = publishGroupChatStatusMessageRequest.getMessageType();
String content = publishGroupChatStatusMessageRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toGroupIds, "toGroupIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(publishGroupChatStatusMessageRequest).build();
doOperation(request);
return true;
}
public Boolean publishPrivateMessage(PublishPrivateChatMessageRequest publishPrivateChatMessageRequest) {
String fromUserId = publishPrivateChatMessageRequest.getFromUserId();
String toUserIds = publishPrivateChatMessageRequest.getToUserIds();
String messageType = publishPrivateChatMessageRequest.getMessageType();
String content = publishPrivateChatMessageRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toUserIds, "toUserIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(publishPrivateChatMessageRequest).build();
doOperation(request);
return true;
}
public Boolean publishPrivateStatusMessage(PublishPrivateChatStatusMessageRequest publishPrivateChatStatusMessageRequest) {
String fromUserId = publishPrivateChatStatusMessageRequest.getFromUserId();
String toUserIds = publishPrivateChatStatusMessageRequest.getToUserIds();
String messageType = publishPrivateChatStatusMessageRequest.getMessageType();
String content = publishPrivateChatStatusMessageRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toUserIds, "toUserIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(publishPrivateChatStatusMessageRequest).build();
doOperation(request);
return true;
}
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.io.Serializable;
/**
*
* @Author luozh
* @Date 2022年05月07日 17:22
* @Version 1.0
*/
@Data
public class Blacklist implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 被拉黑者id
*/
private String clientIdBePrevent;
}
package com.wecloud.im.sdk.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @Author wenzhida
* @Date 2022/4/27 16:47
* @Description 聊天室成员VO
*/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@NoArgsConstructor
public class ChatRoomMember implements Serializable {
private static final long serialVersionUID = -7063567868963011339L;
/**
* 聊天室房间id
*/
private Long chatRoomId;
/**
* 客户端id
*/
private String clientId;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
/**
* <pre>
* 会话表 查询结果对象
* </pre>
*
* @author wei
* @date 2021-05-07
*/
@Data
@Accessors(chain = true)
public class Conversation implements Serializable {
private static final long serialVersionUID = 8120459168840854991L;
/**
* "会话id"
*/
private Long id;
/**
* "创建时间"
*/
private Date createTime;
/**
* "创建者客户端id"
*/
private String creator;
/**
* "可选 对话的名字,可为群组命名。"
*/
private String name;
/**
* value = "可选 自定义属性,供开发者扩展使用。", hidden = true
*/
private String attribute;
/**
* "可选 自定义属性,供开发者扩展使用。"
*/
private HashMap attributes;
/**
* "可选 对话类型标志,是否是系统对话,后面会说明。"
*/
private Boolean systemFlag;
/**
* "未读消息条数"
*/
private Long msgNotReadCount;
/**
* "成员"
*/
private String members;
/**
* "会话属性,1:单聊,2:普通群,3:万人群"
*/
private Integer chatType;
/**
* "群成员数"
*/
private Integer memberCount;
/**
* "是否被@ true-是 false-否"
*/
private Boolean isBeAt;
/**
* 禁言开关
* @see com.wecloud.im.sdk.enums.MutedEnum
*/
/**
* "禁言开关 1-未禁言 2-禁言"
*/
private Integer muted;
/**
* "禁言开关 1-未禁言 2-禁言"
*/
private Integer beAtCount;
/**
* "禁止互加好友"
*/
private Boolean forbidAddFriend;
/**
* "禁止发红包"
*/
private Boolean forbidSendRedPackets;
/**
* "禁止发图片"
*/
private Boolean forbidSendPic;
/**
* "禁止发链接"
*/
private Boolean forbidSendLink;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
* @Author luozh
* @Date 2022年04月28日 14:09
* @Version 1.0
*/
@Builder
@EqualsAndHashCode(callSuper = true)
@Data
public class FriendRequestRequest extends WebServiceRequest {
/**
* 用户id
*/
private String userId;
/**
* 好友id
*/
private String friendId;
/**
* 好友备注
*/
private String friendName;
/**
* 请求备注
*/
private String requestRemark;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@Data
public class GroupChatMessage {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toGroupIds;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否包含发送用户
*/
private Boolean includeSender;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 是否为@消息
*/
private Boolean mentioned;
/**
* 是否为静默消息
*/
private Boolean silent;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@Data
public class GroupChatStatusMessage {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toGroupIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
private Boolean includeSender;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
* @Author luozh
* @Date 2022年04月28日 14:11
* @Version 1.0
*/
@Builder
@EqualsAndHashCode(callSuper = true)
@Data
public class GroupMembersFriendRequestRequest extends WebServiceRequest {
/**
* 会话id
*/
private Long conversationId;
/**
* 用户id
*/
private String userId;
/**
* 好友id
*/
private String friendId;
/**
* 好友备注
*/
private String friendName;
/**
* 请求备注
*/
private String requestRemark;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @Author wenzhida
* @Date 2022/5/1 9:35
* @Description 查找聊天室成员入参
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class ListChatRoomMemberRequest extends WebServiceRequest {
private static final long serialVersionUID = -3602523207000275557L;
/**
* 聊天室房间id
*/
private Long chatRoomId;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @Author wenzhida
* @Date 2022/5/1 9:35
* @Description 查找聊天室入参
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class ListConversationRequest extends WebServiceRequest {
private static final long serialVersionUID = -3602523207000275557L;
/**
* 会话属性,1:单聊,2:普通群,3:万人群
*/
private Integer chatType;
/**
* 会话id列表
*/
private List<Long> conversationIds;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
* @Author luozh
* @Date 2022年05月07日 17:25
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class PageBlacklistRequest extends WebServiceRequest {
private Integer pageIndex;
private Integer pageSize;
private String userId;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.util.List;
/**
*
* @Author luozh
* @Date 2022年05月09日 10:07
* @Version 1.0
*/
@Data
public class PageResult<T> {
private Integer total;
private Integer pageIndex;
private Integer pageSize;
private List<T> records;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
* 单聊消息
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Data
public class PrivateChatMessage {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否包含发送用户
*/
private Boolean includeSender;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 是否为静默消息
*/
private Boolean silent;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@Data
public class PrivateChatStatusMessage {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
private Boolean includeSender;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 发布群聊消息请求
* @Author luozh
* @Date 2022年05月05日 09:39
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PublishGroupChatMessageRequest extends WebServiceRequest {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toGroupIds;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否包含发送用户
*/
private Boolean includeSender;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 是否为@消息
*/
private Boolean mentioned;
/**
* 是否为静默消息
*/
private Boolean silent;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 发布群聊消息请求
* @Author luozh
* @Date 2022年05月05日 09:39
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PublishGroupChatStatusMessageRequest extends WebServiceRequest {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toGroupIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
private Boolean includeSender;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 单聊消息
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PublishPrivateChatMessageRequest extends WebServiceRequest {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否包含发送用户
*/
private Boolean includeSender;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 是否为静默消息
*/
private Boolean silent;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
* @Author luozh
* @Date 2022年05月05日 10:08
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PublishPrivateChatStatusMessageRequest extends WebServiceRequest {
/**
* 发送人客户端id
*/
private String fromUserId;
/**
* 接收群id
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 是否过滤黑名单
*/
private Boolean includeBlacklist;
/**
* 发送用户是否接收
*/
private Boolean includeSender;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月05日 09:55
* @Version 1.0
*/
@Data
public class PushExtParam {
/**
* 通知栏显示主题
*/
private String title;
/**
* 按厂商设置不同推送属性。支持的推送通道值为 `MI`(小米)、`HW`(华为)、`OPPO`、`VIVO`
*/
private String pushChannel;
/**
* 通知渠道的 ID
*/
private String channelId;
/**
* 华为通知栏消息优先级,取值 NORMAL、LOW,默认为 NORMAL 重要消息
*/
private String hwPriority;
/**
* 华为推送自定义的通知栏消息右侧大图标 URL,如果不设置,则不展示通知栏右侧图标
*/
private String hwImage;
/**
* 小米推送自定义的通知栏消息右侧图标 URL
*/
private String miLargeIconUri;
/**
* vivo 推送通道类型。0 为运营消息、1 为系统消息
*/
private String vivoChannelType;
/**
* iOS 平台通知栏分组 ID
*/
private String iosGroupId;
/**
* iOS 平台
*/
private String iosApnsCollapseId;
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月07日 13:51
* @Version 1.0
*/
@Getter
public class BaseMessage {
/**
* 类型
*/
private Integer type;
/**
* 用来给开发者存储拓展的自定义属性字段
*/
@Setter
private Object attrs;
public BaseMessage(MessageTypeEnum type) {
this.setType(type);
}
/**
* 设置类型
* @Author luozh
* @Date 2022年05月07日 01:55:06
* @param type
* @Return
*/
protected void setType(MessageTypeEnum type) {
this.type = type.getCode();
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
* 图片类型消息
* @Author luozh
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class FileMessage extends BaseMessage {
public FileMessage() {
super(MessageTypeEnum.FILE);
}
private MessageFile file;
}
package com.wecloud.im.sdk.model.message;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* 消息图片文件
* @Author luozh
* @Date 2022年05月07日 14:00
* @Version 1.0
*/
@Data
public class MessageFile {
/**
* 文件地址
*/
private String url;
/**
* 元数据
*/
private MetaData metaData;
@Setter
@Getter
public static class MetaData {
/**
* 文件
*/
private String name;
/**
* 文件的格式
*/
private String format;
/**
* 大小 单位b
*/
private Integer size;
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* 消息图片文件
* @Author luozh
* @Date 2022年05月07日 14:00
* @Version 1.0
*/
@Data
public class MessageImageFile {
/**
* 图片地址
*/
private String url;
/**
* 元数据
*/
private MetaData metaData;
@Setter
@Getter
public static class MetaData {
/**
* 图像的名称
*/
private String name;
/**
* 图像的格式
*/
private String format;
/**
* 高度(单位 像素)
*/
private Integer height;
/**
* 宽度(单位 像素)
*/
private Integer width;
/**
* 大小 单位b
*/
private Integer size;
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* 音频消息
* @Author luozh
* @Date 2022年05月07日 14:05
* @Version 1.0
*/
@Data
public class MessageVideoFile {
/**
* 地址
*/
private String url;
/**
* 元数据
*/
private MetaData metaData;
@Setter
@Getter
public static class MetaData {
/**
* 文件的名称
*/
private String name;
/**
* 视频的格式
*/
private String format;
/**
* 时长 单位秒 精确小数点后1位
*/
private Double duration;
/**
* 高度(单位 像素)
*/
private Integer height;
/**
* 宽度(单位 像素)
*/
private Integer width;
/**
* 大小 单位b
*/
private Integer size;
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
/**
* 音频消息
* @Author luozh
* @Date 2022年05月07日 14:05
* @Version 1.0
*/
@Data
public class MessageVoiceFile {
/**
* 地址
*/
private String url;
/**
* 元数据
*/
private MessageImageFile.MetaData metaData;
@Setter
@Getter
public static class MetaData {
/**
* 文件的名称
*/
private String name;
/**
* 时长 单位秒 精确小数点后1位
*/
private Double duration;
/**
* 大小 单位b
*/
private Integer size;
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
* 图片类型消息
* @Author luozh
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class PicMessage extends BaseMessage {
public PicMessage() {
super(MessageTypeEnum.IMAGE);
}
private MessageImageFile file;
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
* 图片类型消息
* @Author luozh
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class PositionMessage extends BaseMessage {
public PositionMessage() {
super(MessageTypeEnum.POSITION);
}
private MetaData metaData;
@Setter
@Getter
public static class MetaData {
/**
* 经度
*/
private Double longitude;
/**
* 纬度
*/
private Double latitude;
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月07日 13:56
* @Version 1.0
*/
@Getter
@Setter
public class TextMessage extends BaseMessage {
public TextMessage() {
super(MessageTypeEnum.TEXT);
}
private String text;
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
* 图片类型消息
* @Author luozh
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class VideoMessage extends BaseMessage {
public VideoMessage() {
super(MessageTypeEnum.VIDEO);
}
private MessageVideoFile file;
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
* 图片类型消息
* @Author luozh
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class VoiceMessage extends BaseMessage {
public VoiceMessage() {
super(MessageTypeEnum.AUDIO);
}
private MessageVoiceFile file;
}
package com.wecloud.im.sdk.sample;
import java.util.Date;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.GroupChatMessage;
import com.wecloud.im.sdk.model.message.MessageImageFile;
import com.wecloud.im.sdk.model.message.PicMessage;
import com.wecloud.im.sdk.model.message.TextMessage;
/**
* 发布群消息
* @Author luozh
* @Date 2022年05月06日 01:37:29
* @Version 1.0
*/
public class PublishGroupChatMessageSample {
public static void main(String[] args) {
WecloudIm im = new WecloudImClientBuilder().build("http://139.159.136.86:8082",
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String senderId = "1519984635566845952";
String toGroupIds = "1519985463165931520";
String messageType = "-1";
boolean silent = true;
GroupChatMessage groupChatMessage = new GroupChatMessage();
groupChatMessage.setFromUserId(senderId);
groupChatMessage.setToGroupIds(toGroupIds);
groupChatMessage.setPushContent("");
groupChatMessage.setIncludeSender(false);
groupChatMessage.setPersisted(true);
groupChatMessage.setMentioned(false);
groupChatMessage.setSilent(silent);
groupChatMessage.setMessageType("-1");
groupChatMessage.setContent(JSONUtil.toJsonStr(buildTextMessage()));
Boolean textMessageResult = im.publishGroupChatMessage(groupChatMessage);
groupChatMessage.setMessageType("-2");
groupChatMessage.setContent(JSONUtil.toJsonStr(buildPicMessage()));
Boolean picMessageResult = im.publishGroupChatMessage(groupChatMessage);
}
private static TextMessage buildTextMessage() {
TextMessage textMessage = new TextMessage();
textMessage.setText("这是text消息测试: " + DateUtil.formatDateTime(new Date()));
return textMessage;
}
private static PicMessage buildPicMessage() {
PicMessage picMessage = new PicMessage();
MessageImageFile imageFile = new MessageImageFile();
imageFile.setUrl("http://ac-p2bpmgci.clouddn.com/246b8acc-2e12-4a9d-a255-8d17a3059d25");
MessageImageFile.MetaData metaData = new MessageImageFile.MetaData();
metaData.setName("IMG_20141223.jpeg");
metaData.setFormat("png");
metaData.setHeight(768);
metaData.setWidth(1024);
metaData.setSize(18);
imageFile.setMetaData(metaData);
picMessage.setFile(imageFile);
return picMessage;
}
}
package com.wecloud.im.sdk.sample;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.PrivateChatMessage;
/**
* 发布单聊消息
* @Author luozh
* @Date 2022年05月06日 01:37:29
* @Version 1.0
*/
public class PublishPrivateChatMessageSample {
public static void main(String[] args) {
WecloudIm im = new WecloudImClientBuilder().build("http://139.159.136.86:8082",
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
// WecloudIm im = new WecloudImClientBuilder().build("http://127.0.0.1:8082",
// "QizKVHcILRWp6Td2",
// "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String senderId = "1519984635566845952";
String toGroupIds = "1513691265777217536";
String messageType = "-1";
Map<String, Object> content = new HashMap<>();
content.put("toConversation", "1519985463165931520");
content.put("type", -1);
content.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
content.put("attrs", new HashMap<String, String>() {
{
put("test1", "");
}
});
boolean silent = true;
PrivateChatMessage privateChatMessage = new PrivateChatMessage();
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(content));
privateChatMessage.setPushContent("");
privateChatMessage.setIncludeSender(false);
privateChatMessage.setPersisted(true);
privateChatMessage.setSilent(silent);
// groupChatMessage.setPushExt(new PushExtParam());
Boolean result = im.publishPrivateMessage(privateChatMessage);
}
}
package com.wecloud.im.sdk.sample;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.PrivateChatStatusMessage;
/**
* 发布单聊消息
* @Author luozh
* @Date 2022年05月06日 01:37:29
* @Version 1.0
*/
public class PublishPrivateChatMessageStatusSample {
public static void main(String[] args) {
// WecloudIm im = new WecloudImClientBuilder().build("http://139.159.136.86:8082",
// "QizKVHcILRWp6Td2",
// "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
WecloudIm im = new WecloudImClientBuilder().build("http://127.0.0.1:8082",
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String senderId = "1519984635566845952";
String toGroupIds = "1513691265777217536";
String messageType = "-1";
Map<String, Object> content = new HashMap<>();
content.put("toConversation", "1519985463165931520");
content.put("type", -1);
content.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
content.put("attrs", new HashMap<String, String>() {
{
put("test1", "");
}
});
PrivateChatStatusMessage privateChatMessage = new PrivateChatStatusMessage();
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(content));
privateChatMessage.setIncludeBlacklist(false);
privateChatMessage.setIncludeSender(false);
Boolean result = im.publishPrivateStatusMessage(privateChatMessage);
}
}
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