Commit d4a0bacc by Future

Merge branch 'xiaohudou_20220427' into feature-cluster

parents 88e9a0f8 c52a8fc6
......@@ -23,8 +23,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.param.ClientInfoParam;
......@@ -207,12 +205,9 @@ public class ImClientController extends BaseController {
}
@PostMapping("/modifyUserAttributes")
@ApiOperation(value = "查询两个客户端之间的关系")
@ApiOperation(value = "修改用户拓展字段")
public ApiResult<Boolean> modifyUserAttributes(@Validated @RequestBody ModifyUserAttributesParam param) {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> attributes = JSONObject.parseObject(param.getAttributes(), typeReference);
return ApiResult.ok(imClientService.modifyUserAttributes(param.getUserId(), attributes));
return ApiResult.ok(imClientService.modifyUserAttributes(param.getUserId(), param.getAttributes()));
}
}
......
......@@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.entity.ImConversation;
import com.wecloud.im.param.ChatRoomMemberPageParam;
import com.wecloud.im.param.DisbandConversationParam;
import com.wecloud.im.param.ExitChatRoomParam;
......@@ -289,5 +290,16 @@ public class ImConversationController extends BaseController {
return ApiResult.ok(conversationList);
}
/**
* 创建会话
*/
@PostMapping("/sdk/create")
@ApiOperation(value = "创建会话", notes = "后台可配置:两个客户端如果已经创建过会话,是否重复创建会话")
public ApiResult<Long> create(@RequestBody ImConversationCreate imConversationCreate) throws Exception {
log.info("sdk 创建会话入参 {}", JSON.toJSONString(imConversationCreate));
ImConversation conversation = imConversationService.serverCreateImConversation(imConversationCreate);
return ApiResult.ok(conversation.getId());
}
}
......@@ -7,7 +7,10 @@ import lombok.extern.slf4j.Slf4j;
import java.util.Arrays;
import java.util.List;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
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.RequestMapping;
......@@ -38,13 +41,15 @@ public class ImGroupController {
private final ImGroupService groupService;
private final DiscoveryClient discoveryClient;
/**
* 创建群组
* @Author luozh
* @Date 2022年05月10日 02:16:19
* @Return
*/
@PostMapping("/createGroup")
@PostMapping("/create")
public ApiResult<Long> createGroup(@RequestBody CreateGroupParam param) {
log.info("创建群组请求 参数: {}", JSON.toJSONString(param));
List<String> memberClientIds = Arrays.asList(param.getMemberIds().split(","));
......@@ -58,7 +63,7 @@ public class ImGroupController {
* @Date 2022年05月10日 02:16:19
* @Return
*/
@PostMapping("/dismissGroup")
@PostMapping("/dismiss")
public ApiResult<Boolean> dismissGroup(@RequestBody DismissGroupParam param) {
log.info("解散群组请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.dismissGroup(param.getUserId(), param.getGroupId()));
......@@ -70,7 +75,7 @@ public class ImGroupController {
* @Date 2022年05月10日 02:16:19
* @Return
*/
@PostMapping("/joinGroup")
@PostMapping("/join")
public ApiResult<Integer> joinGroup(@Validated @RequestBody JoinGroupParam param) {
log.info("加入群组请求 参数: {}", JSON.toJSONString(param));
List<String> memberIds = Arrays.asList(param.getUserIds().split(","));
......@@ -83,7 +88,7 @@ public class ImGroupController {
* @Date 2022年05月10日 02:16:19
* @Return
*/
@PostMapping("/leaveGroup")
@PostMapping("/leave")
public ApiResult<Integer> leaveGroup(@RequestBody LeaveGroupParam param) {
log.info("离开群组请求 参数: {}", JSON.toJSONString(param));
List<String> memberIds = Arrays.asList(param.getUserIds().split(","));
......@@ -97,7 +102,7 @@ public class ImGroupController {
* @Return
* @return
*/
@PostMapping("/listGroupMembers")
@PostMapping("/member/list")
public ApiResult<List<String>> listGroupMembers(@RequestBody ListGroupMembersParam param) {
log.info("获取群组成员请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.listGroupMembers(param.getGroupId()));
......@@ -110,7 +115,7 @@ public class ImGroupController {
* @Return
* @return
*/
@PostMapping("/mutedMembers")
@PostMapping("/member/muted")
public ApiResult<Boolean> mutedMembers(@RequestBody MutedMembersParam param) {
log.info("禁言群成员请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.mutedMembers(param));
......@@ -123,7 +128,7 @@ public class ImGroupController {
* @param param
* @Return
*/
@PostMapping("/groupOwnerTransfer")
@PostMapping("/ownerTransfer")
public ApiResult<Boolean> groupOwnerTransfer(@RequestBody GroupOwnerTransferParam param) {
log.info("群主转移请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.groupOwnerTransfer(param.getGroupId(), param.getNewGroupOwnerUserId()));
......@@ -136,7 +141,7 @@ public class ImGroupController {
* @param param
* @Return
*/
@PostMapping("/addGroupAdmin")
@PostMapping("/addAdmin")
public ApiResult<Boolean> addGroupAdmin(@Validated @RequestBody ModifyGroupAdminParam param) {
log.info("添加群管理员请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.addGroupAdmin(param.getGroupId(), param.getAdminUserIds()));
......@@ -149,9 +154,15 @@ public class ImGroupController {
* @param param
* @Return
*/
@PostMapping("/removeGroupAdmin")
@PostMapping("/removeAdmin")
public ApiResult<Boolean> removeGroupAdmin(@Validated @RequestBody ModifyGroupAdminParam param) {
log.info("移除群管理员请求 参数: {}", JSON.toJSONString(param));
return ApiResult.ok(groupService.removeGroupAdmin(param.getGroupId(), param.getAdminUserIds()));
}
@GetMapping("/getServiceInstance")
public List<ServiceInstance> getServiceInstance() {
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("providers:com.wecloud.im.router.RouterSendService::");
return serviceInstanceList;
}
}
......@@ -27,6 +27,7 @@ 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.SingleUserNotificationParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgUpdate;
import com.wecloud.im.service.ImMessageService;
......@@ -138,5 +139,11 @@ public class ImMessageController extends BaseController {
return ApiResult.ok(imMessageService.privateStatusMessagePublish(param));
}
@ApiOperation("单个用户通知-普通消息")
@PostMapping("/system-notification/publish")
public ApiResult<Boolean> singleUserNotification(@RequestBody @Validated SingleUserNotificationParam param) {
return ApiResult.ok(imMessageService.singleUserNotification(param));
}
}
......@@ -3,7 +3,7 @@ package com.wecloud.im.controller;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.param.rtc.RtcRecordParam;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import com.wecloud.im.service.ImRtcRecordService;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.controller.BaseController;
......@@ -32,9 +32,9 @@ public class ImRtcRecordController extends BaseController {
@PostMapping("/listRtcRecords")
@ApiOperation(value = "分页获取后台通话记录")
public ApiResult<Page<ImRtcRecord>> listRtcRecords(@RequestBody RtcRecordParam rtcRecordParam){
log.info("获取后台通话记录入参 {}", JSON.toJSONString(rtcRecordParam));
return ApiResult.ok(rtcRecordService.getPageImRtcRecords(rtcRecordParam));
public ApiResult<Page<ImRtcRecord>> listRtcRecords(@RequestBody SingleRtcRecordParam singleRtcRecordParam){
log.info("获取后台通话记录入参 {}", JSON.toJSONString(singleRtcRecordParam));
return ApiResult.ok(rtcRecordService.getPageImRtcRecords(singleRtcRecordParam));
}
}
......@@ -90,4 +90,8 @@ public class ImConversation extends BaseEntity {
@TableField("is_forbid_send_link")
@ApiModelProperty("禁止发链接")
private Boolean forbidSendLink;
@ApiModelProperty("是否为加密聊天 0-否 1-是")
private Integer isEncrypt;
}
......@@ -58,6 +58,9 @@ public class ImRtcRecord extends BaseEntity {
@ApiModelProperty("音视频结束时间")
private Date endTime;
@ApiModelProperty("通话过程中离线次数统计 用于区分异常断线使用")
private Integer offlineTimes;
@ApiModelProperty("创建时间")
private Date createTime;
......
......@@ -154,7 +154,7 @@ public class ImFriendController extends BaseController {
*/
@GetMapping("/sdk/unsureFriends")
@ApiOperation(value = "获取好友请求列表,最多只返回1000个")
public ApiResult<List<ImFriendApplyDto>> getUnsureFriendsSdk(@RequestParam("clientId") String clientId) {
public ApiResult<List<ImFriendApplyDto>> getUnsureFriendsSdk(@RequestParam("userId") String clientId) {
log.info("获取好友请求列表入参 {}", clientId);
Long appId = SecurityUtils.getCurrentAppId();
ImClient imClient = imClientService.getCacheImClient(appId, clientId);
......@@ -185,7 +185,7 @@ public class ImFriendController extends BaseController {
*/
@GetMapping("/sdk/getFriends")
@ApiOperation(value = "全量获取好友列表")
public ApiResult<List<ImFriendBaseDto>> getFriendsSdk(@RequestParam("clientId") String clientId) {
public ApiResult<List<ImFriendBaseDto>> getFriendsSdk(@RequestParam("userId") String clientId) {
Long appId = SecurityUtils.getCurrentAppId();
ImClient imClient = imClientService.getCacheImClient(appId, clientId);
return ApiResult.ok(imFriendService.getFriends(imClient));
......
......@@ -175,7 +175,7 @@ public class ImFriendService extends BaseServiceImpl<ImFriendMapper, ImFriend> {
this.updateByKey(friend);
}
// 检查是否存在会话,如果存在 将会话类型修改为1 单聊 双方都显示
ImConversation existConversation = imConversationMapper.getRepetitionConversationSingle(currentClient.getId(), friendClient.getId());
ImConversation existConversation = imConversationMapper.getRepetitionConversationSingle(currentClient.getId(), friendClient.getId(), 0);
if (existConversation != null && ChatTypeEnum.TEMP.getCode().equals(existConversation.getChatType())) {
existConversation.setChatType(ChatTypeEnum.SINGLE.getCode());
imConversationMapper.updateById(existConversation);
......
......@@ -63,9 +63,10 @@ public interface ImConversationMapper extends BaseMapper<ImConversation> {
*
* @param clientId1
* @param clientId2
* @param isEncrypt 是否加密会话 1-是 0-否
* @return
*/
ImConversation getRepetitionConversationSingle(@Param("clientId1") Long clientId1, @Param("clientId2") Long clientId2);
ImConversation getRepetitionConversationSingle(@Param("clientId1") Long clientId1, @Param("clientId2") Long clientId2, @Param("isEncrypt") Integer isEncrypt);
/**
* 判断重复会话中的Attributes是否一样
......
......@@ -25,4 +25,7 @@ public class ClientRelationVo {
@ApiModelProperty("是否黑名单")
private Boolean blacklist = false;
@ApiModelProperty("好友备注")
private String friendName;
}
package com.wecloud.im.param;
import lombok.Data;
import java.util.Map;
import com.wecloud.im.sdk.enums.ChatTypeEnum;
/**
*
* @Author luozh
* @Date 2022年05月25日 10:35
* @Version 1.0
*/
@Data
public class ConversationExtParam {
/**
* 名称
*/
private String name;
/**
* 拓展属性
*/
private Map<String, Object> attributes;
/**
* 会话类型
*/
private ChatTypeEnum chatType;
public ConversationExtParam() {
}
}
......@@ -3,7 +3,10 @@ package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 发送群聊消息入参
......@@ -30,9 +33,9 @@ public class GroupChatMessageParam {
@ApiModelProperty("消息类型")
private String messageType;
@NotEmpty(message = "消息不能为空")
@NotNull(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
private Map<String, Object> content;
@ApiModelProperty("指定离线推送通知中的推送内容")
private String pushContent;
......
......@@ -3,7 +3,10 @@ package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
*
......@@ -44,9 +47,9 @@ public class GroupChatStatusMessageParam {
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@NotNull(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
private Map<String, Object> content;
/**
* 是否过滤黑名单
......
......@@ -2,6 +2,8 @@ package com.wecloud.im.param;
import lombok.Data;
import java.util.Map;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
......@@ -18,5 +20,5 @@ public class ModifyUserAttributesParam {
private String userId;
@NotNull(message = "attributes 不能为空")
private String attributes;
private Map<String, Object> attributes;
}
......@@ -3,7 +3,10 @@ package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 单聊消息
......@@ -37,9 +40,9 @@ public class PrivateChatMessageParam {
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@NotNull(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
private Map<String, Object> content;
/**
* 指定离线推送通知中的推送内容
......
......@@ -3,7 +3,10 @@ package com.wecloud.im.param;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
*
......@@ -38,9 +41,9 @@ public class PrivateChatStatusMessageParam {
/**
* 消息
*/
@NotEmpty(message = "消息不能为空")
@NotNull(message = "消息不能为空")
@ApiModelProperty("消息")
private String content;
private Map<String, Object> content;
/**
* 是否过滤黑名单
......
package com.wecloud.im.param;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 单个用户通知
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Data
public class SingleUserNotificationParam {
/**
* 发送人用户id
*/
@NotBlank(message = "发送人用户id不能为空")
private String fromUserId;
/**
* 指定一个或多个用户
*/
@NotBlank(message = "接收用户不能为空")
private String toUserIds;
/**
* 消息类型
*/
@NotBlank(message = "消息类型不能为空")
private String messageType;
/**
* 消息
*/
@NotBlank(message = "消息内容不能为空")
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExtParam conversationExt;
}
......@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
import javax.validation.constraints.NotNull;
......@@ -28,11 +29,17 @@ public class ImConversationCreate extends BaseEntity {
private String name;
@ApiModelProperty("string格式,可选 自定义属性,供开发者扩展使用。")
private String attributes;
private Map<String, Object> attributes;
@ApiModelProperty("可选 邀请加入会话的客户端,如创建单聊,则填入对方的clientId")
private List<String> clientIds;
@ApiModelProperty("创建者id,sdk调用时传递该参数")
private String creatorUserId;
@ApiModelProperty("成员用户id,sdk调用时传递该参数")
private String memberUserIds;
/**
* @see com.wecloud.im.sdk.enums.ChatTypeEnum
*/
......@@ -43,4 +50,7 @@ public class ImConversationCreate extends BaseEntity {
@ApiModelProperty("客户端平台: 1 web, 2 安卓, 3 ios, 4 pc-win, 5 pc-macOs, 需与生成sign时的值一致")
private Integer platform;
@ApiModelProperty("是否加密聊天: 1-是 0-否")
private Integer isEncrypt;
}
......@@ -6,6 +6,7 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
......@@ -30,9 +31,9 @@ public class ServerImConversationCreate implements Serializable {
private String name;
/**
* tring格式,可选 自定义属性,供开发者扩展使用。")
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private String attributes;
private Map<String, Object> attributes;
/**
* 应用, 前端")
......
package com.wecloud.im.param.rtc;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author nanqianhao
* @date 2022/5/23
* @apiNote
*/
@Data
@ApiModel(value = "单人rtc音视频查找记录")
public class SingleRtcRecordParam implements Serializable {
private static final long serialVersionUID = 2176804812523348248L;
/**
* 发送者id
*/
@ApiModelProperty("发送者id")
private String fromClientId;
/**
* 接受者id
*/
@ApiModelProperty("接受者id")
private String toClientId;
/**
* 房间id
*/
@ApiModelProperty("房间id")
private String channelId;
/**
* 音视频类型
* @see com.wecloud.im.sdk.enums.CallTypeEnum
*/
@ApiModelProperty("音视频类型")
private Integer callType;
/***
* 页码
*/
@ApiModelProperty("页码")
private Integer pageNum;
/**
* 每页数量
*/
@ApiModelProperty("每页数量")
private Integer pageSize;
}
......@@ -28,7 +28,13 @@ public enum ChatTypeEnum implements BaseEnum {
/**
* 临时会话
*/
TEMP(5, "临时会话");
TEMP(5, "临时会话"),
/**
* 系统会话
*/
SYSTEM(6, "系统会话"),
;
private final Integer code;
private final String desc;
......
package com.wecloud.im.sdk.enums;
import io.geekidea.springbootplus.framework.common.enums.BaseEnum;
/**
* @Author Future
* @Date 2022/6/3 13:12
* @Description 单人音视频操作类型枚举
*/
public enum SingleRtcOperateTypeEnum implements BaseEnum {
/**
* 1 - 同意进入频道
*/
JOIN(1, "join"),
/**
* 2 - 拒接进入频道
*/
REJECT(2, "reject"),
/**
* 2 - 离开频道
*/
LEAVE(3, "leave"),
/**
* 4 - 异常原因断开
*/
ABNORMAL_DISCONNECT(4, "abnormalDisconnect");
SingleRtcOperateTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
private final Integer code;
private final String desc;
@Override
public Integer getCode() {
return this.code;
}
@Override
public String getDesc() {
return this.desc;
}
}
......@@ -123,7 +123,7 @@ public interface ImClientService extends BaseService<ImClient> {
* @return
* @throws Exception
*/
boolean deleteImClient( Long id) throws Exception;
boolean deleteImClient(Long id);
/**
* 获取分页对象
......
......@@ -71,6 +71,14 @@ public interface ImConversationService extends BaseService<ImConversation> {
*/
ImConversation serverCreateImConversation(ServerImConversationCreate imConversationCreate);
/**
* 创建会话 sdk用
*
* @param imConversationCreate
* @return
*/
ImConversation serverCreateImConversation(ImConversationCreate imConversationCreate);
/**
* 将用户添加进会话
......
......@@ -20,6 +20,7 @@ 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.SingleUserNotificationParam;
import com.wecloud.im.param.add.ImMsgRecall;
import com.wecloud.im.param.add.ImMsgSendToOnlineClient;
import com.wecloud.im.param.add.ImMsgUpdate;
......@@ -179,4 +180,12 @@ public interface ImMessageService extends BaseService<ImMessage> {
*/
Boolean privateStatusMessagePublish(PrivateChatStatusMessageParam param);
/**
* 单个用户通知-普通消息
* @Author luozh
* @Date 2022年05月25日 10:42:31
* @param param
* @Return
*/
Boolean singleUserNotification(SingleUserNotificationParam param);
}
package com.wecloud.im.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.RtcRecordParam;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import io.geekidea.springbootplus.framework.common.service.BaseService;
/**
......@@ -18,12 +19,13 @@ public interface ImRtcRecordService extends BaseService<ImRtcRecord> {
* @param param
* @param channelId
*/
void createRtcRecord(CreateRtcChannelParam param, Long channelId);
void createRtcRecord(CreateRtcChannelParam param, Long channelId, ImClient currentClient);
/**
* 更新音视频记录
* @param channelId
* @param type 1-同意进入频道 2-拒接进入频道 3-主动挂断(离开频道)
* @param type 1-同意进入频道 2-拒接进入频道 3-主动挂断(离开频道) 4-异常原因断开
* @see com.wecloud.im.sdk.enums.SingleRtcOperateTypeEnum
*/
void updateRtcRecord(Long channelId, Integer type);
......@@ -31,5 +33,5 @@ public interface ImRtcRecordService extends BaseService<ImRtcRecord> {
/**
* 获取通话记录
*/
Page<ImRtcRecord> getPageImRtcRecords(RtcRecordParam rtcRecordParam);
Page<ImRtcRecord> getPageImRtcRecords(SingleRtcRecordParam singleRtcRecordParam);
}
......@@ -230,4 +230,16 @@ public class ImCallbackServiceImpl implements ImCallbackService {
headers.add("WECLOUD-IM-SIGNATURE", signature);
return headers;
}
public static void main(String[] args) {
// 计算 Signature (数据签名)
String appKey = "QizKVHcILRWp6Td2";
String appSecret = "287d04828099fb7de871e9dda845fa8b6b2302faf2ab3457";
String nonce = NanoId.randomNanoId();
String date = DateUtil.formatHttpDate(new Date());
String signature = SignUtils.buildSignature(appKey, appSecret, nonce, date);
System.out.println("nonce = " + nonce);
System.out.println("date = " + date);
System.out.println("signature = " + signature);
}
}
......@@ -63,6 +63,7 @@ import com.wecloud.im.service.ImClientService;
import com.wecloud.im.vo.ClientInfoVo;
import com.wecloud.im.vo.GetInfoListVo;
import com.wecloud.im.vo.MyInfoVo;
import com.wecloud.im.ws.utils.RedisUtils;
import com.wecloud.utils.SnowflakeUtil;
/**
......@@ -94,6 +95,9 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
@Autowired
private ContextService contextService;
@Autowired
private RedisUtils redisUtils;
@Override
public MyInfoVo getMyInfo() {
ImClient currentClient = contextService.getImClientIfNotNullOrThrow();
......@@ -274,7 +278,7 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
}
@Override
public boolean deleteImClient(Long id) throws Exception {
public boolean deleteImClient(Long id) {
return super.removeById(id);
}
......@@ -321,6 +325,10 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
return imClientMapper.selectById(id);
}
@CacheEvict(key = "#p0")
public void deleteCacheImClient(Long id) {
}
@Override
public List<ImClientSimpleDto> getSimpleClients(Long applicationId, List<String> clientIds) {
return imClientMapper.getSimpleClients(applicationId, clientIds);
......@@ -359,6 +367,9 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
relationVo.setFriendClientId(param.getFriendClientId());
// 查询该好友与自己关系: 陌生人、好友、被拉黑名单
ImFriend imFriend = imFriendService.getByKey(param.getClientId(), param.getFriendClientId());
if (imFriend != null) {
relationVo.setFriendName(imFriend.getFriendName());
}
if (imFriend != null && FriendStateEnum.CONFORM.getCode().equals(imFriend.getState())) {
relationVo.setFriend(true);
}
......@@ -395,7 +406,9 @@ public class ImClientServiceImpl extends BaseServiceImpl<ImClientMapper, ImClien
throw new BusinessException("用户不存在");
}
targetClient.setAttributes(JSONObject.toJSONString(attributes));
// 清除client的redis缓存
redisUtils.delKey("cache" + targetClient.getId());
redisUtils.delKey("cache" + targetClient.getFkAppid() + targetClient.getClientId());
return this.updateById(targetClient);
}
}
......@@ -8,16 +8,18 @@ import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.mapper.ImRtcRecordMapper;
import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.RtcRecordParam;
import com.wecloud.im.param.rtc.SingleRtcRecordParam;
import com.wecloud.im.sdk.enums.RtcStateEnum;
import com.wecloud.im.sdk.enums.SingleRtcOperateTypeEnum;
import com.wecloud.im.service.ImClientService;
import com.wecloud.im.service.ImRtcRecordService;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.service.impl.BaseServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
......@@ -30,14 +32,14 @@ import java.util.Date;
@Service
public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, ImRtcRecord> implements ImRtcRecordService {
@Autowired
@Resource
private ImClientService imClientService;
@Async
@Override
public void createRtcRecord(CreateRtcChannelParam param, Long channelId) {
public void createRtcRecord(CreateRtcChannelParam param, Long channelId, ImClient currentClient) {
try {
ImClient currentClient = imClientService.getCurrentClient();
ImRtcRecord rtcRecord = new ImRtcRecord();
rtcRecord.setId(SnowflakeUtil.getId());
rtcRecord.setFkAppid(currentClient.getFkAppid());
......@@ -59,6 +61,7 @@ public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, I
* @param channelId
* @param type 1-同意进入频道 2-拒接进入频道 3-主动挂断(离开频道)
*/
@Async
@Override
public void updateRtcRecord(Long channelId, Integer type) {
try {
......@@ -67,17 +70,21 @@ public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, I
if (rtcRecord == null) {
return;
}
if (type == 1) {
if (SingleRtcOperateTypeEnum.JOIN.getCode().equals(type)) {
// 同意进入频道
rtcRecord.setState(RtcStateEnum.ING.getCode());
rtcRecord.setStartTime(new Date());
} else if (type == 2) {
} else if (SingleRtcOperateTypeEnum.REJECT.getCode().equals(type)) {
// 拒接进入频道
rtcRecord.setState(RtcStateEnum.END.getCode());
} else {
} else if (SingleRtcOperateTypeEnum.LEAVE.getCode().equals(type)) {
// 主动挂断(离开频道)
rtcRecord.setState(RtcStateEnum.END.getCode());
rtcRecord.setEndTime(new Date());
} else if (SingleRtcOperateTypeEnum.ABNORMAL_DISCONNECT.getCode().equals(type)) {
// 异常原因(客户端已不在线)
rtcRecord.setState(RtcStateEnum.END.getCode());
rtcRecord.setEndTime(new Date());
}
this.updateById(rtcRecord);
} catch (Exception e) {
......@@ -86,14 +93,16 @@ public class ImRtcRecordServiceImpl extends BaseServiceImpl<ImRtcRecordMapper, I
}
@Override
public Page<ImRtcRecord> getPageImRtcRecords(RtcRecordParam rtcRecordParam) {
public Page<ImRtcRecord> getPageImRtcRecords(SingleRtcRecordParam singleRtcRecordParam) {
ImClient imClient = imClientService.getCurrentClient();
LambdaQueryWrapper<ImRtcRecord> rtcRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
rtcRecordLambdaQueryWrapper.like(rtcRecordParam.getFromClientId()!=null,ImRtcRecord::getFromClientId,rtcRecordParam.getFromClientId());
rtcRecordLambdaQueryWrapper.like(rtcRecordParam.getToClientId()!=null,ImRtcRecord::getToClientId,rtcRecordParam.getToClientId());
rtcRecordLambdaQueryWrapper.like(rtcRecordParam.getChannelId()!=null,ImRtcRecord::getChannelId,rtcRecordParam.getChannelId());
rtcRecordLambdaQueryWrapper.eq(rtcRecordParam.getCallType()!=null,ImRtcRecord::getCallType,rtcRecordParam.getCallType());
rtcRecordLambdaQueryWrapper.eq(ImRtcRecord::getFkAppid, imClient.getFkAppid());
rtcRecordLambdaQueryWrapper.eq(singleRtcRecordParam.getFromClientId()!=null,ImRtcRecord::getFromClientId, singleRtcRecordParam.getFromClientId());
rtcRecordLambdaQueryWrapper.eq(singleRtcRecordParam.getToClientId()!=null,ImRtcRecord::getToClientId, singleRtcRecordParam.getToClientId());
rtcRecordLambdaQueryWrapper.eq(singleRtcRecordParam.getChannelId()!=null,ImRtcRecord::getChannelId, singleRtcRecordParam.getChannelId());
rtcRecordLambdaQueryWrapper.eq(singleRtcRecordParam.getCallType()!=null,ImRtcRecord::getCallType, singleRtcRecordParam.getCallType());
rtcRecordLambdaQueryWrapper.orderByDesc(ImRtcRecord::getCreateTime);
Page<ImRtcRecord> pageParam = new Page<>(rtcRecordParam.getPageNum(), rtcRecordParam.getPageSize());
Page<ImRtcRecord> pageParam = new Page<>(singleRtcRecordParam.getPageNum(), singleRtcRecordParam.getPageSize());
Page<ImRtcRecord> page = this.page(pageParam, rtcRecordLambdaQueryWrapper);
return page;
}
......
......@@ -7,7 +7,6 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonIgnore;
......@@ -44,7 +43,7 @@ public class ConversationVo implements Serializable {
private String attribute;
@ApiModelProperty("可选 自定义属性,供开发者扩展使用。")
private HashMap attributes;
private String attributes;
@ApiModelProperty("可选 对话类型标志,是否是系统对话,后面会说明。")
private Boolean systemFlag;
......@@ -94,4 +93,8 @@ public class ConversationVo implements Serializable {
@TableField("is_top")
private Boolean top;
@ApiModelProperty("是否为加密聊天 0-否 1-是")
private Integer isEncrypt;
}
package com.wecloud.im.ws.cache;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.ws.utils.SpringBeanUtils;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.event.EventListener;
......
......@@ -43,4 +43,9 @@ public interface RtcService {
*/
Boolean candidateForward(CandidateForwardParam candidateForwardParam);
/**
* 异常断线判断处理
*/
void abnormalDisconnect();
}
package com.wecloud.rtc.service.impl;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
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.stereotype.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wecloud.im.entity.ImApplication;
import com.wecloud.im.entity.ImClient;
import com.wecloud.im.entity.ImRtcRecord;
import com.wecloud.im.param.rtc.CandidateForwardParam;
import com.wecloud.im.param.rtc.CreateRtcChannelParam;
import com.wecloud.im.param.rtc.CreateRtcChannelResult;
......@@ -20,6 +12,7 @@ import com.wecloud.im.param.rtc.JoinRtcChannelParam;
import com.wecloud.im.param.rtc.LeaveRtcChannelParam;
import com.wecloud.im.param.rtc.RejectRtcChannelParam;
import com.wecloud.im.param.rtc.SdpForwardParam;
import com.wecloud.im.sdk.enums.SingleRtcOperateTypeEnum;
import com.wecloud.im.service.ImApplicationService;
import com.wecloud.im.service.ImClientBlacklistService;
import com.wecloud.im.service.ImClientService;
......@@ -36,11 +29,22 @@ import com.wecloud.rtc.service.MangerRtcCacheService;
import com.wecloud.rtc.service.RtcService;
import com.wecloud.rtc.service.WsRtcWrite;
import com.wecloud.utils.SnowflakeUtil;
import io.geekidea.springbootplus.framework.common.api.ApiCode;
import io.geekidea.springbootplus.framework.common.api.ApiResult;
import io.geekidea.springbootplus.framework.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class RtcServiceImpl extends UserStateListener implements RtcService {
private static final Integer MAX_OFFLINE_TIMES = 3;
@Autowired
private ImApplicationService imApplicationService;
......@@ -119,8 +123,8 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
wsRtcWrite.rtcCall(rtcCallResponse, toClient.getId());
// 创建通话记录 todo 优化为mq推送
imRtcRecordService.createRtcRecord(createRtcChannelParam, createRtcChannelResult.getChannelId());
// 创建通话记录
imRtcRecordService.createRtcRecord(createRtcChannelParam, createRtcChannelResult.getChannelId(), currentClient);
// TODO 待开发 下发安卓和ios系统推送
......@@ -153,8 +157,8 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
wsRtcWrite.clientJoin(rtcSdpForwardResponse, Long.valueOf(toClientId));
}
// 更新通话记录 todo 优化为mq推送
imRtcRecordService.updateRtcRecord(joinRtcChannelParam.getChannelId(), 1);
// 更新通话记录
imRtcRecordService.updateRtcRecord(joinRtcChannelParam.getChannelId(), SingleRtcOperateTypeEnum.JOIN.getCode());
return true;
}
......@@ -187,8 +191,8 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
mangerRtcCacheService.delChannelInfo(rejectRtcChannelParam.getChannelId());
}
// 更新通话记录 todo 优化为mq推送
imRtcRecordService.updateRtcRecord(rejectRtcChannelParam.getChannelId(), 2);
// 更新通话记录
imRtcRecordService.updateRtcRecord(rejectRtcChannelParam.getChannelId(), SingleRtcOperateTypeEnum.REJECT.getCode());
return true;
}
......@@ -198,8 +202,8 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
ImClient currentClient = imClientService.getCurrentClient();
this.leave(leaveRtcChannelParam, currentClient);
// 更新通话记录 todo 优化为mq推送
imRtcRecordService.updateRtcRecord(leaveRtcChannelParam.getChannelId(), 3);
// 更新通话记录
imRtcRecordService.updateRtcRecord(leaveRtcChannelParam.getChannelId(), SingleRtcOperateTypeEnum.LEAVE.getCode());
return true;
}
......@@ -313,6 +317,37 @@ public class RtcServiceImpl extends UserStateListener implements RtcService {
return true;
}
@Override
public void abnormalDisconnect() {
List<ImRtcRecord> records = imRtcRecordService.list(new QueryWrapper<ImRtcRecord>().lambda()
.ne(ImRtcRecord::getState, 3));
if (CollectionUtils.isEmpty(records)) {
return;
}
for (ImRtcRecord record : records) {
try {
if (record.getOfflineTimes() >= MAX_OFFLINE_TIMES) {
// 最大离线次数到阈值,做离线处理
imRtcRecordService.updateRtcRecord(record.getChannelId(), SingleRtcOperateTypeEnum.ABNORMAL_DISCONNECT.getCode());
} else {
// 判断频道内两个人是否离线 只要其中一人离线 则认定为离线 将该通话离线次数 +1
ImClient fromClient = imClientService.getCacheImClient(record.getFkAppid(), record.getFromClientId());
ImClient toClient = imClientService.getCacheImClient(record.getFkAppid(), record.getToClientId());
boolean isFromClientOnline = userStateCacheManager.isOnline(fromClient.getId());
boolean isToClientOnline = userStateCacheManager.isOnline(toClient.getId());
if (isFromClientOnline && isToClientOnline) {
// 双方均在线 跳过
continue;
}
record.setOfflineTimes(record.getOfflineTimes() + 1);
imRtcRecordService.updateById(record);
}
} catch (Exception e) {
log.info("单人音视频 {} ,处理异常 ", JSON.toJSONString(record), e);
}
}
}
/**
* 判断是否被拉黑
......
......@@ -37,6 +37,7 @@
imConversation.is_forbid_send_pic as forbid_send_pic,
imConversation.is_forbid_send_link as forbid_send_link,
imConversation.head_portrait,
imConversation.is_encrypt isEncrypt,
im_client.client_id AS creator,
imConversationMembers.is_top as top,
imConversationMembers.is_do_not_disturb as do_not_disturb,
......@@ -87,8 +88,9 @@
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 in (1, 5)
where con.chat_type in (1, 5, 6)
and con.member_count = 2
and con.is_encrypt = #{isEncrypt}
order by con.id asc
LIMIT 1
</select>
......
......@@ -33,7 +33,8 @@
im_message.`at`,
im_message.send_status,
im_message.fk_conversation_id,
im_message.`msg_type` AS 'type', (SELECT COUNT(id)
im_message.`msg_type` AS 'type',
(SELECT COUNT(id)
FROM im_inbox
WHERE fk_msg_id = msgId
AND read_msg_status = 0) AS not_read_count,
......@@ -73,7 +74,8 @@
FROM `im_message`
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
WHERE fk_conversation_id = #{param.conversationId} and im_message.is_delete = 1 and im_message.withdraw = 0
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is
null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
<if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart}
</if>
......@@ -107,7 +109,8 @@
FROM `im_message`
INNER JOIN `im_client` ON `im_client`.id = `im_message`.sender
WHERE fk_conversation_id = #{param.conversationId} and im_message.is_delete = 1 and im_message.withdraw = 0
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{param.currentFkClientId} and (receivers is
null || (receivers !=null and FIND_IN_SET(#{param.currentFkClientId}, receivers))) ))
<if test="param.msgIdStart != null">
AND im_message.id > #{param.msgIdStart}
</if>
......@@ -137,14 +140,16 @@
im_message.`event`,
im_message.system_flag,
im_message.`at`,
im_message.`msg_type` AS 'type', im_message.send_status,
im_message.`msg_type` AS 'type',
im_message.send_status,
im_message.fk_conversation_id
FROM im_inbox
INNER JOIN im_message ON im_message.id = im_inbox.fk_msg_id
INNER JOIN im_client AS im_client ON im_client.id = im_message.sender
WHERE im_inbox.receiver = #{clientId}
AND im_inbox.fk_conversation_id = #{conversationId}
ORDER BY create_time DESC LIMIT 1
ORDER BY create_time DESC
LIMIT 1
</select>
<select id="getLastMsgByConversationId" resultType="com.wecloud.im.vo.OfflineMsgDto">
......@@ -159,13 +164,17 @@
im_message.system_flag,
im_message.`at`,
im_message.send_status,
im_message.`msg_type` AS 'type', im_message.fk_conversation_id
im_message.`msg_type` AS 'type',
im_message.fk_conversation_id
FROM im_message
INNER JOIN im_client AS im_client ON im_client.id = im_message.sender
WHERE im_message.fk_conversation_id = #{conversationId}
and (im_message.`event`=0 || (im_message.`event`=1 and sender != #{currentFkClientId} and (receivers is null || (receivers !=null and FIND_IN_SET(#{currentFkClientId}, receivers))) ))
and (im_message.`event` = 0 || (im_message.`event` = 1 and sender != #{currentFkClientId} and
(receivers is null ||
(receivers != null and FIND_IN_SET(#{currentFkClientId}, receivers)))))
ORDER BY create_time DESC LIMIT 1
ORDER BY create_time DESC
LIMIT 1
</select>
<select id="getReaders" resultType="com.wecloud.im.vo.ReaderVo">
......@@ -174,7 +183,8 @@
client.nickname as nickname,
client.client_id as clientId,
inbox.read_msg_status as readMsgStatus
FROM `im_inbox` inbox LEFT JOIN im_client client on inbox.receiver = client.id
FROM `im_inbox` inbox
LEFT JOIN im_client client on inbox.receiver = client.id
WHERE inbox.fk_conversation_id = #{param.conversationId}
and inbox.fk_msg_id = #{param.msgId}
and inbox.receiver != #{currentClientId}
......
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
-- 在feature-cluster 2021年12月22日之后,需要执行的的sql增量脚本
......@@ -185,4 +185,15 @@ CREATE TABLE `im_rtc_record`
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='单人音视频聊天记录表';
ALTER TABLE im_rtc_record
ADD COLUMN `offline_times` tinyint(1) unsigned DEFAULT '0' COMMENT '通话过程中离线次数统计';
ALTER TABLE `im_rtc_record`
ADD INDEX `idx_state_create_time`(`state`, `create_time`);
ALTER TABLE im_conversation
ADD COLUMN `is_encrypt` tinyint(1) unsigned DEFAULT '0' COMMENT '是否加密聊天: 1-是 0-否';
......@@ -26,7 +26,7 @@ public class SignUtils {
public static final String NEW_LINE = "\n";
public static String buildCanonicalString(String method, String resourcePath, Map<String, String> headers, Map<String, String> parameters) {
public static String buildCanonicalString(String method, String resourcePath, Map<String, String> headers) {
StringBuilder canonicalString = new StringBuilder();
canonicalString.append(method).append(NEW_LINE);
......@@ -69,38 +69,16 @@ public class SignUtils {
}
// Append canonical resource to canonical string
canonicalString.append(buildCanonicalizedResource(resourcePath, parameters));
canonicalString.append(buildCanonicalizedResource(resourcePath));
return canonicalString.toString();
}
private static String buildCanonicalizedResource(String resourcePath, Map<String, String> parameters) {
private static String buildCanonicalizedResource(String resourcePath) {
Assert.isTrue(resourcePath.startsWith("/"), "Resource path should start with slash character");
StringBuilder builder = new StringBuilder();
builder.append(uriEncoding(resourcePath));
if (parameters != null) {
TreeMap<String, String> canonicalizedParams = new TreeMap<String, String>();
for (Map.Entry<String, String> param : parameters.entrySet()) {
if (param.getValue() != null) {
canonicalizedParams.put(uriEncoding(param.getKey()), uriEncoding(param.getValue()));
} else {
canonicalizedParams.put(uriEncoding(param.getKey()), null);
}
}
char separator = '?';
for (Map.Entry<String, String> entry : canonicalizedParams.entrySet()) {
builder.append(separator);
builder.append(entry.getKey());
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
builder.append("=").append(entry.getValue());
}
separator = '&';
}
}
return builder.toString();
}
......@@ -135,8 +113,8 @@ public class SignUtils {
return result;
}
public static String buildSignature(String secretAccessKey, String httpMethod, String resourcePath, Map<String, String> headers, Map<String, String> parameters) {
String canonicalString = buildCanonicalString(httpMethod, resourcePath, headers, parameters);
public static String buildSignature(String secretAccessKey, String httpMethod, String resourcePath, Map<String, String> headers) {
String canonicalString = buildCanonicalString(httpMethod, resourcePath, headers);
return new HmacSHA256Signature().computeSignature(secretAccessKey, canonicalString);
}
......
......@@ -41,8 +41,6 @@ public class SignatureChecker {
* @Return appKey
*/
public static void check(HttpServletRequest request, String clientSignature, String appSecret) {
// 获取到入参
Map<String, String> params = getParameterMap(request);
// 获取请求头
Map<String, String> headers = getHeaderMap(request);
// resourcePath
......@@ -50,7 +48,7 @@ public class SignatureChecker {
// request methos
String requestMethod = request.getMethod();
String canonicalString = SignUtils.buildCanonicalString(requestMethod, resourcePath, headers, params);
String canonicalString = SignUtils.buildCanonicalString(requestMethod, resourcePath, headers);
log.info("服务端api签名字符串: {}", canonicalString);
log.info("服务端api appSecret: {}", appSecret);
String serverSignature = new HmacSHA256Signature().computeSignature(appSecret, canonicalString);
......
......@@ -99,27 +99,27 @@ public class ResourcePathConstants {
/**
* 创建群
*/
public static final String CREATE_GROUP_REQUEST = "/api/group/createGroup";
public static final String CREATE_GROUP_REQUEST = "/api/group/create";
/**
* 解散群
*/
public static final String DISMISS_GROUP_REQUEST = "/api/group/dismissGroup";
public static final String DISMISS_GROUP_REQUEST = "/api/group/dismiss";
/**
* 加入群
*/
public static final String JOIN_GROUP_REQUEST = "/api/group/joinGroup";
public static final String JOIN_GROUP_REQUEST = "/api/group/join";
/**
* 离开群
*/
public static final String LEAVE_GROUP_REQUEST = "/api/group/leaveGroup";
public static final String LEAVE_GROUP_REQUEST = "/api/group/leave";
/**
* 获取群成员列表
*/
public static final String LIST_GROUP_MEMBERS_REQUEST = "/api/group/listGroupMembers";
public static final String LIST_GROUP_MEMBERS_REQUEST = "/api/group/member/list";
/**
* 群设置请求
......@@ -149,26 +149,36 @@ public class ResourcePathConstants {
/**
* 禁言群成员
*/
public static final String MUTED_GROUP_MEMBER_REQUEST = "/api/group/mutedMembers";
public static final String MUTED_GROUP_MEMBER_REQUEST = "/api/group/member/muted";
/**
* 更换群主 请求
*/
public static final String GROUP_OWNER_TRANSFER_REQUEST = "/api/group/groupOwnerTransfer";
public static final String GROUP_OWNER_TRANSFER_REQUEST = "/api/group/ownerTransfer";
/**
* 添加群管理员 请求
*/
public static final String ADD_GROUP_ADMIN_REQUEST = "/api/group/addGroupAdmin";
public static final String ADD_GROUP_ADMIN_REQUEST = "/api/group/addAdmin";
/**
* 移除群管理员 请求
*/
public static final String REMOVE_GROUP_ADMIN_REQUEST = "/api/group/removeGroupAdmin";
public static final String REMOVE_GROUP_ADMIN_REQUEST = "/api/group/removeAdmin";
/**
* 获取通话记录请求
*/
public static final String LIST_RTCRECORDS_REQUEST = "/api/rtcrecord/listRtcRecords";
/**
* 单次发布
*/
public static final String SINGLE_USER_NOTIFICATION_REQUEST = "/api/imMessage/system-notification/publish";
/**
* 创建会话
*/
public static final String CREATE_CONVERSATION_REQUEST = "/api/conversation/sdk/create";
}
package com.wecloud.im.sdk;
import com.wecloud.im.sdk.model.*;
import java.util.List;
import com.wecloud.im.sdk.model.Attributes;
import com.wecloud.im.sdk.model.Blacklist;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientRelation;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.CreateConversation;
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.GroupSettingParam;
import com.wecloud.im.sdk.model.ImClient;
import com.wecloud.im.sdk.model.ImRtcRecord;
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.RtcRecord;
import com.wecloud.im.sdk.model.SingleUserNotification;
import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UnsureFriend;
/**
*
* @Author luozh
......@@ -16,11 +34,10 @@ public interface WecloudIm {
* 注册客户端
* @Author luozh
* @Date 2022年04月13日 04:25:52
* @param userId
* @param headPortrait
* @param nickname
* @param userId 用户id
* @param headPortrait 头像
* @param nickname 昵称
* @Return
* @return
*/
ImClient registerUser(String userId, String headPortrait, String nickname);
......@@ -53,7 +70,7 @@ public interface WecloudIm {
* @param userId 用户id
* @Return
*/
UserAttributes getUserAttributes(String userId);
Attributes getUserAttributes(String userId);
/**
* 更新用户拓展信息
......@@ -63,7 +80,7 @@ public interface WecloudIm {
* @param attributes 用户拓展字段
* @Return
*/
Boolean modifyUserAttributes(String userId, UserAttributes attributes);
Boolean modifyUserAttributes(String userId, Attributes attributes);
/**
* 封禁用户
......@@ -94,6 +111,39 @@ public interface WecloudIm {
List<Friend> getFriends(String userId);
/**
* 好友申请
* @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年05月16日 10:14:07
* @param userId
* @param friendUserIds
* @Return
*/
Boolean unfriend(String userId, String friendUserIds);
/**
* 备注好友
* @Author luozh
* @Date 2022年05月16日 11:13:35
* @param userId
* @param friendUserId
* @param remark
* @Return
*/
Boolean remarkFriend(String userId, String friendUserId, String remark);
/**
* 用户好友关系
* @Author luozh
* @Date 2022年05月13日 10:58:28
......@@ -122,6 +172,23 @@ public interface WecloudIm {
PageResult<Blacklist> pageBlacklist(Integer pageIndex, Integer pageSize, String userId);
/**
* 创建会话
* @Author Shadow
* @Date 2022年05月31日 03:54:49
* @param
* @Return
*/
Long createConversation(CreateConversation createConversation);
/**
* 批量获取会话信息
* @param chatType 会话属性,1:单聊,2:普通群,3:万人群,4:聊天室
* @param conversationIds
* @return
*/
List<Conversation> listConversation(Integer chatType, List<Long> conversationIds);
/**
* 设置会话置顶
* @Author luozh
* @Date 2022年04月26日 03:33:44
......@@ -144,18 +211,6 @@ public interface WecloudIm {
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
......@@ -173,14 +228,6 @@ public interface WecloudIm {
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
......@@ -220,7 +267,7 @@ public interface WecloudIm {
* 创建群组
* @Author luozh
* @Date 2022年05月09日 06:34:58
* @param userId 用户id
* @param groupOwnerUserId 用户id
* @param groupName 用户名称
* @param memberIds 群成员
* @Return 创建结果 true/false
......@@ -313,30 +360,18 @@ public interface WecloudIm {
Boolean removeGroupAdmin(String groupId, String adminUserIds);
/**
* 删除好友
* @Author luozh
* @Date 2022年05月16日 10:14:07
* @param userId
* @param friendUserIds
* @Return
* 获取通话记录列表
* @Author nanqianhao
* @Date 2022年05月23日 11:30
*/
Boolean unfriend(String userId, String friendUserIds);
PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecord rtcRecord);
/**
* 备注好友
* 单个用户通知
* @Author luozh
* @Date 2022年05月16日 11:13:35
* @param userId
* @param friendUserId
* @param remark
* @Date 2022年05月25日 09:36:47
* @param
* @Return
*/
Boolean remarkFriend(String userId, String friendUserId, String remark);
/**
* 获取通话记录列表
* @Author nanqianhao
* @Date 2022年05月23日 11:30
*/
PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecordRequest rtcRecordRequest);
Boolean singleUserNotification(SingleUserNotification singleUserNotification);
}
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.*;
import com.wecloud.im.sdk.model.*;
import java.net.URL;
import java.util.List;
import com.wecloud.im.sdk.internal.WecloudImContactsOperation;
import com.wecloud.im.sdk.internal.WecloudImConversationOperation;
import com.wecloud.im.sdk.internal.WecloudImGroupOperation;
import com.wecloud.im.sdk.internal.WecloudImMessageOperation;
import com.wecloud.im.sdk.internal.WecloudImRtcRecordOperation;
import com.wecloud.im.sdk.internal.WecloudImSystemNotificationOperation;
import com.wecloud.im.sdk.internal.WecloudImUserOperation;
import com.wecloud.im.sdk.model.*;
/**
*
......@@ -44,6 +51,8 @@ public class WecloudImClient implements WecloudIm {
private WecloudImRtcRecordOperation imRtcRecordOperation;
private WecloudImSystemNotificationOperation imSystemNotificationOperation;
public WecloudImClient(URL apiDomain, String appKey, String appSecret) {
this.apiDomain = apiDomain;
this.appKey = appKey;
......@@ -77,13 +86,13 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public UserAttributes getUserAttributes(String userId) {
public Attributes getUserAttributes(String userId) {
GetUserAttributesRequest getUserAttributesRequest = GetUserAttributesRequest.builder().userId(userId).build();
return imUserOperation.getUserAttributes(getUserAttributesRequest);
}
@Override
public Boolean modifyUserAttributes(String userId, UserAttributes attributes) {
public Boolean modifyUserAttributes(String userId, Attributes attributes) {
ModifyUserAttributesRequest modifyUserAttributesRequest =
ModifyUserAttributesRequest.builder().userId(userId).attributes(attributes).build();
;
......@@ -156,6 +165,18 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public Long createConversation(CreateConversation createConversation) {
CreateConversationRequest request = CreateConversationRequest.builder()
.name(createConversation.getName())
.creatorUserId(createConversation.getCreatorUserId())
.memberUserIds(createConversation.getMemberUserIds())
.chatType(createConversation.getChatType())
.attributes(createConversation.getAttributes())
.build();
return imConversationOperation.create(request);
}
@Override
public List<Conversation> listConversation(Integer chatType, List<Long> conversationIds) {
ListConversationRequest request = ListConversationRequest.builder().chatType(chatType)
.conversationIds(conversationIds).build();
......@@ -301,16 +322,25 @@ public class WecloudImClient implements WecloudIm {
}
@Override
public PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecordRequest rtcRecordRequest) {
public PageResult<ImRtcRecord> getPageImRtcRecords(RtcRecord record) {
RtcRecordRequest rtcRecordRequest = BeanUtil.toBean(record, RtcRecordRequest.class);
return imRtcRecordOperation.listRtcRecords(rtcRecordRequest);
}
@Override
public Boolean singleUserNotification(SingleUserNotification singleUserNotification) {
SingleUserNotificationRequest singleUserNotificationRequest = BeanUtil.toBean(singleUserNotification,
SingleUserNotificationRequest.class);
return imSystemNotificationOperation.singleUserNotification(singleUserNotificationRequest);
}
private void initOperations() {
this.imUserOperation = new WecloudImUserOperation(apiDomain, appKey, appSecret);
this.imConversationOperation = new WecloudImConversationOperation(apiDomain, appKey, appSecret);
this.imMessageOperation = new WecloudImMessageOperation(apiDomain, appKey, appSecret);
this.imGroupOperation = new WecloudImGroupOperation(apiDomain, appKey, appSecret);
this.imContactsOperation = new WecloudImContactsOperation(apiDomain, appKey, appSecret);
this.imRtcRecordOperation=new WecloudImRtcRecordOperation(apiDomain, appKey, appSecret);
this.imRtcRecordOperation = new WecloudImRtcRecordOperation(apiDomain, appKey, appSecret);
this.imSystemNotificationOperation = new WecloudImSystemNotificationOperation(apiDomain, appKey, appSecret);
}
}
......@@ -25,7 +25,7 @@ import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import com.alibaba.fastjson.JSON;
import com.wecloud.im.sdk.exception.WecloudException;
import com.wecloud.im.sdk.exception.WecloudImException;
/**
*
......@@ -38,7 +38,7 @@ public class HttpClient {
private static volatile OkHttpClient okHttpClient = null;
private static volatile Semaphore semaphore = null;
private Map<String, String> headerMap;
private Map<String, String> paramMap;
private Map<String, Object> paramMap;
private URL url;
private Request.Builder request;
......@@ -121,7 +121,7 @@ public class HttpClient {
* @param params
* @Return
*/
public HttpClient addParams(Map<String, String> params) {
public HttpClient addParams(Map<String, Object> params) {
if (paramMap == null) {
paramMap = new LinkedHashMap<>(16);
}
......@@ -163,10 +163,10 @@ public class HttpClient {
if (paramMap != null) {
urlBuilder.append("?");
try {
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
for (Map.Entry<String, Object> entry : paramMap.entrySet()) {
urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
append("=").
append(URLEncoder.encode(entry.getValue(), "utf-8")).
append(URLEncoder.encode(entry.getValue().toString(), "utf-8")).
append("&");
}
} catch (Exception e) {
......@@ -196,7 +196,7 @@ public class HttpClient {
} else {
FormBody.Builder formBody = new FormBody.Builder();
if (paramMap != null) {
paramMap.forEach(formBody::add);
paramMap.forEach((k, v) -> formBody.add(k, v.toString()));
}
requestBody = formBody.build();
}
......@@ -215,7 +215,7 @@ public class HttpClient {
return okHttpClient.newCall(request.build()).execute();
} catch (Exception e) {
throw new WecloudException("请求失败:" + e.getMessage());
throw new WecloudImException(400, "请求失败:" + e.getMessage());
}
}
......@@ -241,7 +241,7 @@ public class HttpClient {
try {
getSemaphoreInstance().acquire();
} catch (InterruptedException e) {
throw new WecloudException("请求失败:" + e.getMessage());
throw new WecloudImException(400, "请求失败:" + e.getMessage());
}
return buffer.toString();
}
......@@ -297,7 +297,7 @@ public class HttpClient {
sc.init(null, trustAllCerts, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
throw new WecloudException("请求失败:" + e.getMessage());
throw new WecloudImException(400, "请求失败:" + e.getMessage());
}
return ssfFactory;
}
......
......@@ -33,7 +33,7 @@ public class RequestMessage extends HttpMesssage {
/**
* Use a LinkedHashMap to preserve the insertion order.
*/
private Map<String, String> parameters = new LinkedHashMap<String, String>();
private Map<String, Object> parameters = new LinkedHashMap<>();
/**
* The original request provided by user
......@@ -84,11 +84,11 @@ public class RequestMessage extends HttpMesssage {
this.platform = platform;
}
public Map<String, String> getParameters() {
public Map<String, Object> getParameters() {
return parameters;
}
public void setParameters(Map<String, String> parameters) {
public void setParameters(Map<String, Object> parameters) {
this.parameters.clear();
if (parameters != null && !parameters.isEmpty()) {
this.parameters.putAll(parameters);
......
package com.wecloud.im.sdk.exception;
import lombok.Getter;
/**
*
* @Author luozh
* @Date 2022年04月13日 16:48
* @Version 1.0
*/
public class WecloudException extends RuntimeException {
public class WecloudImException extends RuntimeException {
@Getter
private int code;
/**
* 错误提示
*/
@Getter
private String message;
public WecloudException(String message) {
public WecloudImException(Integer code, String message) {
super(message);
this.code = code;
this.message = message;
}
}
......@@ -3,6 +3,7 @@ package com.wecloud.im.sdk.internal;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.ApiResult;
import com.wecloud.im.sdk.exception.WecloudImException;
/**
*
......@@ -21,6 +22,10 @@ public class ResponseParser {
TypeReference<ApiResult<Object>> typeRef = new TypeReference<ApiResult<Object>>() {
};
ApiResult<Object> apiResult = (ApiResult<Object>) JSON.parseObject(jsonResult, typeRef);
// 判断apiResult
if (!(apiResult.getCode() == 200)) {
throw new WecloudImException(apiResult.getCode(), apiResult.getMessage());
}
return apiResult.getData();
}
}
......@@ -61,7 +61,6 @@ public class SignUtils {
// Append fixed headers to sign to canonical string
for (Map.Entry<String, String> entry : fixedHeadersToSign.entrySet()) {
Object value = entry.getValue();
canonicalString.append(value);
canonicalString.append(SignParameters.NEW_LINE);
}
......@@ -75,38 +74,16 @@ public class SignUtils {
}
// Append canonical resource to canonical string
canonicalString.append(buildCanonicalizedResource(resourcePath, request.getParameters()));
canonicalString.append(buildCanonicalizedResource(resourcePath));
return canonicalString.toString();
}
private static String buildCanonicalizedResource(String resourcePath, Map<String, String> parameters) {
private static String buildCanonicalizedResource(String resourcePath) {
Assert.isTrue(resourcePath.startsWith("/"), "Resource path should start with slash character");
StringBuilder builder = new StringBuilder();
builder.append(uriEncoding(resourcePath));
if (parameters != null) {
TreeMap<String, String> canonicalizedParams = new TreeMap<String, String>();
for (Map.Entry<String, String> param : parameters.entrySet()) {
if (param.getValue() != null) {
canonicalizedParams.put(uriEncoding(param.getKey()), uriEncoding(param.getValue()));
} else {
canonicalizedParams.put(uriEncoding(param.getKey()), null);
}
}
char separator = '?';
for (Map.Entry<String, String> entry : canonicalizedParams.entrySet()) {
builder.append(separator);
builder.append(entry.getKey());
if (entry.getValue() != null && !entry.getValue().isEmpty()) {
builder.append("=").append(entry.getValue());
}
separator = '&';
}
}
return builder.toString();
}
......
......@@ -56,8 +56,8 @@ public class WecloudImContactsOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("clientId", userId + "");
Map<String, Object> param = new HashMap<>();
param.put("userId", userId + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_UNSURE_FRIENDS)
......@@ -83,8 +83,8 @@ public class WecloudImContactsOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
param.put("clientId", userId + "");
Map<String, Object> param = new HashMap<>();
param.put("userId", userId + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_FRIENDS)
.setMethod(HttpMethod.GET).setParameters(param)
......@@ -110,7 +110,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
param.put("friendName", Optional.ofNullable(friendRequestRequest.getFriendName()).orElse(""));
......@@ -140,7 +140,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(friendId, "friendId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("conversationId", conversationId + "");
param.put("clientId", userId + "");
param.put("friendClientId", friendId + "");
......@@ -172,7 +172,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
if (pageBlacklistRequest.getPageSize() == null) {
pageBlacklistRequest.setPageSize(10);
}
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", pageBlacklistRequest.getUserId());
param.put("pageIndex", pageBlacklistRequest.getPageIndex() + "");
param.put("pageSize", pageBlacklistRequest.getPageSize() + "");
......@@ -196,7 +196,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(friendUserIds, "friendUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("friendUserIds", friendUserIds);
// 发送请求
......@@ -219,7 +219,7 @@ public class WecloudImContactsOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(friendUserId, "friendUserId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("friendUserId", friendUserId);
param.put("friendRemark", remark);
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
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.exception.WecloudImException;
import com.wecloud.im.sdk.model.Conversation;
import com.wecloud.im.sdk.model.CreateConversationRequest;
import com.wecloud.im.sdk.model.ListConversationRequest;
import com.wecloud.im.sdk.model.SetConversationDoNotDisturbRequest;
import com.wecloud.im.sdk.model.SetConversationTopRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.CHAT_SETTING;
import static com.wecloud.im.sdk.ResourcePathConstants.CREATE_CONVERSATION_REQUEST;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_CONVERSATION_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotBlank;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
......@@ -46,7 +52,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
assertParameterNotNull(conversationId, "conversationId");
assertParameterNotNull(top, "top");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId);
param.put("conversationId", conversationId.toString());
param.put("type", "TOP");
......@@ -76,7 +82,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
assertParameterNotNull(conversationId, "conversationId");
assertParameterNotNull(doNotDisturb, "doNotDisturb");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", userId);
param.put("conversationId", conversationId.toString());
param.put("type", "DO_NOT_DISTURB");
......@@ -101,7 +107,7 @@ public class WecloudImConversationOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(listConversationRequest.getConversationIds(), "conversationIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("chatType", listConversationRequest.getChatType() + "");
param.put("conversationIds", JSON.toJSONString(listConversationRequest.getConversationIds()));
// 发送请求
......@@ -115,4 +121,34 @@ public class WecloudImConversationOperation extends WecloudImOperation {
List<Conversation> conversations = JSON.parseObject(JSON.toJSONString(result), typeReference);
return conversations;
}
/**
* 创建会话
* @Author Shadow
* @Date 2022年05月31日 04:26:58
* @param createConversationRequest 创建会话请求
* @Return 会话id
*/
public Long create(CreateConversationRequest createConversationRequest) {
// 参数校验
assertParameterNotBlank(createConversationRequest.getName(), "name");
assertParameterNotBlank(createConversationRequest.getCreatorUserId(), "creatorUserId");
assertParameterNotBlank(createConversationRequest.getMemberUserIds(), "memberUserIds");
assertParameterNotBlank(createConversationRequest.getChatType(), "chatType");
// 校验chatType
String[] allowType = new String[]{"1", "5", "6"};
if (!Arrays.asList(allowType).contains(createConversationRequest.getChatType())) {
throw new WecloudImException(500, "chatType 只能为 1 5 6");
}
// 校验通过 构建参数
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(createConversationRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CREATE_CONVERSATION_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(createConversationRequest).build();
Object result = doOperation(request);
return JSON.parseObject(JSON.toJSONString(result), Long.class);
}
}
......@@ -61,9 +61,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(memberIds, "memberIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(createGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(createGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(CREATE_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -86,9 +86,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(userId, "userId");
assertParameterNotBlank(groupId, "groupId");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(dismissGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(dismissGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(DISMISS_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -113,9 +113,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(joinGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(joinGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(JOIN_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -140,9 +140,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(leaveGroupRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(leaveGroupRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LEAVE_GROUP_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -163,9 +163,9 @@ public class WecloudImGroupOperation extends WecloudImOperation {
// 必填参数校验
assertParameterNotBlank(groupId, "groupId");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(listGroupMembersRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(listGroupMembersRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_GROUP_MEMBERS_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -213,7 +213,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
}
// 校验完成,构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("type", type.name());
param.put("groupId", groupId);
param.put("operatorClientId", operatorClientId);
......@@ -252,7 +252,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotNull(muted, "muted");
assertParameterNotBlank(userIds, "userIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("muted", muted.toString());
param.put("userIds", userIds);
......@@ -272,7 +272,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotNull(newGroupOwnerUserId, "newGroupOwnerUserId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("newGroupOwnerUserId", newGroupOwnerUserId);
// 发送请求
......@@ -291,7 +291,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotNull(adminUserIds, "adminUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("adminUserIds", adminUserIds);
// 发送请求
......@@ -309,7 +309,7 @@ public class WecloudImGroupOperation extends WecloudImOperation {
assertParameterNotBlank(groupId, "groupId");
assertParameterNotNull(adminUserIds, "adminUserIds");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("groupId", groupId);
param.put("adminUserIds", adminUserIds);
// 发送请求
......
......@@ -12,6 +12,7 @@ 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.message.WecloudImMessage;
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;
......@@ -42,16 +43,16 @@ public class WecloudImMessageOperation extends WecloudImOperation {
String fromUserId = publishGroupChatMessageRequest.getFromUserId();
String toGroupIds = publishGroupChatMessageRequest.getToGroupIds();
String messageType = publishGroupChatMessageRequest.getMessageType();
String content = publishGroupChatMessageRequest.getContent();
WecloudImMessage 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>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -71,16 +72,16 @@ public class WecloudImMessageOperation extends WecloudImOperation {
String fromUserId = publishGroupChatStatusMessageRequest.getFromUserId();
String toGroupIds = publishGroupChatStatusMessageRequest.getToGroupIds();
String messageType = publishGroupChatStatusMessageRequest.getMessageType();
String content = publishGroupChatStatusMessageRequest.getContent();
WecloudImMessage 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>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatStatusMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishGroupChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_GROUP_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -93,16 +94,16 @@ public class WecloudImMessageOperation extends WecloudImOperation {
String fromUserId = publishPrivateChatMessageRequest.getFromUserId();
String toUserIds = publishPrivateChatMessageRequest.getToUserIds();
String messageType = publishPrivateChatMessageRequest.getMessageType();
String content = publishPrivateChatMessageRequest.getContent();
WecloudImMessage 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>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......@@ -115,16 +116,16 @@ public class WecloudImMessageOperation extends WecloudImOperation {
String fromUserId = publishPrivateChatStatusMessageRequest.getFromUserId();
String toUserIds = publishPrivateChatStatusMessageRequest.getToUserIds();
String messageType = publishPrivateChatStatusMessageRequest.getMessageType();
String content = publishPrivateChatStatusMessageRequest.getContent();
WecloudImMessage 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>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatStatusMessageRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(publishPrivateChatStatusMessageRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(PUBLISH_PRIVATE_CHAT_STATUS_MESSAGE_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......
......@@ -11,7 +11,7 @@ import com.wecloud.im.sdk.common.HttpClient;
import com.wecloud.im.sdk.common.HttpMethod;
import com.wecloud.im.sdk.common.RequestMessage;
import com.wecloud.im.sdk.common.auth.Credentials;
import com.wecloud.im.sdk.exception.WecloudException;
import com.wecloud.im.sdk.exception.WecloudImException;
import static com.wecloud.im.sdk.internal.ImHeaders.X_IM_FROM;
import static com.wecloud.im.sdk.utils.HttpHeaders.CONTENT_TYPE;
......@@ -76,7 +76,7 @@ public abstract class WecloudImOperation {
return ResponseParser.parse(responseBody);
} catch (Exception e) {
throw new WecloudException("发送请求报错: " + e.getMessage());
throw new WecloudImException(400, "发送请求报错: " + e.getMessage());
}
}
......
package com.wecloud.im.sdk.internal;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.wecloud.im.sdk.common.HttpMethod;
......@@ -8,10 +12,6 @@ import com.wecloud.im.sdk.model.ImRtcRecord;
import com.wecloud.im.sdk.model.PageResult;
import com.wecloud.im.sdk.model.RtcRecordRequest;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import static com.wecloud.im.sdk.ResourcePathConstants.LIST_RTCRECORDS_REQUEST;
/**
......@@ -29,7 +29,7 @@ public class WecloudImRtcRecordOperation extends WecloudImOperation {
public PageResult<ImRtcRecord> listRtcRecords(RtcRecordRequest rtcRecordRequest) {
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("pageNum",rtcRecordRequest.getPageNum()+"");
param.put("pageSize",rtcRecordRequest.getPageSize()+"");
if (rtcRecordRequest.getFromClientId() != null && !"".equals(rtcRecordRequest.getFromClientId())){
......
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.SingleUserNotificationRequest;
import static com.wecloud.im.sdk.ResourcePathConstants.SINGLE_USER_NOTIFICATION_REQUEST;
import static com.wecloud.im.sdk.utils.CodingUtils.assertParameterNotNull;
/**
* 系统通知操作
* @Author luozh
* @Date 2022年05月10日 09:30
* @Version 1.0
*/
public class WecloudImSystemNotificationOperation extends WecloudImOperation {
public WecloudImSystemNotificationOperation(URL apiDomain, String appKey, String appSecret) {
super(apiDomain, appKey, appSecret);
}
public Boolean singleUserNotification(SingleUserNotificationRequest singleUserNotificationRequest) {
String fromUserId = singleUserNotificationRequest.getFromUserId();
String toUserIds = singleUserNotificationRequest.getToUserIds();
String messageType = singleUserNotificationRequest.getMessageType();
String content = singleUserNotificationRequest.getContent();
// 必填参数校验
assertParameterNotNull(fromUserId, "fromUserId");
assertParameterNotNull(toUserIds, "toUserIds");
assertParameterNotNull(messageType, "messageType");
assertParameterNotNull(content, "content");
// 校验通过 构建参数
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(singleUserNotificationRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(SINGLE_USER_NOTIFICATION_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
.setOriginalRequest(singleUserNotificationRequest).build();
doOperation(request);
return true;
}
}
......@@ -11,6 +11,7 @@ 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.Attributes;
import com.wecloud.im.sdk.model.BannedUserRequest;
import com.wecloud.im.sdk.model.ChatRoomMember;
import com.wecloud.im.sdk.model.ClientLoginRequest;
......@@ -22,7 +23,6 @@ import com.wecloud.im.sdk.model.ModifyUserAttributesRequest;
import com.wecloud.im.sdk.model.ModifyUserRequest;
import com.wecloud.im.sdk.model.RegisterClientRequest;
import com.wecloud.im.sdk.model.Token;
import com.wecloud.im.sdk.model.UserAttributes;
import com.wecloud.im.sdk.model.UserRelationRequest;
import com.wecloud.im.sdk.model.UsersRelationRequest;
......@@ -61,7 +61,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(userId, "userId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", registerClientRequest.getUserId() + "");
param.put("headPortrait", Optional.ofNullable(registerClientRequest.getHeadPortrait()).orElse(""));
param.put("nickname", Optional.ofNullable(registerClientRequest.getNickname()).orElse(""));
......@@ -89,7 +89,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotNull(userId, "userId");
assertParameterNotNull(deviceType, "deviceType");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("deviceType", clientLoginRequest.getDeviceType() + "");
param.put("clientId", clientLoginRequest.getUserId() + "");
......@@ -119,7 +119,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotBlank(headPortrait, "headPortrait");
assertParameterNotBlank(nickname, "headPortrait");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId + "");
param.put("headPortrait", headPortrait);
param.put("nickname", nickname);
......@@ -144,7 +144,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
// 参数校验
assertParameterNotNull(listChatRoomMemberRequest.getChatRoomId(), "chatRoomId");
// 校验通过 构建参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("chatRoomId", listChatRoomMemberRequest.getChatRoomId() + "");
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(LIST_CHAT_ROOM_MEMBER_REQUEST)
......@@ -171,7 +171,7 @@ public class WecloudImUserOperation extends WecloudImOperation {
assertParameterNotBlank(clientId, "userId");
assertParameterNotBlank(friendClientId, "friendUserId");
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("clientId", clientId);
param.put("friendClientId", friendClientId);
// 发送请求
......@@ -194,8 +194,8 @@ public class WecloudImUserOperation extends WecloudImOperation {
Integer minute = bannedUserRequest.getMinute();
assertParameterNotBlank(userId, "userId");
Map<String, String> param = new HashMap<>();
param.put("clientId", userId);
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
param.put("minute", minute.toString());
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(BANNED_USER_REQUEST)
......@@ -207,11 +207,11 @@ public class WecloudImUserOperation extends WecloudImOperation {
return flag;
}
public UserAttributes getUserAttributes(GetUserAttributesRequest getUserAttributesRequest) {
public Attributes getUserAttributes(GetUserAttributesRequest getUserAttributesRequest) {
String userId = getUserAttributesRequest.getUserId();
assertParameterNotBlank(userId, "userId");
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
param.put("userId", userId);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(GET_USER_ATTRIBUTES_REQUEST)
......@@ -219,19 +219,19 @@ public class WecloudImUserOperation extends WecloudImOperation {
.setOriginalRequest(getUserAttributesRequest).build();
Object result = doOperation(request);
UserAttributes userAttributes = JSON.parseObject(JSON.toJSONString(result), UserAttributes.class);
return userAttributes;
Attributes attributes = JSON.parseObject(JSON.toJSONString(result), Attributes.class);
return attributes;
}
public Boolean modifyUserAttributes(ModifyUserAttributesRequest modifyUserAttributesRequest) {
String userId = modifyUserAttributesRequest.getUserId();
UserAttributes attributes = modifyUserAttributesRequest.getAttributes();
Attributes attributes = modifyUserAttributesRequest.getAttributes();
assertParameterNotBlank(userId, "userId");
assertParameterNotNull(attributes, "attributes");
// 校验通过 构建参数
TypeReference<Map<String, String>> typeReference = new TypeReference<Map<String, String>>() {
TypeReference<Map<String, Object>> typeReference = new TypeReference<Map<String, Object>>() {
};
Map<String, String> param = JSONObject.parseObject(JSON.toJSONString(modifyUserAttributesRequest), typeReference);
Map<String, Object> param = JSONObject.parseObject(JSON.toJSONString(modifyUserAttributesRequest), typeReference);
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint(MODIFY_USER_ATTRIBUTES_REQUEST)
.setMethod(HttpMethod.POST).setParameters(param)
......
......@@ -21,9 +21,9 @@ public class WecloudRequestMessageBuilder {
private HttpMethod method = HttpMethod.GET;
private Map<String, String> headers = new HashMap<String, String>();
private Map<String, String> headers = new HashMap<>();
private Map<String, String> parameters = new LinkedHashMap<String, String>();
private Map<String, Object> parameters = new LinkedHashMap<>();
private WebServiceRequest originalRequest;
......@@ -64,16 +64,16 @@ public class WecloudRequestMessageBuilder {
return this;
}
public Map<String, String> getParameters() {
public Map<String, Object> getParameters() {
return Collections.unmodifiableMap(parameters);
}
public WecloudRequestMessageBuilder setParameters(Map<String, String> parameters) {
public WecloudRequestMessageBuilder setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
return this;
}
public WecloudRequestMessageBuilder addParameter(String key, String value) {
public WecloudRequestMessageBuilder addParameter(String key, Object value) {
parameters.put(key, value);
return this;
}
......@@ -89,7 +89,7 @@ public class WecloudRequestMessageBuilder {
public RequestMessage build() {
Map<String, String> sentHeaders = new HashMap<String, String>(this.headers);
Map<String, String> sentParameters = new LinkedHashMap<String, String>(this.parameters);
Map<String, Object> sentParameters = new LinkedHashMap<String, Object>(this.parameters);
RequestMessage request = new RequestMessage(this.originalRequest);
request.setEndpoint(endpoint);
request.setHeaders(sentHeaders);
......
......@@ -8,20 +8,20 @@ import java.util.Set;
import cn.hutool.core.lang.Assert;
/**
*
* 拓展属性
* @Author luozh
* @Date 2022年05月19日 16:30
* @Version 1.0
*/
public class UserAttributes extends HashMap<String, Object> {
public class Attributes extends HashMap<String, Object> {
final Map<String, Object> attributes;
public UserAttributes() {
public Attributes() {
attributes = new HashMap<>(8);
}
public UserAttributes(Map<String, Object> attributes) {
public Attributes(Map<String, Object> attributes) {
Assert.notNull(attributes, "MultiValueMap must not be null");
this.attributes = attributes;
}
......@@ -100,11 +100,11 @@ public class UserAttributes extends HashMap<String, Object> {
if (this == other) {
return true;
}
if (!(other instanceof UserAttributes)) {
if (!(other instanceof Attributes)) {
return false;
}
UserAttributes otherUserAttributes = (UserAttributes) other;
return this.attributes.equals(otherUserAttributes.attributes);
Attributes otherAttributes = (Attributes) other;
return this.attributes.equals(otherAttributes.attributes);
}
@Override
......
......@@ -32,4 +32,9 @@ public class ClientRelation {
* 是否黑名单
*/
private Boolean blacklist;
/**
* 好友备注
*/
private String friendName;
}
......@@ -5,7 +5,6 @@ import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
/**
* <pre>
......@@ -49,7 +48,7 @@ public class Conversation implements Serializable {
/**
* "可选 自定义属性,供开发者扩展使用。"
*/
private HashMap attributes;
private String attributes;
/**
* "可选 对话类型标志,是否是系统对话,后面会说明。"
......
package com.wecloud.im.sdk.model;
import lombok.Data;
/**
*
* @Author luozh
* @Date 2022年05月25日 10:02
* @Version 1.0
*/
@Data
public class ConversationExt {
/**
* 名称
*/
private String name;
/**
* 拓展属性
*/
private Attributes attributes;
}
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.util.Map;
/**
* 创建会话
* @Author luozh
* @Date 2022年05月31日 16:09
* @Version 1.0
*/
@Data
public class CreateConversation {
/**
* 会话名称
*/
private String name;
/**
* 创建人用户id
*/
private String creatorUserId;
/**
* 成员用户id
*/
private String memberUserIds;
/**
* 会话属性,1:单聊 5:临时会话 6:系统会话
*/
private String chatType;
/**
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private Map<String, Object> attributes;
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import java.util.Map;
/**
* 创建会话
* @Author luozh
* @Date 2022年05月31日 16:09
* @Version 1.0
*/
@Data
@Builder
public class CreateConversationRequest extends WebServiceRequest {
/**
* 会话名称
*/
private String name;
/**
* 创建人用户id
*/
private String creatorUserId;
/**
* 成员用户id
*/
private String memberUserIds;
/**
* 会话属性,1:单聊 5:临时会话 6:系统会话
*/
private String chatType;
/**
* Map格式,可选 自定义属性,供开发者扩展使用。")
*/
private Map<String, Object> attributes;
}
......@@ -2,6 +2,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
*
* @Author luozh
......@@ -34,7 +36,7 @@ public class GroupChatMessage {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 指定离线推送通知中的推送内容
......
......@@ -2,6 +2,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
*
* @Author luozh
......@@ -34,7 +36,7 @@ public class GroupChatStatusMessage {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 是否过滤黑名单
......
......@@ -23,6 +23,6 @@ public class ModifyUserAttributesRequest extends WebServiceRequest {
/**
* 参数
*/
private UserAttributes attributes;
private Attributes attributes;
}
......@@ -2,6 +2,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
* 单聊消息
* @Author luozh
......@@ -28,7 +30,7 @@ public class PrivateChatMessage {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 指定离线推送通知中的推送内容
......
......@@ -2,6 +2,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
*
* @Author luozh
......@@ -29,7 +31,7 @@ public class PrivateChatStatusMessage {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 是否过滤黑名单
......
......@@ -3,6 +3,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
* 发布群聊消息请求
* @Author luozh
......@@ -36,7 +38,7 @@ public class PublishGroupChatMessageRequest extends WebServiceRequest {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 指定离线推送通知中的推送内容
......
......@@ -3,6 +3,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
* 发布群聊消息请求
* @Author luozh
......@@ -36,7 +38,7 @@ public class PublishGroupChatStatusMessageRequest extends WebServiceRequest {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 是否过滤黑名单
......
......@@ -3,6 +3,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
* 单聊消息
* @Author luozh
......@@ -30,7 +32,7 @@ public class PublishPrivateChatMessageRequest extends WebServiceRequest {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 指定离线推送通知中的推送内容
......
......@@ -3,6 +3,8 @@ package com.wecloud.im.sdk.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
*
* @Author luozh
......@@ -31,7 +33,7 @@ public class PublishPrivateChatStatusMessageRequest extends WebServiceRequest {
/**
* 消息
*/
private String content;
private WecloudImMessage content;
/**
* 是否过滤黑名单
......
package com.wecloud.im.param.rtc;
package com.wecloud.im.sdk.model;
import lombok.Data;
import java.io.Serializable;
/**
* @author nanqianhao
* @date 2022/5/23
* @apiNote
*/
@Data
public class RtcRecordParam implements Serializable {
private static final long serialVersionUID = 1L;
public class RtcRecord {
/**
* 发送者id
*/
......@@ -30,7 +25,7 @@ public class RtcRecordParam implements Serializable {
private String channelId;
/**
* 音视频类型
* 通话记录类型 1视频 2音频
*/
private Integer callType;
......
......@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
* @date 2022/5/23
* @apiNote
*/
//@Builder
@Data
@EqualsAndHashCode(callSuper = true)
public class RtcRecordRequest extends WebServiceRequest{
......
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.experimental.Tolerate;
/**
* 单个用户通知
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@Builder
@Data
public class SingleUserNotification {
/**
* 发送人用户id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExt conversationExt;
@Tolerate
public SingleUserNotification() {
}
}
package com.wecloud.im.sdk.model;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Tolerate;
/**
* 单个用户通知 请求
* @Author luozh
* @Date 2022年05月05日 11:49
* @Version 1.0
*/
@EqualsAndHashCode(callSuper = true)
@Builder
@Data
public class SingleUserNotificationRequest extends WebServiceRequest {
/**
* 发送人用户id
*/
private String fromUserId;
/**
* 指定一个或多个用户
*/
private String toUserIds;
/**
* 消息类型
*/
private String messageType;
/**
* 消息
*/
private String content;
/**
* 指定离线推送通知中的推送内容
*/
private String pushContent;
/**
* 是否存储此条消息
*/
private Boolean persisted;
/**
* 推送拓展配置
*/
private PushExtParam pushExt;
/**
* 会话拓展配置
*/
private ConversationExt conversationExt;
@Tolerate
public SingleUserNotificationRequest() {
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
......@@ -11,12 +8,12 @@ import com.wecloud.im.sdk.enums.MessageTypeEnum;
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class VoiceMessage extends BaseMessage {
public VoiceMessage() {
public class AudioMessage extends WecloudImBaseMessage {
public AudioMessage() {
super(MessageTypeEnum.AUDIO);
}
private MessageVoiceFile file;
public void setFile(MessageVoiceFile file) {
this.put("file", file);
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
......@@ -11,12 +8,12 @@ import com.wecloud.im.sdk.enums.MessageTypeEnum;
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class FileMessage extends BaseMessage {
public class FileMessage extends WecloudImBaseMessage {
public FileMessage() {
super(MessageTypeEnum.FILE);
}
private MessageFile file;
public void setFile(MessageFile file) {
this.put("file", file);
}
}
......@@ -6,20 +6,16 @@ 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() {
public class LocationMessage extends WecloudImBaseMessage {
public LocationMessage() {
super(MessageTypeEnum.POSITION);
}
private MetaData metaData;
@Setter
@Getter
public static class MetaData {
......@@ -34,4 +30,8 @@ public class PositionMessage extends BaseMessage {
*/
private Double latitude;
}
public void setMetaData(MetaData metaData) {
this.put("metaData", metaData);
}
}
......@@ -13,10 +13,12 @@ import com.wecloud.im.sdk.enums.MessageTypeEnum;
*/
@Getter
@Setter
public class PicMessage extends BaseMessage {
public class PicMessage extends WecloudImBaseMessage {
public PicMessage() {
super(MessageTypeEnum.IMAGE);
}
private MessageImageFile file;
public void setFile(MessageImageFile file) {
this.put("file", file);
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
......@@ -11,14 +8,14 @@ import com.wecloud.im.sdk.enums.MessageTypeEnum;
* @Date 2022年05月07日 13:56
* @Version 1.0
*/
@Getter
@Setter
public class TextMessage extends BaseMessage {
public class TextMessage extends WecloudImBaseMessage {
public TextMessage() {
super(MessageTypeEnum.TEXT);
}
private String text;
public void setText(String text) {
this.put("text", text);
}
}
package com.wecloud.im.sdk.model.message;
import lombok.Getter;
import lombok.Setter;
import com.wecloud.im.sdk.enums.MessageTypeEnum;
/**
......@@ -11,12 +8,12 @@ import com.wecloud.im.sdk.enums.MessageTypeEnum;
* @Date 2022年05月07日 13:59
* @Version 1.0
*/
@Getter
@Setter
public class VideoMessage extends BaseMessage {
public class VideoMessage extends WecloudImBaseMessage {
public VideoMessage() {
super(MessageTypeEnum.VIDEO);
}
private MessageVideoFile file;
public void setFile(MessageVideoFile file) {
this.put("file", 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:51
* @Date 2022年05月26日 14:09
* @Version 1.0
*/
@Getter
public class BaseMessage {
public class WecloudImBaseMessage extends WecloudImMessage {
/**
* 类型
*/
private Integer type;
public WecloudImBaseMessage() {
super();
}
/**
* 用来给开发者存储拓展的自定义属性字段
*/
@Setter
private Object attrs;
public BaseMessage(MessageTypeEnum type) {
public WecloudImBaseMessage(MessageTypeEnum type) {
this.setType(type);
}
......@@ -36,7 +26,11 @@ public class BaseMessage {
* @param type
* @Return
*/
protected void setType(MessageTypeEnum type) {
this.type = type.getCode();
public void setType(MessageTypeEnum type) {
this.put("type", type.getCode());
}
public void setAttrs(Object attrs) {
this.put("attrs", attrs);
}
}
package com.wecloud.im.sdk.model.message;
import java.util.HashMap;
/**
*
* @Author luozh
* @Date 2022年05月07日 13:51
* @Version 1.0
*/
public class WecloudImMessage extends HashMap<String, Object> {
/**
* 添加
* @Author Shadow
* @Date 2022年05月26日 02:57:05
* @param key
* @param value
* @Return
*/
public WecloudImMessage add(String key, Object value) {
this.put(key, value);
return this;
}
}
......@@ -3,6 +3,7 @@ package com.wecloud.im.sdk.sample;
import com.alibaba.fastjson.JSONObject;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.ClientRelation;
/**
*
......@@ -17,10 +18,13 @@ public class ModifySample {
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String userId = "20220413001";
String headPortrait = "http://123";
String nickname = "luo_test2";
Boolean result = im.modifyUser(userId, nickname, headPortrait);
System.out.println("\t modify user result=" + JSONObject.toJSONString(result));
String userId = "1526928068558675968";
String friendId = "1526804546603610112";
// String headPortrait = "http://123";
// String nickname = "luo_test2";
ClientRelation result = im.userRelation(userId, friendId);
ClientRelation result2 = im.userRelation(friendId, userId);
System.out.println("\t user relation userId result=" + JSONObject.toJSONString(result));
System.out.println("\t modify user result=" + JSONObject.toJSONString(result2));
}
}
......@@ -3,7 +3,6 @@ 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;
......@@ -41,11 +40,11 @@ public class PublishGroupChatMessageSample {
groupChatMessage.setSilent(silent);
groupChatMessage.setMessageType("-1");
groupChatMessage.setContent(JSONUtil.toJsonStr(buildTextMessage()));
groupChatMessage.setContent(buildTextMessage());
Boolean textMessageResult = im.publishGroupChatMessage(groupChatMessage);
groupChatMessage.setMessageType("-2");
groupChatMessage.setContent(JSONUtil.toJsonStr(buildPicMessage()));
groupChatMessage.setContent(buildPicMessage());
Boolean picMessageResult = im.publishGroupChatMessage(groupChatMessage);
......
package com.wecloud.im.sdk.sample;
import java.util.Date;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.wecloud.im.sdk.WecloudIm;
import com.wecloud.im.sdk.WecloudImClientBuilder;
import com.wecloud.im.sdk.model.PrivateChatMessage;
import com.wecloud.im.sdk.model.message.TextMessage;
import com.wecloud.im.sdk.model.ConversationExt;
import com.wecloud.im.sdk.model.SingleUserNotification;
import com.wecloud.im.sdk.model.message.WecloudImBaseMessage;
/**
* 发布单聊消息
......@@ -26,24 +23,24 @@ public class PublishPrivateChatMessageSample {
"QizKVHcILRWp6Td2",
"287d04828099fb7de871e9dda845fa8b6b2302faf2ab3737");
String senderId = "1512322637488148480";
String toGroupIds = "1513691265777217536";
String messageType = "-1";
TextMessage textMessage = new TextMessage();
textMessage.setText("这是text消息测试: " + DateUtil.formatDateTime(new Date()));
boolean silent = true;
PrivateChatMessage privateChatMessage = new PrivateChatMessage();
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(textMessage));
privateChatMessage.setPushContent("");
privateChatMessage.setIncludeSender(false);
privateChatMessage.setPersisted(true);
privateChatMessage.setSilent(silent);
Boolean result = im.publishPrivateMessage(privateChatMessage);
String s = "{\"fromUserId\":1526928068558675968,\"userName\":\"温枝达\",\"headPortrait\":\"https://xiaohudou.obs.cn-south-1.myhuaweicloud.com/test/62907630993254d611b016f5.min.jpg\",\"type\":\"501\",\"attrs\":{\"fromUserId\":1526928068558675968,\"userName\":\"温枝达\",\"headPortrait\":\"https://xiaohudou.obs.cn-south-1.myhuaweicloud.com/test/62907630993254d611b016f5.min.jpg\",\"type\":\"501\"}}";
WecloudImBaseMessage message = JSONObject.parseObject(s, WecloudImBaseMessage.class);
ConversationExt conversationExt = new ConversationExt();
conversationExt.setName("小虎通知");
SingleUserNotification singleUserNotification =
SingleUserNotification.builder()
.fromUserId("888888").toUserIds("1527241923595841536")
.content(JSONObject.toJSONString(message))
.messageType("502")
.conversationExt(conversationExt)
.persisted(true)
.pushContent(null)
.build();
im.singleUserNotification(singleUserNotification);
}
......
......@@ -2,14 +2,13 @@ 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;
import com.wecloud.im.sdk.model.message.WecloudImMessage;
/**
* 发布单聊消息
......@@ -31,7 +30,7 @@ public class PublishPrivateChatMessageStatusSample {
String toGroupIds = "1513691265777217536";
String messageType = "-1";
Map<String, Object> content = new HashMap<>();
WecloudImMessage content = new WecloudImMessage();
content.put("toConversation", "1519985463165931520");
content.put("type", -1);
content.put("text", "这是测试消息: " + DateUtil.formatDateTime(new Date()));
......@@ -45,7 +44,7 @@ public class PublishPrivateChatMessageStatusSample {
privateChatMessage.setFromUserId(senderId);
privateChatMessage.setToUserIds(toGroupIds);
privateChatMessage.setMessageType(messageType);
privateChatMessage.setContent(JSONUtil.toJsonStr(content));
privateChatMessage.setContent(content);
privateChatMessage.setIncludeBlacklist(false);
privateChatMessage.setIncludeSender(false);
......
......@@ -24,8 +24,9 @@ public class SignTest {
Map<String, String> headers = new HashMap<>();
headers.put(ImHeaders.DATE, date);
headers.put(ImHeaders.CONTENT_TYPE, "application/json; charset=utf-8");
headers.put(ImHeaders.X_IM_FROM, "server");
// 请求参数
Map<String, String> param = new HashMap<>();
Map<String, Object> param = new HashMap<>();
// 发送请求
RequestMessage request = new WecloudRequestMessageBuilder().setEndpoint("/api/imClient/registerClient")
.setMethod(HttpMethod.POST).setParameters(param).addHeaders(headers)
......@@ -34,7 +35,7 @@ public class SignTest {
String canonicalString = SignUtils.buildCanonicalString("POST", resourcePath, request);
String signature = new HmacSHA256Signature().computeSignature("287d04ds8099fb7de871e9dda845fa8b6b2302faf2ab3737", canonicalString);
String authorization = SignUtils.composeRequestAuthorization("QizKVHcILRWp6Fd3", signature);
System.out.println("canonicalString: " + canonicalString);
System.out.println("canonicalString: \n" + canonicalString);
System.out.println("signature: " + signature);
System.out.println("Authorization header: " + authorization);
......
......@@ -26,7 +26,6 @@ public class MultiMeetScheduled {
public void callingTimeout() {
log.info("呼叫超时处理开始...");
multiMeetService.callingTimeout();
log.info("呼叫超时处理结束...");
}
/**
......@@ -37,7 +36,6 @@ public class MultiMeetScheduled {
public void disconnect() {
log.info("异常断线处理开始...");
multiMeetService.disconnect();
log.info("异常断线处理结束...");
}
}
package io.geekidea.springbootplus.scheduled;
import com.wecloud.rtc.service.RtcService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @Author Future
* @Date 2022/6/3 11:43
* @Description 单人rtc定时器调度
*/
@Slf4j
@Component
public class SingleRtcScheduled {
@Resource
private RtcService rtcService;
/**
* 呼叫异常停止处理 查出正在通话的记录,检测是否在线,如未在线超过5次,按断线处理
*/
@Scheduled(cron = "*/13 * * * * ?")
public void abnormalDisconnect() {
log.info("单人音视频异常断线处理开始...");
rtcService.abnormalDisconnect();
}
}
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