Compare commits

..
33 Commits
Author SHA1 Message Date
heavyrian2012 0a3516cdf2 version and release note 2024-04-19 11:28:17 +08:00
heavyrian2012 135a9ed0a8 添加用户设置添加好友验证功能 2024-04-19 11:19:43 +08:00
heavyrian2012 73e3447b39 强制推送配置默认为关闭 2024-04-03 10:51:06 +08:00
heavyrian2012 394b9119fa 添加配置,可以在会话静音/全局静音/PC在线时静音时强制推送。
(cherry picked from commit 1f4cf54990831d4bcc4fcec2fa5479036a581e58)
2024-04-03 10:49:47 +08:00
heavyrian2012 ebb05351a8 群组标记删除
(cherry picked from commit cdf4a0c011b879819c0263b84bddd2da5cb8bc7d)
2024-04-03 10:49:46 +08:00
heavyrian2012 c4421fc9ed server api添加通过邮箱获取用户列表的接口 2024-03-25 19:00:42 +08:00
heavyrian2012 a906bf352d version and release note 2024-03-25 09:04:28 +08:00
heavyrian2012 37f1772705 在线状态回调添加其他端的状态 2024-03-23 12:32:45 +08:00
heavyrian2012 0a05503c78 创建频道和机器人时,不再设置默认头像 2024-03-23 11:13:37 +08:00
heavyrian2012 a702602758 去掉用户信息中的密码处理 2024-03-23 11:13:09 +08:00
heavyrian2012 c01e5b634d version and release note 2024-03-07 16:33:50 +08:00
heavyrian2012 6c2848cbf7 升级依赖 2024-02-27 20:45:14 +08:00
heavyrian2012 ae3c8e0d25 升级部分依赖版本 2024-02-27 11:51:48 +08:00
heavyrian2012 2ef0059395 remove useless test code 2024-02-27 11:28:28 +08:00
heavyrian2012 d91a2d9fd5 升级部分依赖版本 2024-02-27 11:27:56 +08:00
heavyrian2012 a4bcd5e29e 同步专业版IM服务 2024-02-22 14:28:49 +08:00
heavyrian2012 fe4612c801 解决server端音视频SDK信令透传问题 2024-02-22 14:26:04 +08:00
heavyrian2012 58ade23b23 添加鸿蒙平台的支持 2024-02-04 17:02:20 +08:00
heavyrian2012 f1e46fca75 同步专业版IM服务 2024-02-02 13:44:47 +08:00
heavyrian2012 1e17fa1db4 同步专业版IM SDK 2024-02-02 12:50:23 +08:00
heavyrian2012 7094114ea3 同步专业版IM服务SDK 2024-01-27 14:13:14 +08:00
heavyrian2012 c805bddca1 version and release note 2024-01-14 10:47:49 +08:00
heavyrian2012 cb5754fe07 群组信息变更回调中加上群组信息 2024-01-14 09:51:46 +08:00
heavyrian2012 c014b78d95 1,添加配置,可以禁止拉陌生人进群
2,拉人进群时检查是否被拉黑
2024-01-14 09:42:42 +08:00
heavyrian2012 8a13a32615 sdk支持流式文本 2023-12-30 19:09:30 +08:00
heavyrian2012 bc409042b0 解决搜索时特殊字符的转义问题 2023-12-27 20:07:48 +08:00
heavyrian2012 49ad4f5eb6 机器人sdk添加撤回和更新接口 2023-12-26 09:20:34 +08:00
heavyrian2012 8c93e2ee42 update readme 2023-12-11 10:55:30 +08:00
heavyrian2012 54286b4a55 release note and version 2023-12-03 11:43:41 +08:00
heavyrian2012 594103e06b 解决广播没有发送消息给未登录用户的问题 2023-12-02 23:03:00 +08:00
heavyrian2012 90e89978aa 消息表的消息id索引改成唯一索引,只对新库有效,已有数据库不影响。 2023-12-02 17:01:03 +08:00
heavyrian2012 93b6e70804 优化用户id搜索逻辑 2023-11-30 19:44:06 +08:00
heavyrian2012 b774e0d423 添加获取在线用户信息和获取用户session信息的接口 2023-11-28 11:04:12 +08:00
69 changed files with 1590 additions and 489 deletions
+3
View File
@@ -140,6 +140,9 @@ mvn clean package
详细维护说明请参考 [野火维护说明](https://docs.wildfirechat.cn/base_knowledge/maintain.html)。
## 服务对象
因为野火的使用范围比较广,难免被一些不法分子利用,国内反诈反赌力度很大,所以国内多地警方都跟我们都有过联系。***为了预防我们的产品被用于非法目的,试用及购买只能支持境内法人单位,不接受个人或者境外团体。如果我们发现产品被用于非法目的,我们会立即停止技术支持服务并且报警和配合警方调查。请用于非法目的用户绕行!***
## 应用截图
登录界面
+19 -1
View File
@@ -126,6 +126,15 @@ message.global_mute_exception_types 401,402,403,404,405,407,408,410,411
## 离线用户推送过期天数,0是永不过期,建议配置为7天。
message.push_expired_days 7
## 当会话静音/全局静音/PC在线静音时,普通消息都不会有推送,如果有某些消息类型需要此时保持推送,可以配置到这里。此配置对消息免打扰时段无效。
## 此配置只影响远程推送,需要客户端处理客户端在线且在后台收到此消息的处理,需要针对这些消息类型加上本地通知。
## 强制推送消息的MessagePayload中pushContent和pushData至少要存在一个才可以推送。
## 消息类型以英文逗号分割。
#message.force_push_types 401,402
## 群发消息(包括server api群发和全局频道群发)时,目标用户是否来自于t_user表。如果使用野火托管用户信息,请设置为true,否则设置为false。
message.broadcast.target_from_user_table true
## 消息转发功能开启时,开关是否不转发server api接口消息。
## 当为true时,不转发server api发送的消息;当为false时,转发server api发送的消息。
message.no_forward_admin_message false
@@ -198,6 +207,12 @@ group.visible_quit_or_kickoff_notification 0
## Server API不受此限制。
#group.forbidden_client_operation 0xFFF
## 是否禁止陌生人拉人入群,默认为false
group.disable_stranger_invite false
## 群组信息是否标记删除
group.enable_mark_deletion true
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
## 注意,修改本配置不会对已经同步的信息产生影响。
@@ -285,7 +300,10 @@ server.multi_endpoint false
## 是否支持PC多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PC端多端登录。
server.multi_pc_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
## 是否支持PAD多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PAD端多端登录。
server.multi_pad_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或pad或web端登录的通知。
server.multi_platform_notification true
# 当pc或者web在线时,手机是否默认静音,默认为true。注意仅影响默认值,用户可以手动切换是否静音。
+2
View File
@@ -0,0 +1,2 @@
alter table `t_group` add column `_deleted` tinyint NOT NULL DEFAULT 0;
@@ -10,7 +10,7 @@ CREATE TABLE `t_messages_0` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -28,7 +28,7 @@ CREATE TABLE `t_messages_1` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -46,7 +46,7 @@ CREATE TABLE `t_messages_2` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -63,7 +63,7 @@ CREATE TABLE `t_messages_3` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -81,7 +81,7 @@ CREATE TABLE `t_messages_4` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -99,7 +99,7 @@ CREATE TABLE `t_messages_5` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -116,7 +116,7 @@ CREATE TABLE `t_messages_6` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -134,7 +134,7 @@ CREATE TABLE `t_messages_7` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -152,7 +152,7 @@ CREATE TABLE `t_messages_8` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -169,7 +169,7 @@ CREATE TABLE `t_messages_9` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -187,7 +187,7 @@ CREATE TABLE `t_messages_10` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -205,7 +205,7 @@ CREATE TABLE `t_messages_11` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -222,7 +222,7 @@ CREATE TABLE `t_messages_12` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -240,7 +240,7 @@ CREATE TABLE `t_messages_13` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -258,7 +258,7 @@ CREATE TABLE `t_messages_14` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -275,7 +275,7 @@ CREATE TABLE `t_messages_15` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -293,7 +293,7 @@ CREATE TABLE `t_messages_16` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -311,7 +311,7 @@ CREATE TABLE `t_messages_17` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -328,7 +328,7 @@ CREATE TABLE `t_messages_18` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -346,7 +346,7 @@ CREATE TABLE `t_messages_19` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -364,7 +364,7 @@ CREATE TABLE `t_messages_20` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -381,7 +381,7 @@ CREATE TABLE `t_messages_21` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -399,7 +399,7 @@ CREATE TABLE `t_messages_22` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -417,7 +417,7 @@ CREATE TABLE `t_messages_23` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -434,7 +434,7 @@ CREATE TABLE `t_messages_24` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -452,7 +452,7 @@ CREATE TABLE `t_messages_25` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -470,7 +470,7 @@ CREATE TABLE `t_messages_26` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -487,7 +487,7 @@ CREATE TABLE `t_messages_27` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -505,7 +505,7 @@ CREATE TABLE `t_messages_28` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -523,7 +523,7 @@ CREATE TABLE `t_messages_29` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -540,7 +540,7 @@ CREATE TABLE `t_messages_30` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -558,7 +558,7 @@ CREATE TABLE `t_messages_31` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -576,7 +576,7 @@ CREATE TABLE `t_messages_32` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -593,7 +593,7 @@ CREATE TABLE `t_messages_33` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -611,7 +611,7 @@ CREATE TABLE `t_messages_34` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
@@ -629,7 +629,7 @@ CREATE TABLE `t_messages_35` (
`_data` BLOB NOT NULL,
`_searchable_key` TEXT DEFAULT NULL,
`_dt` DATETIME NOT NULL,
INDEX `message_uid_index` (`_mid` DESC)
UNIQUE INDEX `message_uid_index` (`_mid` DESC)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8mb4
+1
View File
@@ -0,0 +1 @@
alter table `t_group` add column `_deleted` tinyint NOT NULL DEFAULT 0;
+21 -52
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.2.0</version>
<version>1.2.5</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -37,14 +37,14 @@
<!--用于与slf4j保持桥接-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.17.2</version>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>2.22.1</version>
</dependency>
<!-- slf4j核心包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
@@ -65,6 +65,18 @@
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.3</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-common</artifactId>
@@ -129,37 +141,18 @@
<version>3.11.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.xiaoleilu/hutool -->
<dependency>
<groupId>com.xiaoleilu</groupId>
<artifactId>hutool</artifactId>
<version>2.15.11</version>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.26</version>
</dependency>
<!-- Test dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<!-- needs extra dependencies: objenesis & hamcrest -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.fusesource.mqtt-client</groupId>
<artifactId>mqtt-client</artifactId>
@@ -169,29 +162,7 @@
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.websocket</groupId>
<artifactId>websocket-client</artifactId>
<version>9.2.0.M1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<!-- use 2.6.0 for Java 7 projects -->
<version>2.6.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.191</version>
<scope>test</scope>
<version>1.2.2</version>
</dependency>
<dependency>
@@ -214,14 +185,12 @@
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.13.1</version>
<version>4.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
@@ -95,9 +95,15 @@ public class PushServer {
pushMessage.deviceToken = session.getDeviceToken();
pushMessage.unReceivedMsg = badge;
pushMessage.userId = session.getUsername();
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_Android) {
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS ||
session.getPlatform() == ProtoConstants.Platform.Platform_iPad ||
session.getPlatform() == ProtoConstants.Platform.Platform_Android ||
session.getPlatform() == ProtoConstants.Platform.Platform_APad ||
session.getPlatform() == ProtoConstants.Platform.Platform_Harmony ||
session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad
) {
String url = androidPushServerUrl;
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad) {
url = iOSPushServerUrl;
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
}
@@ -1,8 +1,6 @@
package com.xiaoleilu.loServer;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.DateUtil;
import cn.hutool.core.date.DateUtil;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.ClassUtil;
import com.xiaoleilu.loServer.annotation.Route;
@@ -1,6 +1,6 @@
package com.xiaoleilu.loServer;
import com.xiaoleilu.hutool.util.DateUtil;
import cn.hutool.core.date.DateUtil;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.AdminActionHandler;
@@ -5,11 +5,9 @@ import java.nio.charset.Charset;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.xiaoleilu.hutool.lang.Singleton;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.FileUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Singleton;
import cn.hutool.core.util.StrUtil;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.DefaultIndexAction;
import com.xiaoleilu.loServer.action.UnknownErrorAction;
@@ -189,7 +187,7 @@ public class ServerSetting {
* @param filterClass Filter类
*/
public static void setFilter(String path, Class<? extends Filter> filterClass) {
setFilter(path, (Filter)Singleton.get(filterClass));
setFilter(path, (Filter) Singleton.get(filterClass));
}
//----------------------------------------------------------------------------------------------- Filter end
@@ -8,13 +8,11 @@ import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import com.hazelcast.core.HazelcastInstance;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.DateUtil;
import com.xiaoleilu.hutool.util.FileUtil;
import com.xiaoleilu.hutool.util.ReUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
@@ -24,6 +22,8 @@ import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.slf4j.LoggerFactory;
import static cn.hutool.core.date.DatePattern.HTTP_DATETIME_PATTERN;
/**
* 默认的主页Action,当访问主页且没有定义主页Action时,调用此Action
*
@@ -96,7 +96,7 @@ public class FileAction extends Action {
}
private static final Pattern INSECURE_URI = Pattern.compile(".*[<>&\"].*");
private static final SimpleDateFormat HTTP_DATE_FORMATER = new SimpleDateFormat(DateUtil.HTTP_DATETIME_PATTERN, Locale.US);
private static final SimpleDateFormat HTTP_DATE_FORMATER = new SimpleDateFormat(HTTP_DATETIME_PATTERN, Locale.US);
/**
@@ -1,9 +1,6 @@
package com.xiaoleilu.loServer.action;
import com.hazelcast.core.HazelcastInstance;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.spi.IMessagesStore;
@@ -4,9 +4,6 @@ import java.io.PrintWriter;
import java.io.StringWriter;
import com.hazelcast.core.HazelcastInstance;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
@@ -48,10 +48,6 @@ public class CreateChatroomAction extends AdminAction {
inputCreateChatroom.setChatroomId(messagesStore.getShortUUID());
}
if (inputCreateChatroom.getPortrait() == null || inputCreateChatroom.getPortrait().length() == 0) {
inputCreateChatroom.setPortrait("https://avatars.io/gravatar/" + inputCreateChatroom.getChatroomId());
}
WFCMessage.ChatroomInfo info = inputCreateChatroom.toChatroomInfo();
messagesStore.createChatroom(inputCreateChatroom.getChatroomId(), info);
setResponseContent(RestResult.ok(new OutputCreateChatroom(inputCreateChatroom.getChatroomId())), response);
@@ -45,23 +45,13 @@ public class CreateRobotAction extends AdminAction {
if (inputCreateRobot != null
&& !StringUtil.isNullOrEmpty(inputCreateRobot.getName())) {
if(StringUtil.isNullOrEmpty(inputCreateRobot.getPassword())) {
inputCreateRobot.setPassword(UUIDGenerator.getUUID());
}
if(StringUtil.isNullOrEmpty(inputCreateRobot.getUserId())) {
inputCreateRobot.setUserId(messagesStore.getShortUUID());
}
if (inputCreateRobot.getPortrait() == null || inputCreateRobot.getPortrait().length() == 0) {
inputCreateRobot.setPortrait("https://avatars.io/gravatar/" + inputCreateRobot.getUserId());
}
WFCMessage.User newUser = inputCreateRobot.toUser();
try {
messagesStore.addUserInfo(newUser, inputCreateRobot.getPassword());
messagesStore.addUserInfo(newUser);
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ADMIN_API_Exception);
@@ -47,10 +47,6 @@ public class CreateUserAction extends AdminAction {
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())
&& (inputCreateUser.getType() == ProtoConstants.UserType.UserType_Normal || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Admin || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Super_Admin)) {
if(StringUtil.isNullOrEmpty(inputCreateUser.getPassword())) {
inputCreateUser.setPassword(UUIDGenerator.getUUID());
}
if(StringUtil.isNullOrEmpty(inputCreateUser.getUserId())) {
inputCreateUser.setUserId(messagesStore.getShortUUID());
}
@@ -85,7 +81,7 @@ public class CreateUserAction extends AdminAction {
try {
messagesStore.addUserInfo(newUserBuilder.build(), inputCreateUser.getPassword());
messagesStore.addUserInfo(newUserBuilder.build());
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ADMIN_API_Exception);
@@ -57,6 +57,10 @@ public class GetGroupInfoAction extends AdminAction {
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
pojoGroupInfo.setSearchable(groupInfo.getSearchable());
pojoGroupInfo.setMax_member_count(groupInfo.getMemberCount());
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
result = RestResult.ok(pojoGroupInfo);
}
setResponseContent(result, response);
@@ -0,0 +1,47 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.*;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.MemorySessionStore;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import java.util.Collection;
@Route(APIPath.User_Online_List)
@HttpMethod("POST")
public class GetOnlineUserAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
GetOnlineUserRequest getOnlineUserRequest = getRequestBody(request.getNettyRequest(), GetOnlineUserRequest.class);
if (getOnlineUserRequest.nodeId == 1) {
GetOnlineUserResult result = messagesStore.getOnlineUsers(getOnlineUserRequest.offset, getOnlineUserRequest.count);
setResponseContent(RestResult.ok(result), response);
} else {
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
}
}
return true;
}
}
@@ -0,0 +1,50 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.GetOnlineUserCountResult;
import cn.wildfirechat.pojos.GetUserSessionResult;
import cn.wildfirechat.pojos.InputUserId;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.MemorySessionStore;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import java.util.Collection;
@Route(APIPath.User_Online_Count)
@HttpMethod("POST")
public class GetUserOnlineCountAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
int count = messagesStore.getOnlineUserCount();
GetOnlineUserCountResult result = new GetOnlineUserCountResult();
GetOnlineUserCountResult.Node node = new GetOnlineUserCountResult.Node();
node.node = 1;
node.count = count;
result.add(node);
setResponseContent(RestResult.ok(result), response);
}
return true;
}
}
@@ -0,0 +1,57 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.GetUserSessionResult;
import cn.wildfirechat.pojos.InputGetChatroomInfo;
import cn.wildfirechat.pojos.InputUserId;
import cn.wildfirechat.pojos.OutputStringList;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.moquette.persistence.MemorySessionStore;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import java.util.Collection;
@Route(APIPath.User_Session_List)
@HttpMethod("POST")
public class GetUserSessionsAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputUserId inputUserId = getRequestBody(request.getNettyRequest(), InputUserId.class);
String userId = inputUserId.getUserId();
if (!StringUtil.isNullOrEmpty(userId)) {
Collection<MemorySessionStore.Session> sessions = sessionsStore.sessionForUser(userId);
GetUserSessionResult result = new GetUserSessionResult();
for (MemorySessionStore.Session session : sessions) {
boolean isOnline = sessionsStore.isClientOnline(session.getClientID());
result.userSessions.add(new GetUserSessionResult.UserSession(session.getUsername(), session.getClientID(), session.getPlatform(), session.getPushType(), session.getDeviceToken(), session.getVoipDeviceToken(), isOnline));
}
setResponseContent(RestResult.ok(result), response);
} else {
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
}
}
return true;
}
}
@@ -0,0 +1,66 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputUserInfoList;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.List;
@Route(APIPath.User_Get_Email_Info)
@HttpMethod("POST")
public class GetUsersByEmailAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
String email = getRequestBody(request.getNettyRequest(), String.class);
if (!StringUtil.isNullOrEmpty(email)) {
List<WFCMessage.User> users = messagesStore.getUserInfosByEmail(email);
List<InputOutputUserInfo> list = new ArrayList<>();
for (WFCMessage.User user : users) {
list.add(InputOutputUserInfo.fromPbUser(user));
}
RestResult result;
if (list.isEmpty()) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
OutputUserInfoList outputUserInfoList = new OutputUserInfoList();
outputUserInfoList.userInfos = list;
result = RestResult.ok(outputUserInfoList);
}
setResponseContent(result, response);
} else {
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
}
}
return true;
}
}
@@ -56,6 +56,10 @@ public class GetGroupInfoAction extends RobotAction {
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
pojoGroupInfo.setSearchable(groupInfo.getSearchable());
pojoGroupInfo.setMax_member_count(groupInfo.getMemberCount());
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
result = RestResult.ok(pojoGroupInfo);
}
setResponseContent(result, response);
@@ -1,31 +1,32 @@
package com.xiaoleilu.loServer.exception;
import com.xiaoleilu.hutool.util.StrUtil;
/**
* 设置异常
* @author xiaoleilu
*/
public class ServerSettingException extends RuntimeException{
private static final long serialVersionUID = -4134588858314744501L;
public ServerSettingException(Throwable e) {
super(e);
}
public ServerSettingException(String message) {
super(message);
}
public ServerSettingException(String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params));
}
public ServerSettingException(String message, Throwable throwable) {
super(message, throwable);
}
public ServerSettingException(Throwable throwable, String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params), throwable);
}
}
package com.xiaoleilu.loServer.exception;
import cn.hutool.core.util.StrUtil;
/**
* 设置异常
* @author xiaoleilu
*/
public class ServerSettingException extends RuntimeException{
private static final long serialVersionUID = -4134588858314744501L;
public ServerSettingException(Throwable e) {
super(e);
}
public ServerSettingException(String message) {
super(message);
}
public ServerSettingException(String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params));
}
public ServerSettingException(String message, Throwable throwable) {
super(message, throwable);
}
public ServerSettingException(Throwable throwable, String messageTemplate, Object... params) {
super(StrUtil.format(messageTemplate, params), throwable);
}
}
@@ -1,7 +1,7 @@
package com.xiaoleilu.loServer.handler;
import cn.hutool.core.lang.Singleton;
import cn.wildfirechat.common.IMExceptionEvent;
import com.xiaoleilu.hutool.lang.Singleton;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.UnknownErrorAction;
@@ -8,7 +8,6 @@
package com.xiaoleilu.loServer.handler;
import com.xiaoleilu.hutool.lang.Singleton;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.FileAction;
@@ -1,28 +1,27 @@
package com.xiaoleilu.loServer.handler;
import com.xiaoleilu.hutool.log.StaticLog;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.channel.FileRegion;
import io.netty.handler.codec.http.DefaultHttpResponse;
import io.netty.handler.codec.http.HttpContentCompressor;
/**
* 解决大文件传输与Gzip压缩冲突问题
* @author Looly
*
*/
public class HttpChunkContentCompressor extends HttpContentCompressor {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
StaticLog.debug("Write object [{}]", msg);
if (msg instanceof FileRegion || msg instanceof DefaultHttpResponse) {
//文件传输不经过Gzip压缩
ctx.write(msg, promise);
}else{
super.write(ctx, msg, promise);
}
}
}
package com.xiaoleilu.loServer.handler;
import cn.hutool.log.StaticLog;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.channel.FileRegion;
import io.netty.handler.codec.http.DefaultHttpResponse;
import io.netty.handler.codec.http.HttpContentCompressor;
/**
* 解决大文件传输与Gzip压缩冲突问题
* @author Looly
*
*/
public class HttpChunkContentCompressor extends HttpContentCompressor {
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
StaticLog.debug("Write object [{}]", msg);
if (msg instanceof FileRegion || msg instanceof DefaultHttpResponse) {
//文件传输不经过Gzip压缩
ctx.write(msg, promise);
}else{
super.write(ctx, msg, promise);
}
}
}
@@ -1,7 +1,6 @@
package com.xiaoleilu.loServer.handler;
import io.netty.util.internal.StringUtil;
import com.xiaoleilu.hutool.util.FileUtil;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
@@ -8,7 +8,6 @@
package com.xiaoleilu.loServer.handler;
import com.xiaoleilu.hutool.lang.Singleton;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.FileAction;
@@ -10,15 +10,12 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.xiaoleilu.hutool.http.HttpUtil;
import com.xiaoleilu.hutool.lang.Conver;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import com.xiaoleilu.hutool.util.URLUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpHeaderNames;
@@ -261,7 +258,7 @@ public class Request {
* @return 获得Integer类型请求参数
*/
public Integer getIntParam(String name, Integer defaultValue) {
return Conver.toInt(getParam(name), defaultValue);
return Convert.toInt(getParam(name), defaultValue);
}
/**
@@ -270,7 +267,7 @@ public class Request {
* @return 获得long类型请求参数
*/
public Long getLongParam(String name, Long defaultValue) {
return Conver.toLong(getParam(name), defaultValue);
return Convert.toLong(getParam(name), defaultValue);
}
/**
@@ -279,7 +276,7 @@ public class Request {
* @return 获得Double类型请求参数
*/
public Double getDoubleParam(String name, Double defaultValue) {
return Conver.toDouble(getParam(name), defaultValue);
return Convert.toDouble(getParam(name), defaultValue);
}
/**
@@ -288,7 +285,7 @@ public class Request {
* @return 获得Float类型请求参数
*/
public Float getFloatParam(String name, Float defaultValue) {
return Conver.toFloat(getParam(name), defaultValue);
return Convert.toFloat(getParam(name), defaultValue);
}
/**
@@ -297,7 +294,7 @@ public class Request {
* @return 获得Boolean类型请求参数
*/
public Boolean getBoolParam(String name, Boolean defaultValue) {
return Conver.toBool(getParam(name), defaultValue);
return Convert.toBool(getParam(name), defaultValue);
}
/**
@@ -477,7 +474,7 @@ public class Request {
protected void putIp(ChannelHandlerContext ctx) {
String ip = getHeader("X-Forwarded-For");
if (StrUtil.isNotBlank(ip)) {
ip = HttpUtil.getMultistageReverseProxyIp(ip);
ip = NetUtil.getMultistageReverseProxyIp(ip);
} else {
final InetSocketAddress insocket = (InetSocketAddress) ctx.channel().remoteAddress();
ip = insocket.getAddress().getHostAddress();
@@ -13,12 +13,9 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.TimeZone;
import com.xiaoleilu.hutool.http.HttpUtil;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.DateUtil;
import com.xiaoleilu.hutool.util.StrUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import com.xiaoleilu.loServer.ServerSetting;
import com.xiaoleilu.loServer.listener.FileProgressiveFutureListener;
@@ -44,6 +41,8 @@ import io.netty.handler.codec.http.cookie.ServerCookieEncoder;
import org.apache.tika.Tika;
import org.slf4j.LoggerFactory;
import static cn.hutool.core.date.DatePattern.HTTP_DATETIME_PATTERN;
/**
* 响应对象
*
@@ -332,7 +331,7 @@ public class Response {
* @param httpCacheSeconds 缓存时间,单位秒
*/
public void setDateAndCache(long lastModify, int httpCacheSeconds) {
SimpleDateFormat formatter = new SimpleDateFormat(DateUtil.HTTP_DATETIME_PATTERN, Locale.US);
SimpleDateFormat formatter = new SimpleDateFormat(HTTP_DATETIME_PATTERN, Locale.US);
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
// Date header
@@ -2,10 +2,7 @@ package com.xiaoleilu.loServer.listener;
import java.io.RandomAccessFile;
import com.xiaoleilu.hutool.io.IoUtil;
import com.xiaoleilu.hutool.log.Log;
import com.xiaoleilu.hutool.log.StaticLog;
import cn.hutool.core.io.IoUtil;
import io.netty.channel.ChannelProgressiveFuture;
import io.netty.channel.ChannelProgressiveFutureListener;
import org.slf4j.LoggerFactory;
@@ -135,6 +135,7 @@ public final class BrokerConstants {
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
public static final String SERVER_MULTI_PC_ENDPOINT = "server.multi_pc_endpoint";
public static final String SERVER_MULTI_PAD_ENDPOINT = "server.multi_pad_endpoint";
public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification";
public static final String SERVER_MOBILE_DEFAULT_SILENT_WHEN_PC_ONLINE = "server.mobile_default_silent_when_pc_online";
public static final String SERVER_CLIENT_SUPPORT_KICKOFF_EVENT = "server.client_support_kickoff_event";
@@ -154,8 +155,12 @@ public final class BrokerConstants {
public static final String MESSAGE_NO_Forward_Admin_Message = "message.no_forward_admin_message";
public static final String MESSAGE_Push_Expired_Days = "message.push_expired_days";
public static final String MESSAGE_Force_Push_Types = "message.force_push_types";
public static final String MESSAGE_Forward_With_Client_Info = "message.forward_with_client_info";
public static final String BROADCAST_Target_From_User_Table = "message.broadcast.target_from_user_table";
public static final String ROBOT_Callback_With_Client_Info = "robot.callback_with_client_info";
public static final String CHANNEL_Callback_With_Client_Info = "channel.callback_with_client_info";
@@ -182,6 +187,10 @@ public final class BrokerConstants {
public static final String GROUP_Visible_Quit_Kickoff_Notification = "group.visible_quit_or_kickoff_notification";
public static final String GROUP_Forbidden_Client_Operation = "group.forbidden_client_operation";
public static final String GROUP_Disable_Stranger_Invite = "group.disable_stranger_invite";
public static final String GROUP_INFO_MARK_DELETION = "group.enable_mark_deletion";
public static final String USER_HIDE_PROPERTIES = "user.hide_properties";
public static final String USER_KEEP_DISPLAY_NAME_WHEN_DESTROY = "user.keep_display_name_when_destroy";
@@ -27,7 +27,7 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
if (!StringUtil.isNullOrEmpty(request.getGroup().getGroupInfo().getTargetId())) {
WFCMessage.GroupInfo existGroupInfo = m_messagesStore.getGroupInfo(request.getGroup().getGroupInfo().getTargetId());
if (existGroupInfo != null) {
if (existGroupInfo != null && existGroupInfo.getDeleted() == 0) {
return ErrorCode.ERROR_CODE_GROUP_ALREADY_EXIST;
}
}
@@ -50,8 +50,16 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
}
if(requestSourceType == ProtoConstants.RequestSourceType.Request_From_User) {
ErrorCode errorCode = m_messagesStore.canAddGroupMembers(fromUser, request.getGroup().getMembersList());
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
}
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), request.getMemberExtra(), isAdmin);
if (groupInfo != null) {
if (groupInfo != null && groupInfo.getDeleted() == 0) {
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
} else {
@@ -10,7 +10,6 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.hutool.system.UserInfo;
import io.moquette.persistence.MemorySessionStore;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.moquette.spi.impl.security.TokenAuthenticator;
@@ -36,6 +36,7 @@ import java.util.function.Function;
import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static io.moquette.BrokerConstants.GROUP_INFO_MARK_DELETION;
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingPrivacySearchable;
@@ -45,6 +46,7 @@ public class DatabaseStore {
private final ThreadPoolExecutorWrapper mScheduler;
private boolean disableRemoteMessageSearch = false;
private boolean encryptMessage = false;
private boolean keepGroupInfo = false;
public void setDisableRemoteMessageSearch(boolean disableRemoteMessageSearch) {
this.disableRemoteMessageSearch = disableRemoteMessageSearch;
}
@@ -55,6 +57,11 @@ public class DatabaseStore {
public DatabaseStore(ThreadPoolExecutorWrapper scheduler) {
this.mScheduler = scheduler;
try {
keepGroupInfo = Boolean.parseBoolean(Server.getServer().getConfig().getProperty(GROUP_INFO_MARK_DELETION, "false"));
} catch (Exception e) {
}
}
TreeMap<Long, Long> reloadUserMessageMaps(String userId) {
@@ -188,7 +195,7 @@ public class DatabaseStore {
sql += " where `_mobile` = ? ";
} else if(searchType == SearchUserType_UserId) {
sql += " where `_uid` = ? ";
} else if(searchType == SearchUserType_Name_Mobile) {
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
sqlParaCount = 2;
sql += " where (`_name` = ? or `_mobile` = ?) ";
} else {
@@ -200,7 +207,7 @@ public class DatabaseStore {
if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile || searchType == SearchUserType_UserId) {
sql += " limit 1";
} else if(searchType == SearchUserType_Name_Mobile) {
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
sql += " limit 2";
} else {
sql += " limit 3";
@@ -291,7 +298,7 @@ public class DatabaseStore {
if (searchType == SearchUserType_Name) {
filter.add(user);
continue;
} else if(searchType == SearchUserType_Name_Mobile) {
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
if(keyword.equals(user.getName())) {
if(!keyword.equals(user.getMobile())) {
filter.add(user);
@@ -331,7 +338,7 @@ public class DatabaseStore {
if (searchType == SearchUserType_Mobile) {
filter.add(user);
continue;
} else if(searchType == SearchUserType_Name_Mobile) {
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
if(keyword.equals(user.getMobile())) {
if(!keyword.equals(user.getName())) {
filter.add(user);
@@ -412,7 +419,7 @@ public class DatabaseStore {
connection = DBUtil.getConnection();
String sql = "select u._uid, u._name, u._display_name, u._portrait, u._mobile, u._gender, u._email, u._address, u._company, u._social, u._extra, u._dt, u._type " +
" from t_user u left join (select _uid, _value from t_user_setting where _scope = 27) s on u._uid = s._uid " +
" where u._display_name like ? and u._type <> 2 and u._deleted = 0 ";
" where u._display_name like ? ESCAPE '!' and u._type <> 2 and u._deleted = 0 ";
if(nameOrIdMatched.size() == 1) {
sql += " and u._uid <> ? and u._name <> ?";
} else if(nameOrIdMatched.size() == 2) {
@@ -430,6 +437,12 @@ public class DatabaseStore {
sql += " offset " + (page * 20 - nameOrIdMatched.size());
}
keyword = keyword
.replace("!", "!!")
.replace("%", "!%")
.replace("_", "!_")
.replace("[", "![");
statement = connection.prepareStatement(sql);
statement.setString(1, "%" + keyword + "%");
if(nameOrIdMatched.size() == 1) {
@@ -517,7 +530,7 @@ public class DatabaseStore {
out.addAll(nameOrIdMatched);
}
if(searchType == SearchUserType_General) {
if(searchType == SearchUserType_General || searchType == SearchUserType_Name_Mobile_DisplayName) {
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page, nameOrIdMatched);
general.removeAll(nameOrIdMatched);
out.addAll(general);
@@ -1419,7 +1432,8 @@ public class DatabaseStore {
", `_join_type`" +
", `_private_chat`" +
", `_searchable`" +
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
", `_deleted`" +
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " +
"`_name` = ?," +
"`_portrait` = ?," +
@@ -1430,8 +1444,9 @@ public class DatabaseStore {
"`_mute` = ?" +
", `_join_type` = ?" +
", `_private_chat` = ?" +
", `_searchable` = ?, " +
"`_member_dt` = ?";
", `_searchable` = ?" +
", `_deleted` = ?" +
", `_member_dt` = ?";
statement = connection.prepareStatement(sql);
@@ -1449,6 +1464,7 @@ public class DatabaseStore {
statement.setInt(index++, groupInfo.getJoinType());
statement.setInt(index++, groupInfo.getPrivateChat());
statement.setInt(index++, groupInfo.getSearchable());
statement.setInt(index++, groupInfo.getDeleted());
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
statement.setString(index++, groupInfo.getName());
@@ -1461,6 +1477,7 @@ public class DatabaseStore {
statement.setInt(index++, groupInfo.getJoinType());
statement.setInt(index++, groupInfo.getPrivateChat());
statement.setInt(index++, groupInfo.getSearchable());
statement.setInt(index++, groupInfo.getDeleted());
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
@@ -1792,10 +1809,12 @@ public class DatabaseStore {
try {
connection = DBUtil.getConnection();
String sql;
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX) {
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_Harmony) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
} else {
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and `_platform` = ? and `_cid` <> ? and `_deleted` = 0";
}
@@ -1810,13 +1829,19 @@ public class DatabaseStore {
statement.setString(index++, uid);
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX) {
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) {
statement.setInt(index++, ProtoConstants.Platform.Platform_Windows);
statement.setInt(index++, ProtoConstants.Platform.Platform_OSX);
statement.setInt(index++, ProtoConstants.Platform.Platform_LINUX);
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
statement.setInt(index++, ProtoConstants.Platform.Platform_HarmonyPC);
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_Harmony) {
statement.setInt(index++, ProtoConstants.Platform.Platform_iOS);
statement.setInt(index++, ProtoConstants.Platform.Platform_Android);
statement.setInt(index++, ProtoConstants.Platform.Platform_Harmony);
} else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) {
statement.setInt(index++, ProtoConstants.Platform.Platform_iPad);
statement.setInt(index++, ProtoConstants.Platform.Platform_APad);
statement.setInt(index++, ProtoConstants.Platform.Platform_HarmonyPad);
} else {
statement.setInt(index++, platform);
}
@@ -2903,6 +2928,99 @@ public class DatabaseStore {
return null;
}
List<WFCMessage.User> getUserInfosByEmail(String email) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
List<WFCMessage.User> outList = new ArrayList<>();
try {
connection = DBUtil.getConnection();
String sql = "select `_uid`, `_name`" +
", `_display_name`" +
", `_portrait`" +
", `_mobile`" +
", `_gender`" +
", `_email`" +
", `_address`" +
", `_company`" +
", `_social`" +
", `_extra`" +
", `_type`" +
", `_deleted`" +
", `_dt` from t_user where `_deleted` = 0 and `_email` = ?";
statement = connection.prepareStatement(sql);
statement.setString(1, email);
rs = statement.executeQuery();
while (rs.next()) {
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
int index = 1;
String value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setUid(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setDisplayName(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setPortrait(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setMobile(value);
int gender = rs.getInt(index++);
builder.setGender(gender);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setEmail(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setAddress(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setCompany(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setSocial(value);
value = rs.getString(index++);
value = (value == null ? "" : value);
builder.setExtra(value);
int type = rs.getInt(index++);
builder.setType(type);
int deleted = rs.getInt(index++);
builder.setDeleted(deleted);
long longValue = rs.getLong(index++);
if(longValue <= 0)
longValue = 1;
builder.setUpdateDt(longValue);
outList.add(builder.build());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement, rs);
}
return outList;
}
List<WFCMessage.User> getAllUsers(int count, int offset) {
Connection connection = null;
PreparedStatement statement = null;
@@ -3000,17 +3118,20 @@ public class DatabaseStore {
return outList;
}
Set<String> getAllEnds() {
Set<String> getAllEnds(boolean fromUserTable) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
try {
connection = DBUtil.getConnection();
String sql = "select distinct(`_uid`) from t_user_session where `_deleted` = 0";
String sql;
if(fromUserTable) {
sql = "select distinct(`_uid`) from t_user_session";
} else {
sql = "select distinct(`_uid`) from t_user where `_deleted` = 0 and `_type` <> 1 and `_type` <> 2";
}
statement = connection.prepareStatement(sql);
rs = statement.executeQuery();
Set<String> out = new HashSet<>();
while (rs.next()) {
@@ -3300,8 +3421,12 @@ public class DatabaseStore {
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "delete from t_group where _gid = ?";
String sql;
if(keepGroupInfo) {
sql = "update t_group set _deleted = 1, _dt = _dt+1, _member_count = 0, _member_dt = _member_dt+1 where _gid = ?";
} else {
sql = "delete from t_group where _gid = ?";
}
statement = connection.prepareStatement(sql);
int index = 1;
@@ -3628,7 +3753,7 @@ public class DatabaseStore {
", `_extra`" +
", `_dt` from t_channel";
if (buzzy) {
sql += " where `_name` like ?";
sql += " where `_name` like ? ESCAPE '!' ";
} else {
sql += " where `_name` = ?";
}
@@ -3642,6 +3767,12 @@ public class DatabaseStore {
sql += " offset " + page * 20;
}
keyword = keyword
.replace("!", "!!")
.replace("%", "!%")
.replace("_", "!_")
.replace("[", "![");
statement = connection.prepareStatement(sql);
int index = 1;
if (buzzy) {
@@ -23,6 +23,8 @@ import com.google.gson.Gson;
import com.google.protobuf.ByteString;
import com.hazelcast.core.*;
import com.hazelcast.util.StringUtil;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.Action;
import com.xiaoleilu.loServer.action.admin.AdminAction;
import com.xiaoleilu.loServer.model.FriendData;
import cn.wildfirechat.common.ErrorCode;
@@ -48,6 +50,7 @@ import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
@@ -72,6 +75,7 @@ import static io.moquette.BrokerConstants.*;
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static cn.wildfirechat.pojos.MyInfoType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingAddFriendNoVerify;
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
public class MemoryMessagesStore implements IMessagesStore {
@@ -154,11 +158,13 @@ public class MemoryMessagesStore implements IMessagesStore {
private boolean mFriendRobotAutoAccept = true;
private long mPushExpiredTimes = 604800000L;
private Set<Integer> mForcePushTypes = new HashSet<>();
private boolean mMultiPlatformNotification = false;
private boolean mMobileDefaultSilentWhenPCOnline = true;
private boolean mDisableStrangerChat = false;
private Set<String> mAllowStrangerChatSet = new HashSet<>();
private boolean mDisableStrangerAddGroup = false;
private Set<String> mClientSignatureSet = new HashSet<>();
private boolean mRejectEmptySignature = true;
@@ -192,6 +198,8 @@ public class MemoryMessagesStore implements IMessagesStore {
private boolean keepDisplayNameWhenDestroyUser = true;
private String mRecallForwardUrl = null;
private boolean mBroadcastTargetFromUserTable = false;
private boolean mForwardMessageWithClientInfo = false;
private boolean mRobotCallbackWithClientInfo = false;
private boolean mChannelCallbackWithClientInfo = false;
@@ -253,6 +261,20 @@ public class MemoryMessagesStore implements IMessagesStore {
e.printStackTrace();
}
try {
String forcePushTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Force_Push_Types);
if(!StringUtil.isNullOrEmptyAfterTrim(forcePushTypes)) {
forcePushTypes = forcePushTypes.replace(",", ",");
for (String s : forcePushTypes.split(",")) {
int type = Integer.parseInt(s.trim());
if(type > 0) {
mForcePushTypes.add(type);
}
}
}
} catch (Exception e) {
}
try {
mMultiPlatformNotification = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PLATFROM_NOTIFICATION, "false"));
} catch (Exception e) {
@@ -513,6 +535,11 @@ public class MemoryMessagesStore implements IMessagesStore {
}
try {
mDisableStrangerAddGroup = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.GROUP_Disable_Stranger_Invite, "false"));
} catch (Exception e) {
}
try {
String s = server.getConfig().getProperty(GROUP_Forbidden_Client_Operation, null);
if(!StringUtil.isNullOrEmptyAfterTrim(s)) {
@@ -560,6 +587,13 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
}
try {
mBroadcastTargetFromUserTable = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.BROADCAST_Target_From_User_Table, "false"));
} catch (Exception e) {
}
try {
mRobotCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ROBOT_Callback_With_Client_Info, "false"));
} catch (Exception e) {
@@ -748,7 +782,7 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public Set<String> getAllEnds() {
return databaseStore.getAllEnds();
return databaseStore.getAllEnds(mBroadcastTargetFromUserTable);
}
@Override
public WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType) {
@@ -1185,6 +1219,85 @@ public class MemoryMessagesStore implements IMessagesStore {
return messageSeq;
}
@Override
public ErrorCode canAddGroupMembers(String fromUser, List<WFCMessage.GroupMember> memberList) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
WFCMessage.User operator = mUserMap.get(fromUser);
if(operator != null && operator.getType() > 1) {
return ErrorCode.ERROR_CODE_SUCCESS;
}
if (mDisableStrangerAddGroup) {
for (WFCMessage.GroupMember groupMember : memberList) {
String targetUser = groupMember.getMemberId();
if(fromUser.equals(targetUser)) {
continue;
}
Collection<FriendData> friendDatas = friendsMap.get(targetUser);
if (friendDatas == null || friendDatas.size() == 0) {
friendDatas = loadFriend(friendsMap, targetUser);
}
boolean allow = false;
for (FriendData friendData : friendDatas) {
if (friendData.getFriendUid().equals(fromUser)) {
if (friendData.getBlacked() == 1) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
} else {
if (friendData.getState() == 0) {
allow = true;
}
break;
}
}
}
if(allow) {
continue;
}
//在禁止私聊时,是否是允许私聊的用户id
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser)) {
continue;
}
//在禁止私聊时,允许机器人,物联网设备及管理员进行私聊。
WFCMessage.User target = mUserMap.get(targetUser);
if (target != null && target.getType() != ProtoConstants.UserType.UserType_Normal) {
continue;
}
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
} else {
for (WFCMessage.GroupMember groupMember : memberList) {
String targetUser = groupMember.getMemberId();
if(fromUser.equals(targetUser)) {
continue;
}
Collection<FriendData> friendDatas = friendsMap.get(targetUser);
if (friendDatas == null || friendDatas.size() == 0) {
friendDatas = loadFriend(friendsMap, targetUser);
}
for (FriendData friendData : friendDatas) {
if (friendData.getFriendUid().equals(fromUser)) {
if (friendData.getBlacked() == 1) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
} else {
break;
}
}
}
}
}
return ErrorCode.ERROR_CODE_SUCCESS;
}
@Override
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -1260,17 +1373,35 @@ public class MemoryMessagesStore implements IMessagesStore {
mIMap.set(groupId, groupInfo);
databaseStore.persistGroupMember(groupId, updatedMemberList, false);
callbackGroupEvent(fromUser, groupInfo.getTargetId(), ProtoConstants.GroupUpdateEventType.Group_Event_Create);
callbackGroupEvent(fromUser, groupInfo.getTargetId(), ProtoConstants.GroupUpdateEventType.Group_Event_Create, groupInfo);
return groupInfo;
}
private void callbackGroupEvent(String operatorId, String groupId, int type) {
private void callbackGroupEvent(String operatorId, String groupId, int type, WFCMessage.GroupInfo groupInfo) {
if (!StringUtil.isNullOrEmpty(mGroupInfoUpdateCallback)) {
GroupUpdateEvent event = new GroupUpdateEvent();
event.operatorId = operatorId;
event.groupId = groupId;
event.type = type;
PojoGroupInfo pojoGroupInfo = new PojoGroupInfo();
event.groupInfo = pojoGroupInfo;
if (groupInfo != null && groupInfo.getDeleted() == 0) {
pojoGroupInfo.setExtra(groupInfo.getExtra());
pojoGroupInfo.setName(groupInfo.getName());
pojoGroupInfo.setOwner(groupInfo.getOwner());
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
pojoGroupInfo.setType(groupInfo.getType());
pojoGroupInfo.setMute(groupInfo.getMute());
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
pojoGroupInfo.setSearchable(groupInfo.getSearchable());
pojoGroupInfo.setMax_member_count(groupInfo.getMemberCount());
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
}
m_Server.getCallbackScheduler().execute(() -> {
try {
HttpUtils.httpJsonPost(mGroupInfoUpdateCallback, GsonUtil.gson.toJson(event), HttpUtils.HttpPostType.POST_TYPE_Grout_Event_Callback);
@@ -1684,7 +1815,7 @@ public class MemoryMessagesStore implements IMessagesStore {
removeFavGroup(groupId, ids);
removeGroupUserSettings(groupId, ids);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Destroy);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Destroy, groupInfo);
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -1769,12 +1900,12 @@ public class MemoryMessagesStore implements IMessagesStore {
if (modifyType == Modify_Group_Mute) {
if (newInfoBuilder.getMute() > 0) {
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Mute);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Mute, newInfoBuilder.build());
} else {
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Unmute);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Unmute, newInfoBuilder.build());
}
} else {
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Update);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Update, newInfoBuilder.build());
}
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -1787,7 +1918,7 @@ public class MemoryMessagesStore implements IMessagesStore {
WFCMessage.GroupInfo groupInfo = mIMap.get(groupId);
if (groupInfo == null) {
groupInfo = databaseStore.getPersistGroupInfo(groupId);
if (groupInfo != null) {
if (groupInfo != null && groupInfo.getDeleted() == 0) {
mIMap.set(groupId, groupInfo);
} else {
return ErrorCode.ERROR_CODE_NOT_EXIST;
@@ -1872,7 +2003,7 @@ public class MemoryMessagesStore implements IMessagesStore {
WFCMessage.GroupInfo groupInfo = mIMap.get(groupId);
if (groupInfo == null) {
groupInfo = databaseStore.getPersistGroupInfo(groupId);
if (groupInfo != null) {
if (groupInfo != null && groupInfo.getDeleted() == 0) {
mIMap.set(groupId, groupInfo);
} else {
return ErrorCode.ERROR_CODE_NOT_EXIST;
@@ -1956,13 +2087,6 @@ public class MemoryMessagesStore implements IMessagesStore {
ArrayList<WFCMessage.GroupInfo> out = new ArrayList<>();
for (WFCMessage.UserRequest request : requests) {
WFCMessage.GroupInfo groupInfo = mIMap.get(request.getUid());
if (groupInfo == null) {
groupInfo = databaseStore.getPersistGroupInfo(request.getUid());
if (groupInfo != null) {
mIMap.set(request.getUid(), groupInfo);
}
}
if (groupInfo != null && groupInfo.getUpdateDt() > request.getUpdateDt()) {
if(!isAdmin && !StringUtil.isNullOrEmpty(fromUser)) {
WFCMessage.GroupMember gm = getGroupMember(groupInfo.getTargetId(), fromUser);
@@ -2121,7 +2245,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Transfer);
callbackGroupEvent(operator, groupId, ProtoConstants.GroupUpdateEventType.Group_Event_Transfer, groupInfo);
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -2193,7 +2317,7 @@ public class MemoryMessagesStore implements IMessagesStore {
IMap<String, WFCMessage.GroupInfo> groups = hzInstance.getMap(GROUPS_MAP);
WFCMessage.GroupInfo groupInfo = groups.get(groupId);
boolean isMute = false;
if (groupInfo != null) {
if (groupInfo != null && groupInfo.getDeleted() == 0) {
if (groupInfo.getOwner().equals(memberId)) {
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -2650,6 +2774,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
String pcValue = null;
String padValue = null;
for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) {
if (s.getDeleted() != 0 || !m_Server.getConnectionsManager().isConnected(s.getClientID())) {
continue;
@@ -2659,8 +2784,14 @@ public class MemoryMessagesStore implements IMessagesStore {
case Platform_LINUX:
case Platform_Windows:
case Platform_OSX:
case Platform_HarmonyPC:
pcValue = System.currentTimeMillis() + "|" + s.getPlatform() + "|" + s.getClientID() + "|" + s.getPhoneName();
break;
case Platform_iPad:
case Platform_APad:
case Platform_HarmonyPad:
padValue = System.currentTimeMillis() + "|" + s.getPlatform() + "|" + s.getClientID() + "|" + s.getPhoneName();
break;
default:
break;
}
@@ -2670,6 +2801,11 @@ public class MemoryMessagesStore implements IMessagesStore {
if (!isOnlineValueEqual(pcentry, pcValue)) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(pcValue==null?"":pcValue).build(), session.clientID);
}
WFCMessage.UserSettingEntry padentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "Pad");
if (!isOnlineValueEqual(padentry, padValue)) {
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("Pad").setValue(padValue==null?"":padValue).build(), session.clientID);
}
}
@Override
@@ -2768,7 +2904,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
public void addUserInfo(WFCMessage.User user) throws Exception {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
if (databaseStore.isUidAndNameConflict(user.getUid(), user.getName())) {
@@ -2776,7 +2912,6 @@ public class MemoryMessagesStore implements IMessagesStore {
}
databaseStore.updateUser(user);
mUserMap.put(user.getUid(), user);
databaseStore.updateUserPassword(user.getUid(), password);
callbackUserInfoEvent(user);
}
@@ -2862,6 +2997,11 @@ public class MemoryMessagesStore implements IMessagesStore {
return getUserInfo(userId);
}
@Override
public List<WFCMessage.User> getUserInfosByEmail(String email) {
return databaseStore.getUserInfosByEmail(email);
}
@Override
public List<WFCMessage.User> getUserInfoList(int count, int offset) {
return databaseStore.getAllUsers(count, offset);
@@ -2877,10 +3017,18 @@ public class MemoryMessagesStore implements IMessagesStore {
searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_UserId;
}
if(mDisableUserIdSearch && (searchType == ProtoConstants.SearchUserType.SearchUserType_General || searchType == ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_UserId)) {
if(mDisableUserIdSearch && searchType == ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_UserId) {
searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile;
}
if(mDisableUserIdSearch && searchType == ProtoConstants.SearchUserType.SearchUserType_General) {
searchType = ProtoConstants.SearchUserType.SearchUserType_Name_Mobile_DisplayName;
}
if(mDisableUserIdSearch && searchType == ProtoConstants.SearchUserType.SearchUserType_UserId) {
return new ArrayList<>();
}
return databaseStore.searchUserFromDB(keyword, searchType, page);
}
@@ -3183,6 +3331,10 @@ public class MemoryMessagesStore implements IMessagesStore {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
WFCMessage.UserSettingEntry userSettingData = getUserSetting(request.getTargetUid(), kUserSettingAddFriendNoVerify, "");
boolean noVerify = userSettingData != null && "1".equals(userSettingData.getValue());
Collection<WFCMessage.FriendRequest> requests = requestMap.get(userId);
if (requests == null || requests.size() == 0) {
requests = loadFriendRequest(requestMap, userId);
@@ -3197,7 +3349,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted && !isAdmin) {
if (!noVerify && existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted && !isAdmin) {
if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected
&& System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) {
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
@@ -3239,7 +3391,7 @@ public class MemoryMessagesStore implements IMessagesStore {
.setReason(request.getReason())
.setExtra(request.getExtra())
.setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Sent)
.setToReadStatus(false)
.setToReadStatus(noVerify)
.setUpdateDt(System.currentTimeMillis())
.build();
@@ -3247,6 +3399,12 @@ public class MemoryMessagesStore implements IMessagesStore {
requestMap.remove(userId);
requestMap.remove(request.getTargetUid());
if(noVerify) {
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(userId).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
ServerAPIHelper.sendRequest(request.getTargetUid(), null, IMTopic.HandleFriendRequestTopic, handleFriendRequest.toByteArray(), null, ProtoConstants.RequestSourceType.Request_From_User);
}
head[0] = newRequest.getUpdateDt();
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -4367,6 +4525,35 @@ public class MemoryMessagesStore implements IMessagesStore {
return getChannelListener(channelId);
}
@Override
public int getOnlineUserCount() {
return m_Server.getProcessor().getConnectionDescriptors().getActiveConnectionsNo();
}
@Override
public GetOnlineUserResult getOnlineUsers(int offset, int count) {
List<String> onlineUserIds = new ArrayList<>(m_Server.getProcessor().getConnectionDescriptors().getConnectedClientIds());
GetOnlineUserResult result = new GetOnlineUserResult();
result.userClients = new ArrayList<>();
result.totalCount = onlineUserIds.size();
result.offset = offset;
if(onlineUserIds.size() > offset) {
List<String> clientIds = onlineUserIds.subList(offset, Math.min(offset+count, onlineUserIds.size()));
for (String clientId : clientIds) {
MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(clientId);
if(session != null) {
GetOnlineUserResult.UserClient userClient = new GetOnlineUserResult.UserClient();
userClient.userId = session.getUsername();
userClient.clientId = session.getClientID();
userClient.platform = session.getPlatform();
result.userClients.add(userClient);
}
}
}
return result;
}
@Override
public Set<String> handleSensitiveWord(String message) {
updateSensitiveWord();
@@ -4454,6 +4641,11 @@ public class MemoryMessagesStore implements IMessagesStore {
return mPushExpiredTimes;
}
@Override
public Set<Integer> getForcePushTypes() {
return mForcePushTypes;
}
@Override
public List<Integer> getClientForbiddenSendTypes() {
return mForbiddenClientSendTypes;
@@ -40,6 +40,7 @@ public class MemorySessionStore implements ISessionsStore {
private boolean supportMultiEndpoint = false;
private boolean supportMultiPCEndpoint = false;
private boolean supportMultiPadEndpoint = false;
private boolean clientSupportKickoff = false;
public static class Session implements Comparable<Session>{
@@ -292,6 +293,10 @@ public class MemorySessionStore implements ISessionsStore {
supportMultiPCEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PC_ENDPOINT, "false"));
} catch (Exception e) {
}
try {
supportMultiPadEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_PAD_ENDPOINT, "false"));
} catch (Exception e) {
}
try {
clientSupportKickoff = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_CLIENT_SUPPORT_KICKOFF_EVENT, "false"));
@@ -396,6 +401,10 @@ public class MemorySessionStore implements ISessionsStore {
&& !(platform == ProtoConstants.Platform.Platform_Windows && supportMultiPCEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_LINUX && supportMultiPCEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_OSX && supportMultiPCEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_HarmonyPC && supportMultiPCEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_iPad && supportMultiPadEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_APad && supportMultiPadEndpoint)
&& !(platform == ProtoConstants.Platform.Platform_HarmonyPad && supportMultiPadEndpoint)
) {
databaseStore.clearMultiEndpoint(username, clientID, platform);
if (userSessions.get(username) != null) {
@@ -410,15 +419,19 @@ public class MemorySessionStore implements ISessionsStore {
}
boolean remove = false;
if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Harmony) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS || s.getPlatform() == ProtoConstants.Platform.Platform_Harmony) {
remove = true;
}
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_LINUX) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || s.getPlatform() == ProtoConstants.Platform.Platform_LINUX) {
} else if(platform == ProtoConstants.Platform.Platform_iPad || platform == ProtoConstants.Platform.Platform_APad || platform == ProtoConstants.Platform.Platform_HarmonyPad) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_iPad || s.getPlatform() == ProtoConstants.Platform.Platform_APad || s.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad) {
remove = true;
}
} else {
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_LINUX || platform == ProtoConstants.Platform.Platform_HarmonyPC) {
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || s.getPlatform() == ProtoConstants.Platform.Platform_LINUX || s.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC) {
remove = true;
}
} else { //web, microapp
if (s.getPlatform() ==platform) {
remove = true;
}
@@ -615,6 +628,11 @@ public class MemorySessionStore implements ISessionsStore {
return result;
}
@Override
public boolean isClientOnline(String clientId) {
return mServer.getProcessor().getConnectionDescriptors().isConnected(clientId);
}
@Override
public StoredMessage inFlightAck(String clientID, int messageID) {
return getSession(clientID).outboundFlightMessages.remove(messageID);
@@ -742,7 +760,12 @@ public class MemorySessionStore implements ISessionsStore {
if (session.getPlatform() == ProtoConstants.Platform.Platform_LINUX
|| session.getPlatform() == ProtoConstants.Platform.Platform_WEB
|| session.getPlatform() == ProtoConstants.Platform.Platform_Windows
|| session.getPlatform() == ProtoConstants.Platform.Platform_OSX) {
|| session.getPlatform() == ProtoConstants.Platform.Platform_OSX
|| session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC
|| session.getPlatform() == ProtoConstants.Platform.Platform_iPad
|| session.getPlatform() == ProtoConstants.Platform.Platform_APad
|| session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad
) {
databaseStore.updateSessionDeleted(operator, pcClientId, 1);
sessions.remove(pcClientId);
mServer.getProcessor().kickoffSession(session);
@@ -16,13 +16,10 @@
package io.moquette.spi;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputUserChatroom;
import cn.wildfirechat.pojos.SystemSettingPojo;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.model.FriendData;
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
import io.moquette.persistence.DatabaseStore;
import io.moquette.persistence.MemorySessionStore;
import io.moquette.persistence.UserClientEntry;
@@ -32,10 +29,7 @@ import io.netty.buffer.Unpooled;
import io.netty.handler.codec.mqtt.MqttQoS;
import cn.wildfirechat.common.ErrorCode;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
* Defines the SPI to be implemented by a StorageService that handle persistence of messages
@@ -108,6 +102,7 @@ public interface IMessagesStore {
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count, Collection<Integer> contentTypes);
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId, boolean directing);
ErrorCode canAddGroupMembers(String operator, List<WFCMessage.GroupMember> memberList);
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin);
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra);
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
@@ -152,12 +147,13 @@ public interface IMessagesStore {
List<InputOutputUserBlockStatus> getUserStatusList();
ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag);
void addUserInfo(WFCMessage.User user, String password) throws Exception;
void addUserInfo(WFCMessage.User user) throws Exception;
void destroyUser(String userId);
void updateUserInfo(WFCMessage.User user) throws Exception;
WFCMessage.User getUserInfo(String userId);
WFCMessage.User getUserInfoByName(String name);
WFCMessage.User getUserInfoByMobile(String mobile);
List<WFCMessage.User> getUserInfosByEmail(String email);
List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
List<WFCMessage.User> getUserInfoList(int count, int offset);
@@ -228,6 +224,9 @@ public interface IMessagesStore {
boolean checkUserInChannel(String user, String channelId);
Collection<String> getChannelSubscriber(String channelId);
int getOnlineUserCount();
GetOnlineUserResult getOnlineUsers(int offset, int count);
Set<String> handleSensitiveWord(String message);
boolean addSensitiveWords(List<String> words);
boolean removeSensitiveWords(List<String> words);
@@ -248,6 +247,7 @@ public interface IMessagesStore {
boolean isRobotAutoAcceptFriendRequest();
long getPushExpiredTimes();
Set<Integer> getForcePushTypes();
List<Integer> getClientForbiddenSendTypes();
List<Integer> getBlackListExceptionTypes();
@@ -74,6 +74,8 @@ public interface ISessionsStore {
*/
Collection<ClientSession> getAllSessions();
boolean isClientOnline(String clientId);
StoredMessage inFlightAck(String clientID, int messageID);
/**
@@ -21,7 +21,6 @@ import cn.wildfirechat.pojos.OutputMessageData;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import cn.wildfirechat.push.PushServer;
import com.google.gson.Gson;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.util.StringUtil;
import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus;
@@ -223,7 +222,12 @@ public class MessagesPublisher {
if (targetSession.getPlatform() == ProtoConstants.Platform.Platform_WEB
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_Windows
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_LINUX
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_OSX) {
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_OSX
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPC
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_iPad
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_APad
|| targetSession.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad
) {
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
if (targetIsActive) {
isPcOnline = true;
@@ -266,6 +270,7 @@ public class MessagesPublisher {
boolean isVoipSilent;
boolean isNoDisturb;
boolean isConvSilent = false;
boolean isForcePush = false;
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
isSilent = true;
isConvSilent = true;
@@ -284,6 +289,11 @@ public class MessagesPublisher {
conversation = WFCMessage.Conversation.newBuilder().setType(conversationType).setLine(line).setTarget(target).build();
}
if(m_messagesStore.getForcePushTypes().contains(messageContentType)) {
LOG.info("The message type {} force push", messageContentType);
isForcePush = true;
}
if (m_messagesStore.getUserConversationSilent(user, conversation)) {
LOG.info("The conversation {}-{}-{} is slient", conversation.getType(), conversation.getTarget(), conversation.getLine());
isConvSilent = true;
@@ -364,17 +374,17 @@ public class MessagesPublisher {
continue;
}
if (isConvSilent && !isVoip) {
if (isConvSilent && !isVoip && !isForcePush) {
LOG.info("Silent of user or conversation");
continue;
}
if (isSilent && !isVoip) {
if (isSilent && !isVoip && !isForcePush) {
LOG.info("Silent of user");
continue;
}
if(isVoip && isVoipSilent) {
if(isVoip && isVoipSilent && !isForcePush) {
LOG.info("voip silent of user");
continue;
}
@@ -469,6 +479,33 @@ public class MessagesPublisher {
LOG.info("the target {} of user {} is not active", targetSession.getClientID(), targetSession.getUsername());
}
}
if(sessions.isEmpty() && message.getContent().getType() == 403 && !user.equals(message.getFromUser())) {
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
if (userInfo != null && userInfo.getType() == ProtoConstants.UserType.UserType_Robot) {
WFCMessage.Robot robot = m_messagesStore.getRobot(user);
if (robot != null && !StringUtil.isNullOrEmpty(robot.getCallback())) {
OutputClient outputClient = null;
if(m_messagesStore.isRobotCallbackWithClientInfo() && !StringUtil.isNullOrEmpty(exceptClientId)) {
Session session = m_sessionsStore.getSession(exceptClientId);
if(session != null && session.getUsername().equals(message.getFromUser())) {
outputClient = new OutputClient(session.getPlatform(), exceptClientId);
}
}
final WFCMessage.Message finalMsg = message;
OutputClient finalOutputClient = outputClient;
Server.getServer().getCallbackScheduler().execute(() -> {
try {
HttpUtils.httpJsonPost(robot.getCallback(), GsonUtil.gson.toJson(OutputMessageData.fromProtoMessage(finalMsg, finalOutputClient), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Robot_Message_Callback);
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
}
});
}
}
}
}
}
}
@@ -17,6 +17,7 @@
package io.moquette.spi.impl;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.OutputCheckUserOnline;
import cn.wildfirechat.pojos.UserOnlineStatus;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
@@ -266,7 +267,27 @@ public class ProtocolProcessor {
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
mServer.getCallbackScheduler().execute(() -> {
try {
HttpUtils.httpJsonPost(mUserOnlineStatusCallback, GsonUtil.gson.toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName)), HttpUtils.HttpPostType.POST_TYPE_User_Online_Event_Callback);
int sessionstatus;
Collection<MemorySessionStore.Session> useSessions = m_sessionsStore.sessionForUser(userId);
UserOnlineStatus userOnlineStatus = new UserOnlineStatus(userId, clientId, platform, status, packageName);
userOnlineStatus.sessions = new ArrayList<>();
for (MemorySessionStore.Session session : useSessions) {
if (session.getDeleted() > 0) {
continue;
}
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
if (descriptor == null) {
sessionstatus = 1;
} else {
sessionstatus = 0;
}
userOnlineStatus.sessions.add(new OutputCheckUserOnline.Session(userId, session.getClientID(), session.getPlatform(), sessionstatus, session.getLastActiveTime(), session.getAppName()));
}
HttpUtils.httpJsonPost(mUserOnlineStatusCallback, GsonUtil.gson.toJson(userOnlineStatus), HttpUtils.HttpPostType.POST_TYPE_User_Online_Event_Callback);
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
@@ -731,6 +752,10 @@ public class ProtocolProcessor {
channel.flush();
}
public ConnectionDescriptorStore getConnectionDescriptors() {
return connectionDescriptors;
}
public void addInterceptHandler(InterceptHandler interceptHandler) {
this.m_interceptor.addInterceptHandler(interceptHandler);
}
@@ -26,6 +26,7 @@ import java.io.IOException;
import java.util.*;
import java.util.zip.GZIPOutputStream;
import cn.hutool.core.util.ReflectUtil;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.server.ThreadPoolExecutorWrapper;
import com.google.gson.Gson;
@@ -92,7 +93,7 @@ public class Qos1PublishHandler extends QosPublishHandler {
for (Class cls:ClassUtil.getAllAssignedClass(IMHandler.class)) {
Handler annotation = (Handler)cls.getAnnotation(Handler.class);
if(annotation != null) {
IMHandler handler = (IMHandler) com.xiaoleilu.hutool.util.ClassUtil.newInstance(cls);
IMHandler handler = (IMHandler) ReflectUtil.newInstance(cls);
m_imHandlers.put(annotation.value(), handler);
}
}
@@ -140,7 +141,7 @@ public class Qos1PublishHandler extends QosPublishHandler {
status = 0;
}
out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime());
out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime(), session.getAppName());
}
callback.onRouteHandled(GsonUtil.gson.toJson(out).getBytes());
@@ -116,6 +116,27 @@ public class DBUtil {
} else if(flyway.info().current().getVersion().getMajor().intValue() < 43) {
System.out.println("数据库执行升级需要较长时间,可能长达数分钟或更长,请耐心等待,不要中断。。。");
}
if(flyway.info().current() != null && flyway.info().current().getVersion().getMajor().intValue() < 55) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = getConnection();
String sql = "update flyway_schema_history set checksum = ? where version = ? and checksum = ?";
statement = connection.prepareStatement(sql);
int index = 1;
statement.setLong(index++, -931486413L);
statement.setString(index++, "3");
statement.setLong(index++, 478454046L);
statement.executeUpdate();
} catch (SQLException e) {
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
}
}
}
flyway.migrate();
@@ -20,4 +20,5 @@ public interface UserSettingScope {
int kUserSettingPttSilent = 25;
int kUserSettingGroupRemark = 26;
int kUserSettingPrivacySearchable = 27;
int kUserSettingAddFriendNoVerify = 28;
}
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.2.0</version>
<version>1.2.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -27,6 +27,7 @@ public interface APIPath {
String User_Get_Token = "/admin/user/get_token";
String User_Update_Block_Status = "/admin/user/update_block_status";
String User_Get_Info = "/admin/user/get_info";
String User_Get_Email_Info = "/admin/user/get_info_by_email";
String User_Get_All = "/admin/user/all";
String User_Get_Robot_Info = "/admin/user/get_robot_info";
String User_Get_Blocked_List = "/admin/user/get_blocked_list";
@@ -37,6 +38,7 @@ public interface APIPath {
String User_Kickoff_Client = "/admin/user/kickoff_client";
String User_Online_Count = "/admin/user/online_count";
String User_Online_List = "/admin/user/online_list";
String User_Session_List = "/admin/user/session_list";
String User_Application_Get_UserInfo = "/admin/user/app_get_user_info";
String Friend_Update_Status = "/admin/friend/status";
@@ -90,7 +92,7 @@ public interface APIPath {
String Check_User_Subscribe_Channel = "/admin/channel/is_subscribed";
String Get_System_Setting = "/admin/system/get_setting";
String Put_System_Setting = "/admin/system/put_setting";
String GET_CUSTOMER = "/admin/customer";
String Health = "/admin/health";
String Conference_List = "/admin/conference/list";
@@ -115,6 +117,8 @@ public interface APIPath {
String Robot_User_Info = "/robot/user_info";
String Robot_Get_Profile = "/robot/profile";
String Robot_Message_Send = "/robot/message/send";
String Robot_Message_Recall = "/robot/message/recall";
String Robot_Message_Update = "/robot/message/update";
String Robot_Set_Callback = "/robot/set_callback";
String Robot_Get_Callback = "/robot/get_callback";
String Robot_Delete_Callback = "/robot/delete_callback";
@@ -135,4 +139,6 @@ public interface APIPath {
String Robot_Group_Member_Quit = "/robot/group/member/quit";
String Robot_Group_Transfer = "/robot/group/transfer";
String Robot_Group_Set_Manager = "/robot/group/manager/set";
String Robot_Conference_Request = "/robot/conference/request";
}
@@ -0,0 +1,48 @@
package cn.wildfirechat.messagecontentbuilder;
import cn.wildfirechat.pojos.MessagePayload;
import cn.wildfirechat.proto.ProtoConstants;
import com.google.gson.Gson;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
public class StreamingTextMessageContentBuilder extends MessageContentBuilder{
private String text;
private String streamId;
private boolean generating;
public static StreamingTextMessageContentBuilder newBuilder(String streamId) {
StreamingTextMessageContentBuilder builder = new StreamingTextMessageContentBuilder();
builder.generating = false;
builder.streamId = streamId;
return builder;
}
public StreamingTextMessageContentBuilder text(String text) {
this.text = text;
return this;
}
public StreamingTextMessageContentBuilder generating(boolean generating) {
this.generating = generating;
return this;
}
@Override
public MessagePayload build() {
MessagePayload payload = encodeBase();
payload.setSearchableContent(text);
payload.setContent(streamId);
if(generating) {
//正在生成消息的类型是14,存储标记位为透传为4。
payload.setType(14);
payload.setPersistFlag(4);
} else {
//已经生成消息的类型是15,存储标记位为透传为3。
payload.setType(15);
payload.setPersistFlag(3);
}
return payload;
}
}
@@ -0,0 +1,37 @@
package cn.wildfirechat.pojos;
import java.util.ArrayList;
import java.util.List;
public class GetUserSessionResult {
public static class UserSession {
public String userId;
public String clientId;
public int platform;
public int pushType;
public String deviceToken;
public String deviceVoipToken;
boolean isOnline;
public UserSession() {
}
public UserSession(String userId, String clientId, int platform, int pushType, String deviceToken, String deviceVoipToken, boolean isOnline) {
this.userId = userId;
this.clientId = clientId;
this.platform = platform;
this.pushType = pushType;
this.deviceToken = deviceToken;
this.deviceVoipToken = deviceVoipToken;
this.isOnline = isOnline;
}
}
public List<UserSession> userSessions;
public GetUserSessionResult() {
userSessions = new ArrayList<>();
}
}
@@ -4,4 +4,5 @@ public class GroupUpdateEvent {
public String operatorId;
public String groupId;
public int type;
public PojoGroupInfo groupInfo;
}
@@ -0,0 +1,32 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information; please view the LICENSE
* file that was distributed with this source code.
*/
package cn.wildfirechat.pojos;
public class InputConferenceRequest {
public String userId;
public String clientId;
public String request;
public long sessionId;
public String roomId;
public String data;
public boolean advance;
public InputConferenceRequest() {
}
public InputConferenceRequest(String userId, String clientId, String request, long sessionId, String roomId, String data, boolean advance) {
this.userId = userId;
this.clientId = clientId;
this.request = request;
this.sessionId = sessionId;
this.roomId = roomId;
this.data = data;
this.advance = advance;
}
}
@@ -68,6 +68,7 @@ public class InputCreateGroup extends InputGroupBase {
if(group_info.isSuper_group()) {
groupInfoBuilder.setSuperGroup(1);
}
groupInfoBuilder.setDeleted(0);
groupBuilder.setGroupInfo(groupInfoBuilder);
if(group.getMembers() != null) {
@@ -0,0 +1,35 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package cn.wildfirechat.pojos;
public class InputGetUserSK {
private String uid;
private String cid;
public InputGetUserSK(String uid, String cid) {
this.uid = uid;
this.cid = cid;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getCid() {
return cid;
}
public void setCid(String cid) {
this.cid = cid;
}
}
@@ -19,18 +19,23 @@ public class OutputCheckUserOnline {
public int platform;
public int status; //0 online, 1 have session offline
public long lastSeen;
public String packageName;
public Session(String clientId, String userId, int platform, int status, long lastSeen) {
public Session() {
}
public Session(String clientId, String userId, int platform, int status, long lastSeen, String packageName) {
this.clientId = clientId;
this.userId = userId;
this.platform = platform;
this.status = status;
this.lastSeen = lastSeen;
this.packageName = packageName;
}
}
public void addSession(String userId, String clientId, int platform, int status, long lastSeen) {
Session session = new Session(clientId, userId, platform, status, lastSeen);
public void addSession(String userId, String clientId, int platform, int status, long lastSeen, String packageName) {
Session session = new Session(clientId, userId, platform, status, lastSeen, packageName);
sessions.add(session);
}
@@ -0,0 +1,16 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package cn.wildfirechat.pojos;
public class OutputReadData {
public String user;
public Conversation conversation;
public long readTime;
}
@@ -0,0 +1,18 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package cn.wildfirechat.pojos;
import cn.wildfirechat.proto.WFCMessage;
import java.util.List;
public class OutputUserInfoList {
public List<InputOutputUserInfo> userInfos;
}
@@ -22,6 +22,7 @@ public class PojoGroupInfo {
int max_member_count;
int history_message;
boolean super_group;
boolean deleted;
public String getTarget_id() {
return target_id;
@@ -126,4 +127,12 @@ public class PojoGroupInfo {
public void setSuper_group(boolean super_group) {
this.super_group = super_group;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}
@@ -1,5 +1,7 @@
package cn.wildfirechat.pojos;
import java.util.List;
public class UserOnlineStatus {
public static final int ONLINE = 0;
public static final int OFFLINE = 1;
@@ -11,6 +13,9 @@ public class UserOnlineStatus {
public int status;
public long timestamp;
public String packageName;
public int customState;
public String customText;
public List<OutputCheckUserOnline.Session> sessions;
public UserOnlineStatus() {
}
@@ -53,6 +53,10 @@ public class ProtoConstants {
int Platform_LINUX = 7;
int Platform_iPad = 8;
int Platform_APad = 9;
int Platform_Harmony = 10;
int Platform_HarmonyPad = 11;
int Platform_HarmonyPC = 12;
int Platform_MAX = Platform_HarmonyPC;
}
//message NotifyMessage & PullMessageRequest -> type
@@ -220,6 +224,7 @@ public class ProtoConstants {
int SearchUserType_Mobile = 3;
int SearchUserType_UserId = 4;
int SearchUserType_Name_Mobile_UserId = 5;
int SearchUserType_Name_Mobile_DisplayName = 100;
}
public interface DisableSearchMask {
@@ -1651,6 +1651,16 @@ public final class WFCMessage {
* <code>optional int32 super_group = 16;</code>
*/
int getSuperGroup();
// optional int32 deleted = 17;
/**
* <code>optional int32 deleted = 17;</code>
*/
boolean hasDeleted();
/**
* <code>optional int32 deleted = 17;</code>
*/
int getDeleted();
}
/**
* Protobuf type {@code GroupInfo}
@@ -1783,6 +1793,11 @@ public final class WFCMessage {
superGroup_ = input.readInt32();
break;
}
case 136: {
bitField0_ |= 0x00010000;
deleted_ = input.readInt32();
break;
}
}
}
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -2214,6 +2229,22 @@ public final class WFCMessage {
return superGroup_;
}
// optional int32 deleted = 17;
public static final int DELETED_FIELD_NUMBER = 17;
private int deleted_;
/**
* <code>optional int32 deleted = 17;</code>
*/
public boolean hasDeleted() {
return ((bitField0_ & 0x00010000) == 0x00010000);
}
/**
* <code>optional int32 deleted = 17;</code>
*/
public int getDeleted() {
return deleted_;
}
private void initFields() {
targetId_ = "";
name_ = "";
@@ -2231,6 +2262,7 @@ public final class WFCMessage {
maxMemberCount_ = 0;
historyMessage_ = 0;
superGroup_ = 0;
deleted_ = 0;
}
private byte memoizedIsInitialized = -1;
public final boolean isInitialized() {
@@ -2300,6 +2332,9 @@ public final class WFCMessage {
if (((bitField0_ & 0x00008000) == 0x00008000)) {
output.writeInt32(16, superGroup_);
}
if (((bitField0_ & 0x00010000) == 0x00010000)) {
output.writeInt32(17, deleted_);
}
getUnknownFields().writeTo(output);
}
@@ -2373,6 +2408,10 @@ public final class WFCMessage {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(16, superGroup_);
}
if (((bitField0_ & 0x00010000) == 0x00010000)) {
size += com.google.protobuf.CodedOutputStream
.computeInt32Size(17, deleted_);
}
size += getUnknownFields().getSerializedSize();
memoizedSerializedSize = size;
return size;
@@ -2521,6 +2560,8 @@ public final class WFCMessage {
bitField0_ = (bitField0_ & ~0x00004000);
superGroup_ = 0;
bitField0_ = (bitField0_ & ~0x00008000);
deleted_ = 0;
bitField0_ = (bitField0_ & ~0x00010000);
return this;
}
@@ -2613,6 +2654,10 @@ public final class WFCMessage {
to_bitField0_ |= 0x00008000;
}
result.superGroup_ = superGroup_;
if (((from_bitField0_ & 0x00010000) == 0x00010000)) {
to_bitField0_ |= 0x00010000;
}
result.deleted_ = deleted_;
result.bitField0_ = to_bitField0_;
onBuilt();
return result;
@@ -2687,6 +2732,9 @@ public final class WFCMessage {
if (other.hasSuperGroup()) {
setSuperGroup(other.getSuperGroup());
}
if (other.hasDeleted()) {
setDeleted(other.getDeleted());
}
this.mergeUnknownFields(other.getUnknownFields());
return this;
}
@@ -3455,6 +3503,39 @@ public final class WFCMessage {
return this;
}
// optional int32 deleted = 17;
private int deleted_ ;
/**
* <code>optional int32 deleted = 17;</code>
*/
public boolean hasDeleted() {
return ((bitField0_ & 0x00010000) == 0x00010000);
}
/**
* <code>optional int32 deleted = 17;</code>
*/
public int getDeleted() {
return deleted_;
}
/**
* <code>optional int32 deleted = 17;</code>
*/
public Builder setDeleted(int value) {
bitField0_ |= 0x00010000;
deleted_ = value;
onChanged();
return this;
}
/**
* <code>optional int32 deleted = 17;</code>
*/
public Builder clearDeleted() {
bitField0_ = (bitField0_ & ~0x00010000);
deleted_ = 0;
onChanged();
return this;
}
// @@protoc_insertion_point(builder_scope:GroupInfo)
}
@@ -67305,7 +67386,7 @@ public final class WFCMessage {
"dRequest\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006reason\030\002" +
" \002(\t\022\r\n\005extra\030\003 \001(\t\":\n\014Conversation\022\014\n\004t" +
"ype\030\001 \002(\005\022\016\n\006target\030\002 \002(\t\022\014\n\004line\030\003 \002(\005\"" +
"\300\002\n\tGroupInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014\n\004name" +
"\321\002\n\tGroupInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014\n\004name" +
"\030\002 \002(\t\022\020\n\010portrait\030\003 \001(\t\022\r\n\005owner\030\004 \001(\t\022" +
"\014\n\004type\030\005 \002(\005\022\024\n\014member_count\030\006 \001(\005\022\r\n\005e" +
"xtra\030\007 \001(\t\022\021\n\tupdate_dt\030\010 \001(\003\022\030\n\020member_" +
@@ -67313,172 +67394,172 @@ public final class WFCMessage {
"pe\030\013 \001(\005\022\024\n\014private_chat\030\014 \001(\005\022\022\n\nsearch",
"able\030\r \001(\005\022\030\n\020max_member_count\030\016 \001(\005\022\027\n\017" +
"history_message\030\017 \001(\005\022\023\n\013super_group\030\020 \001" +
"(\005\"r\n\013GroupMember\022\021\n\tmember_id\030\001 \002(\t\022\r\n\005" +
"alias\030\002 \001(\t\022\014\n\004type\030\003 \002(\005\022\021\n\tupdate_dt\030\004" +
" \001(\003\022\021\n\tcreate_dt\030\005 \001(\003\022\r\n\005extra\030\006 \001(\t\"F" +
"\n\005Group\022\036\n\ngroup_info\030\001 \002(\0132\n.GroupInfo\022" +
"\035\n\007members\030\002 \003(\0132\014.GroupMember\"\313\001\n\013Chann" +
"elMenu\022\014\n\004type\030\001 \002(\t\022\014\n\004name\030\002 \002(\t\022\013\n\003ke" +
"y\030\003 \001(\t\022\013\n\003url\030\004 \001(\t\022\020\n\010media_id\030\005 \001(\t\022\022" +
"\n\narticle_id\030\006 \001(\t\022\016\n\006app_id\030\007 \001(\t\022\020\n\010ap",
"p_page\030\010 \001(\t\022\036\n\010sub_menu\030\t \003(\0132\014.Channel" +
"Menu\022\017\n\007menu_id\030\n \001(\t\022\r\n\005extra\030\013 \001(\t\"-\n\017" +
"ChannelMenuList\022\032\n\004menu\030\001 \003(\0132\014.ChannelM" +
"enu\"\340\001\n\013ChannelInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014" +
"\n\004name\030\002 \002(\t\022\020\n\010portrait\030\003 \001(\t\022\r\n\005owner\030" +
"\004 \001(\t\022\016\n\006status\030\005 \001(\005\022\014\n\004desc\030\006 \001(\t\022\r\n\005e" +
"xtra\030\007 \001(\t\022\021\n\tupdate_dt\030\010 \001(\003\022\016\n\006secret\030" +
"\t \001(\t\022\020\n\010callback\030\n \001(\t\022\021\n\tautomatic\030\013 \001" +
"(\005\022\032\n\004menu\030\014 \003(\0132\014.ChannelMenu\"D\n\021Modify" +
"ChannelInfo\022\022\n\nchannel_id\030\001 \002(\t\022\014\n\004type\030",
"\002 \002(\005\022\r\n\005value\030\003 \002(\t\"8\n\017TransferChannel\022" +
"\022\n\nchannel_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\"3" +
"\n\017PullChannelInfo\022\022\n\nchannel_id\030\001 \002(\t\022\014\n" +
"\004head\030\002 \002(\003\"H\n\023PullChannelListener\022\022\n\nch" +
"annel_id\030\001 \002(\t\022\016\n\006offset\030\002 \002(\005\022\r\n\005count\030" +
"\003 \002(\005\"R\n\031PullChannelListenerResult\022\023\n\013to" +
"tal_count\030\001 \002(\005\022\016\n\006offset\030\002 \002(\005\022\020\n\010liste" +
"ner\030\003 \003(\t\"3\n\rListenChannel\022\022\n\nchannel_id" +
"\030\001 \002(\t\022\016\n\006listen\030\002 \002(\005\"E\n\023SearchChannelR" +
"esult\022\035\n\007channel\030\001 \003(\0132\014.ChannelInfo\022\017\n\007",
"keyword\030\002 \002(\t\"\235\002\n\016MessageContent\022\014\n\004type" +
"\030\001 \002(\005\022\032\n\022searchable_content\030\002 \001(\t\022\024\n\014pu" +
"sh_content\030\003 \001(\t\022\017\n\007content\030\004 \001(\t\022\014\n\004dat" +
"a\030\005 \001(\014\022\021\n\tmediaType\030\006 \001(\005\022\026\n\016remoteMedi" +
"aUrl\030\007 \001(\t\022\024\n\014persist_flag\030\010 \001(\005\022\027\n\017expi" +
"re_duration\030\t \001(\005\022\026\n\016mentioned_type\030\n \001(" +
"\005\022\030\n\020mentioned_target\030\013 \003(\t\022\r\n\005extra\030\014 \001" +
"(\t\022\021\n\tpush_data\030\r \001(\t\"\226\001\n\025AddGroupMember" +
"Request\022\020\n\010group_id\030\001 \002(\t\022\"\n\014added_membe" +
"r\030\002 \003(\0132\014.GroupMember\022\017\n\007to_line\030\003 \003(\005\022\'",
"\n\016notify_content\030\004 \001(\0132\017.MessageContent\022" +
"\r\n\005extra\030\005 \001(\t\"{\n\022CreateGroupRequest\022\025\n\005" +
"group\030\001 \002(\0132\006.Group\022\017\n\007to_line\030\002 \003(\005\022\'\n\016" +
"notify_content\030\003 \001(\0132\017.MessageContent\022\024\n" +
"\014member_extra\030\004 \001(\t\"a\n\023DismissGroupReque" +
"st\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n" +
"\016notify_content\030\003 \001(\0132\017.MessageContent\"\245" +
"\001\n\rFriendRequest\022\020\n\010from_uid\030\001 \001(\t\022\016\n\006to" +
"_uid\030\002 \002(\t\022\016\n\006reason\030\003 \002(\t\022\016\n\006status\030\004 \001" +
"(\005\022\021\n\tupdate_dt\030\005 \001(\003\022\030\n\020from_read_statu",
"s\030\006 \001(\010\022\026\n\016to_read_status\030\007 \001(\010\022\r\n\005extra" +
"\030\010 \001(\t\"#\n\rGeneralResult\022\022\n\nerror_code\030\001 " +
"\002(\005\"?\n\025GetUploadTokenRequest\022\022\n\nmedia_ty" +
"pe\030\001 \002(\005\022\022\n\nmedia_path\030\002 \002(\t\"S\n\024GetUploa" +
"dTokenResult\022\016\n\006domain\030\001 \002(\t\022\r\n\005token\030\002 " +
"\002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004port\030\004 \001(\005\"H\n\023Han" +
"dleFriendRequest\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006" +
"status\030\002 \002(\005\022\r\n\005extra\030\003 \001(\t\"\023\n\005IDBuf\022\n\n\002" +
"id\030\001 \002(\t\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Me" +
"ssage\022#\n\014conversation\030\001 \002(\0132\r.Conversati",
"on\022\021\n\tfrom_user\030\002 \002(\t\022 \n\007content\030\003 \002(\0132\017" +
".MessageContent\022\022\n\nmessage_id\030\004 \001(\003\022\030\n\020s" +
"erver_timestamp\030\005 \001(\003\022\017\n\007to_user\030\006 \001(\t\022\n" +
"\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022\014\n\004name" +
"\030\002 \001(\t\022\024\n\014display_name\030\003 \001(\t\022\020\n\010portrait" +
"\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\017\n" +
"\007address\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r\n\005extra" +
"\030\t \001(\t\022\021\n\tupdate_dt\030\n \001(\003\022\016\n\006gender\030\013 \001(" +
"\005\022\016\n\006social\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007delet" +
"ed\030\016 \001(\005\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030",
"\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\020\n\010" +
"callback\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017GetRobo" +
"tsResult\022\025\n\005entry\030\001 \003(\0132\006.Robot\"g\n\030Uploa" +
"dDeviceTokenRequest\022\020\n\010platform\030\001 \002(\005\022\020\n" +
"\010app_name\030\002 \002(\t\022\024\n\014device_token\030\003 \002(\t\022\021\n" +
"\tpush_type\030\004 \002(\005\"\201\001\n\026ModifyGroupInfoRequ" +
"est\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005v" +
"alue\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_co" +
"ntent\030\005 \001(\0132\017.MessageContent\"\203\001\n\026SetGrou" +
"pManagerRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004typ",
"e\030\002 \002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007to_line\030\004 \003(" +
"\005\022\'\n\016notify_content\030\005 \001(\0132\017.MessageConte" +
"nt\"(\n\tInfoEntry\022\014\n\004type\030\001 \002(\005\022\r\n\005value\030\002" +
" \002(\t\"0\n\023ModifyMyInfoRequest\022\031\n\005entry\030\001 \003" +
"(\0132\n.InfoEntry\";\n\rNotifyMessage\022\014\n\004type\030" +
"\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target\030\003 \001(\t\"=\n\022P" +
"ullMessageRequest\022\n\n\002id\030\001 \002(\003\022\014\n\004type\030\002 " +
"\002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021PullMessageResult\022" +
"\031\n\007message\030\001 \003(\0132\010.Message\022\017\n\007current\030\002 " +
"\002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023PullGroupInfoResult",
"\022\030\n\004info\030\001 \003(\0132\n.GroupInfo\"6\n\026PullGroupM" +
"emberRequest\022\016\n\006target\030\001 \002(\t\022\014\n\004head\030\002 \002" +
"(\003\"5\n\025PullGroupMemberResult\022\034\n\006member\030\001 " +
"\003(\0132\014.GroupMember\"-\n\013UserRequest\022\013\n\003uid\030" +
"\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017PullUserRequ" +
"est\022\035\n\007request\030\001 \003(\0132\014.UserRequest\"/\n\nUs" +
"erResult\022\023\n\004user\030\001 \002(\0132\005.User\022\014\n\004code\030\002 " +
"\002(\005\"-\n\016PullUserResult\022\033\n\006result\030\001 \003(\0132\013." +
"UserResult\"^\n\020QuitGroupRequest\022\020\n\010group_" +
"id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_cont",
"ent\030\003 \001(\0132\017.MessageContent\"~\n\030RemoveGrou" +
"pMemberRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n\016remo" +
"ved_member\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016not" +
"ify_content\030\004 \001(\0132\017.MessageContent\"u\n\024Tr" +
"ansferGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\021\n\t" +
"new_owner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016noti" +
"fy_content\030\004 \001(\0132\017.MessageContent\"\206\001\n\026Mo" +
"difyGroupMemberAlias\022\020\n\010group_id\030\001 \002(\t\022\r" +
"\n\005alias\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify" +
"_content\030\004 \001(\0132\017.MessageContent\022\021\n\tmembe",
"r_id\030\005 \001(\t\"\206\001\n\026ModifyGroupMemberExtra\022\020\n" +
"\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016noti" +
"fy_content\030\003 \001(\0132\017.MessageContent\022\r\n\005ext" +
"ra\030\004 \001(\t\022\021\n\tmember_id\030\005 \001(\t\"P\n\020UserSetti" +
"ngEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005v" +
"alue\030\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyU" +
"serSettingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(" +
"\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Version\022\017\n\007version\030\001" +
" \002(\003\"8\n\024GetUserSettingResult\022 \n\005entry\030\001 " +
"\003(\0132\021.UserSettingEntry\"f\n\006Friend\022\013\n\003uid\030",
"\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tupdate_dt\030\003 \002(\003\022" +
"\r\n\005alias\030\004 \001(\t\022\017\n\007blacked\030\005 \001(\005\022\r\n\005extra" +
"\030\006 \001(\t\"*\n\020GetFriendsResult\022\026\n\005entry\030\001 \003(" +
"\0132\007.Friend\"7\n\026GetFriendRequestResult\022\035\n\005" +
"entry\030\001 \003(\0132\016.FriendRequest\"\243\001\n\021ConnectA" +
"ckPayload\022\020\n\010msg_head\030\001 \001(\003\022\023\n\013friend_he" +
"ad\030\002 \001(\003\022\026\n\016friend_rq_head\030\003 \001(\003\022\024\n\014sett" +
"ing_head\030\004 \001(\003\022\021\n\tnode_addr\030\005 \001(\t\022\021\n\tnod" +
"e_port\030\006 \001(\005\022\023\n\013server_time\030\007 \001(\003\"P\n\rIMH" +
"ttpWrapper\022\r\n\005token\030\001 \002(\t\022\021\n\tclient_id\030\002",
" \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021S" +
"earchUserRequest\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuz" +
"zy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020SearchUserResu" +
"lt\022\024\n\005entry\030\001 \003(\0132\005.User\"@\n\026GetChatroomI" +
"nfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tupdat" +
"e_dt\030\002 \001(\003\"\227\001\n\014ChatroomInfo\022\r\n\005title\030\001 \002" +
"(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portrait\030\003 \001(\t\022\024\n\014me" +
"mber_count\030\004 \001(\005\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tu" +
"pdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n\005state\030\010" +
" \001(\005\"F\n\034GetChatroomMemberInfoRequest\022\023\n\013",
"chatroom_id\030\001 \002(\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022" +
"ChatroomMemberInfo\022\024\n\014member_count\030\001 \001(\005" +
"\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(" +
"\003\"4\n\023NotifyRecallMessage\022\n\n\002id\030\001 \002(\003\022\021\n\t" +
"from_user\030\002 \002(\t\"/\n\020BlackUserRequest\022\013\n\003u" +
"id\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323\001\n\014RouteReques" +
"t\022\013\n\003app\030\001 \001(\t\022\020\n\010platform\030\002 \001(\005\022\021\n\tpush" +
"_type\030\003 \001(\005\022\023\n\013device_name\030\004 \001(\t\022\026\n\016devi" +
"ce_version\030\005 \001(\t\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010" +
"language\030\007 \001(\t\022\024\n\014carrier_name\030\010 \001(\t\022\023\n\013",
"app_version\030\t \001(\t\022\023\n\013sdk_version\030\n \001(\t\"D" +
"\n\rRouteResponse\022\014\n\004host\030\001 \002(\t\022\021\n\tlong_po" +
"rt\030\002 \002(\005\022\022\n\nshort_port\030\003 \002(\005\"G\n\017GetToken" +
"Request\022\017\n\007user_id\030\001 \002(\t\022\021\n\tclient_id\030\002 " +
"\002(\t\022\020\n\010platform\030\003 \001(\005\"r\n\022LoadRemoteMessa" +
"ges\022#\n\014conversation\030\001 \002(\0132\r.Conversation" +
"\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005count\030\003 \002(\005\022\024\n\014c" +
"ontent_type\030\004 \003(\005\"a\n\020MultiCastMessage\022\021\n" +
"\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.Mess" +
"ageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005\"E\n\035",
"RecallMultiCastMessageRequest\022\022\n\nmessage" +
"_id\030\001 \002(\003\022\020\n\010receiver\030\002 \003(\t\"@\n\017AuthCodeR" +
"equest\022\021\n\ttarget_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022" +
"\014\n\004host\030\003 \002(\t\"o\n\030ApplicationConfigReques" +
"t\022\r\n\005appId\030\001 \002(\t\022\017\n\007appType\030\002 \002(\005\022\021\n\ttim" +
"estamp\030\003 \002(\003\022\r\n\005nonce\030\004 \002(\t\022\021\n\tsignature" +
"\030\005 \002(\tB/\n\025cn.wildfirechat.protoB\nWFCMess" +
"ageZ\n./go;proto"
"(\005\022\017\n\007deleted\030\021 \001(\005\"r\n\013GroupMember\022\021\n\tme" +
"mber_id\030\001 \002(\t\022\r\n\005alias\030\002 \001(\t\022\014\n\004type\030\003 \002" +
"(\005\022\021\n\tupdate_dt\030\004 \001(\003\022\021\n\tcreate_dt\030\005 \001(\003" +
"\022\r\n\005extra\030\006 \001(\t\"F\n\005Group\022\036\n\ngroup_info\030\001" +
" \002(\0132\n.GroupInfo\022\035\n\007members\030\002 \003(\0132\014.Grou" +
"pMember\"\313\001\n\013ChannelMenu\022\014\n\004type\030\001 \002(\t\022\014\n" +
"\004name\030\002 \002(\t\022\013\n\003key\030\003 \001(\t\022\013\n\003url\030\004 \001(\t\022\020\n" +
"\010media_id\030\005 \001(\t\022\022\n\narticle_id\030\006 \001(\t\022\016\n\006a",
"pp_id\030\007 \001(\t\022\020\n\010app_page\030\010 \001(\t\022\036\n\010sub_men" +
"u\030\t \003(\0132\014.ChannelMenu\022\017\n\007menu_id\030\n \001(\t\022\r" +
"\n\005extra\030\013 \001(\t\"-\n\017ChannelMenuList\022\032\n\004menu" +
"\030\001 \003(\0132\014.ChannelMenu\"\340\001\n\013ChannelInfo\022\021\n\t" +
"target_id\030\001 \001(\t\022\014\n\004name\030\002 \002(\t\022\020\n\010portrai" +
"t\030\003 \001(\t\022\r\n\005owner\030\004 \001(\t\022\016\n\006status\030\005 \001(\005\022\014" +
"\n\004desc\030\006 \001(\t\022\r\n\005extra\030\007 \001(\t\022\021\n\tupdate_dt" +
"\030\010 \001(\003\022\016\n\006secret\030\t \001(\t\022\020\n\010callback\030\n \001(\t" +
"\022\021\n\tautomatic\030\013 \001(\005\022\032\n\004menu\030\014 \003(\0132\014.Chan" +
"nelMenu\"D\n\021ModifyChannelInfo\022\022\n\nchannel_",
"id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\"8\n" +
"\017TransferChannel\022\022\n\nchannel_id\030\001 \002(\t\022\021\n\t" +
"new_owner\030\002 \002(\t\"3\n\017PullChannelInfo\022\022\n\nch" +
"annel_id\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"H\n\023PullChan" +
"nelListener\022\022\n\nchannel_id\030\001 \002(\t\022\016\n\006offse" +
"t\030\002 \002(\005\022\r\n\005count\030\003 \002(\005\"R\n\031PullChannelLis" +
"tenerResult\022\023\n\013total_count\030\001 \002(\005\022\016\n\006offs" +
"et\030\002 \002(\005\022\020\n\010listener\030\003 \003(\t\"3\n\rListenChan" +
"nel\022\022\n\nchannel_id\030\001 \002(\t\022\016\n\006listen\030\002 \002(\005\"" +
"E\n\023SearchChannelResult\022\035\n\007channel\030\001 \003(\0132",
"\014.ChannelInfo\022\017\n\007keyword\030\002 \002(\t\"\235\002\n\016Messa" +
"geContent\022\014\n\004type\030\001 \002(\005\022\032\n\022searchable_co" +
"ntent\030\002 \001(\t\022\024\n\014push_content\030\003 \001(\t\022\017\n\007con" +
"tent\030\004 \001(\t\022\014\n\004data\030\005 \001(\014\022\021\n\tmediaType\030\006 " +
"\001(\005\022\026\n\016remoteMediaUrl\030\007 \001(\t\022\024\n\014persist_f" +
"lag\030\010 \001(\005\022\027\n\017expire_duration\030\t \001(\005\022\026\n\016me" +
"ntioned_type\030\n \001(\005\022\030\n\020mentioned_target\030\013" +
" \003(\t\022\r\n\005extra\030\014 \001(\t\022\021\n\tpush_data\030\r \001(\t\"\226" +
"\001\n\025AddGroupMemberRequest\022\020\n\010group_id\030\001 \002" +
"(\t\022\"\n\014added_member\030\002 \003(\0132\014.GroupMember\022\017",
"\n\007to_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132" +
"\017.MessageContent\022\r\n\005extra\030\005 \001(\t\"{\n\022Creat" +
"eGroupRequest\022\025\n\005group\030\001 \002(\0132\006.Group\022\017\n\007" +
"to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017." +
"MessageContent\022\024\n\014member_extra\030\004 \001(\t\"a\n\023" +
"DismissGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\017\n" +
"\007to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017" +
".MessageContent\"\245\001\n\rFriendRequest\022\020\n\010fro" +
"m_uid\030\001 \001(\t\022\016\n\006to_uid\030\002 \002(\t\022\016\n\006reason\030\003 " +
"\002(\t\022\016\n\006status\030\004 \001(\005\022\021\n\tupdate_dt\030\005 \001(\003\022\030",
"\n\020from_read_status\030\006 \001(\010\022\026\n\016to_read_stat" +
"us\030\007 \001(\010\022\r\n\005extra\030\010 \001(\t\"#\n\rGeneralResult" +
"\022\022\n\nerror_code\030\001 \002(\005\"?\n\025GetUploadTokenRe" +
"quest\022\022\n\nmedia_type\030\001 \002(\005\022\022\n\nmedia_path\030" +
"\002 \002(\t\"S\n\024GetUploadTokenResult\022\016\n\006domain\030" +
"\001 \002(\t\022\r\n\005token\030\002 \002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004" +
"port\030\004 \001(\005\"H\n\023HandleFriendRequest\022\022\n\ntar" +
"get_uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\022\r\n\005extra\030\003" +
" \001(\t\"\023\n\005IDBuf\022\n\n\002id\030\001 \002(\t\"\027\n\tIDListBuf\022\n" +
"\n\002id\030\001 \003(\t\"\256\001\n\007Message\022#\n\014conversation\030\001",
" \002(\0132\r.Conversation\022\021\n\tfrom_user\030\002 \002(\t\022 " +
"\n\007content\030\003 \002(\0132\017.MessageContent\022\022\n\nmess" +
"age_id\030\004 \001(\003\022\030\n\020server_timestamp\030\005 \001(\003\022\017" +
"\n\007to_user\030\006 \001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003" +
"uid\030\001 \002(\t\022\014\n\004name\030\002 \001(\t\022\024\n\014display_name\030" +
"\003 \001(\t\022\020\n\010portrait\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022" +
"\r\n\005email\030\006 \001(\t\022\017\n\007address\030\007 \001(\t\022\017\n\007compa" +
"ny\030\010 \001(\t\022\r\n\005extra\030\t \001(\t\022\021\n\tupdate_dt\030\n \001" +
"(\003\022\016\n\006gender\030\013 \001(\005\022\016\n\006social\030\014 \001(\t\022\014\n\004ty" +
"pe\030\r \001(\005\022\017\n\007deleted\030\016 \001(\005\"c\n\005Robot\022\013\n\003ui",
"d\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n" +
"\006secret\030\004 \001(\t\022\020\n\010callback\030\005 \001(\t\022\r\n\005extra" +
"\030\006 \001(\t\"(\n\017GetRobotsResult\022\025\n\005entry\030\001 \003(\013" +
"2\006.Robot\"g\n\030UploadDeviceTokenRequest\022\020\n\010" +
"platform\030\001 \002(\005\022\020\n\010app_name\030\002 \002(\t\022\024\n\014devi" +
"ce_token\030\003 \002(\t\022\021\n\tpush_type\030\004 \002(\005\"\201\001\n\026Mo" +
"difyGroupInfoRequest\022\020\n\010group_id\030\001 \002(\t\022\014" +
"\n\004type\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\022\017\n\007to_line\030\004" +
" \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017.MessageCo" +
"ntent\"\203\001\n\026SetGroupManagerRequest\022\020\n\010grou",
"p_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\017\n\007user_id\030\003 \003(" +
"\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_content\030\005 \001" +
"(\0132\017.MessageContent\"(\n\tInfoEntry\022\014\n\004type" +
"\030\001 \002(\005\022\r\n\005value\030\002 \002(\t\"0\n\023ModifyMyInfoReq" +
"uest\022\031\n\005entry\030\001 \003(\0132\n.InfoEntry\";\n\rNotif" +
"yMessage\022\014\n\004type\030\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006" +
"target\030\003 \001(\t\"=\n\022PullMessageRequest\022\n\n\002id" +
"\030\001 \002(\003\022\014\n\004type\030\002 \002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021P" +
"ullMessageResult\022\031\n\007message\030\001 \003(\0132\010.Mess" +
"age\022\017\n\007current\030\002 \002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023Pu",
"llGroupInfoResult\022\030\n\004info\030\001 \003(\0132\n.GroupI" +
"nfo\"6\n\026PullGroupMemberRequest\022\016\n\006target\030" +
"\001 \002(\t\022\014\n\004head\030\002 \002(\003\"5\n\025PullGroupMemberRe" +
"sult\022\034\n\006member\030\001 \003(\0132\014.GroupMember\"-\n\013Us" +
"erRequest\022\013\n\003uid\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(" +
"\003\"0\n\017PullUserRequest\022\035\n\007request\030\001 \003(\0132\014." +
"UserRequest\"/\n\nUserResult\022\023\n\004user\030\001 \002(\0132" +
"\005.User\022\014\n\004code\030\002 \002(\005\"-\n\016PullUserResult\022\033" +
"\n\006result\030\001 \003(\0132\013.UserResult\"^\n\020QuitGroup" +
"Request\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003",
"(\005\022\'\n\016notify_content\030\003 \001(\0132\017.MessageCont" +
"ent\"~\n\030RemoveGroupMemberRequest\022\020\n\010group" +
"_id\030\001 \002(\t\022\026\n\016removed_member\030\002 \003(\t\022\017\n\007to_" +
"line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Mes" +
"sageContent\"u\n\024TransferGroupRequest\022\020\n\010g" +
"roup_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to_l" +
"ine\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Mess" +
"ageContent\"\206\001\n\026ModifyGroupMemberAlias\022\020\n" +
"\010group_id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_lin" +
"e\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Messag",
"eContent\022\021\n\tmember_id\030\005 \001(\t\"\206\001\n\026ModifyGr" +
"oupMemberExtra\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_l" +
"ine\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017.Mess" +
"ageContent\022\r\n\005extra\030\004 \001(\t\022\021\n\tmember_id\030\005" +
" \001(\t\"P\n\020UserSettingEntry\022\r\n\005scope\030\001 \002(\005\022" +
"\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\022\021\n\tupdate_dt" +
"\030\004 \002(\003\"A\n\024ModifyUserSettingReq\022\r\n\005scope\030" +
"\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Ver" +
"sion\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSettingR" +
"esult\022 \n\005entry\030\001 \003(\0132\021.UserSettingEntry\"",
"f\n\006Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n" +
"\tupdate_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007black" +
"ed\030\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsRes" +
"ult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026GetFriend" +
"RequestResult\022\035\n\005entry\030\001 \003(\0132\016.FriendReq" +
"uest\"\243\001\n\021ConnectAckPayload\022\020\n\010msg_head\030\001" +
" \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016friend_rq_h" +
"ead\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021\n\tnode_" +
"addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013server_" +
"time\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005token\030\001 \002",
"(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t\022\014" +
"\n\004data\030\004 \001(\014\"A\n\021SearchUserRequest\022\017\n\007key" +
"word\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"" +
"(\n\020SearchUserResult\022\024\n\005entry\030\001 \003(\0132\005.Use" +
"r\"@\n\026GetChatroomInfoRequest\022\023\n\013chatroom_" +
"id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014Chatroom" +
"Info\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010por" +
"trait\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcre" +
"ate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005extra" +
"\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatroomMemb",
"erInfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tma" +
"x_count\030\002 \001(\005\";\n\022ChatroomMemberInfo\022\024\n\014m" +
"ember_count\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010IN" +
"T64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecallMessag" +
"e\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020Blac" +
"kUserRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 \002(" +
"\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010platf" +
"orm\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_n" +
"ame\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t\022\022\n\npho" +
"ne_name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carri",
"er_name\030\010 \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sd" +
"k_version\030\n \001(\t\"D\n\rRouteResponse\022\014\n\004host" +
"\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_port\030" +
"\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 \002(" +
"\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"r" +
"\n\022LoadRemoteMessages\022#\n\014conversation\030\001 \002" +
"(\0132\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n" +
"\005count\030\003 \002(\005\022\024\n\014content_type\030\004 \003(\005\"a\n\020Mu" +
"ltiCastMessage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007con" +
"tent\030\002 \002(\0132\017.MessageContent\022\n\n\002to\030\003 \003(\t\022",
"\014\n\004line\030\004 \002(\005\"E\n\035RecallMultiCastMessageR" +
"equest\022\022\n\nmessage_id\030\001 \002(\003\022\020\n\010receiver\030\002" +
" \003(\t\"@\n\017AuthCodeRequest\022\021\n\ttarget_id\030\001 \002" +
"(\t\022\014\n\004type\030\002 \002(\005\022\014\n\004host\030\003 \002(\t\"o\n\030Applic" +
"ationConfigRequest\022\r\n\005appId\030\001 \002(\t\022\017\n\007app" +
"Type\030\002 \002(\005\022\021\n\ttimestamp\030\003 \002(\003\022\r\n\005nonce\030\004" +
" \002(\t\022\021\n\tsignature\030\005 \002(\tB/\n\025cn.wildfirech" +
"at.protoB\nWFCMessageZ\n./go;proto"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -67502,7 +67583,7 @@ public final class WFCMessage {
internal_static_GroupInfo_fieldAccessorTable = new
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
internal_static_GroupInfo_descriptor,
new java.lang.String[] { "TargetId", "Name", "Portrait", "Owner", "Type", "MemberCount", "Extra", "UpdateDt", "MemberUpdateDt", "Mute", "JoinType", "PrivateChat", "Searchable", "MaxMemberCount", "HistoryMessage", "SuperGroup", });
new java.lang.String[] { "TargetId", "Name", "Portrait", "Owner", "Type", "MemberCount", "Extra", "UpdateDt", "MemberUpdateDt", "Mute", "JoinType", "PrivateChat", "Searchable", "MaxMemberCount", "HistoryMessage", "SuperGroup", "Deleted", });
internal_static_GroupMember_descriptor =
getDescriptor().getMessageTypes().get(3);
internal_static_GroupMember_fieldAccessorTable = new
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.2.0</version>
<version>1.2.5</version>
</parent>
<artifactId>distribution</artifactId>
@@ -124,6 +124,15 @@ message.global_mute_exception_types 401,402,403,404,405,407,408,410,411
## 离线用户推送过期天数,0是永不过期,建议配置为7天。
message.push_expired_days 7
## 当会话静音/全局静音/PC在线静音时,普通消息都不会有推送,如果有某些消息类型需要此时保持推送,可以配置到这里。此配置对消息免打扰时段无效。
## 此配置只影响远程推送,需要客户端处理客户端在线且在后台收到此消息的处理,需要针对这些消息类型加上本地通知。
## 强制推送消息的MessagePayload中pushContent和pushData至少要存在一个才可以推送。
## 消息类型以英文逗号分割。
#message.force_push_types 401,402
## 群发消息(包括server api群发和全局频道群发)时,目标用户是否来自于t_user表。如果使用野火托管用户信息,请设置为true,否则设置为false。
message.broadcast.target_from_user_table true
## 消息转发功能开启时,开关是否不转发server api接口消息。
## 当为true时,不转发server api发送的消息;当为false时,转发server api发送的消息。
message.no_forward_admin_message false
@@ -197,6 +206,12 @@ group.visible_quit_or_kickoff_notification 0
## 如果有客户端有被破解的风险,可以禁止客户端群操作,然后通过Server API操作。Server API不受限制。
#group.forbidden_client_operation 0xFFF
## 是否禁止陌生人拉人入群,默认为false
group.disable_stranger_invite false
## 群组信息是否标记删除
group.enable_mark_deletion false
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
## 注意,修改本配置不会对已经同步的信息产生影响。
@@ -283,7 +298,10 @@ server.multi_endpoint false
## 是否支持PC多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PC端多端登录。
server.multi_pc_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
## 是否支持PAD多端登陆,当server.multi_endpoint为true时,此开关无意义,当为false时,可以单独打开PAD端多端登录。
server.multi_pad_endpoint false
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或pad或web端登录的通知。
server.multi_platform_notification true
# 当pc或者web在线时,手机是否默认静音,默认为true。注意仅影响默认值,用户可以手动切换是否静音。
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>1.2.0</version>
<version>1.2.5</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+36
View File
@@ -12,6 +12,42 @@
# 更新记录
--------------
Release note 1.2.5:
1. Server API添加通过邮箱获取用户信息的接口。
2. 支持群组标记删除功能。
3. 添加配置,可以设置在静音时强制推送指定类型消息。
4. 支持用户设置添加好友是否验证功能
--------------
Release note 1.2.4:
1. 去掉用户的默认密码。
2. 去掉频道和机器人的默认头像。
3. 修改在线状态回调数据,返回此用户的所有端状态。
--------------
Release note 1.2.3:
1. 同步专业版IM服务server SDK。
2. 添加对鸿蒙平台的支持。
3. 解决server端音视频SDK信令支持问题。
4. 升级部分依赖,解决漏洞问题
--------------
Release note 1.2.2:
1. 解决搜索特殊字符时的转义问题。
2. SDK添加流式消息。
3. 添加配置,是否禁止拉陌生人入群。
4. 放被拉黑时禁止被拉入群
5. 群组信息变更回调时加上群组信息
6. 机器人sdk添加撤回和更新消息接口
--------------
Release note 1.2.1:
1. 添加获取在线用户功能。
2. 添加获取用户连接session信息的功能。
3. 优化按照用户id搜索用户的逻辑。
4. 解决广播消息没有发给未登录用户的问题。
--------------
Release note 1.2.0:
1. 添加配置开关,可以关掉api/version检查接口。
+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.2.0</version>
<version>1.2.5</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+2 -2
View File
@@ -45,7 +45,7 @@
<dependency>
<groupId>cn.wildfirechat</groupId>
<artifactId>sdk</artifactId>
<version>1.2.0</version>
<version>1.2.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/sdk-1.1.9.jar</systemPath>
</dependency>
@@ -53,7 +53,7 @@
<dependency>
<groupId>cn.wildfirechat</groupId>
<artifactId>common</artifactId>
<version>1.2.0</version>
<version>1.2.2</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/common-1.1.9.jar</systemPath>
</dependency>
@@ -97,4 +97,8 @@ public class GeneralAdmin {
public static IMResult<HealthCheckResult> healthCheck() throws Exception {
return AdminHttpUtils.httpGet(APIPath.Health, HealthCheckResult.class);
}
public static IMResult<String> getCustomer() throws Exception {
return AdminHttpUtils.httpJsonPost(APIPath.GET_CUSTOMER, null, String.class);
}
}
+87 -17
View File
@@ -2,6 +2,7 @@ package cn.wildfirechat.sdk;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.messagecontentbuilder.RichNotificationContentBuilder;
import cn.wildfirechat.messagecontentbuilder.StreamingTextMessageContentBuilder;
import cn.wildfirechat.messagecontentbuilder.TextMessageContentBuilder;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.ProtoConstants;
@@ -177,6 +178,15 @@ public class Main {
System.out.println("get user info by userId failure");
System.exit(-1);
}
IMResult<OutputUserInfoList> userInfoListIMResult = UserAdmin.getUserByEmail("[email protected]");
if(userInfoListIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || userInfoListIMResult.getErrorCode() == ErrorCode.ERROR_CODE_NOT_EXIST) {
System.out.println("getUserByEmail success");
} else {
System.out.println("getUserByEmail failure");
System.exit(-1);
}
InputOutputUserInfo updateUserInfo = new InputOutputUserInfo();
updateUserInfo.setUserId(System.currentTimeMillis()+"");
updateUserInfo.setDisplayName("updatedUserName");
@@ -324,6 +334,14 @@ public class Main {
System.out.println("get user online failure");
System.exit(-1);
}
IMResult<GetUserSessionResult> getUserSessionResultIMResult = UserAdmin.getUserSession("hygqmws2k");
if (getUserSessionResultIMResult != null && getUserSessionResultIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get user session success");
} else {
System.out.println("get user session failure");
System.exit(-1);
}
}
}
@@ -369,21 +387,6 @@ public class Main {
System.exit(-1);
}
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello2", false);
if (result != null && result.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("success");
} else {
System.out.println("failure");
System.exit(-1);
}
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello3", true);
if (result != null && (result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || result.getErrorCode() == ErrorCode.ERROR_CODE_ALREADY_FRIENDS)) {
System.out.println("success");
} else {
System.out.println("send friend request success");
}
IMResult<Void> updateFriendStatusResult = RelationAdmin.setUserFriend("ff1", "ff2", true, "{\"from\":1}");
if (updateFriendStatusResult != null && updateFriendStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
@@ -839,6 +842,42 @@ public class Main {
} else {
System.out.println("failure");
}
testStreamingText();
}
static void testStreamingText() throws Exception {
Conversation conversation = new Conversation();
conversation.setTarget("uygqmws2k");
conversation.setType(ProtoConstants.ConversationType.ConversationType_Private);
String fullText = "北京野火无限网络科技有限公司是成立于2019年底的一家科技创新企业,公司的主要目标是为广大企业和单位提供优质可控、私有部署的即时通讯和实时音视频能力,为社会信息化水平提高作出自己的贡献。\n" +
"\n" +
"野火IM是公司研发一套自主可控的即时通讯组件,具有全部私有化、功能齐全、协议稳定可靠、全平台支持、安全性高和支持国产化等技术特点。客户端分层设计,既可开箱即用,也可与现有系统深度融合。具有完善的服务端API和自定义消息功能,可以任意扩展功能。代码开源率高,方便二次开发和使用。支持多人实时音视频和会议功能,线上沟通更通畅。\n" +
"\n" +
"公司致力于开源项目,在Github上开源项目广受好评,其中Server项目有超过7.1K个Star,组织合计Star超过1万个。有大量的技术公司受益于我们的开源,为自己的产品添加了即时通讯能力,这也算是我们公司为社会信息化建设做出的一点点贡献吧。\n" +
"\n" +
"公司以即时通讯技术为核心,持续努力优化和完善即时通讯和实时音视频产品,努力为客户提供最优质的即时通讯和实时音视频能力。";
int i = 0;
String streamId = UUID.randomUUID().toString();
while (i < fullText.length()) {
i+= 15;
boolean finish = i >= fullText.length();
String partText = finish?fullText:fullText.substring(0, i);
MessagePayload payload = StreamingTextMessageContentBuilder.newBuilder(streamId).text(partText).generating(!finish).build();
IMResult<SendMessageResult> resultSendMessage = MessageAdmin.sendMessage("admin", conversation, payload, null);
if (resultSendMessage != null && resultSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("send message success");
} else {
System.out.println("send message failure");
System.exit(-1);
}
Thread.sleep(500);
}
}
//***********************************************
@@ -974,7 +1013,7 @@ public class Main {
System.exit(-1);
}
IMResult<OutputUserChatroom> userChatroomIMResult = ChatroomAdmin.getUserChatroom("hygqmws2k");
IMResult<OutputUserChatroom> userChatroomIMResult = ChatroomAdmin.getUserChatroom("uygqmws2k");
if(userChatroomIMResult != null && (userChatroomIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || userChatroomIMResult.getErrorCode() == ErrorCode.ERROR_CODE_NOT_EXIST)) {
System.out.println("get user chatroom success");
} else {
@@ -1173,7 +1212,7 @@ public class Main {
payload.setType(1);
payload.setSearchableContent("hello world");
IMResult<SendMessageResult> resultRobotSendMessage = robotService.sendMessage("robot1", conversation, payload);
IMResult<SendMessageResult> resultRobotSendMessage = robotService.sendMessage(robotService.getRobotId(), conversation, payload);
if (resultRobotSendMessage != null && resultRobotSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("robot send message success");
} else {
@@ -1181,6 +1220,37 @@ public class Main {
System.exit(-1);
}
if(commercialServer) {
Thread.sleep(1000);
IMResult<String> recallMessageResult = robotService.recallMessage(resultRobotSendMessage.result.getMessageUid());
if (recallMessageResult != null && recallMessageResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("robot recall message success");
} else {
System.out.println("robot recall message failure");
System.exit(-1);
}
payload.setSearchableContent("hello world, hello world");
resultRobotSendMessage = robotService.sendMessage(robotService.getRobotId(), conversation, payload);
if (resultRobotSendMessage != null && resultRobotSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("robot send message success");
} else {
System.out.println("robot send message failure");
System.exit(-1);
}
Thread.sleep(1000);
payload.setSearchableContent("hello world, updated message content");
IMResult<Void> updateMessageResult = robotService.updateMessage(resultRobotSendMessage.result.getMessageUid(), payload);
if (updateMessageResult != null && updateMessageResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("robot update message success");
} else {
System.out.println("robot update message failure");
System.exit(-1);
}
}
IMResult<InputOutputUserInfo> resultRobotGetUserInfo = robotService.getUserInfo("userId1");
if (resultRobotGetUserInfo != null && resultRobotGetUserInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("robot get user info success");
@@ -17,6 +17,10 @@ public class RobotService {
robotHttpUtils = new RobotHttpUtils(url, robotId, robotSecret);
}
public String getRobotId() {
return robotHttpUtils.getRobotId();
}
public IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception {
String path = APIPath.Robot_Message_Send;
SendMessageData messageData = new SendMessageData();
@@ -26,6 +30,23 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
}
public IMResult<String> recallMessage(long messageUid) throws Exception {
String path = APIPath.Robot_Message_Recall;
RecallMessageData messageData = new RecallMessageData();
messageData.setMessageUid(messageUid);
return robotHttpUtils.httpJsonPost(path, messageData, String.class);
}
public IMResult<Void> updateMessage(long messageUid, MessagePayload payload) throws Exception {
String path = APIPath.Robot_Message_Update;
UpdateMessageContentData updateMessageContentData = new UpdateMessageContentData();
updateMessageContentData.setMessageUid(messageUid);
updateMessageContentData.setPayload(payload);
updateMessageContentData.setUpdateTimestamp(0);
updateMessageContentData.setDistribute(1);
return robotHttpUtils.httpJsonPost(path, updateMessageContentData, Void.class);
}
public IMResult<InputOutputUserInfo> getUserInfo(String userId) throws Exception {
String path = APIPath.Robot_User_Info;
InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null);
@@ -247,5 +268,10 @@ public class RobotService {
return configData;
}
public IMResult<String> sendConferenceRequest(String robotId, String clientId, String request, long sessionId, String roomId, String data, boolean advance) throws Exception {
String path = APIPath.Robot_Conference_Request;
InputConferenceRequest input = new InputConferenceRequest(robotId, clientId, request, sessionId, roomId, data, advance);
return robotHttpUtils.httpJsonPost(path, input, String.class);
}
}
@@ -24,6 +24,11 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public static IMResult<OutputUserInfoList> getUserByEmail(String email) throws Exception {
String path = APIPath.User_Get_Email_Info;
return AdminHttpUtils.httpJsonPost(path, email, OutputUserInfoList.class);
}
public static IMResult<OutputGetUserList> getAllUsers(int count, int offset) throws Exception {
String path = APIPath.User_Get_All;
InputGetUserList input = new InputGetUserList();
@@ -151,4 +156,9 @@ public class UserAdmin {
input.setAuthCode(authCode);
return AdminHttpUtils.httpJsonPost(path, input, OutputApplicationUserInfo.class);
}
public static IMResult<GetUserSessionResult> getUserSession(String userId) throws Exception {
InputUserId inputUserId = new InputUserId(userId);
return AdminHttpUtils.httpJsonPost(APIPath.User_Session_List, inputUserId, GetUserSessionResult.class);
}
}