Browse Source

!107 修复几个bug

Merge pull request !107 from blue/v_3.0.0
master
blue 2 years ago
committed by Gitee
parent
commit
48af793cee
No known key found for this signature in database GPG Key ID: 173E9B9CA92EEF8F
  1. 2
      .gitignore
  2. 2
      db/im-platform.sql
  3. 2
      im-client/pom.xml
  4. 2
      im-common/pom.xml
  5. 0
      im-common/src/main/java/com/bx/imcommon/contant/IMConstant.java
  6. 0
      im-common/src/main/java/com/bx/imcommon/contant/IMRedisKey.java
  7. 0
      im-common/src/main/java/com/bx/imcommon/enums/IMCmdType.java
  8. 0
      im-common/src/main/java/com/bx/imcommon/enums/IMListenerType.java
  9. 0
      im-common/src/main/java/com/bx/imcommon/enums/IMSendCode.java
  10. 0
      im-common/src/main/java/com/bx/imcommon/enums/IMTerminalType.java
  11. 0
      im-common/src/main/java/com/bx/imcommon/model/IMGroupMessage.java
  12. 0
      im-common/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java
  13. 0
      im-common/src/main/java/com/bx/imcommon/model/IMLoginInfo.java
  14. 0
      im-common/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java
  15. 0
      im-common/src/main/java/com/bx/imcommon/model/IMRecvInfo.java
  16. 0
      im-common/src/main/java/com/bx/imcommon/model/IMSendInfo.java
  17. 0
      im-common/src/main/java/com/bx/imcommon/model/IMSendResult.java
  18. 0
      im-common/src/main/java/com/bx/imcommon/model/IMSessionInfo.java
  19. 0
      im-common/src/main/java/com/bx/imcommon/model/IMSystemMessage.java
  20. 0
      im-common/src/main/java/com/bx/imcommon/model/IMUserInfo.java
  21. 0
      im-common/src/main/java/com/bx/imcommon/mq/RedisMQConfig.java
  22. 0
      im-common/src/main/java/com/bx/imcommon/mq/RedisMQConsumer.java
  23. 0
      im-common/src/main/java/com/bx/imcommon/mq/RedisMQListener.java
  24. 7
      im-common/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java
  25. 16
      im-common/src/main/java/com/bx/imcommon/mq/RedisMQTemplate.java
  26. 0
      im-common/src/main/java/com/bx/imcommon/serializer/DateToLongSerializer.java
  27. 0
      im-common/src/main/java/com/bx/imcommon/util/CommaTextUtils.java
  28. 0
      im-common/src/main/java/com/bx/imcommon/util/JwtUtil.java
  29. 0
      im-common/src/main/java/com/bx/imcommon/util/ThreadPoolExecutorFactory.java
  30. 27
      im-platform/src/main/java/com/bx/implatform/config/TaskSchedulerConfig.java
  31. 2
      im-platform/src/main/java/com/bx/implatform/entity/Group.java
  32. 3
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java
  33. 4
      im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java
  34. 2
      im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java
  35. 2
      im-platform/src/main/java/com/bx/implatform/task/consumer/GroupBannedConsumerTask.java
  36. 2
      im-platform/src/main/java/com/bx/implatform/task/consumer/GroupUnbanConsumerTask.java
  37. 2
      im-platform/src/main/java/com/bx/implatform/task/consumer/UserBannedConsumerTask.java
  38. 26
      im-platform/src/main/java/com/bx/implatform/task/schedule/ReloadSensitiveWordTask.java
  39. 31
      im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java
  40. 4
      im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java
  41. 2
      im-server/pom.xml
  42. 29
      im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java
  43. 10
      im-server/src/main/java/com/bx/imserver/netty/processor/SystemMessageProcessor.java
  44. 7
      im-uniapp/manifest.json
  45. 2
      pom.xml

2
.gitignore

@ -7,7 +7,7 @@
/im-platform/src/main/resources/logback-prod.xml
/im-server/src/main/resources/application-prod.yml
/im-server/src/main/resources/logback-prod.xml
/im-commom/im-commom.iml
/im-common/im-common.iml
/im-uniapp/node_modules/
/im-web/package-lock.json
/im-uniapp/unpackage/

2
db/im-platform.sql

