Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a213704c5 | ||
|
|
5a52a7d553 | ||
|
|
d751a7080b | ||
|
|
68ae7dbd58 | ||
|
|
10fce4baad | ||
|
|
c69906e249 | ||
|
|
1aed4b1d37 | ||
|
|
f2601fc65d | ||
|
|
4895f03a68 | ||
|
|
1d234a3575 | ||
|
|
386d0b9c57 | ||
|
|
3ab1c7553d | ||
|
|
85a4c806c1 | ||
|
|
9aac87b7a1 | ||
|
|
ce21441772 | ||
|
|
0a3516cdf2 | ||
|
|
135a9ed0a8 | ||
|
|
73e3447b39 | ||
|
|
394b9119fa | ||
|
|
ebb05351a8 | ||
|
|
c4421fc9ed | ||
|
|
a906bf352d | ||
|
|
37f1772705 | ||
|
|
0a05503c78 | ||
|
|
a702602758 | ||
|
|
c01e5b634d | ||
|
|
6c2848cbf7 | ||
|
|
ae3c8e0d25 | ||
|
|
2ef0059395 | ||
|
|
d91a2d9fd5 | ||
|
|
a4bcd5e29e | ||
|
|
fe4612c801 | ||
|
|
58ade23b23 | ||
|
|
f1e46fca75 | ||
|
|
1e17fa1db4 | ||
|
|
7094114ea3 | ||
|
|
c805bddca1 | ||
|
|
cb5754fe07 | ||
|
|
c014b78d95 | ||
|
|
8a13a32615 | ||
|
|
bc409042b0 | ||
|
|
49ad4f5eb6 | ||
|
|
8c93e2ee42 | ||
|
|
54286b4a55 | ||
|
|
594103e06b | ||
|
|
90e89978aa | ||
|
|
93b6e70804 | ||
|
|
b774e0d423 | ||
|
|
08b813cd9f | ||
|
|
24c6538084 | ||
|
|
724be0b273 | ||
|
|
63f0fc66ce | ||
|
|
327b8d43a8 | ||
|
|
df67b8e0c8 | ||
|
|
b4fcef1ced | ||
|
|
c43dfe26f4 | ||
|
|
aa1161131d | ||
|
|
a1188f5d52 | ||
|
|
6a10412940 | ||
|
|
8e3100e5b7 | ||
|
|
c17a5be171 | ||
|
|
7727fad4dc | ||
|
|
dd5b9b1847 | ||
|
|
92c3c98553 | ||
|
|
d13ed6f989 | ||
|
|
4e6188ee32 | ||
|
|
a183d30f89 | ||
|
|
3f4c2b0cea | ||
|
|
932ee9235f | ||
|
|
1e5ac9b787 | ||
|
|
ad5d4991c8 | ||
|
|
a2ee6c87eb | ||
|
|
30e01a7040 |
@@ -54,6 +54,9 @@
|
||||
## 野火开发文档
|
||||
[在线文档](https://docs.wildfirechat.cn/)
|
||||
|
||||
## 野火IM论坛
|
||||
[野火IM论坛](https://bbs.wildfirechat.cn)
|
||||
|
||||
## 野火性能测试报告及测试方法
|
||||
[Github](https://github.com/wildfirechat/Performance_Test), [码云](https://gitee.com/wfchat/Performance_Test)。
|
||||
|
||||
@@ -70,7 +73,7 @@ PC客户端点[这里](https://github.com/wildfirechat/vue-pc-chat/releases)下
|
||||
|
||||

|
||||
|
||||
## 快速使用
|
||||
## 快速开始
|
||||
可以按照[快速开始](https://docs.wildfirechat.cn/quick_start/)来部署应用服务和IM服务,然后打包移动端,就可以完成聊天和通话功能。
|
||||
|
||||
之后再部署开放平台服务、频道(公众号)服务、机器人服务、推送服务、Turn服务(音视频服务)来实现完整的应用功能,详情可以详细阅读文档。
|
||||
@@ -116,6 +119,19 @@ mvn clean package
|
||||
|
||||
修改之后运行编译命令```mvn clean package```,rpm包生成在```distribution/target```目录下。
|
||||
|
||||
## Epoll
|
||||
在linux系统中打开Epoll开关可以提高性能,默认软件包内打包的是x86_64的epoll native sdk。如果是arm64的机器,可以把[broker pom](./broker/pom.xml)文件中修改如下:
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>io.netty</groupId>
|
||||
<artifactId>netty-transport-native-epoll</artifactId>
|
||||
<version>${netty.version}</version>
|
||||
<!-- <classifier>linux-x86_64</classifier>-->
|
||||
<classifier>linux-aarch_64</classifier>
|
||||
</dependency>
|
||||
```
|
||||
然后重新打包。专业版IM服务软件包中有arm64架构的sdk,可以直接替换。epoll只支持x86_64和arm64两个架构,其他架构不要把epoll开关打开。
|
||||
|
||||
## 升级说明
|
||||
1. 从0.42 版本增加了群成员数限制,默认为2000。如果您从之前的版本升级到这个版本或以后,需要注意到群成员数的限制。升级之后超出限制的群不受影响,但不能继续加人,如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的人数。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。
|
||||
2. 0.50版本添加了是否允许客户端发送群操作通知的配置。如果您在客户端自定义群通知,需要在服务器端配置允许,没有使用自定义群操作通知的不受影响。***
|
||||
@@ -128,6 +144,18 @@ mvn clean package
|
||||
9. 从0.79 版本起把log4j升级到log4j2,因为log4j已经不再维护而且还有已知的漏洞,建议所有客户都升级,升级时注意更新log4j2的配置文件
|
||||
10. 0.97版本更改了启动脚本```wildfirechat.sh```,如果是升级服务,请注意更新启动脚本。
|
||||
|
||||
## 维护说明
|
||||
野火设计理念当中,IM服务和客户端协议栈构成个管道工具,数据在人和人或者人和服务或者服务和服务之间传递,可以通过Server API和自定义消息来对接和开发业务。业务系统把IM系统当作一个工具来使用,是不需要把任何业务逻辑写在IM服务中的。
|
||||
|
||||
如果修改了IM服务可能会引起跟客户端协议栈的不兼容,以后也没有可能从社区版IM服务迁移到专业版IM服务,还有一旦修改就跟我们代码不一样了,如果出了问题我们就无法分析和解决。所以 ***我们强烈不推荐在IM服务修改代码,如果修改过就不再提供任何技术支持和服务了***。除了IM服务以外的所有代码可以任意修改。
|
||||
|
||||
现有接口足够对接和二开任何业务了,如果发现无法实现你们的业务需求,可以在[论坛](https://bbs.wildfirechat.cn)来咨询,我们会分析如何实现,如果需要添加新接口,我们会及时免费添加。请切记:***不要修改IM服务的代码!*** ***不要修改IM服务的代码!*** ***不要修改IM服务的代码!***
|
||||
|
||||
详细维护说明请参考 [野火维护说明](https://docs.wildfirechat.cn/base_knowledge/maintain.html)。
|
||||
|
||||
## 服务对象
|
||||
因为野火的使用范围比较广,难免被一些不法分子利用,国内反诈反赌力度很大,所以国内多地警方都跟我们都有过联系。***为了预防我们的产品被用于非法目的,试用及购买只能支持境内法人单位,不接受个人或者境外团体。如果我们发现产品被用于非法目的,我们会立即停止技术支持服务并且报警和配合警方调查。请用于非法目的用户绕行!***
|
||||
|
||||
## 应用截图
|
||||
登录界面
|
||||
|
||||
|
||||
@@ -123,6 +123,18 @@ message.group_mute_exception_types 401,402,403,404,405,407,408,410,411
|
||||
## 用户被全局禁言时允许发送的消息类型
|
||||
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
|
||||
@@ -136,12 +148,19 @@ robot.callback_with_client_info false
|
||||
## 频道回调信息是否带上用户clientId和平台类型。
|
||||
channel.callback_with_client_info false
|
||||
|
||||
## 频道回调新方式,在新方式下,如果有callback地址就会总是回调客户端发送的消息(包括owner和订阅者)。automatic属性控制订阅者发送的消息是否发给owner, 0发,1不发。
|
||||
## 旧的方式是,automatic为0时,订阅者的消息发给owner,不转发消息到callback地址。为1时,把订阅者的消息转发给callback地址,不发给owner。
|
||||
channel.new_callback_feature true
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
##禁止按照昵称搜索用户。
|
||||
friend.disable_nick_name_search false
|
||||
|
||||
##禁止按照用户id搜索用户,默认为true。
|
||||
friend.disable_user_id_search true
|
||||
|
||||
##禁止发送好友邀请,通过server api添加好友不受此限制(force参数需要为true)
|
||||
friend.disable_friend_request false
|
||||
|
||||
@@ -166,6 +185,18 @@ chatroom.rejoin_when_active true
|
||||
## 当一个聊天室不存在时,如果有用户加入就自动创建
|
||||
chatroom.create_when_not_exist true
|
||||
|
||||
## 一个用户同一时刻只能加入一个聊天室。
|
||||
## 当一个客户端加入一个聊天室时,如果这个客户端已经加入另外一个聊天室了,会自动退出之前的聊天室。
|
||||
## 当一个客户端加入一个聊天室时,如果这个用户的其他端已经加入一个聊天室了,kickoff_other_platform为true时会自动退出之前的聊天室,为false时会返回225的错误码。
|
||||
## 当自动退出聊天室时,客户端不会收到任何通知,只是不会再收到消息。
|
||||
chatroom.kickoff_other_platform true
|
||||
|
||||
## 是否允许群主不受限制地撤回自己发送的消息。false可以${message.recall_time_limit}撤回自己的消息;true可以撤回任意时间自己的消息。默认为true。
|
||||
group.allow_owner_recall_self_msg true
|
||||
|
||||
## 是否允许群管理员不受限制地撤回自己发送的消息。false可以${message.recall_time_limit}撤回自己的消息;true可以撤回任意时间自己的消息。默认为false。
|
||||
group.allow_manager_recall_self_msg false
|
||||
|
||||
## 是否允许客户端发送操作群的自定义群通知消息
|
||||
group.allow_client_custom_operation_notification true
|
||||
|
||||
@@ -180,6 +211,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不受影响。
|
||||
## 注意,修改本配置不会对已经同步的信息产生影响。
|
||||
@@ -192,6 +229,9 @@ user.keep_display_name_when_destroy true
|
||||
# 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。
|
||||
#sync.data_part_size 1000
|
||||
|
||||
## 是否关闭api/version接口。api/version方法可以用来检查IM服务版本,上线确认无问题后,可以关掉这个接口。
|
||||
#http.close_api_version false
|
||||
|
||||
#*********************************************************************
|
||||
# 限频配置
|
||||
#*********************************************************************
|
||||
@@ -264,7 +304,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。注意仅影响默认值,用户可以手动切换是否静音。
|
||||
@@ -357,10 +400,12 @@ push.ios.server.address http://localhost:8085/ios/push
|
||||
#*********************************************************************
|
||||
# Sensitive configuration
|
||||
#*********************************************************************
|
||||
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
|
||||
## 内置文本敏感词过滤处理方法,当命中敏感词后,消息会被记录到t_sensitive_messages表中,然后根据type类型做不同的处理,处理方式如下:
|
||||
## 0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***然后正常发送;3 正常发送。
|
||||
## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址
|
||||
sensitive.filter.type 0
|
||||
|
||||
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
|
||||
## 如果内置敏感词库无法满足您的需求,可以开发部署独立敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址,内置的敏感词审核和敏感词转发功能就不再起作用了。
|
||||
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
|
||||
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
|
||||
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
alter table `t_group` add column `_deleted` tinyint NOT NULL DEFAULT 0;
|
||||
|
||||
Executable
+13
@@ -0,0 +1,13 @@
|
||||
DROP TABLE IF EXISTS `t_domain`;
|
||||
CREATE TABLE `t_domain` (
|
||||
`_domain_id` varchar(64) NOT NULL PRIMARY KEY,
|
||||
`_name` varchar(64) NOT NULL,
|
||||
`_desc` varchar(256) DEFAULT '',
|
||||
`_email` varchar(64) DEFAULT '',
|
||||
`_tel` varchar(64) DEFAULT '',
|
||||
`_address` varchar(64) DEFAULT '',
|
||||
`_extra` varchar(1024) DEFAULT '',
|
||||
`_dt` bigint(20) NOT NULL
|
||||
);
|
||||
|
||||
alter table `t_user` add column `_external` tinyint 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
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
alter table `t_group` add column `_deleted` tinyint NOT NULL DEFAULT 0;
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
DROP TABLE IF EXISTS `t_domain`;
|
||||
CREATE TABLE `t_domain` (
|
||||
`_domain_id` varchar(128) NOT NULL PRIMARY KEY,
|
||||
`_name` varchar(64) NOT NULL,
|
||||
`_desc` varchar(256) DEFAULT '',
|
||||
`_email` varchar(64) DEFAULT '',
|
||||
`_tel` varchar(64) DEFAULT '',
|
||||
`_address` varchar(64) DEFAULT '',
|
||||
`_extra` varchar(1024) DEFAULT '',
|
||||
`_dt` bigint(20) NOT NULL
|
||||
)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = utf8mb4
|
||||
COLLATE = utf8mb4_unicode_ci;
|
||||
|
||||
alter table `t_user` add column `_external` tinyint DEFAULT 0;
|
||||
+22
-55
@@ -5,7 +5,7 @@
|
||||
<relativePath>../</relativePath>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.7</version>
|
||||
<version>1.2.7</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>
|
||||
@@ -112,9 +124,7 @@
|
||||
<artifactId>netty-transport-native-epoll</artifactId>
|
||||
<version>${netty.version}</version>
|
||||
<classifier>linux-x86_64</classifier>
|
||||
<!--
|
||||
<classifier>${os.detected.name}-${os.detected.arch}</classifier>
|
||||
-->
|
||||
<!-- <classifier>linux-aarch_64</classifier>-->
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
@@ -129,37 +139,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 +160,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 +183,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
|
||||
|
||||
|
||||
@@ -47,6 +47,8 @@ abstract public class Action {
|
||||
protected static RateLimiter robotLimiter = null;
|
||||
protected static RateLimiter channelLimiter = null;
|
||||
|
||||
protected static boolean closeApiVersion = false;
|
||||
|
||||
public static void init(IConfig config) {
|
||||
int adminRate = 10000;
|
||||
int robotRate = 1000;
|
||||
@@ -70,6 +72,11 @@ abstract public class Action {
|
||||
adminLimiter = new RateLimiter(10, adminRate);
|
||||
robotLimiter = new RateLimiter(10, robotRate);
|
||||
channelLimiter = new RateLimiter(10, channelRate);
|
||||
|
||||
try {
|
||||
closeApiVersion = Boolean.parseBoolean(config.getProperty(HTTP_CLOSE_API_VERSION, "false"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
protected class Result {
|
||||
|
||||
@@ -31,6 +31,11 @@ public class CheckTokenAction extends Action {
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
if(closeApiVersion) {
|
||||
response.sendError(HttpResponseStatus.NOT_FOUND, "404 Not found!");
|
||||
return true;
|
||||
}
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
String userId = request.getParam("userId");
|
||||
String clientId = request.getParam("clientId");
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -30,8 +30,12 @@ public class VersionAction extends Action {
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
if(closeApiVersion) {
|
||||
response.sendError(HttpResponseStatus.NOT_FOUND, "404 Not found!");
|
||||
return true;
|
||||
}
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
try {
|
||||
|
||||
response.setContent(Utility.formatJson(gson.toJson(GitRepositoryState.getGitRepositoryState())));
|
||||
|
||||
@@ -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);
|
||||
|
||||
+47
@@ -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;
|
||||
}
|
||||
}
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* 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.InputGetChatroomInfo;
|
||||
import cn.wildfirechat.pojos.InputUserId;
|
||||
import cn.wildfirechat.pojos.OutputStringList;
|
||||
import cn.wildfirechat.pojos.OutputUserChatroom;
|
||||
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.UserClientEntry;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
@Route(APIPath.Chatroom_GetUserChatroom)
|
||||
@HttpMethod("POST")
|
||||
public class GetUserChatroomAction 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)) {
|
||||
OutputUserChatroom outputUserChatroom = messagesStore.getUserChatroom(userId);
|
||||
|
||||
RestResult result;
|
||||
if (outputUserChatroom != null) {
|
||||
result = RestResult.ok(outputUserChatroom);
|
||||
} else {
|
||||
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
|
||||
}
|
||||
setResponseContent(result, response);
|
||||
} else {
|
||||
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* 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.InputGetUserGroupByType;
|
||||
import cn.wildfirechat.pojos.InputUserId;
|
||||
import cn.wildfirechat.pojos.OutputGroupIds;
|
||||
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.Set;
|
||||
|
||||
@Route(APIPath.Get_User_Groups_By_Type)
|
||||
@HttpMethod("POST")
|
||||
public class GetUserGroupsByTypeAction extends AdminAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputGetUserGroupByType input = getRequestBody(request.getNettyRequest(), InputGetUserGroupByType.class);
|
||||
if (input != null
|
||||
&& (!StringUtil.isNullOrEmpty(input.getUserId()))) {
|
||||
|
||||
Set<String> groupIds = messagesStore.getUserGroupIds(input.getUserId(), input.getGroupMemberTypes());
|
||||
OutputGroupIds outputGroupIds = new OutputGroupIds();
|
||||
outputGroupIds.setGroupIds(new ArrayList<>(groupIds));
|
||||
RestResult result = RestResult.ok(outputGroupIds);
|
||||
setResponseContent(result, response);
|
||||
} else {
|
||||
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+50
@@ -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;
|
||||
}
|
||||
}
|
||||
+57
@@ -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;
|
||||
}
|
||||
}
|
||||
+66
@@ -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);
|
||||
|
||||
@@ -80,6 +80,7 @@ public class UpdateProfileAction extends RobotAction {
|
||||
RestResult result = RestResult.ok();
|
||||
if(modified) {
|
||||
try {
|
||||
builder.setUpdateDt(System.currentTimeMillis());
|
||||
messagesStore.updateUserInfo(builder.build());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
|
||||
@@ -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;
|
||||
|
||||
+27
-28
@@ -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
|
||||
|
||||
+1
-4
@@ -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";
|
||||
@@ -153,12 +154,21 @@ 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";
|
||||
public static final String CHANNEL_New_Callback_Feature = "channel.new_callback_feature";
|
||||
|
||||
|
||||
public static final String FRIEND_Disable_Search = "friend.disable_search";
|
||||
public static final String FRIEND_Disable_NickName_Search = "friend.disable_nick_name_search";
|
||||
public static final String FRIEND_Disable_UserId_Search = "friend.disable_user_id_search";
|
||||
public static final String FRIEND_Disable_Friend_Request = "friend.disable_friend_request";
|
||||
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
|
||||
public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration";
|
||||
@@ -169,14 +179,20 @@ public final class BrokerConstants {
|
||||
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
|
||||
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
|
||||
public static final String CHATROOM_Create_When_Not_Exist = "chatroom.create_when_not_exist";
|
||||
public static final String CHATROOM_Kickoff_Other_Platform = "chatroom.kickoff_other_platform";
|
||||
|
||||
|
||||
public static final String GROUP_Allow_Owner_Recall_Self_Msg = "group.allow_owner_recall_self_msg";
|
||||
public static final String GROUP_Allow_Manager_Recall_Self_Msg = "group.allow_manager_recall_self_msg";
|
||||
public static final String GROUP_Allow_Client_Custom_Operation_Notification = "group.allow_client_custom_operation_notification";
|
||||
public static final String GROUP_Allow_Robot_Custom_Operation_Notification = "group.allow_robot_custom_operation_notificatio";
|
||||
|
||||
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";
|
||||
|
||||
@@ -199,6 +215,9 @@ public final class BrokerConstants {
|
||||
public static final String HTTP_CHANNEL_RATE_LIMIT = "http.channel.rate_limit";
|
||||
public static final String CLIENT_REQUEST_RATE_LIMIT = "client.request_rate_limit";
|
||||
|
||||
public static final String HTTP_CLOSE_API_VERSION = "http.close_api_version";
|
||||
|
||||
|
||||
private BrokerConstants() {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -43,13 +43,13 @@ public class QuitGroupHandler extends GroupHandler<WFCMessage.QuitGroupRequest>
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getKeepMsg()>0?"1":"0", "").getQuitGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||
}
|
||||
|
||||
if((m_messagesStore.getVisibleQuitKickoffNotification() & 0x01) > 0) {
|
||||
Set<String> toUsers = m_messagesStore.getGroupManagers(request.getGroupId(), true);
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitVisibleGroupNotifyContent();
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getKeepMsg()>0?"1":"0", "").getQuitVisibleGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content, toUsers);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import cn.wildfirechat.pojos.SystemSettingPojo;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import cn.wildfirechat.server.ThreadPoolExecutorWrapper;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
import com.hazelcast.core.MultiMap;
|
||||
import com.hazelcast.util.StringUtil;
|
||||
@@ -37,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;
|
||||
@@ -46,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;
|
||||
}
|
||||
@@ -56,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) {
|
||||
@@ -163,7 +169,7 @@ public class DatabaseStore {
|
||||
return null;
|
||||
}
|
||||
|
||||
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType) {
|
||||
List<WFCMessage.User> searchUserByNameMobileUserId(String keyword, int searchType) {
|
||||
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
@@ -182,26 +188,34 @@ public class DatabaseStore {
|
||||
", `_extra`" +
|
||||
", `_dt`, `_type` from t_user";
|
||||
|
||||
int sqlParaCount = 1;
|
||||
if(searchType == SearchUserType_Name) {
|
||||
sql += " where `_name` = ? ";
|
||||
} else if(searchType == SearchUserType_Mobile) {
|
||||
sql += " where `_mobile` = ? ";
|
||||
} else {
|
||||
} else if(searchType == SearchUserType_UserId) {
|
||||
sql += " where `_uid` = ? ";
|
||||
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
|
||||
sqlParaCount = 2;
|
||||
sql += " where (`_name` = ? or `_mobile` = ?) ";
|
||||
} else {
|
||||
sqlParaCount = 3;
|
||||
sql += " where (`_name` = ? or `_mobile` = ? or `_uid` = ?) ";
|
||||
}
|
||||
|
||||
sql += " and `_type` <> 2 and `_deleted` = 0"; //can search normal user(0) and robot(1) and admin(100), can not search things
|
||||
|
||||
if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
|
||||
if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile || searchType == SearchUserType_UserId) {
|
||||
sql += " limit 1";
|
||||
} else {
|
||||
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
|
||||
sql += " limit 2";
|
||||
} else {
|
||||
sql += " limit 3";
|
||||
}
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
statement.setString(1, keyword);
|
||||
if(searchType != SearchUserType_Name && searchType != SearchUserType_Mobile) {
|
||||
statement.setString(2, keyword);
|
||||
for (int i = 0; i < sqlParaCount; i++) {
|
||||
statement.setString(i+1, keyword);
|
||||
}
|
||||
|
||||
rs = statement.executeQuery();
|
||||
@@ -284,7 +298,7 @@ public class DatabaseStore {
|
||||
if (searchType == SearchUserType_Name) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
} else if(searchType != SearchUserType_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);
|
||||
@@ -294,15 +308,96 @@ public class DatabaseStore {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} else if(searchType == SearchUserType_Name_Mobile_UserId) {
|
||||
if(keyword.equals(user.getName())) {
|
||||
if(keyword.equals(user.getMobile()) && keyword.equals(user.getUid())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getMobile())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getUid())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||
if (searchType == SearchUserType_Mobile) {
|
||||
filter.add(user);
|
||||
} else if(searchType != SearchUserType_Name) {
|
||||
if(keyword.equals(user.getMobile()) && !keyword.equals(user.getName())) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
} else if(searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name_Mobile_DisplayName) {
|
||||
if(keyword.equals(user.getMobile())) {
|
||||
if(!keyword.equals(user.getName())) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
} else if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
} else if(searchType == SearchUserType_Name_Mobile_UserId) {
|
||||
if(keyword.equals(user.getMobile())) {
|
||||
if(keyword.equals(user.getName()) && keyword.equals(user.getUid())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getName())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getUid())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchUserIdMask) > 0) {
|
||||
if (searchType == SearchUserType_UserId) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
} else if(searchType == SearchUserType_Name_Mobile_UserId) {
|
||||
if(keyword.equals(user.getUid())) {
|
||||
if(keyword.equals(user.getName()) && keyword.equals(user.getMobile())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0 && (value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getName())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else if(keyword.equals(user.getMobile())) {
|
||||
if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
filter.add(user);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -324,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) {
|
||||
@@ -342,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) {
|
||||
@@ -423,13 +524,13 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
||||
List<WFCMessage.User> nameOrIdMatched = searchUserByNameMobile(keyword, searchType);
|
||||
List<WFCMessage.User> nameOrIdMatched = searchUserByNameMobileUserId(keyword, searchType);
|
||||
List<WFCMessage.User> out = new ArrayList<>();
|
||||
if(page == 0) {
|
||||
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);
|
||||
@@ -1035,7 +1136,16 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
if (!expired) {
|
||||
messages.add(message);
|
||||
boolean duplicated = false;
|
||||
for (WFCMessage.Message msg : messages) {
|
||||
if(message.getMessageId() == msg.getMessageId()) {
|
||||
duplicated = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!duplicated) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1331,7 +1441,8 @@ public class DatabaseStore {
|
||||
", `_join_type`" +
|
||||
", `_private_chat`" +
|
||||
", `_searchable`" +
|
||||
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||
", `_deleted`" +
|
||||
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||
" ON DUPLICATE KEY UPDATE " +
|
||||
"`_name` = ?," +
|
||||
"`_portrait` = ?," +
|
||||
@@ -1342,8 +1453,9 @@ public class DatabaseStore {
|
||||
"`_mute` = ?" +
|
||||
", `_join_type` = ?" +
|
||||
", `_private_chat` = ?" +
|
||||
", `_searchable` = ?, " +
|
||||
"`_member_dt` = ?";
|
||||
", `_searchable` = ?" +
|
||||
", `_deleted` = ?" +
|
||||
", `_member_dt` = ?";
|
||||
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -1361,6 +1473,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());
|
||||
@@ -1373,6 +1486,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);
|
||||
@@ -1704,10 +1818,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";
|
||||
}
|
||||
@@ -1722,13 +1838,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);
|
||||
}
|
||||
@@ -1845,6 +1967,45 @@ public class DatabaseStore {
|
||||
return null;
|
||||
}
|
||||
|
||||
Set<String> getUserGroupIds(String userId, List<Integer> memberTypes) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "select _gid from t_group_member where _mid = ? ";
|
||||
if(!memberTypes.isEmpty()) {
|
||||
sql += " and _type in (";
|
||||
for (int i = 0; i < memberTypes.size(); i++) {
|
||||
if(i > 0) {
|
||||
sql += ",";
|
||||
}
|
||||
sql += memberTypes.get(i);
|
||||
}
|
||||
sql += ")";
|
||||
}
|
||||
statement = connection.prepareStatement(sql);
|
||||
|
||||
statement.setString(1, userId);
|
||||
|
||||
rs = statement.executeQuery();
|
||||
Set<String> out = new HashSet<>();
|
||||
while (rs.next()) {
|
||||
String uid = rs.getString(1);
|
||||
out.add(uid);
|
||||
}
|
||||
return out;
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Set<String> getCommonGroupIds(String userId1, String userId2) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
@@ -2776,6 +2937,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;
|
||||
@@ -2873,17 +3127,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()) {
|
||||
@@ -3173,8 +3430,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;
|
||||
@@ -3501,12 +3762,16 @@ public class DatabaseStore {
|
||||
", `_extra`" +
|
||||
", `_dt` from t_channel";
|
||||
if (buzzy) {
|
||||
sql += " where `_name` like ?";
|
||||
sql += " where `_name` like ? ESCAPE '!' ";
|
||||
} else {
|
||||
sql += " where `_name` = ?";
|
||||
}
|
||||
|
||||
sql += " and _status = 0";
|
||||
sql += " and _status <> 64";
|
||||
sql += " and _status <> 16";
|
||||
sql += " and _status <> 17";
|
||||
sql += " and _status <> 24";
|
||||
sql += " and _status <> 25";
|
||||
|
||||
sql += " limit 20";
|
||||
|
||||
@@ -3515,6 +3780,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 {
|
||||
@@ -137,18 +141,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private ConcurrentHashMap<String, Boolean> userPushHiddenDetail = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<String, Boolean> userConvSlientMap = new ConcurrentHashMap<>();
|
||||
|
||||
private LinkedHashMap<String, Long> repeatFriendRequest = new LinkedHashMap<String, Long>() {
|
||||
@Override
|
||||
protected boolean removeEldestEntry(Map.Entry<String, Long> eldest) {
|
||||
return System.currentTimeMillis() - eldest.getValue() > 5 * 60 * 1000;
|
||||
}
|
||||
};
|
||||
|
||||
private boolean mDisableSearch = false;
|
||||
private boolean mDisableNicknameSearch = false;
|
||||
private boolean mDisableUserIdSearch = false;
|
||||
private boolean mDisableFriendRequest = false;
|
||||
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
||||
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
||||
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
||||
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;
|
||||
@@ -156,6 +172,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private long mChatroomParticipantIdleTime = 900000;
|
||||
private boolean mChatroomRejoinWhenActive = true;
|
||||
private boolean mChatroomCreateWhenNotExist = true;
|
||||
private boolean mChatroomKickoffOtherPlatform = true;
|
||||
|
||||
private List<Integer> mForbiddenClientSendTypes = new ArrayList<>();
|
||||
private List<Integer> mBlackListExceptionTypes = new ArrayList<>();
|
||||
@@ -171,6 +188,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private String mChannelInfoUpdateCallback;
|
||||
private String mChatroomInfoUpdateCallback;
|
||||
private String mChatroomMemberUpdateCallback;
|
||||
private boolean mGroupAllowOwnerRecallSelfMsg = false;
|
||||
private boolean mGroupAllowManagerRecallSelfMsg = false;
|
||||
private boolean mGroupAllowClientCustomOperationNotification;
|
||||
private boolean mGroupAllowRobotCustomOperationNotification;
|
||||
private int mGroupVisibleQuitKickoffNotification;
|
||||
@@ -179,9 +198,12 @@ 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;
|
||||
private boolean mChannelNewCallbackFeature = true;
|
||||
|
||||
private Set<Integer> mUserHideProperties = new HashSet<>();
|
||||
|
||||
@@ -240,6 +262,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) {
|
||||
@@ -268,6 +304,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
Utility.printExecption(LOG, e);
|
||||
printMissConfigLog(FRIEND_Disable_NickName_Search, mDisableNicknameSearch + "");
|
||||
}
|
||||
try {
|
||||
mDisableUserIdSearch = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_UserId_Search, "true"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mDisableFriendRequest = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Disable_Friend_Request));
|
||||
} catch (Exception e) {
|
||||
@@ -306,6 +348,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mPushExpiredTimes = Long.parseLong(m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Push_Expired_Days, "7")) * 86400000L;
|
||||
if(mPushExpiredTimes == 0) mPushExpiredTimes = Long.MAX_VALUE;
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mChatroomRejoinWhenActive = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.CHATROOM_Rejoin_When_Active));
|
||||
} catch (Exception e) {
|
||||
@@ -322,6 +370,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
printMissConfigLog(CHATROOM_Create_When_Not_Exist, mChatroomCreateWhenNotExist + "");
|
||||
}
|
||||
|
||||
try {
|
||||
mChatroomKickoffOtherPlatform = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.CHATROOM_Kickoff_Other_Platform, "true"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
mChatroomParticipantIdleTime = Long.parseLong(m_Server.getConfig().getProperty(CHATROOM_Participant_Idle_Time, "900000"));
|
||||
} catch (Exception e) {
|
||||
@@ -453,6 +507,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mGroupAllowOwnerRecallSelfMsg = Boolean.parseBoolean(server.getConfig().getProperty(GROUP_Allow_Owner_Recall_Self_Msg, "true"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
try {
|
||||
mGroupAllowManagerRecallSelfMsg = Boolean.parseBoolean(server.getConfig().getProperty(GROUP_Allow_Manager_Recall_Self_Msg, "false"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mGroupAllowClientCustomOperationNotification = Boolean.parseBoolean(server.getConfig().getProperty(GROUP_Allow_Client_Custom_Operation_Notification));
|
||||
} catch (Exception e) {
|
||||
@@ -471,6 +536,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)) {
|
||||
@@ -518,6 +588,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) {
|
||||
@@ -526,8 +603,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
try {
|
||||
mChannelCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.CHANNEL_Callback_With_Client_Info, "false"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
try {
|
||||
mChannelNewCallbackFeature = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.CHANNEL_New_Callback_Feature, "true"));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mRecallForwardUrl = server.getConfig().getProperty(BrokerConstants.MESSAGE_RecallMsg_Forward_Url);
|
||||
} catch (Exception e) {
|
||||
@@ -656,7 +737,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (channelInfo != null) {
|
||||
if (channelInfo.getOwner().equals(fromUser)) {
|
||||
if(requestSourceType == ProtoConstants.RequestSourceType.Request_From_Channel
|
||||
&& channelInfo.getAutomatic() != 0) {
|
||||
&& channelInfo.getAutomatic() != 0 && !isChannelNewCallbackFeature()) {
|
||||
LOG.info("Channel api message not send to the owner when automatic");
|
||||
} else {
|
||||
notifyReceivers.add(fromUser);
|
||||
@@ -686,7 +767,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
} else {
|
||||
notifyReceivers.add(fromUser);
|
||||
if (channelInfo.getAutomatic() == 0) {
|
||||
if (channelInfo.getAutomatic() == 0 || isChannelNewCallbackFeature()) {
|
||||
notifyReceivers.add(channelInfo.getOwner());
|
||||
} else {
|
||||
LOG.info("Channel api message not send to the owner when automatic");
|
||||
@@ -706,7 +787,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) {
|
||||
@@ -898,7 +979,29 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
Collection<UserClientEntry> members = chatroomMembers.get(chatroomId);
|
||||
return members;
|
||||
}
|
||||
//Todo chatroom
|
||||
|
||||
@Override
|
||||
public OutputUserChatroom getUserChatroom(String userId) {
|
||||
String chatroomId = (String) m_Server.getHazelcastInstance().getMap(USER_CHATROOM).get(userId);
|
||||
if(chatroomId != null) {
|
||||
MultiMap<String, UserClientEntry> chatroomMembers = m_Server.getHazelcastInstance().getMultiMap(CHATROOM_MEMBER_IDS);
|
||||
for (UserClientEntry userClientEntry : chatroomMembers.get(chatroomId)) {
|
||||
if(userClientEntry.userId.equals(userId)) {
|
||||
OutputUserChatroom outputUserChatroom = new OutputUserChatroom();
|
||||
outputUserChatroom.userId = userId;
|
||||
outputUserChatroom.chatroomId = chatroomId;
|
||||
outputUserChatroom.clientId = userClientEntry.clientId;
|
||||
MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(userClientEntry.clientId);
|
||||
if(session != null) {
|
||||
outputUserChatroom.platform = session.getPlatform();
|
||||
}
|
||||
return outputUserChatroom;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WFCMessage.PullMessageResult fetchChatroomMessage(String fromUser, String chatroomId, String exceptClientId, long fromMessageId) {
|
||||
WFCMessage.PullMessageResult.Builder builder = WFCMessage.PullMessageResult.newBuilder();
|
||||
@@ -1121,6 +1224,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();
|
||||
@@ -1196,17 +1378,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);
|
||||
@@ -1525,8 +1725,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
WFCMessage.GroupMember newOwner = null;
|
||||
for (WFCMessage.GroupMember member :members) {
|
||||
if (!member.getMemberId().equals(operator) && member.getType() != GroupMemberType_Removed) {
|
||||
newOwner = member;
|
||||
break;
|
||||
if(newOwner == null) {
|
||||
newOwner = member;
|
||||
} else {
|
||||
if(newOwner.getType() == GroupMemberType_Silent && member.getType() != GroupMemberType_Silent) {
|
||||
newOwner = member;
|
||||
} else if(newOwner.getType() != GroupMemberType_Manager && member.getType() == GroupMemberType_Manager) {
|
||||
newOwner = member;
|
||||
} else if(newOwner.getType() == member.getType()) {
|
||||
if(newOwner.getCreateDt() > member.getCreateDt() && member.getCreateDt() > 0) {
|
||||
newOwner = member;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1620,7 +1831,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;
|
||||
}
|
||||
|
||||
@@ -1705,12 +1916,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;
|
||||
}
|
||||
@@ -1723,7 +1934,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;
|
||||
@@ -1808,7 +2019,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;
|
||||
@@ -1892,16 +2103,12 @@ 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)) {
|
||||
if(!isAdmin && !StringUtil.isNullOrEmpty(fromUser) && groupInfo.getDeleted() == 0) {
|
||||
WFCMessage.GroupMember gm = getGroupMember(groupInfo.getTargetId(), fromUser);
|
||||
if((gm == null || gm.getType() == GroupMemberType_Removed) && request.getUpdateDt() > 0) {
|
||||
continue;
|
||||
}
|
||||
if(gm == null) {
|
||||
groupInfo = groupInfo.toBuilder().setMemberUpdateDt(-1).build();
|
||||
} else if(gm.getType() == GroupMemberType_Removed) {
|
||||
@@ -1929,6 +2136,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return databaseStore.getUserGroupIds(userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getUserGroupIds(String userId, List<Integer> memberTypes) {
|
||||
return databaseStore.getUserGroupIds(userId, memberTypes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getCommonGroupIds(String userId1, String userId2) {
|
||||
return databaseStore.getCommonGroupIds(userId1, userId2);
|
||||
@@ -2052,7 +2264,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;
|
||||
}
|
||||
@@ -2074,6 +2286,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
if(userList.contains(groupInfo.getOwner())) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
long updateDt = System.currentTimeMillis();
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
|
||||
@@ -2120,7 +2336,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;
|
||||
}
|
||||
@@ -2208,7 +2424,28 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
||||
}
|
||||
if (operatorId.equals(groupInfo.getOwner())) {
|
||||
canRecall = true;
|
||||
if(operatorId.equals(message.getFromUser())) {
|
||||
if(mGroupAllowOwnerRecallSelfMsg) {
|
||||
canRecall = true;
|
||||
}
|
||||
} else {
|
||||
canRecall = true;
|
||||
}
|
||||
} else {
|
||||
if(message.getFromUser().equals(operatorId) && mGroupAllowManagerRecallSelfMsg) {
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
||||
if (members == null || members.size() == 0) {
|
||||
members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget());
|
||||
}
|
||||
for (WFCMessage.GroupMember member : members) {
|
||||
if (member.getMemberId().equals(operatorId)) {
|
||||
if (member.getType() == GroupMemberType_Manager || member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Owner) {
|
||||
canRecall = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!canRecall && !message.getFromUser().equals(operatorId)) {
|
||||
@@ -2274,7 +2511,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
json.put("c", message.getContent().getContent());
|
||||
json.put("e", message.getContent().getExtra());
|
||||
if (message.getContent().getData() != null && message.getContent().getData().size() > 0) {
|
||||
json.put("b", Base64.getEncoder().encode(message.getContent().getData().toByteArray()));
|
||||
json.put("b", Base64.getEncoder().encodeToString(message.getContent().getData().toByteArray()));
|
||||
}
|
||||
if (message.getContent().getMediaType() > 0) {
|
||||
json.put("mt", message.getContent().getMediaType());
|
||||
@@ -2556,6 +2793,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;
|
||||
@@ -2565,8 +2803,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;
|
||||
}
|
||||
@@ -2576,6 +2820,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
|
||||
@@ -2674,7 +2923,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())) {
|
||||
@@ -2682,7 +2931,6 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
databaseStore.updateUser(user);
|
||||
mUserMap.put(user.getUid(), user);
|
||||
databaseStore.updateUserPassword(user.getUid(), password);
|
||||
|
||||
callbackUserInfoEvent(user);
|
||||
}
|
||||
@@ -2768,6 +3016,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);
|
||||
@@ -2780,9 +3033,21 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
if (mDisableNicknameSearch && 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);
|
||||
}
|
||||
|
||||
@@ -2937,7 +3202,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
if (mDisableStrangerChat) {
|
||||
//在禁止私聊时,是否是允许私聊的用户id
|
||||
if(mAllowStrangerChatSet.contains(targetUser)) {
|
||||
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser)) {
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -3085,6 +3350,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);
|
||||
@@ -3099,14 +3368,28 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
|
||||
if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted && !isAdmin) {
|
||||
if (mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) {
|
||||
if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected
|
||||
&& System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
|
||||
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;
|
||||
}
|
||||
|
||||
if (!(mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration)) {
|
||||
if(System.currentTimeMillis() - existRequest.getUpdateDt() > 5 * 60 * 1000) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
|
||||
} else {
|
||||
mWriteLock.lock();
|
||||
try {
|
||||
String repeatKey = userId + "-" + existRequest.getToUid();
|
||||
Long lastTime = repeatFriendRequest.get(repeatKey);
|
||||
if(lastTime != null && System.currentTimeMillis() - lastTime < 5 * 60 * 1000) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
|
||||
}
|
||||
repeatFriendRequest.put(repeatKey, System.currentTimeMillis());
|
||||
} finally {
|
||||
mWriteLock.unlock();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_ALREADY_REQUEST;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3127,7 +3410,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();
|
||||
|
||||
@@ -3135,6 +3418,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;
|
||||
}
|
||||
@@ -3458,9 +3747,25 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
|
||||
MultiMap<String, UserClientEntry> chatroomMembers = m_Server.getHazelcastInstance().getMultiMap(CHATROOM_MEMBER_IDS);
|
||||
String alreadyInChatroom = (String) m_Server.getHazelcastInstance().getMap(USER_CHATROOM).get(userId);
|
||||
if(alreadyInChatroom != null) {
|
||||
for (UserClientEntry userClientEntry : chatroomMembers.get(alreadyInChatroom)) {
|
||||
if(userClientEntry.userId.equals(userId)) {
|
||||
if(!chatroomId.equals(alreadyInChatroom) || !userClientEntry.clientId.equals(clientId)) {
|
||||
if(mChatroomKickoffOtherPlatform) {
|
||||
handleQuitChatroom(userId, userClientEntry.clientId, chatroomId);
|
||||
} else {
|
||||
return ErrorCode.ERROR_CODE_OTHER_CLIENT_ALREADY_IN_CHATROOM;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_Server.getStore().sessionsStore().getSession(clientId).refreshLastChatroomActiveTime();
|
||||
m_Server.getHazelcastInstance().getMap(USER_CHATROOM).put(userId, chatroomId);
|
||||
m_Server.getHazelcastInstance().getMultiMap(CHATROOM_MEMBER_IDS).put(chatroomId, new UserClientEntry(userId, clientId));
|
||||
chatroomMembers.put(chatroomId, new UserClientEntry(userId, clientId));
|
||||
|
||||
mWriteLock.lock();
|
||||
chatroomMessages.put(userId, new TreeMap<>());
|
||||
@@ -4239,6 +4544,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();
|
||||
@@ -4316,11 +4650,26 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return mChannelCallbackWithClientInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isChannelNewCallbackFeature() {
|
||||
return mChannelNewCallbackFeature;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isRobotAutoAcceptFriendRequest() {
|
||||
return mFriendRobotAutoAccept;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getPushExpiredTimes() {
|
||||
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);
|
||||
|
||||
@@ -357,7 +357,11 @@ public class Server {
|
||||
private String getServerIp(IConfig config) {
|
||||
String serverIp = config.getProperty(BrokerConstants.SERVER_IP_PROPERTY_NAME);
|
||||
if (serverIp == null || serverIp.equals("0.0.0.0")) {
|
||||
serverIp = Utility.getLocalAddress().getHostAddress();
|
||||
if(Utility.getLocalAddress() != null) {
|
||||
serverIp = Utility.getLocalAddress().getHostAddress();
|
||||
} else {
|
||||
serverIp = "0.0.0.0";
|
||||
}
|
||||
}
|
||||
return serverIp;
|
||||
}
|
||||
|
||||
@@ -135,7 +135,6 @@ public class NettyAcceptor implements ServerAcceptor {
|
||||
}
|
||||
}
|
||||
})
|
||||
.option(ChannelOption.SO_BACKLOG, 10240) // 服务端可连接队列大小
|
||||
.option(ChannelOption.SO_BACKLOG, nettySoBacklog)
|
||||
.option(ChannelOption.SO_REUSEADDR, nettySoReuseaddr)
|
||||
.childOption(ChannelOption.TCP_NODELAY, nettyTcpNodelay)
|
||||
|
||||
@@ -16,12 +16,10 @@
|
||||
|
||||
package io.moquette.spi;
|
||||
|
||||
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||
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;
|
||||
@@ -31,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
|
||||
@@ -107,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);
|
||||
@@ -119,6 +115,7 @@ public interface IMessagesStore {
|
||||
List<WFCMessage.GroupInfo> getGroupInfos(List<WFCMessage.UserRequest> requests, String fromUser, boolean isAdmin);
|
||||
WFCMessage.GroupInfo getGroupInfo(String groupId);
|
||||
Set<String> getUserGroupIds(String userId);
|
||||
Set<String> getUserGroupIds(String userId, List<Integer> types);
|
||||
Set<String> getCommonGroupIds(String userId1, String userId2);
|
||||
ErrorCode getGroupMembers(String fromUser, String groupId, long maxDt, List<WFCMessage.GroupMember> members);
|
||||
WFCMessage.GroupMember getGroupMember(String groupId, String memberId);
|
||||
@@ -150,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);
|
||||
@@ -172,6 +170,7 @@ public interface IMessagesStore {
|
||||
|
||||
long insertChatroomMessages(String target, int line, long messageId);
|
||||
Collection<UserClientEntry> getChatroomMembers(String chatroomId);
|
||||
OutputUserChatroom getUserChatroom(String userId);
|
||||
WFCMessage.PullMessageResult fetchChatroomMessage(String fromUser, String chatroomId, String exceptClientId, long fromMessageId);
|
||||
|
||||
ErrorCode verifyToken(String userId, String token, List<String> serverIPs, List<Integer> ports);
|
||||
@@ -225,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);
|
||||
@@ -241,9 +243,13 @@ public interface IMessagesStore {
|
||||
boolean isForwardMessageWithClientInfo();
|
||||
boolean isRobotCallbackWithClientInfo();
|
||||
boolean isChannelCallbackWithClientInfo();
|
||||
boolean isChannelNewCallbackFeature();
|
||||
|
||||
boolean isRobotAutoAcceptFriendRequest();
|
||||
|
||||
long getPushExpiredTimes();
|
||||
Set<Integer> getForcePushTypes();
|
||||
|
||||
List<Integer> getClientForbiddenSendTypes();
|
||||
List<Integer> getBlackListExceptionTypes();
|
||||
List<Integer> getGroupMuteExceptionTypes();
|
||||
|
||||
@@ -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;
|
||||
@@ -235,7 +239,7 @@ public class MessagesPublisher {
|
||||
|
||||
for (Session targetSession : sessions) {
|
||||
//超过7天不活跃的用户忽略
|
||||
if(System.currentTimeMillis() - targetSession.getLastActiveTime() > 7 * 24 * 60 * 60 * 1000) {
|
||||
if(System.currentTimeMillis() - targetSession.getLastActiveTime() > m_messagesStore.getPushExpiredTimes()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -631,7 +668,15 @@ public class MessagesPublisher {
|
||||
public void publish2Receivers(WFCMessage.Message message, Set<String> receivers, String exceptClientId, int pullType) {
|
||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(message.getConversation().getTarget());
|
||||
if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && channelInfo.getAutomatic() == 1 && !message.getFromUser().equals(channelInfo.getOwner())) {
|
||||
|
||||
boolean forwardMsg;
|
||||
if(m_messagesStore.isChannelNewCallbackFeature()) {
|
||||
forwardMsg = channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && !StringUtil.isNullOrEmpty(exceptClientId);
|
||||
} else {
|
||||
forwardMsg = channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback()) && channelInfo.getAutomatic() == 1 && !message.getFromUser().equals(channelInfo.getOwner());
|
||||
}
|
||||
|
||||
if (forwardMsg) {
|
||||
OutputClient outputClient = null;
|
||||
if(m_messagesStore.isChannelCallbackWithClientInfo() && !StringUtil.isNullOrEmpty(exceptClientId)) {
|
||||
Session session = m_sessionsStore.getSession(exceptClientId);
|
||||
@@ -730,7 +775,10 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
|
||||
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
|
||||
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
||||
return;
|
||||
}
|
||||
if(!m_messagesStore.isChannelNewCallbackFeature() && channelInfo.getAutomatic() == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>1.1.7</version>
|
||||
<version>1.2.7</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@ public interface APIPath {
|
||||
String Chatroom_Destroy = "/admin/chatroom/del";
|
||||
String Chatroom_Info = "/admin/chatroom/info";
|
||||
String Chatroom_GetMembers = "/admin/chatroom/members";
|
||||
String Chatroom_GetUserChatroom = "/admin/chatroom/user_chatroom";
|
||||
String Chatroom_SetBlacklist = "/admin/chatroom/set_black_status";
|
||||
String Chatroom_GetBlacklist = "/admin/chatroom/get_black_status";
|
||||
String Chatroom_SetManager = "/admin/chatroom/set_manager";
|
||||
@@ -16,9 +17,15 @@ public interface APIPath {
|
||||
String Sensitive_Del = "/admin/sensitive/del";
|
||||
String Sensitive_Query = "/admin/sensitive/query";
|
||||
|
||||
String Create_Domain = "/admin/domain/create";
|
||||
String Get_Domain = "/admin/domain/get";
|
||||
String Destroy_Domain = "/admin/domain/destroy";
|
||||
String List_Domain = "/admin/domain/list";
|
||||
|
||||
String Create_User = "/admin/user/create";
|
||||
String Update_User = "/admin/user/update";
|
||||
String Destroy_User = "/admin/user/destroy";
|
||||
String Search_User = "/admin/user/search_user";
|
||||
String Create_Robot = "/admin/robot/create";
|
||||
String CreateOrUpdate_Device = "/admin/device/create";
|
||||
String Get_Device = "/admin/device/get";
|
||||
@@ -26,6 +33,8 @@ 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_Batch_Get_Infos = "/admin/user/batch_get_infos";
|
||||
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";
|
||||
@@ -36,6 +45,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";
|
||||
@@ -49,7 +59,10 @@ public interface APIPath {
|
||||
String Friend_Get_Requests = "/admin/friend/get_requests";
|
||||
String Relation_Get = "/admin/relation/get";
|
||||
|
||||
String Handle_Friend_Send_Request = "/admin/friend/handle_send_request";
|
||||
|
||||
String Msg_Send = "/admin/message/send";
|
||||
String Msg_Publish = "/admin/message/publish";
|
||||
String Msg_Recall = "/admin/message/recall";
|
||||
String Msg_Delete = "/admin/message/delete";
|
||||
String Msg_Update = "/admin/message/update";
|
||||
@@ -67,6 +80,7 @@ public interface APIPath {
|
||||
String Group_Dismiss = "/admin/group/del";
|
||||
String Group_Transfer = "/admin/group/transfer";
|
||||
String Group_Get_Info = "/admin/group/get_info";
|
||||
String Group_Batch_Info = "/admin/group/batch_infos";
|
||||
String Group_Modify_Info = "/admin/group/modify";
|
||||
String Group_Member_List = "/admin/group/member/list";
|
||||
String Group_Member_Get = "/admin/group/member/get";
|
||||
@@ -77,10 +91,15 @@ public interface APIPath {
|
||||
String Group_Mute_Member = "/admin/group/manager/mute";
|
||||
String Group_Allow_Member = "/admin/group/manager/allow";
|
||||
String Get_User_Groups = "/admin/group/of_user";
|
||||
String Get_User_Groups_By_Type = "/admin/group/of_user_by_type";
|
||||
String Group_Set_Member_Alias = "/admin/group/member/set_alias";
|
||||
String Group_Set_Member_Extra = "/admin/group/member/set_extra";
|
||||
String Get_Common_Groups = "/admin/group/common_group";
|
||||
|
||||
String Sync_Group = "/admin/mesh/group_sync";
|
||||
String Conference_User_Request = "/admin/conference/user_request";
|
||||
String Conference_User_Event = "/admin/conference/user_event";
|
||||
|
||||
String Create_Channel = "/admin/channel/create";
|
||||
String Destroy_Channel = "/admin/channel/destroy";
|
||||
String Get_Channel_Info = "/admin/channel/get";
|
||||
@@ -88,7 +107,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";
|
||||
@@ -113,6 +132,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";
|
||||
@@ -133,4 +154,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";
|
||||
}
|
||||
|
||||
@@ -66,6 +66,8 @@ public enum ErrorCode {
|
||||
|
||||
ERROR_CODE_FUNCTION_DISABLED(220, "function disabled"),
|
||||
|
||||
ERROR_CODE_OTHER_CLIENT_ALREADY_IN_CHATROOM(225, "other client already in chatroom"),
|
||||
|
||||
ERROR_CODE_CHANNEL_NO_EXIST(236, "channel no exist"),
|
||||
ERROR_CODE_CHANNEL_NO_SECRET(237, "channel no secret"),
|
||||
ERROR_CODE_USER_NOT_PREPARED(238, "user not prepared"),
|
||||
|
||||
+48
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -10,4 +10,9 @@ public class ConferenceCreateEvent {
|
||||
public int bitrate;
|
||||
public boolean advance;
|
||||
public boolean recording;
|
||||
public long timestamp;
|
||||
|
||||
public ConferenceCreateEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,4 +3,9 @@ package cn.wildfirechat.pojos;
|
||||
public class ConferenceDestroyEvent {
|
||||
public String userId;
|
||||
public String roomId;
|
||||
public long timestamp;
|
||||
|
||||
public ConferenceDestroyEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,4 +4,9 @@ public class ConferenceJoinEvent {
|
||||
public String userId;
|
||||
public String roomId;
|
||||
public boolean screenSharing;
|
||||
public long timestamp;
|
||||
|
||||
public ConferenceJoinEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,4 +6,9 @@ public class ConferenceLeaveEvent {
|
||||
public boolean rejoin;
|
||||
public boolean kicked;
|
||||
public boolean screenSharing;
|
||||
public long timestamp;
|
||||
|
||||
public ConferenceLeaveEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,4 +5,9 @@ public class ConferencePublishEvent {
|
||||
public boolean video;
|
||||
public String roomId;
|
||||
public boolean screenSharing;
|
||||
public long timestamp;
|
||||
|
||||
public ConferencePublishEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,4 +4,9 @@ public class ConferenceUnpublishEvent {
|
||||
public String userId;
|
||||
public String roomId;
|
||||
public boolean screenSharing;
|
||||
public long timestamp;
|
||||
|
||||
public ConferenceUnpublishEvent() {
|
||||
timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,40 @@
|
||||
/*
|
||||
* 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 java.util.List;
|
||||
|
||||
public class InputGetUserGroupByType {
|
||||
private String userId;
|
||||
private List<Integer> groupMemberTypes;
|
||||
|
||||
public InputGetUserGroupByType() {
|
||||
}
|
||||
|
||||
public InputGetUserGroupByType(String userId, List<Integer> groupMemberTypes) {
|
||||
this.userId = userId;
|
||||
this.groupMemberTypes = groupMemberTypes;
|
||||
}
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(String userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public List<Integer> getGroupMemberTypes() {
|
||||
return groupMemberTypes;
|
||||
}
|
||||
|
||||
public void setGroupMemberTypes(List<Integer> groupMemberTypes) {
|
||||
this.groupMemberTypes = groupMemberTypes;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -15,6 +15,7 @@ public class InputGroupBase {
|
||||
public String operator;
|
||||
public List<Integer> to_lines;
|
||||
public MessagePayload notify_message;
|
||||
private boolean isMeshMessage;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -39,4 +40,12 @@ public class InputGroupBase {
|
||||
public void setNotify_message(MessagePayload notify_message) {
|
||||
this.notify_message = notify_message;
|
||||
}
|
||||
|
||||
public boolean isMeshMessage() {
|
||||
return isMeshMessage;
|
||||
}
|
||||
|
||||
public void setMeshMessage(boolean meshMessage) {
|
||||
isMeshMessage = meshMessage;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
public class InputHandleFriendRequest {
|
||||
private String userId;
|
||||
private String friendUid;
|
||||
private int status;
|
||||
private boolean force;
|
||||
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(String userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getFriendUid() {
|
||||
return friendUid;
|
||||
}
|
||||
|
||||
public void setFriendUid(String friendUid) {
|
||||
this.friendUid = friendUid;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public boolean isForce() {
|
||||
return force;
|
||||
}
|
||||
|
||||
public void setForce(boolean force) {
|
||||
this.force = force;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class InputIntValue {
|
||||
public int value;
|
||||
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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 InputOutputDomainInfo {
|
||||
public String domainId;
|
||||
public String name;
|
||||
public String desc;
|
||||
public String email;
|
||||
public String tel;
|
||||
public String address;
|
||||
public String extra;
|
||||
public long dt;
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getTel() {
|
||||
return tel;
|
||||
}
|
||||
|
||||
public void setTel(String tel) {
|
||||
this.tel = tel;
|
||||
}
|
||||
|
||||
public String getAddress() {
|
||||
return address;
|
||||
}
|
||||
|
||||
public void setAddress(String address) {
|
||||
this.address = address;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
}
|
||||
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public long getDt() {
|
||||
return dt;
|
||||
}
|
||||
|
||||
public void setDt(long dt) {
|
||||
this.dt = dt;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* 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 java.util.List;
|
||||
|
||||
public class InputOutputDomainInfoList {
|
||||
public List<InputOutputDomainInfo> infos;
|
||||
|
||||
public List<InputOutputDomainInfo> getInfos() {
|
||||
return infos;
|
||||
}
|
||||
|
||||
public void setInfos(List<InputOutputDomainInfo> infos) {
|
||||
this.infos = infos;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class InputStringValue {
|
||||
public String value;
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -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,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 OutputUserChatroom {
|
||||
public String userId;
|
||||
public String chatroomId;
|
||||
public String clientId;
|
||||
public int/*ProtoConstants.Platform*/ platform;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -14,6 +14,7 @@ public class PojoGroupInfo {
|
||||
String portrait;
|
||||
String owner;
|
||||
int type;
|
||||
int member_count;
|
||||
String extra;
|
||||
int mute;
|
||||
int join_type;
|
||||
@@ -22,6 +23,9 @@ public class PojoGroupInfo {
|
||||
int max_member_count;
|
||||
int history_message;
|
||||
boolean super_group;
|
||||
boolean deleted;
|
||||
long update_dt;
|
||||
long member_update_dt;
|
||||
|
||||
public String getTarget_id() {
|
||||
return target_id;
|
||||
@@ -126,4 +130,36 @@ 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;
|
||||
}
|
||||
|
||||
public long getUpdate_dt() {
|
||||
return update_dt;
|
||||
}
|
||||
|
||||
public void setUpdate_dt(long update_dt) {
|
||||
this.update_dt = update_dt;
|
||||
}
|
||||
|
||||
public int getMember_count() {
|
||||
return member_count;
|
||||
}
|
||||
|
||||
public void setMember_count(int member_count) {
|
||||
this.member_count = member_count;
|
||||
}
|
||||
|
||||
public long getMember_update_dt() {
|
||||
return member_update_dt;
|
||||
}
|
||||
|
||||
public void setMember_update_dt(long member_update_dt) {
|
||||
this.member_update_dt = member_update_dt;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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 java.util.List;
|
||||
|
||||
public class PojoGroupInfoList {
|
||||
public List<PojoGroupInfo> groupInfoList;
|
||||
|
||||
public List<PojoGroupInfo> getGroupInfoList() {
|
||||
return groupInfoList;
|
||||
}
|
||||
|
||||
public void setGroupInfoList(List<PojoGroupInfo> groupInfoList) {
|
||||
this.groupInfoList = groupInfoList;
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ public class PojoGroupMember {
|
||||
String alias;
|
||||
int type;
|
||||
String extra;
|
||||
long updateDt;
|
||||
long createDt;
|
||||
|
||||
public String getMember_id() {
|
||||
@@ -47,6 +48,14 @@ public class PojoGroupMember {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public long getUpdateDt() {
|
||||
return updateDt;
|
||||
}
|
||||
|
||||
public void setUpdateDt(long updateDt) {
|
||||
this.updateDt = updateDt;
|
||||
}
|
||||
|
||||
public long getCreateDt() {
|
||||
return createDt;
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import io.netty.util.internal.StringUtil;
|
||||
public class RecallMessageData {
|
||||
private String operator;
|
||||
private long messageUid;
|
||||
private boolean isUserRecall;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -30,4 +31,12 @@ public class RecallMessageData {
|
||||
public void setMessageUid(long messageUid) {
|
||||
this.messageUid = messageUid;
|
||||
}
|
||||
|
||||
public boolean isUserRecall() {
|
||||
return isUserRecall;
|
||||
}
|
||||
|
||||
public void setUserRecall(boolean userRecall) {
|
||||
isUserRecall = userRecall;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ public class SendMessageData {
|
||||
private Conversation conv;
|
||||
private MessagePayload payload;
|
||||
private List<String> toUsers;
|
||||
private boolean isMeshMessage;
|
||||
|
||||
public String getSender() {
|
||||
return sender;
|
||||
@@ -52,6 +53,14 @@ public class SendMessageData {
|
||||
this.toUsers = toUsers;
|
||||
}
|
||||
|
||||
public boolean isMeshMessage() {
|
||||
return isMeshMessage;
|
||||
}
|
||||
|
||||
public void setMeshMessage(boolean meshMessage) {
|
||||
isMeshMessage = meshMessage;
|
||||
}
|
||||
|
||||
public static boolean isValide(SendMessageData sendMessageData) {
|
||||
if(sendMessageData == null ||
|
||||
sendMessageData.getConv() == null ||
|
||||
|
||||
@@ -14,6 +14,7 @@ public class UpdateMessageContentData {
|
||||
private MessagePayload payload;
|
||||
private int distribute;
|
||||
private int updateTimestamp;
|
||||
private int meshLocal;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
@@ -54,4 +55,12 @@ public class UpdateMessageContentData {
|
||||
public void setUpdateTimestamp(int updateTimestamp) {
|
||||
this.updateTimestamp = updateTimestamp;
|
||||
}
|
||||
|
||||
public int getMeshLocal() {
|
||||
return meshLocal;
|
||||
}
|
||||
|
||||
public void setMeshLocal(int meshLocal) {
|
||||
this.meshLocal = meshLocal;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
|
||||
public class MeshRestResult<T> {
|
||||
private static Gson gson = new Gson();
|
||||
public enum MeshRestCode {
|
||||
SUCCESS(0, "success"),
|
||||
ERROR_INVALID_MOBILE(1, "无效的电话号码"),
|
||||
ERROR_SEND_SMS_OVER_FREQUENCY(3, "请求验证码太频繁"),
|
||||
ERROR_SERVER_ERROR(4, "服务器异常"),
|
||||
ERROR_CODE_EXPIRED(5, "验证码已过期"),
|
||||
ERROR_CODE_INCORRECT(6, "验证码或密码错误"),
|
||||
ERROR_SERVER_CONFIG_ERROR(7, "服务器配置错误"),
|
||||
ERROR_SESSION_EXPIRED(8, "会话不存在或已过期"),
|
||||
ERROR_SESSION_NOT_VERIFIED(9, "会话没有验证"),
|
||||
ERROR_SESSION_NOT_SCANED(10, "会话没有被扫码"),
|
||||
ERROR_SERVER_NOT_IMPLEMENT(11, "功能没有实现"),
|
||||
ERROR_GROUP_ANNOUNCEMENT_NOT_EXIST(12, "群公告不存在"),
|
||||
ERROR_NOT_LOGIN(13, "没有登录"),
|
||||
ERROR_NO_RIGHT(14, "没有权限"),
|
||||
ERROR_INVALID_PARAMETER(15, "无效参数"),
|
||||
ERROR_NOT_EXIST(16, "对象不存在"),
|
||||
ERROR_USER_NAME_ALREADY_EXIST(17, "用户名已经存在"),
|
||||
ERROR_SESSION_CANCELED(18, "会话已经取消"),
|
||||
ERROR_PASSWORD_INCORRECT(19, "密码错误"),
|
||||
ERROR_FAILURE_TOO_MUCH_TIMES(20, "密码错误次数太多,请等5分钟再试试"),
|
||||
ERROR_USER_FORBIDDEN(21, "用户被封禁");
|
||||
public int code;
|
||||
public String msg;
|
||||
|
||||
MeshRestCode(int code, String msg) {
|
||||
this.code = code;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
}
|
||||
private int remote_im_code;
|
||||
private int remote_mesh_code;
|
||||
private int local_mesh_code;
|
||||
private String error_message;
|
||||
private T result;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return gson.toJson(this);
|
||||
}
|
||||
|
||||
public static MeshRestResult ok() {
|
||||
return new MeshRestResult();
|
||||
}
|
||||
|
||||
public static MeshRestResult ok(Object object) {
|
||||
return new MeshRestResult(object);
|
||||
}
|
||||
|
||||
public static MeshRestResult remoteIMError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.remote_im_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public static MeshRestResult remoteMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.remote_mesh_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public MeshRestResult addRemoteMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
remote_mesh_code = code;
|
||||
error_message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public static MeshRestResult localMeshError(int code, String message) {
|
||||
MeshRestResult r = new MeshRestResult();
|
||||
r.local_mesh_code = code;
|
||||
r.error_message = message;
|
||||
return r;
|
||||
}
|
||||
|
||||
public MeshRestResult addLocalMeshError(int code, String message) {
|
||||
local_mesh_code = code;
|
||||
error_message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public MeshRestResult() {
|
||||
|
||||
}
|
||||
|
||||
public MeshRestResult(T object) {
|
||||
result = object;
|
||||
}
|
||||
|
||||
public T getResult() {
|
||||
return result;
|
||||
}
|
||||
|
||||
public void setResult(T result) {
|
||||
this.result = result;
|
||||
}
|
||||
|
||||
public int getRemote_im_code() {
|
||||
return remote_im_code;
|
||||
}
|
||||
|
||||
public void setRemote_im_code(int remote_im_code) {
|
||||
this.remote_im_code = remote_im_code;
|
||||
}
|
||||
|
||||
public int getRemote_mesh_code() {
|
||||
return remote_mesh_code;
|
||||
}
|
||||
|
||||
public void setRemote_mesh_code(int remote_mesh_code) {
|
||||
this.remote_mesh_code = remote_mesh_code;
|
||||
}
|
||||
|
||||
public int getLocal_mesh_code() {
|
||||
return local_mesh_code;
|
||||
}
|
||||
|
||||
public void setLocal_mesh_code(int local_mesh_code) {
|
||||
this.local_mesh_code = local_mesh_code;
|
||||
}
|
||||
|
||||
public String getError_message() {
|
||||
return error_message;
|
||||
}
|
||||
|
||||
public void setError_message(String error_message) {
|
||||
this.error_message = error_message;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoAddFriendReq {
|
||||
public String fromUserId;
|
||||
public String reason;
|
||||
public String targetUserId;
|
||||
public String domainId;
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoAddGroupMember {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public List<PojoGroupMember> members;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public List<PojoGroupMember> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<PojoGroupMember> members) {
|
||||
this.members = members;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoDeleteFriend {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String friendUid;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getFriendUid() {
|
||||
return friendUid;
|
||||
}
|
||||
|
||||
public void setFriendUid(String friendUid) {
|
||||
this.friendUid = friendUid;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoDismissGroup {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.PojoGroupInfo;
|
||||
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoGroupUpdated {
|
||||
public List<String> domainIds;
|
||||
public PojoGroupInfo groupInfo;
|
||||
public List<PojoGroupMember> members;
|
||||
|
||||
public List<String> getDomainIds() {
|
||||
return domainIds;
|
||||
}
|
||||
|
||||
public void setDomainIds(List<String> domainIds) {
|
||||
this.domainIds = domainIds;
|
||||
}
|
||||
|
||||
public PojoGroupInfo getGroupInfo() {
|
||||
return groupInfo;
|
||||
}
|
||||
|
||||
public void setGroupInfo(PojoGroupInfo groupInfo) {
|
||||
this.groupInfo = groupInfo;
|
||||
}
|
||||
|
||||
public List<PojoGroupMember> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<PojoGroupMember> members) {
|
||||
this.members = members;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoHandleFriendRequestReq {
|
||||
public String userId;
|
||||
public int status;
|
||||
public String targetUserId;
|
||||
public String domainId;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoKickoffGroupMember {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public List<String> members;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public List<String> getMembers() {
|
||||
return members;
|
||||
}
|
||||
|
||||
public void setMembers(List<String> members) {
|
||||
this.members = members;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoModifyGroupInfo {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
public int type;
|
||||
public String value;
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
import cn.wildfirechat.pojos.SendMessageData;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class PojoPublishMessageReq {
|
||||
public SendMessageData messageData;
|
||||
public List<String> receivers;
|
||||
public String domainId;
|
||||
public long messageId;
|
||||
public boolean republish;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoQuitGroup {
|
||||
public String domainId;
|
||||
public String operator;
|
||||
public String group_id;
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public String getDomainId() {
|
||||
return domainId;
|
||||
}
|
||||
|
||||
public void setDomainId(String domainId) {
|
||||
this.domainId = domainId;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
package cn.wildfirechat.pojos.mesh;
|
||||
|
||||
public class PojoRecallMessageReq {
|
||||
public String domainId;
|
||||
public long messageId;
|
||||
public String operator;
|
||||
public boolean isSenderRecall;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user