package cn.stylefeng.roses.kernel.im.rongcloud;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.stylefeng.roses.kernel.im.api.ImServerApi;
|
import cn.stylefeng.roses.kernel.im.api.pojo.RongCloudProperties;
|
import io.rong.RongCloud;
|
import io.rong.messages.BaseMessage;
|
import io.rong.methods.message.history.History;
|
import io.rong.models.Result;
|
import io.rong.models.group.GroupMember;
|
import io.rong.models.group.GroupModel;
|
import io.rong.models.message.GroupMessage;
|
import io.rong.models.message.PrivateMessage;
|
import io.rong.models.message.SystemMessage;
|
import io.rong.models.response.*;
|
import io.rong.models.user.BatchTagModel;
|
import io.rong.models.user.GetTagModel;
|
import io.rong.models.user.UserModel;
|
import lombok.SneakyThrows;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.util.Arrays;
|
|
import static org.junit.Assert.assertEquals;
|
|
/**
|
* 融云IM服务
|
*/
|
@Slf4j
|
public class RongCloudImServer implements ImServerApi {
|
|
private final RongCloudProperties rongCloudProperties;
|
|
public RongCloud rongCloud;
|
|
public RongCloudImServer(RongCloudProperties rongCloudProperties) {
|
this.rongCloudProperties = rongCloudProperties;
|
}
|
|
public RongCloud getRongCloud() {
|
if (rongCloud != null) {
|
return rongCloud;
|
}
|
|
// 融云配置
|
String appKey = rongCloudProperties.getAppKey();
|
String appSecret = rongCloudProperties.getAppSecret();
|
|
// 融云服务端重新加载
|
rongCloud = RongCloud.getInstance(appKey, appSecret);
|
return rongCloud;
|
}
|
|
@SneakyThrows
|
@Override
|
public TokenResult userRegister(String id, String name, String portrait) {
|
// 注册用户,生成用户在融云的唯一身份标识 Token
|
UserModel userModel = new UserModel()
|
.setId(id)
|
.setName(name)
|
.setPortrait(portrait);
|
TokenResult result = getRongCloud().user.register(userModel);
|
|
|
// {"token":"UNFruJFNKX77FTKA0fO92Xm4tDCdiuJG@fnk7.cn.rongnav.com;fnk7.cn.rongcfg.com","userId":"1","reqBody":"userId=1&name=%E7%B3%BB%E7%BB%9F%E6%8F%90%E7%A4%BA&portraitUri=http%3A%2F%2Fwww.rongcloud.cn%2Fimages%2Flogo.png","code":200,"requestId":"e3e851ac0cdb47a4ad456f9c8dd1e88a"}
|
log.info("融云IM getToken: " + result.toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public UserResult userGet(String id) {
|
UserModel userModel = new UserModel().setId(id);
|
|
UserResult result = getRongCloud().user.get(userModel);
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result userUpdate(String id, String name, String portrait) {
|
UserModel userModel = new UserModel().setId(id);
|
if (StrUtil.isNotEmpty(name)) {
|
userModel.setName(name);
|
}
|
if (StrUtil.isNotEmpty(portrait)) {
|
userModel.setPortrait(portrait);
|
}
|
|
Result result = getRongCloud().user.update(userModel);
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public CheckOnlineResult userCheckOnline(String id) {
|
UserModel userModel = new UserModel().setId(id);
|
|
CheckOnlineResult result = getRongCloud().user.onlineStatus.check(userModel);
|
|
log.info("融云IM checkOnline: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public GetTagResult userGetTag(String[] userIds) {
|
GetTagModel tagModel = new GetTagModel();
|
tagModel.setUserIds(userIds);
|
GetTagResult result = getRongCloud().user.tag.get(tagModel);
|
|
log.info("融云IM getTag: " + result.toString());
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result userBatchSetTag(String[] userIds, String[] tagArray) {
|
BatchTagModel tagModel = new BatchTagModel();
|
tagModel.setUserIds(userIds);
|
tagModel.setTags(tagArray);
|
|
Result result = getRongCloud().user.tag.batchSet(tagModel);
|
|
log.info("融云IM setTag: " + result.toString());
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result groupCreate(String groupId, String groupName, String[] userIds) {
|
GroupMember[] members = Arrays.stream(userIds)
|
.map(userId -> new GroupMember().setId(userId))
|
.toArray(GroupMember[]::new);
|
|
GroupModel group = new GroupModel()
|
.setId(groupId)
|
.setMembers(members)
|
.setName(groupName);
|
Result result = getRongCloud().group.create(group);
|
log.info("融云IM group create result: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result groupUpdate(String groupId, String groupName, String[] userIds) {
|
GroupMember[] members = Arrays.stream(userIds)
|
.map(userId -> new GroupMember().setId(userId))
|
.toArray(GroupMember[]::new);
|
|
GroupModel group = new GroupModel()
|
.setId(groupId)
|
.setMembers(members)
|
.setName(groupName);
|
Result result = getRongCloud().group.update(group);
|
log.info("融云IM refresh: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result groupJoin(String groupId, String groupName, String[] userIds) {
|
GroupMember[] members = Arrays.stream(userIds)
|
.map(userId -> new GroupMember().setId(userId))
|
.toArray(GroupMember[]::new);
|
|
GroupModel group = new GroupModel()
|
.setId(groupId)
|
.setMembers(members);
|
if (StrUtil.isNotEmpty(groupName)) {
|
// 加入群组时,如果传入 groupName,则会修改推送通知中携带的群组名称,效果与调用刷新群组信息一致
|
group.setName(groupName);
|
}
|
Result result = getRongCloud().group.join(group);
|
log.info("融云IM join: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public GroupUserQueryResult groupQueryUser(String groupId) {
|
GroupModel group = new GroupModel().setId(groupId);
|
|
GroupUserQueryResult result = getRongCloud().group.get(group);
|
log.info("融云IM groupQueryUser: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result groupQuit(String groupId, String[] userIds) {
|
GroupMember[] members = Arrays.stream(userIds)
|
.map(userId -> new GroupMember().setId(userId))
|
.toArray(GroupMember[]::new);
|
|
GroupModel group = new GroupModel()
|
.setId(groupId)
|
.setMembers(members);
|
Result result = getRongCloud().group.quit(group);
|
log.info("融云IM quit: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public UserGroupQueryResult groupGetUserGroups(String userId) {
|
UserModel user = new UserModel().setId(userId);
|
|
UserGroupQueryResult userGroupResult = getRongCloud().user.getGroups(user);
|
log.info("融云IM getGroups: " + userGroupResult.toString());
|
|
assertEquals("200", userGroupResult.getCode().toString());
|
return userGroupResult;
|
}
|
|
@SneakyThrows
|
@Override
|
public Result groupDismiss(String groupId, String userId) {
|
GroupMember[] members = new GroupMember[]{new GroupMember().setId("ghJiu7H1")};
|
GroupModel group = new GroupModel()
|
.setId("groupId")
|
.setMembers(members);
|
|
Result result = getRongCloud().group.dismiss(group);
|
log.info("groupDismissResult: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public <T extends BaseMessage> ResponseResult messageSendSystem(String fromUserId, String[] toUserIds, T message) {
|
SystemMessage systemMessage = new SystemMessage()
|
.setSenderId(fromUserId)
|
.setTargetId(toUserIds)
|
.setObjectName(message.getType())
|
.setContent(message)
|
.setIsPersisted(0)
|
.setIsCounted(0)
|
.setContentAvailable(0);
|
|
// if (StrUtil.isNotEmpty(pushContent)) {
|
// systemMessage.setPushContent(pushContent);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushData)) {
|
// systemMessage.setPushData(pushData);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushExt)) {
|
// systemMessage.setPushExt(pushExt);
|
// }
|
|
ResponseResult result = getRongCloud().message.system.send(systemMessage);
|
log.info("融云IM publishSystem: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public <T extends BaseMessage> ResponseResult messageSendPrivate(String fromUserId, String[] toUserIds, T message) {
|
PrivateMessage privateMessage = new PrivateMessage()
|
.setSenderId(fromUserId)
|
.setTargetId(toUserIds)
|
.setObjectName(message.getType())
|
.setContent(message)
|
.setVerifyBlacklist(0)
|
// 是否需要为收件人在历史消息云端存储服务中存储此条消息。0 表示不存储;1 表示存储
|
.setIsPersisted(1)
|
.setIsCounted(0)
|
// 是否向发件人客户端同步已发消息。1 表示同步,默认值为 0,即不同步
|
.setIsIncludeSender(1);
|
|
// if (StrUtil.isNotEmpty(pushContent)) {
|
// privateMessage.setPushContent(pushContent);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushData)) {
|
// privateMessage.setPushData(pushData);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushExt)) {
|
// privateMessage.setPushExt(pushExt);
|
// }
|
|
// 发送单聊方法
|
ResponseResult publishPrivateResult = getRongCloud().message.msgPrivate.send(privateMessage);
|
log.info("融云IM sendPrivate: " + publishPrivateResult.toString());
|
|
assertEquals("200", publishPrivateResult.getCode().toString());
|
return publishPrivateResult;
|
}
|
|
@SneakyThrows
|
@Override
|
public <T extends BaseMessage> ResponseResult messageSendGroup(String fromUserId, String[] toGroupIds, T message) {
|
// 群组消息
|
GroupMessage groupMessage = new GroupMessage()
|
.setSenderId(fromUserId)
|
.setTargetId(toGroupIds)
|
.setObjectName(message.getType())
|
.setContent(message)
|
// 是否需要为收件人在历史消息云端存储服务中存储此条消息。0 表示不存储;1 表示存储
|
.setIsPersisted(1)
|
// 是否向发件人客户端同步已发消息。1 表示同步,默认值为 0,即不同步
|
.setIsIncludeSender(1)
|
.setContentAvailable(0);
|
|
// if (StrUtil.isNotEmpty(pushContent)) {
|
// groupMessage.setPushContent(pushContent);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushData)) {
|
// groupMessage.setPushData(pushData);
|
// }
|
//
|
// if (StrUtil.isNotEmpty(pushExt)) {
|
// groupMessage.setPushExt(pushExt);
|
// }
|
|
ResponseResult result = getRongCloud().message.group.send(groupMessage);
|
|
log.info("融云IM send group: " + result.toString());
|
|
assertEquals("200", result.getCode().toString());
|
return result;
|
}
|
|
@SneakyThrows
|
@Override
|
public HistoryMessageResult historyMessage(String date) {
|
History history = getRongCloud().message.history;
|
// 获取历史消息日志文件
|
HistoryMessageResult historyMessageResult = (HistoryMessageResult) history.get(date);
|
|
log.info("get history message: " + historyMessageResult.toString());
|
return historyMessageResult;
|
}
|
|
}
|