Commit 910da5db by Future

Merge branch 'xiaohudou_20220427' into feature-cluster

parents 25532764 4aefa1a1
......@@ -20,7 +20,7 @@ spring:
# 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
password: temple123456
......
......@@ -63,3 +63,12 @@ rocketmq:
namesrvAddr: 124.71.83.11:9876
# 生产者的组名
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;
import com.alibaba.fastjson.JSON;
import com.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
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.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
......@@ -17,10 +20,12 @@ 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.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import com.wecloud.im.ws.model.WsResponse;
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.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -28,6 +33,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.HashMap;
......@@ -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")
......@@ -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;
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.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
......@@ -67,10 +69,23 @@ public class ConversationMembersAction {
@ActionMapping("/getList")
@ApiOperation(value = "获取会话中成员表列表")
public WsResponse<Map<String, List<ConversationMemberVo>>> getImConversationMembersList(@Validated ListConversationMembersParam data) throws Exception {
List<ConversationMemberVo> conversationMemberVoList =
imConversationMembersService.getImConversationMembersList(data);
List<ConversationMemberVo> conversationMemberVoList = imConversationMembersService.getImConversationMembersList(data);
Map<String, List<ConversationMemberVo>> result = new HashMap<>();
result.put("result", conversationMemberVoList);
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;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
......@@ -140,6 +142,11 @@ public class NormalChatAction {
if (muted(conversation, reqId, imClientSender, membersList, request.getSenderChannel())) {
return;
}
// 消息内容校验
if (checkMsg(conversation, reqId, data.getText(), request.getSenderChannel())) {
return;
}
ImMessageOnlineSend imMessageOnlineSend = assembleImMessageOnlineSend(data, imClientSender, imApplication.getId());
// 再给所有人发 todo 需要改成批量
......@@ -378,9 +385,47 @@ public class NormalChatAction {
responseModel.setCode(apiResult.getCode());
responseModel.setMsg(apiResult.getMessage());
responseModel.setReqId(reqId);
channelSender.sendMsgLocal((NioSocketChannel)channel, responseModel);
channelSender.sendMsgLocal((NioSocketChannel) channel, responseModel);
}
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;
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.common.BaseRequest;
import com.wecloud.dispatch.extend.ActionRequest;
......@@ -18,19 +33,6 @@ import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.utils.JsonUtils;
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
......
......@@ -70,5 +70,17 @@ public class ImClientBlacklistController extends BaseController {
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;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
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.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.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
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.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
......@@ -22,22 +36,7 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
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;
import java.util.List;
/**
* 会话表 控制器
......@@ -211,6 +210,17 @@ public class ImConversationController extends BaseController {
return ApiResult.result(true);
}
/**
* 群聊设置
*/
@PostMapping("/groupChatSetting")
@ApiOperation(value = "群聊设置", notes = "权限:群主和管理员有权限操作")
public ApiResult<Boolean> groupChatSetting(@RequestBody @Validated GroupChatSettingParam param) {
log.info("群聊设置入参 {}", JSON.toJSONString(param));
Boolean result = imConversationService.groupChatSetting(param);
return ApiResult.ok(result);
}
/**
* 用户进入聊天室
......@@ -243,6 +253,16 @@ public class ImConversationController extends BaseController {
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;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
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.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -16,10 +18,10 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
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.ListConversationMembersParam;
import com.wecloud.im.param.SetConversationDoNotDisturbParam;
import com.wecloud.im.param.SetConversationTopParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.vo.ConversationMemberVo;
......@@ -77,39 +79,56 @@ public class ImConversationMembersController extends BaseController {
}
/**
* 会话置顶
* 聊天设置
* @Author luozh
* @Date 2022年04月26日 11:48:59
* @param
* @Return
*/
@ApiOperation(value = "会话置顶")
@PostMapping("/sdk/setTop")
public ApiResult<Boolean> setTop(@RequestBody SetConversationTopParam param) {
Long appId = SecurityUtils.getCurrentAppId();
String clientId = param.getClientId();
Long conversationId = param.getConversationId();
Boolean top = param.getTop();
imConversationMembersService.setTop(appId, clientId, conversationId, top);
return ApiResult.ok();
@ApiOperation(value = "聊天设置")
@PostMapping("/chatSetting")
public ApiResult<Boolean> chatSetting(@RequestBody ChatSettingParam param) {
return ApiResult.ok(imConversationMembersService.chatSetting(param));
}
/**
* 设置免打扰
* 群成员添加好友
* @Author luozh
* @Date 2022年04月26日 11:49:55
* @Date 2022年04月28日 11:40:44
* @param
* @Return
*/
@ApiOperation(value = "会话免打扰")
@PostMapping("/sdk/setDoNotDisturb")
public ApiResult<Boolean> setDoNotDisturb(@RequestBody SetConversationDoNotDisturbParam param) {
Long appId = SecurityUtils.getCurrentAppId();
String clientId = param.getClientId();
Long conversationId = param.getConversationId();
Boolean doNotDisturb = param.getDoNotDisturb();
imConversationMembersService.setDoNotDisturb(appId, clientId, conversationId, doNotDisturb);
return ApiResult.ok();
@ApiOperation(value = "群成员添加好友")
@PostMapping("/addUser")
public ApiResult<Boolean> addUser(@RequestBody ImFriendApplyParam param) {
if (param.getConversationId() == null) {
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: conversationId 不能为空");
}
if (StringUtils.isBlank(param.getFriendName())) {
throw new BusinessException(ApiCode.PARAMETER_EXCEPTION.getCode(), "参数: friendName 不能为空");
}
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;
import org.springframework.web.bind.annotation.RestController;
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.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.ImMsgUpdate;
import com.wecloud.im.service.ImMessageService;
......@@ -60,7 +64,7 @@ public class ImMessageController extends BaseController {
@PostMapping("/delete")
@ApiOperation(value = "删除消息", notes = "单条消息与批量消息删除共用")
public ApiResult<Boolean> deleteMsg(@RequestBody MsgDeleteParam param) {
if(param == null) {
if (param == null) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
if (CollectionUtils.isEmpty(param.getMsgIds())) {
......@@ -109,5 +113,30 @@ public class ImMessageController extends BaseController {
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;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.geekidea.springbootplus.framework.common.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -9,9 +7,13 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
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;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.Map;
import javax.validation.constraints.NotNull;
/**
* 消息在线推送
......@@ -45,7 +45,7 @@ public class ImMessageOnlineSend extends BaseEntity {
private String sender;
@ApiModelProperty("内容")
private Map content;
private Object content;
@ApiModelProperty("0未撤回; 1已撤回")
private Boolean withdraw;
......
......@@ -94,10 +94,36 @@ public class ImFriendController extends BaseController {
return ApiResult.fail(ApiCode.CLIENT_NOT_FOUNT, null);
}
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);
}
if(currentClient.getId().equals(friendClient.getId())) {
if (currentClient.getId().equals(friendClient.getId())) {
return ApiResult.fail(ApiCode.PARAMETER_EXCEPTION, null);
}
imFriendService.applyFriend(currentClient, friendClient, param.getFriendName(), param.getRequestRemark());
......
......@@ -3,8 +3,6 @@ package com.wecloud.im.friend.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @Description 申请好友入参
* @Author lixiaozhong
......@@ -14,6 +12,9 @@ import java.io.Serializable;
public class ImFriendApplyParam extends ImFriendBaseParam {
private static final long serialVersionUID = 1L;
@ApiModelProperty("会话id,群成员添加好友时传参")
private Long conversationId;
@ApiModelProperty("备注好友名称")
private String friendName;
......
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
......@@ -7,11 +14,6 @@ import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryVo;
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 接口
......@@ -46,7 +48,7 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
* @param currentClientId
* @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> {
* @return 成功则返回true
*/
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;
import lombok.Data;
/**
* 设置会话置顶入参
* 聊天设置入参
* @Author luozh
* @Date 2022年04月26日 11:52
* @Version 1.0
*/
@Data
public class SetConversationTopParam {
public class ChatSettingParam {
@ApiModelProperty("客户端id")
String clientId;
......@@ -19,7 +19,10 @@ public class SetConversationTopParam {
@ApiModelProperty("会话id")
Long conversationId;
@ApiModelProperty("设置类型")
ChatSettingTypeEnum type;
@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;
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "黑名单分页参数")
public class ImClientBlacklistPageParam extends BasePageOrderParam {
private String clientId;
private static final long serialVersionUID = 1L;
}
......@@ -61,4 +61,16 @@ public class ImConversationQueryVo implements Serializable {
*/
@ApiModelProperty("禁言开关 1-未禁言 2-禁言")
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;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.util.HashMap;
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;
import io.geekidea.springbootplus.framework.common.service.BaseService;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import com.wecloud.dispatch.extend.ActionRequest;
import com.wecloud.im.entity.ImClientBlacklist;
import com.wecloud.im.param.ImClientBlacklistPageParam;
import com.wecloud.im.param.ImClientBlacklistQueryVo;
......@@ -53,4 +52,12 @@ public interface ImClientBlacklistService extends BaseService<ImClientBlacklist>
*/
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;
import java.util.List;
import org.springframework.web.bind.annotation.RequestBody;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.friend.param.ImFriendApplyParam;
import com.wecloud.im.param.ApiImConversationMembersPageParam;
import com.wecloud.im.param.ApiImConversationMembersQueryVo;
import com.wecloud.im.param.ChatSettingParam;
import com.wecloud.im.param.ImConvMemeClientRemarkNameParam;
import com.wecloud.im.param.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo;
......@@ -129,14 +133,14 @@ public interface ImConversationMembersService extends BaseService<ImConversation
* @param
* @Return
*/
Boolean setTop(Long appId, String clientId, Long conversationId, Boolean top);
Boolean chatSetting(ChatSettingParam param);
/**
* 设置免打扰
* 群成员添加好友
* @Author luozh
* @Date 2022年04月25日 06:24:43
* @param
* @Date 2022年04月28日 11:48:42
* @param param
* @Return
*/
Boolean setDoNotDisturb(Long appId, String clientId, Long conversationId, Boolean doNotDisturb);
Boolean addUser(@RequestBody ImFriendApplyParam param);
}
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.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
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;
......@@ -19,14 +28,10 @@ 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.param.add.ServerImConversationCreate;
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.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> {
*/
ImConversationCreateVo createImConversation(ImConversationCreate imConversationCreate);
/**
* 创建会话 sdk用
*
* @param imConversationCreate
* @return
*/
ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate);
/**
* 将用户添加进会话
......@@ -209,6 +222,13 @@ public interface ImConversationService extends BaseService<ImConversation> {
Long getRepetitionConversationAttributes(Long clientId1, Long clientId2, String attributes);
/**
* 群禁言
* @param param
* @return
*/
Boolean groupChatSetting(GroupChatSettingParam param);
/**
* 用户主动进入聊天室
* @param param
* @return
......@@ -223,11 +243,27 @@ public interface ImConversationService extends BaseService<ImConversation> {
Boolean exitChatRoom(ExitChatRoomParam param);
/**
* 分页获取聊天室成员入参
* 获取聊天室成员入参
* @param param
* @return
*/
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;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.param.ChatContentVo;
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.ImHistoryMessagePageParam;
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.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
......@@ -132,4 +136,38 @@ public interface ImMessageService extends BaseService<ImMessage> {
*/
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;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -101,11 +100,26 @@ public class ImClientBlacklistServiceImpl extends BaseServiceImpl<ImClientBlackl
@Override
public Paging<ImClientBlacklistQueryVo> getImClientBlacklistPageList(ImClientBlacklistPageParam imClientBlacklistPageParam) {
Page<ImClientBlacklistQueryVo> page = new PageInfo<>(imClientBlacklistPageParam);
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);
return imClientBlacklistQueryVoPaging;
}
}
......@@ -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.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
......@@ -25,12 +27,17 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Maps;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
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.ImConversationMembersMapper;
import com.wecloud.im.param.ApiImConversationMembersPageParam;
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.ImConversationMembersPageParam;
import com.wecloud.im.param.ImConversationMembersQueryVo;
......@@ -38,11 +45,9 @@ import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.SetAdminsParam;
import com.wecloud.im.param.add.ImConversationMemAttrUpdate;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ConversationMemberVo;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
......@@ -76,17 +81,14 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
private ImClientService imClientService;
@Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImMessageService imMessageService;
@Autowired
private ImConversationMembersMapper imConversationMembersMapper;
@Autowired
private ContextService contextService;
@Autowired
private ImFriendService imFriendService;
@Override
public ApiResult<List<ApiImConversationMembersQueryVo>> getRestApiImConversationMembersList(ApiImConversationMembersPageParam apiImConversationMembersPageParam, ImApplication imApplication) {
......@@ -259,7 +261,13 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
}
@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 =
baseMapper.selectOne(Wrappers.<ImConversationMembers>lambdaQuery()
......@@ -269,22 +277,49 @@ public class ImConversationMembersServiceImpl extends BaseServiceImpl<ImConversa
if (conversation == null) {
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
public Boolean setDoNotDisturb(Long appId, String clientId, Long conversationId, Boolean doNotDisturb) {
// 找到对应的会话
ImConversationMembers conversation =
baseMapper.selectOne(Wrappers.<ImConversationMembers>lambdaQuery()
.eq(ImConversationMembers::getClientId, clientId)
.eq(ImConversationMembers::getFkConversationId, conversationId)
.eq(ImConversationMembers::getFkAppid, appId));
public Boolean addUser(ImFriendApplyParam param) {
Long appId = SecurityUtils.getCurrentAppId();
Long conversationId = param.getConversationId();
// 判断会话是否存在
ImConversation conversation = imConversationService.getById(conversationId);
if (conversation == null) {
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;
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.ApiResult;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
......@@ -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.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.jwt.JwtToken;
import io.geekidea.springbootplus.framework.shiro.util.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
......@@ -25,6 +18,7 @@ import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
......@@ -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.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chanjx.utils.StringUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.wecloud.im.chatroom.cache.ChatRoomCacheManager;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
......@@ -46,12 +42,17 @@ import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImConversationMapper;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
import com.wecloud.im.param.GroupChatSettingParam;
import com.wecloud.im.param.ImClientSimpleDto;
import com.wecloud.im.param.ImConversationPageParam;
import com.wecloud.im.param.ImConversationQueryParam;
import com.wecloud.im.param.ImConversationQueryVo;
import com.wecloud.im.param.IntoChatRoomParam;
import com.wecloud.im.param.ListConversationMembersParam;
import com.wecloud.im.param.ListConversationParam;
import com.wecloud.im.param.MutedGroupMemberParam;
import com.wecloud.im.param.MutedGroupParam;
import com.wecloud.im.param.SetAdminsParam;
......@@ -62,15 +63,17 @@ 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.param.add.ServerImConversationCreate;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
import com.wecloud.im.sdk.enums.GroupChatSettingTypeEnum;
import com.wecloud.im.sdk.enums.GroupRoleEnum;
import com.wecloud.im.sdk.enums.MutedEnum;
import com.wecloud.im.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.vo.ChatRoomMemberVo;
import com.wecloud.im.vo.ConversationMemberVo;
import com.wecloud.im.vo.ConversationVo;
import com.wecloud.im.vo.ImConversationCreateVo;
......@@ -79,9 +82,19 @@ import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
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
imMessage.setSendStatus(2);
imMessage.setFkConversationId(imConversation.getId());
imMessageService.save(imMessage);
sendEventMsgToMember(imApplication, client2.getId(), imMessage, createClient);
// 发送消息
sendEventMsgToMember(imConversation.getId(), imApplication.getId(), createClient.getClientId(),
client2.getId(), content, imMessage);
}
}
ImConversationCreateVo imConversationCreateVo = new ImConversationCreateVo();
......@@ -278,6 +293,136 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@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)
public Boolean addClientToConversation(ImClientToConversation imClientToConversation) {
......@@ -365,10 +510,11 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员
for (ImConversationMembers conversationMember : membersList) {
sendEventMsgToMember(imApplication, conversationMember.getFkClientId(), imMessage, imClientSender);
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
conversationMember.getFkClientId(), content, imMessage);
}
// 发送给刚被拉入群的成员
sendEventMsgToMember(imApplication, clientToConversation.getId(), imMessage, imClientSender);
sendEventMsgToMember(imClientToConversation.getConversationId(), imApplication.getId(), createClient.getClientId(),
clientToConversation.getId(), content, imMessage);
}
// 将群成员数量减
......@@ -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
@Transactional(rollbackFor = Exception.class)
public Boolean delClientToConversation(ImClientToConversation imClientToConversation) throws Exception {
......@@ -486,37 +600,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessageService.save(imMessage);
membersList.removeIf(e -> e.getId().equals(members.getId()));
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
}
Long conversationId = imClientToConversation.getConversationId();
Long appId = imApplication.getId();
String sender = imClientSender.getClientId();
Integer msgType = imMessage.getMsgType();
sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage);
}
// 将群成员数量减
......@@ -566,41 +655,12 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage);
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(param.getConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
Long conversationId = param.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
} catch (Exception e) {
log.info("下发解散群事件失败,接收人 {}", JSON.toJSONString(member));
}
}
sendMsgToMembers(conversationId, membersList, appId, sender, content, imMessage);
}
@Override
......@@ -666,39 +726,13 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
throw new BusinessException("退出群聊错误");
}
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(messageId);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(MsgTypeEnum.LEAVE_CONVERSATION.getUriCode());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
// 向群成员发送退出群聊事件
Long conversationId = imClientToConversation.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
Integer msgType = MsgTypeEnum.LEAVE_CONVERSATION.getUriCode();
}
sendMsgToMembers(conversationId, membersList, appId, sender, null, imMessage);
// 群主退出 转移给下一个人
if (GroupRoleEnum.OWNER.getCode().equals(members.getRole())) {
ImConversationMembers conversationMember = membersList.get(0);
......@@ -801,72 +835,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
imConversationMapper.updateById(muteGroupParam);
deleteCacheImConversationById(param.getConversationId());
// 下发事件通知 开启、取消 群禁言
// 查询该会话所有成员
List<ImConversationMembers> membersList = imConversationMembersService.list(
new QueryWrapper<ImConversationMembers>().lambda()
.eq(ImConversationMembers::getFkAppid, currentClient.getFkAppid())
.eq(ImConversationMembers::getFkConversationId, param.getConversationId())
.ne(ImConversationMembers::getFkClientId, currentClient.getId())
);
if (membersList.isEmpty()) {
throw new BusinessException("群聊成员列表为空");
}
// 保存事件消息
ImMessage imMessage = new ImMessage();
Map<String, Object> content = new HashMap<>();
content.put("operator", currentClient.getClientId());
imMessage.setContent(JsonUtils.encodeJson(content));
// 保存消息至消息表
imMessage.setId(SnowflakeUtil.getId());
Integer msgType = MutedEnum.NO.getCode().equals(param.getMutedType()) ?
MsgTypeEnum.CONVERSATION_MUTED_CANCEL.getUriCode()
: MsgTypeEnum.CONVERSATION_MUTED.getUriCode();
imMessage.setMsgType(msgType);
imMessage.setCreateTime(new Date());
imMessage.setFkAppid(currentClient.getFkAppid());
imMessage.setSender(currentClient.getId());
imMessage.setWithdraw(false);
imMessage.setEvent(true);
imMessage.setSystemFlag(false);
imMessage.setSendStatus(2);
imMessage.setFkConversationId(param.getConversationId());
imMessageService.save(imMessage);
for (ImConversationMembers member : membersList) {
// 不关心事件是否发送成功
try {
// 给所有成员下发事件消息
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, member.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setMsgId(imMessage.getId());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setType(imMessage.getMsgType());
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(param.getConversationId());
imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
} catch (Exception e) {
log.info("下发群禁言事件失败,接收人 {}", JSON.toJSONString(member));
}
}
return true;
}
......@@ -945,34 +916,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 内容
HashMap<String, String> content = Maps.newHashMap();
content.put("name", imConversationById.getName());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, currentClient.getFkAppid())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
imMessageOnlineSend.setSender(currentClient.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 发送消息至成员
ImMessage message = new ImMessage();
message.setWithdraw(Boolean.FALSE);
message.setEvent(Boolean.TRUE);
message.setMsgType(MsgTypeEnum.CONVERSATION_NAME_CHANGE.getUriCode());
sendMsgToMembers(param.getConversationId(), membersList, currentClient.getFkAppid(),
currentClient.getClientId(), content, message);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
}
return ApiResult.ok();
} else {
return ApiResult.fail();
......@@ -1011,38 +963,15 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// ws下发拓展字段变动事件
HashMap<String, String> content = Maps.newHashMap();
content.put("attributes", imConversationById.getAttributes());
// 遍历发送
for (ImConversationMembers conversationMembers : membersList) {
// 查询接收方
ImClient imClientReceiver = imClientService.getOne(new QueryWrapper<ImClient>().lambda()
.eq(ImClient::getFkAppid, imApplication.getId())
.eq(ImClient::getId, conversationMembers.getFkClientId()));
if (imClientReceiver == null) {
continue;
}
// 封装响应的实体
ImMessageOnlineSend imMessageOnlineSend = new ImMessageOnlineSend();
// imMessageOnlineSend.setMsgId(null);
// imMessageOnlineSend.setSender(imClientSender.getClientId());
imMessageOnlineSend.setType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
imMessageOnlineSend.setContent(content);
imMessageOnlineSend.setCreateTime(new Date());
imMessageOnlineSend.setConversationId(conversationMembers.getFkConversationId());
// imMessageOnlineSend.setWithdraw(Boolean.FALSE);
imMessageOnlineSend.setEvent(Boolean.TRUE);
// 向接收方推送
WsResponse<ImMessageOnlineSend> responseModel = new WsResponse<>();
responseModel.setCmd(WsResponseCmdEnum.CONVERSATION_EVENT_MSG.getCmdCode());
ApiResult<Boolean> result = ApiResult.result(ApiCode.SUCCESS);
responseModel.setCode(result.getCode());
responseModel.setMsg(result.getMessage());
responseModel.setData(imMessageOnlineSend);
responseModel.setReqId(null);
channelSender.sendMsg(responseModel, imClientReceiver.getId());
}
// 向群成员发送拓展字段变动事件
Long conversationId = imConversationAttrUpdate.getConversationId();
Long appId = currentClient.getFkAppid();
String sender = currentClient.getClientId();
ImMessage message = new ImMessage();
message.setWithdraw(Boolean.FALSE);
message.setEvent(Boolean.TRUE);
message.setMsgType(MsgTypeEnum.CONVERSATION_EXPAND_FIELD_CHANGE.getUriCode());
sendMsgToMembers(conversationId, membersList, appId, sender, content, message);
} else {
throw new BusinessException("修改错误");
}
......@@ -1166,6 +1095,47 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
}
@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) {
// 获取当前client
ImClient imClientSender = contextService.getImClientIfNotNullOrThrow();
......@@ -1213,10 +1183,9 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) {
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);
return true;
......@@ -1271,7 +1240,8 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
// 遍历发送给已在群内的成员
for (String key : chatRoomMembers.keySet()) {
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;
}
......@@ -1290,6 +1260,35 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
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) {
// 会话id
Long chatRoomId = SnowflakeUtil.getId();
......@@ -1319,4 +1318,175 @@ public class ImConversationServiceImpl extends BaseServiceImpl<ImConversationMap
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;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import io.geekidea.springbootplus.framework.core.pagination.PageInfo;
import io.geekidea.springbootplus.framework.core.pagination.Paging;
import io.geekidea.springbootplus.framework.shiro.util.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
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.springframework.beans.BeanUtils;
......@@ -19,35 +27,46 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.wecloud.dispatch.common.BaseRequest;
import com.wecloud.im.entity.ImApiMessageOnlineSend;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.entity.ImConversationMembers;
import com.wecloud.im.entity.ImInbox;
import com.wecloud.im.entity.ImMessage;
import com.wecloud.im.entity.ImMessageOnlineSend;
import com.wecloud.im.mapper.ImMessageMapper;
import com.wecloud.im.mq.MqSender;
import com.wecloud.im.param.ChatContentVo;
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.ImHistoryMessagePageParam;
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.ImMsgSendToOnlineClient;
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.service.ContextService;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImConversationMembersService;
import com.wecloud.im.service.ImConversationService;
import com.wecloud.im.service.ImInboxService;
import com.wecloud.im.service.ImMessageService;
import com.wecloud.im.thousandchat.service.ThousandChatService;
import com.wecloud.im.vo.ImMessageOfflineListVo;
......@@ -57,12 +76,14 @@ import com.wecloud.im.vo.ReaderVo;
import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.model.request.PushVO;
import com.wecloud.im.ws.model.request.ReceiveDataVO;
import com.wecloud.im.ws.model.request.ReceiveVO;
import com.wecloud.im.ws.sender.ChannelSender;
import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils;
import com.wecloud.utils.SnowflakeUtil;
/**
......@@ -87,7 +108,6 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired
private ImApplicationService imApplicationService;
@Autowired
private ImConversationMembersService imConversationMembersService;
......@@ -103,6 +123,9 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
@Autowired
private MqSender mqSender;
@Autowired
private ImInboxService imInboxService;
@Override
@Transactional(rollbackFor = Exception.class)
public ApiResult<Boolean> restApiImMessageSend(ImMsgSendToOnlineClient imMsgSendToOnlineClient, ImApplication imApplication) {
......@@ -214,7 +237,7 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
ImMessage messageById = this.getById(imMsgRecall.getMsgId());
// 判断该消息是否是该客户端发送 todo 单向撤回、双向撤回开关可配置
Boolean withdrawOther = true;
boolean withdrawOther = true;
if (!withdrawOther && !messageById.getSender().equals(imClientSender.getId())) {
throw new BusinessException("不可撤回别人发送的消息");
}
......@@ -538,5 +561,416 @@ public class ImMessageServiceImpl extends BaseServiceImpl<ImMessageMapper, ImMes
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;
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.wecloud.dispatch.annotation.ActionMapping;
import com.wecloud.dispatch.common.BaseRequest;
......@@ -29,23 +45,6 @@ import com.wecloud.pushserver.client.model.constant.MqConstant;
import com.wecloud.pushserver.client.model.dto.PushDTO;
import com.wecloud.utils.JsonUtils;
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请求
......
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.ImConversation;
import com.wecloud.im.entity.ImMessage;
......@@ -18,22 +35,7 @@ import com.wecloud.im.ws.enums.MsgTypeEnum;
import com.wecloud.im.ws.enums.WsResponseCmdEnum;
import com.wecloud.im.ws.model.WsResponse;
import com.wecloud.im.ws.sender.ChannelSender;
import 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 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 {
@ApiModelProperty("禁言开关 1-未禁言 2-禁言")
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;
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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
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
* @Description 用户与redis绑定
......@@ -48,8 +50,10 @@ public class UserStateCacheManager extends UserStateListener {
@Override
public void offlineEvent(Long clientId, Integer platform, String longChannelId) {
log.info("ws用户离线删除redis key,uid: {}, clientId: {}", longChannelId, clientId);
redisUtils.removeForSet(getUserStateCacheKey(clientId), platform + RedisUtils.SPLIT + GetIpUtils.getlanIp());
String key = getUserStateCacheKey(clientId);
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;
*/
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
INVITE_CLIENT_JOIN_CONVERSATION(-1007),
......@@ -54,6 +66,29 @@ public enum MsgTypeEnum {
// 群成员备注修改 -1021
CONVERSATION_MEMBER_NAME_MODIFY(-1021),
// 禁止群成员互加好友
CONVERSATION_FORBID_ADD_FRIEND(-1022),
// 取消禁止群成员互加好友
CONVERSATION_FORBID_ADD_FRIEND_CANCEL(-1023),
// 禁止群成员发红包
CONVERSATION_FORBID_SEND_RED_PACKETS(-1024),
// 取消禁止群成员发红包
CONVERSATION_FORBID_SEND_RED_PACKETS_CANCEL(-1025),
// 禁止群成员发图片
CONVERSATION_FORBID_SEND_PIC_CANCEL(-1026),
// 取消禁止群成员发图片
CONVERSATION_FORBID_SEND_PIC(-1027),
// 禁止群成员发链接
CONVERSATION_FORBID_SEND_LINK(-1028),
// 取消禁止群成员发链接
CONVERSATION_FORBID_SEND_LINK_CANCEL(-1029),
;
private final int uriCode;
......
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.ApiResult;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
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.rpc.RpcContext;
import org.apache.dubbo.rpc.cluster.router.address.Address;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
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;
/**
* @Description 下发数据
......@@ -144,6 +146,7 @@ public class ChannelSender {
// 调用本地下发
log.info("在线用户入参 {}, 具体ip结果 {}", toClientId, JSON.toJSONString(channelInfoEntry));
for(ClientChannelInfo clientChannelInfo : channelInfoEntry.getValue()) {
log.info("客户端 {}, 推送消息内容 {}", toClientId, msgJson);
this.sendMsgLocal(toClientId, clientChannelInfo.getPlatform(), msgJson);
}
continue;
......
......@@ -5,7 +5,9 @@
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
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>
<select id="getImConversationById" resultType="com.wecloud.im.param.ImConversationQueryVo">
......@@ -30,6 +32,10 @@
imConversation.attributes as attribute,
imConversation.system_flag,
imConversation.muted as muted,
imConversation.is_forbid_add_friend as forbid_add_friend,
imConversation.is_forbid_send_red_packets as forbid_send_red_packets,
imConversation.is_forbid_send_pic as forbid_send_pic,
imConversation.is_forbid_send_link as forbid_send_link,
im_client.client_id AS creator,
(SELECT COUNT(im_inbox.id)
FROM im_inbox
......@@ -70,12 +76,16 @@
<select id="getRepetitionConversationSingle" resultType="com.wecloud.im.entity.ImConversation">
-- 查询重复的单聊会话第一条
select con.* from im_conversation con
select con.*
from im_conversation con
inner join im_conversation_members mem1
on con.id = mem1.fk_conversation_id and mem1.fk_client_id = #{clientId1}
inner join im_conversation_members mem2
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
where con.chat_type = 1
and con.member_count = 2
order by con.id asc
LIMIT 1
</select>
<select id="getRepetitionConversationAttributes" resultType="java.lang.Long">
......@@ -91,15 +101,65 @@
im_conversation_members2.fk_conversation_id
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>
<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 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>
<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>
......@@ -142,6 +142,11 @@ public enum ApiCode {
*/
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;
......
......@@ -37,14 +37,54 @@ public class ResourcePathConstants {
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;
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.GroupChatMessage;
import com.wecloud.im.sdk.model.GroupChatStatusMessage;
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.UnsureFriend;
......@@ -69,6 +77,16 @@ public interface WecloudIm {
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
* @Date 2022年04月26日 03:33:44
......@@ -89,4 +107,79 @@ public interface WecloudIm {
* @Return
*/
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;
import java.net.URL;
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.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.Conversation;
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.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.ListChatRoomMemberRequest;
import com.wecloud.im.sdk.model.ListConversationRequest;
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.SetConversationDoNotDisturbRequest;
import com.wecloud.im.sdk.model.SetConversationTopRequest;
......@@ -45,6 +66,8 @@ public class WecloudImClient implements WecloudIm {
private WecloudImConversationOperation imConversationOperation;
private WecloudImMessageOperation wecloudImMessageOperation;
public WecloudImClient(URL apiDomain, String appKey, String appSecret) {
this.apiDomain = apiDomain;
this.appKey = appKey;
......@@ -92,6 +115,44 @@ public class WecloudImClient implements WecloudIm {
}
@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) {
SetConversationTopRequest setConversationTopRequest =
SetConversationTopRequest.builder().userId(userId).conversationId(conversationId).top(top).build();
......@@ -105,9 +166,42 @@ public class WecloudImClient implements WecloudIm {
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() {
this.imClientOperation = new WecloudImClientOperation(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;
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.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
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.FriendRequestRequest;
import com.wecloud.im.sdk.model.GetFriendsRequest;
import com.wecloud.im.sdk.model.GetUnsureFriendsRequest;
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.PageBlacklistRequest;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token;
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_TOKEN_URL;
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.PAGE_BLACKLIST_REQUEST;
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.assertParameterNotNull;
......@@ -151,6 +163,13 @@ public class WecloudImClientOperation extends WecloudImOperation {
return unsureFriends;
}
/**
* 获取好友列表(全量)
* @Author luozh
* @Date 2022年04月28日 03:01:21
* @param getFriendsRequest
* @Return
*/
public List<Friend> getFriends(GetFriendsRequest getFriendsRequest) {
String userId = getFriendsRequest.getUserId();
// 参数校验
......@@ -169,4 +188,96 @@ public class WecloudImClientOperation extends WecloudImOperation {
List<Friend> unsureFriends = JSON.parseObject(JSON.toJSONString(result), typeReference);
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;
import java.net.URL;
import java.util.HashMap;
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.RequestMessage;
import com.wecloud.im.sdk.model.GroupMembersFriendRequestRequest;
import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest;
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;
/**
......@@ -43,9 +47,10 @@ public class WecloudImConversationOperation extends WecloudImOperation {
Map<String, String> param = new HashMap<>();
param.put("clientId", userId);
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)
.setOriginalRequest(setConversationTopRequest).build();
......@@ -72,13 +77,38 @@ public class WecloudImConversationOperation extends WecloudImOperation {
Map<String, String> param = new HashMap<>();
param.put("clientId", userId);
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)
.setOriginalRequest(setConversationDoNotDisturbRequest).build();
doOperation(request);
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