@ -49,7 +49,7 @@ create table `im_group`(
`notice` varchar(1024) default '' comment '群公告',
`is_banned` tinyint(1) default 0 comment '是否被封禁 0:否 1:是',
`reason` varchar(255) default '' comment '被封禁原因',
`deleted` tinyint(1) default 0 comment '是否已删除',
`dissolve` tinyint(1) default 0 comment '是否已解散',
`created_time` datetime default CURRENT_TIMESTAMP comment '创建时间'
)ENGINE=InnoDB CHARSET=utf8mb4 comment '';

2
im-client/pom.xml

@ -14,7 +14,7 @@
<dependencies>
<dependency>
<groupId>com.bx</groupId>
<artifactId>im-commom</artifactId>
<artifactId>im-common</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>

2
im-commom/pom.xml → im-common/pom.xml

@ -8,7 +8,7 @@
<version>3.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>im-commom</artifactId>
<artifactId>im-common</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>

0
im-commom/src/main/java/com/bx/imcommon/contant/IMConstant.java → im-common/src/main/java/com/bx/imcommon/contant/IMConstant.java

0
im-commom/src/main/java/com/bx/imcommon/contant/IMRedisKey.java → im-common/src/main/java/com/bx/imcommon/contant/IMRedisKey.java

0
im-commom/src/main/java/com/bx/imcommon/enums/IMCmdType.java → im-common/src/main/java/com/bx/imcommon/enums/IMCmdType.java

0
im-commom/src/main/java/com/bx/imcommon/enums/IMListenerType.java → im-common/src/main/java/com/bx/imcommon/enums/IMListenerType.java

0
im-commom/src/main/java/com/bx/imcommon/enums/IMSendCode.java → im-common/src/main/java/com/bx/imcommon/enums/IMSendCode.java

0
im-commom/src/main/java/com/bx/imcommon/enums/IMTerminalType.java → im-common/src/main/java/com/bx/imcommon/enums/IMTerminalType.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMGroupMessage.java → im-common/src/main/java/com/bx/imcommon/model/IMGroupMessage.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMHeartbeatInfo.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMLoginInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMLoginInfo.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java → im-common/src/main/java/com/bx/imcommon/model/IMPrivateMessage.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMRecvInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMRecvInfo.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMSendInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMSendInfo.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMSendResult.java → im-common/src/main/java/com/bx/imcommon/model/IMSendResult.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMSessionInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMSessionInfo.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMSystemMessage.java → im-common/src/main/java/com/bx/imcommon/model/IMSystemMessage.java

0
im-commom/src/main/java/com/bx/imcommon/model/IMUserInfo.java → im-common/src/main/java/com/bx/imcommon/model/IMUserInfo.java

0
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQConfig.java → im-common/src/main/java/com/bx/imcommon/mq/RedisMQConfig.java

0
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQConsumer.java → im-common/src/main/java/com/bx/imcommon/mq/RedisMQConsumer.java

0
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQListener.java → im-common/src/main/java/com/bx/imcommon/mq/RedisMQListener.java

7
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java → im-common/src/main/java/com/bx/imcommon/mq/RedisMQPullTask.java

@ -52,11 +52,6 @@ public class RedisMQPullTask implements CommandLineRunner {
public void run() {
List<Object> datas = new LinkedList<>();
try {
if(redisMQTemplate.isClose()){
// 如果redis未初始化或已断开,3s后再重新尝试消费
EXECUTOR.schedule(this, 3, TimeUnit.SECONDS);
return;
}
if (consumer.isReady()) {
String key = consumer.generateKey();
// 拉取一个批次的数据
@ -75,6 +70,8 @@ public class RedisMQPullTask implements CommandLineRunner {
}
} catch (Exception e) {
log.error("数据消费异常,队列:{}", queue, e);
// 出现异常,10s后再重新尝试消费
EXECUTOR.schedule(this, 10, TimeUnit.SECONDS);
return;
}
// 继续消费数据

16
im-commom/src/main/java/com/bx/imcommon/mq/RedisMQTemplate.java → im-common/src/main/java/com/bx/imcommon/mq/RedisMQTemplate.java

@ -2,10 +2,9 @@ package com.bx.imcommon.mq;
import org.apache.logging.log4j.util.Strings;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisConnectionUtils;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.Objects;
import java.util.Properties;
/**
@ -19,9 +18,10 @@ public class RedisMQTemplate extends RedisTemplate<String, Object> {
public String getVersion() {
if (version.isEmpty()) {
RedisConnection redisConnection = this.getConnectionFactory().getConnection();
Properties properties = redisConnection.info();
RedisConnection connection = RedisConnectionUtils.getConnection(getConnectionFactory());
Properties properties = connection.info();
version = properties.getProperty("redis_version");
RedisConnectionUtils.releaseConnection(connection,getConnectionFactory());
}
return version;
}
@ -41,12 +41,4 @@ public class RedisMQTemplate extends RedisTemplate<String, Object> {
return firVersion > 6 || (firVersion == 6 && secVersion >= 2);
}
Boolean isClose(){
try {
return getConnectionFactory().getConnection().isClosed();
}catch (Exception e){
return true;
}
}
}

0
im-commom/src/main/java/com/bx/imcommon/serializer/DateToLongSerializer.java → im-common/src/main/java/com/bx/imcommon/serializer/DateToLongSerializer.java

0
im-commom/src/main/java/com/bx/imcommon/util/CommaTextUtils.java → im-common/src/main/java/com/bx/imcommon/util/CommaTextUtils.java

0
im-commom/src/main/java/com/bx/imcommon/util/JwtUtil.java → im-common/src/main/java/com/bx/imcommon/util/JwtUtil.java

0
im-commom/src/main/java/com/bx/imcommon/util/ThreadPoolExecutorFactory.java → im-common/src/main/java/com/bx/imcommon/util/ThreadPoolExecutorFactory.java

27
im-platform/src/main/java/com/bx/implatform/config/TaskSchedulerConfig.java

@ -0,0 +1,27 @@
package com.bx.implatform.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
/**
* @author: Blue
* @date: 2024-09-01
* @version: 1.0
*/
@EnableScheduling
@Configuration
public class TaskSchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10); // 设置线程池大小
taskScheduler.setThreadNamePrefix("scheduled-task-");
taskScheduler.initialize();
return taskScheduler;
}
}

2
im-platform/src/main/java/com/bx/implatform/entity/Group.java

@ -65,7 +65,7 @@ public class Group {
/**
* 是否已删除
*/
private Boolean deleted;
private Boolean dissolve;

3
im-platform/src/main/java/com/bx/implatform/service/impl/GroupMessageServiceImpl.java

@ -73,11 +73,12 @@ public class GroupMessageServiceImpl extends ServiceImpl<GroupMessageMapper, Gro
msg.setSendTime(new Date());
msg.setSendNickName(member.getShowNickName());
msg.setAtUserIds(CommaTextUtils.asText(dto.getAtUserIds()));
this.save(msg);
// 过滤内容中的敏感词
if(MessageType.TEXT.code().equals(dto.getType())){
msg.setContent(sensitiveFilterUtil.filter(dto.getContent()));
}
this.save(msg);
// 群发
GroupMessageVO msgInfo = BeanUtils.copyProperties(msg, GroupMessageVO.class);
msgInfo.setAtUserIds(dto.getAtUserIds());

4
im-platform/src/main/java/com/bx/implatform/service/impl/GroupServiceImpl.java

@ -114,7 +114,7 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
// 群聊用户id
List<Long> userIds = groupMemberService.findUserIdsByGroupId(groupId);
// 逻辑删除群数据
group.setDeleted(true);
group.setDissolve(true);
this.updateById(group);
// 删除成员数据
groupMemberService.removeByGroupId(groupId);
@ -190,7 +190,7 @@ public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements
if (Objects.isNull(group)) {
throw new GlobalException("群组不存在");
}
if (group.getDeleted()) {
if (group.getDissolve()) {
throw new GlobalException("群组'" + group.getName() + "'已解散");
}
if (group.getIsBanned()) {

2
im-platform/src/main/java/com/bx/implatform/service/impl/PrivateMessageServiceImpl.java

@ -56,11 +56,11 @@ public class PrivateMessageServiceImpl extends ServiceImpl<PrivateMessageMapper,
msg.setSendId(session.getUserId());
msg.setStatus(MessageStatus.UNSEND.code());
msg.setSendTime(new Date());
this.save(msg);
// 过滤内容中的敏感词
if (MessageType.TEXT.code().equals(dto.getType())) {
msg.setContent(sensitiveFilterUtil.filter(dto.getContent()));
}
this.save(msg);
// 推送消息
PrivateMessageVO msgInfo = BeanUtils.copyProperties(msg, PrivateMessageVO.class);
IMPrivateMessage<PrivateMessageVO> sendMessage = new IMPrivateMessage<>();

2
im-platform/src/main/java/com/bx/implatform/task/GroupBannedConsumerTask.java → im-platform/src/main/java/com/bx/implatform/task/consumer/GroupBannedConsumerTask.java

@ -1,4 +1,4 @@
package com.bx.implatform.task;
package com.bx.implatform.task.consumer;
import com.bx.imclient.IMClient;
import com.bx.imcommon.enums.IMTerminalType;

2
im-platform/src/main/java/com/bx/implatform/task/GroupUnbanConsumerTask.java → im-platform/src/main/java/com/bx/implatform/task/consumer/GroupUnbanConsumerTask.java

@ -1,4 +1,4 @@
package com.bx.implatform.task;
package com.bx.implatform.task.consumer;
import com.bx.imclient.IMClient;
import com.bx.imcommon.enums.IMTerminalType;

2
im-platform/src/main/java/com/bx/implatform/task/UserBannedConsumerTask.java → im-platform/src/main/java/com/bx/implatform/task/consumer/UserBannedConsumerTask.java

@ -1,4 +1,4 @@
package com.bx.implatform.task;
package com.bx.implatform.task.consumer;
import com.bx.imclient.IMClient;
import com.bx.imcommon.model.IMSystemMessage;

26
im-platform/src/main/java/com/bx/implatform/task/schedule/ReloadSensitiveWordTask.java

@ -0,0 +1,26 @@
package com.bx.implatform.task.schedule;
import com.bx.implatform.util.SensitiveFilterUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* @author: Blue
* @date: 2024-09-01
* @version: 1.0
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class ReloadSensitiveWordTask {
private final SensitiveFilterUtil sensitiveFilterUtil;
@Scheduled(fixedRate = 60000)
public void run() {
log.info("【定时任务】重新装载敏感词...");
sensitiveFilterUtil.reload();
}
}

31
im-platform/src/main/java/com/bx/implatform/util/SensitiveFilterUtil.java

@ -14,7 +14,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 敏感词过滤器SensitiveFilter
@ -35,7 +34,7 @@ public final class SensitiveFilterUtil {
/**
* 根节点
*/
private static final TrieNode ROOT_NODE = new TrieNode();
private static TrieNode ROOT_NODE = new TrieNode();
/**
* 线程池
@ -86,41 +85,41 @@ public final class SensitiveFilterUtil {
* @date 2023/12/4 11:18
*/
@PostConstruct
public void init() {
// 每120s装载一次敏感词
EXECUTOR_SERVICE.scheduleAtFixedRate(() -> {
public void reload() {
// 使用copy on write的方式,防止出现并发问题
TrieNode newNode = new TrieNode();
List<String> keywords = sensitiveWordService.findAllEnabledWords();
keywords.forEach(keyword->{
if(StrUtil.isNotEmpty(keyword)){
keywords.forEach(keyword -> {
if (StrUtil.isNotEmpty(keyword)) {
// 添加到前缀树
addKeyword(keyword);
addKeyword(newNode,keyword);
}
});
},0,120, TimeUnit.SECONDS);
ROOT_NODE = newNode;
}
/**
* 3将一个敏感词添加到前缀树中
*
* @param node
* @param keyword
* @author NXY
* @date 2023/12/4 11:15
*/
private void addKeyword(String keyword) {
TrieNode tempNode = ROOT_NODE;
private void addKeyword(TrieNode node, String keyword) {
for (int i = 0; i < keyword.length(); i++) {
char c = keyword.charAt(i);
TrieNode subNode = tempNode.getSubNode(c);
TrieNode subNode = node.getSubNode(c);
if (subNode == null) {
// 初始化子节点
subNode = new TrieNode();
tempNode.addSubNode(c, subNode);
node.addSubNode(c, subNode);
}
// 指向子节点,进入下一轮循环
tempNode = subNode;
node = subNode;
// 设置结束标识
if (i == keyword.length() - 1) {
tempNode.setKeywordEnd(true);
node.setKeywordEnd(true);
}
}
}
@ -195,9 +194,9 @@ public final class SensitiveFilterUtil {
/**
* 判断是否为符号 特殊符号
*
* @return boolean
* @author NXY
* @date 2023/12/4 11:17
* @return boolean
*/
private boolean isSymbol(Character c) {
// 0x2E80~0x9FFF 是东亚文字范围

4
im-platform/src/main/java/com/bx/implatform/vo/GroupVO.java

@ -44,8 +44,8 @@ public class GroupVO {
@Schema(description = "群名备注")
private String remarkGroupName;
@Schema(description = "是否已删除")
private Boolean deleted;
@Schema(description = "是否已解散")
private Boolean dissolve;
@Schema(description = "是否已退出")
private Boolean quit;

2
im-server/pom.xml

@ -15,7 +15,7 @@
<dependencies>
<dependency>
<groupId>com.bx</groupId>
<artifactId>im-commom</artifactId>
<artifactId>im-common</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>

29
im-server/src/main/java/com/bx/imserver/netty/processor/ProcessorFactory.java

@ -6,27 +6,14 @@ import com.bx.imserver.util.SpringContextHolder;
public class ProcessorFactory {
public static AbstractMessageProcessor createProcessor(IMCmdType cmd) {
AbstractMessageProcessor processor = null;
switch (cmd) {
case LOGIN:
processor = SpringContextHolder.getApplicationContext().getBean(LoginProcessor.class);
break;
case HEART_BEAT:
processor = SpringContextHolder.getApplicationContext().getBean(HeartbeatProcessor.class);
break;
case PRIVATE_MESSAGE:
processor = SpringContextHolder.getApplicationContext().getBean(PrivateMessageProcessor.class);
break;
case GROUP_MESSAGE:
processor = SpringContextHolder.getApplicationContext().getBean(GroupMessageProcessor.class);
break;
case SYSTEM_MESSAGE:
processor = SpringContextHolder.getApplicationContext().getBean(SystemMessageProcessor.class);
break;
default:
break;
}
return processor;
return switch (cmd) {
case LOGIN->SpringContextHolder.getApplicationContext().getBean(LoginProcessor.class);
case HEART_BEAT -> SpringContextHolder.getApplicationContext().getBean(HeartbeatProcessor.class);
case PRIVATE_MESSAGE->SpringContextHolder.getApplicationContext().getBean(PrivateMessageProcessor.class);
case GROUP_MESSAGE->SpringContextHolder.getApplicationContext().getBean(GroupMessageProcessor.class);
case SYSTEM_MESSAGE->SpringContextHolder.getApplicationContext().getBean(SystemMessageProcessor.class);
default -> null;
};
}
}

10
im-server/src/main/java/com/bx/imserver/netty/processor/SystemMessageProcessor.java

@ -26,10 +26,11 @@ public class SystemMessageProcessor extends AbstractMessageProcessor<IMRecvInfo>
@Override
public void process(IMRecvInfo recvInfo) {
IMUserInfo receiver = recvInfo.getReceivers().get(0);
log.info("接收到系统消息,接收者:{},内容:{}", receiver.getId(), recvInfo.getData());
log.info("接收到系统消息,接收用户数量:{},内容:{}", recvInfo.getReceivers().size(), recvInfo.getData());
for (IMUserInfo receiver : recvInfo.getReceivers()) {
try {
ChannelHandlerContext channelCtx = UserChannelCtxMap.getChannelCtx(receiver.getId(), receiver.getTerminal());
ChannelHandlerContext channelCtx =
UserChannelCtxMap.getChannelCtx(receiver.getId(), receiver.getTerminal());
if (!Objects.isNull(channelCtx)) {
// 推送消息到用户
IMSendInfo<Object> sendInfo = new IMSendInfo<>();
@ -41,13 +42,14 @@ public class SystemMessageProcessor extends AbstractMessageProcessor<IMRecvInfo>
} else {
// 消息推送失败确认
sendResult(recvInfo, IMSendCode.NOT_FIND_CHANNEL);
log.error("未找到channel,接收者:{},内容:{}",receiver.getId(), recvInfo.getData());
log.error("未找到channel,接收者:{},内容:{}", receiver.getId(), recvInfo.getData());
}
} catch (Exception e) {
// 消息推送失败确认
sendResult(recvInfo, IMSendCode.UNKONW_ERROR);
log.error("发送异常,,接收者:{},内容:{}", receiver.getId(), recvInfo.getData(), e);
}
}
}

7
im-uniapp/manifest.json

@ -2,8 +2,8 @@
"name" : "盒子IM",
"appid" : "__UNI__69DD57A",
"description" : "",
"versionName" : "1.0.7",
"versionCode" : 107,
"versionName" : "3.0.0",
"versionCode" : 300,
"transformPx" : false,
/* 5+App */
"app-plus" : {
@ -54,7 +54,8 @@
"privacyDescription" : {
"NSMicrophoneUsageDescription" : "",
"NSCameraUsageDescription" : ""
}
},
"idfa" : false
},
/* SDK */
"sdkConfigs" : {

2
pom.xml

@ -17,7 +17,7 @@
<modules>
<module>im-platform</module>
<module>im-server</module>
<module>im-commom</module>
<module>im-common</module>
<module>im-client</module>
</modules>

Loading…
Cancel
Save