Compare commits

...
63 Commits
Author SHA1 Message Date
heavyrain2012 6b264f2c9d version to 0.59 2021-04-05 10:27:06 +08:00
heavyrain2012 705ac341e0 为user message表添加会话信息及索引 2021-04-04 21:17:39 +08:00
heavyrain2012 2c07036364 当群成员被删除后再次加入到群组中,createTime应该会最后一次加入群组的时间 2021-04-03 16:29:01 +08:00
heavyrain2012 1a460f1b29 检查参数的有效性 2021-04-03 14:33:35 +08:00
heavyrain2012 e10b78bb34 优化撤回超市错误提示 2021-04-03 14:29:37 +08:00
heavyrain2012 edd973904a server api修改用户name 2021-04-03 14:29:24 +08:00
heavyrain2012 8ed1ba2f3a Merge branch 'wildfirechat' of https://github.com/wildfirechat/server into wildfirechat 2021-04-03 14:27:20 +08:00
heavyrain2012 6f24579c8e update 2021-04-03 14:27:11 +08:00
imhao183 c7bb49b3f7 修改群组extra消息时,发送通知给客户端 2021-04-02 12:15:11 +08:00
imhao183 d4d467afe2 修正自定义群组无效的问题 2021-04-02 12:04:18 +08:00
imhao183 96f7baece4 内置存储上传文件上限改为200MB 2021-04-02 10:08:03 +08:00
imhao183 2421d02eb8 当server api没有认证信息时,返回没有sign的错误码 2021-03-24 15:13:57 +08:00
imhao183 f6e9af58d4 version to 0.58 2021-03-20 10:56:50 +08:00
heavyrain2012 1dbc5d490e 添加频道控制相关接口 2021-03-20 09:57:38 +08:00
imhao183 f04f4fb087 添加禁言时例外消息类型 2021-03-19 14:33:17 +08:00
imhao183 1c9c77c06b 多人音视频添加成员时推送消息 2021-03-18 18:27:37 +08:00
imhao183 21f766880d update version to 0.57 2021-03-17 09:56:09 +08:00
imhao183 fa7f76ffef 修正群组成员变更时无法同步到客户端的问题 2021-03-17 09:55:08 +08:00
imhao183 d6d3eba8e6 修正拼写错误 2021-03-15 12:22:09 +08:00
imhao183 19bd5e83e5 处理同一个设备多个用户登录的情况 2021-03-11 11:11:19 +08:00
imhao183 2cbbf0a516 优化启动脚本 2021-03-03 18:24:28 +08:00
heavyrain2012 f6e8cd4ca8 update version to 0.55 2021-03-01 18:51:57 +08:00
heavyrain2012 da74b9fa94 添加更新接口 2021-02-24 15:46:46 +08:00
imhao183 281fe4c955 update version 2021-02-23 18:06:50 +08:00
imhao183 adfa3d3031 添加flyway修复说明 2021-02-23 18:05:31 +08:00
imhao183 6c34a9e512 remove default sensitive word 2021-02-23 18:01:28 +08:00
heavyrain.lee 0fd56ba61d Update README.md 2021-02-18 17:06:12 +08:00
imhao183 01342174af 去掉对客户端版本的限制,以便支持更新版本的客户端sdk 2021-02-16 11:27:49 +08:00
heavyrain2012 4742b135a5 添加消息转发类型过滤参数 2021-02-14 15:00:50 +08:00
heavyrain2012 6466218836 添加对接第三方敏感词处理方法 2021-02-14 12:30:40 +08:00
imhao183 a973a731e4 update version to 0.53 2021-02-13 20:54:33 +08:00
heavyrain2012 90449e08c6 解决某些特殊情况下,群组成员个数错误问题 2021-02-12 21:20:44 +08:00
heavyrain2012 5857a3fbd1 Revert "同步群成员状态,当群成员不存在时,返回删除状态"
This reverts commit ae4d8a95ba.
2021-02-12 18:01:55 +08:00
heavyrain2012 ae4d8a95ba 同步群成员状态,当群成员不存在时,返回删除状态 2021-02-12 17:58:27 +08:00
imhao183 9fa1370219 添加获取两个用户好友关系的接口 2021-02-09 14:58:07 +08:00
imhao183 dd4cdb4bc4 修正问题:创建群组时,如果没有把owner加入到群成员列表中,服务器自动加入群成员列表,但count计数时没有加入。 2021-02-01 16:02:43 +08:00
imhao183 e07b839671 修改允许客户端自定义群通知配置默认值为true 2021-01-30 21:45:45 +08:00
imhao183 3a0653b8ed 添加端口被占用时的提示说明 2021-01-30 09:17:57 +08:00
imhao183 b4979e5408 修正当敏感词策略为忽略时敏感词消息会从历史消息功能中拉取的问题 2021-01-30 09:09:25 +08:00
imhao183 59cb884772 update version to 0.52 2021-01-25 14:46:31 +08:00
imhao183 3d0a36b4f3 优化自动清理历史消息逻辑 2021-01-24 20:27:22 +08:00
heavyrain2012 7923a3e0c4 db 自动清除过期历史消息数据 2021-01-23 18:01:28 +08:00
imhao183 e5a4aa4741 内置存储下载带上contenttype 2021-01-23 17:01:12 +08:00
imhao183 e76e8b38df 解决特殊文件下报异常的问题 2021-01-23 15:58:53 +08:00
imhao183 5f7df37664 添加踢用户下线api接口 2021-01-22 10:23:33 +08:00
imhao183 2c9e8d66e8 优化踢客户端下线逻辑 2021-01-22 09:34:03 +08:00
imhao183 d7eddbf7b4 请求数据非法时给出错误响应码 2021-01-22 09:32:55 +08:00
imhao183 3b783fb72e push void answer 2021-01-21 20:51:08 +08:00
imhao183 4e9e87f113 docker file 2021-01-19 15:32:37 +08:00
imhao183 0f0b3398d7 禁止客户端直接修改电话号码,电话号码只能通过server api来修改 2021-01-16 10:30:41 +08:00
imhao183 a725b507c7 机器人api 2021-01-16 10:29:03 +08:00
imhao183 46423a341d 创建群组时,当owner没有加入到群成员列表中时,自动加入到群成员列表 2021-01-16 10:28:44 +08:00
heavyrain2012 f70ae457af add robot callback api 2021-01-16 09:13:53 +08:00
imhao183 29b30cec28 fix build error 2021-01-15 22:27:17 +08:00
imhao183 fc05973b5d 创建群组时使用类型2 2021-01-15 22:23:00 +08:00
imhao183 97a21ff201 添加机器人群组操作 2021-01-15 22:22:42 +08:00
imhao183 0b90f0c56c update sql script alter change status column 2021-01-15 22:21:24 +08:00
imhao183 07454aedce add robot create group function 2021-01-15 22:21:08 +08:00
imhao183 ee26284d39 update 2021-01-14 10:39:08 +08:00
imhao183 99e24dca1c 截取推送信息日志长度,防止消息内容打印到日志中去 2021-01-14 10:37:23 +08:00
imhao183 5dbfeaabf9 sdk添加对设置会话置顶的功能 2021-01-14 10:28:17 +08:00
imhao183 38595c06d8 添加注释 2021-01-13 20:16:27 +08:00
imhao183 e65e313ef3 添加配置,是否不同步指定用户信息到客户端 2021-01-11 12:40:39 +08:00
91 changed files with 4244 additions and 4496 deletions
+4 -2
View File
@@ -7,7 +7,7 @@
| [android-chat](https://github.com/wildfirechat/android-chat) | 野火IM Android SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
| [ios-chat](https://github.com/wildfirechat/ios-chat) | 野火IM iOS SDK源码和App源码 |可以很方便地进行二次开发,或集成到现有应用当中 |
| [pc-chat](https://github.com/wildfirechat/pc-chat) | 基于[Electron](https://electronjs.org/)开发的PC平台应用 | |
| [web-chat](https://github.com/wildfirechat/web-chat) | Web平台的Demo, [体验地址](http://web.wildfirechat.cn) | |
| [web-chat](https://github.com/wildfirechat/web-chat) | Web平台的Demo, [体验地址](http://web.wildfirechat.net) | |
| [wx-chat](https://github.com/wildfirechat/wx-chat) | 微信小程序平台的Demo | |
| [server](https://github.com/wildfirechat/server) | IM server | |
| [app server](https://github.com/wildfirechat/app_server) | 应用服务端 | |
@@ -16,7 +16,7 @@
| [docs](https://github.com/wildfirechat/docs) | 野火IM相关文档,包含设计、概念、开发、使用说明 | | | |
# server
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯解决方案,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.cn)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
本工程为野火IM 社区版IM服务软件。野火IM作为一个通用的即时通讯解决方案,可以集成到各种应用中。请阅读[docs](http://docs.wildfirechat.net)或下载服务器[发布版本](https://github.com/wildfirechat/server/releases)
开发一套IM系统真的很艰辛,请路过的朋友们给点个star,支持我们坚持下去🙏🙏🙏🙏🙏
@@ -73,6 +73,8 @@
## 升级说明
1. 从0.42 版本增加了群成员数限制,默认为2000。如果您从之前的版本升级到这个版本或以后,需要注意到群成员数的限制。升级之后超出限制的群不受影响,但不能继续加人,如果您想修改默认值,可以在升级版本之后,修改t_setting表,把默认的大小改为您期望的人数。另外修改t_group表,把已经存在的群组max_member_count改成您期望的,然后重启。
2. 0.46和0.47版本升级到0.48及以后版本时,可能会提示flyway migrate 38错误,请执行 [修复脚本](https://github.com/wildfirechat/server/blob/wildfirechat/flyway_repaire_migrate_38.sql) 进行修复。0.46和0.47版本之外的版本不会出现此问题。
3. 从0.54之前版本升级到0.54及以后版本时,会提示flyway migrate错误。因为0.54版本删除了sql脚本中默认敏感词的内容,flyway checksum失败。请执行```update flyway_schema_history set checksum = 0 where script = 'V17__add_default_sensitive_word.sql';```来修复。
4. 从0.59之前的版本升级到之后的版本执行数据库升级时间比较长,请耐心等待提示运行成功,避免中途终端。
## 特别感谢
1. [moquette](https://github.com/moquette-io/moquette) 本项目是基于此项目二次开发而来,处理MQTT相关业务。
+34 -2
View File
@@ -35,6 +35,11 @@ local_port 80
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
embed.db 1
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
db.auto_clean_history_messages true
##服务器管理接口密钥
http.admin.secret_key 123456
@@ -76,6 +81,15 @@ message.recall_time_limit 120
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
message.forbidden_client_send_types 3999,4000,4001
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
## 因为音视频使用了消息作为信令,所以就需要允许发送音视频信令。如果开发了其它场景也需要被动回应消息,可以加在这里。
## 黑名单时允许发送的消息类型
message.blacklist_exception_types 401,402,403,404,405,407,408,410,411
## 群禁言或者聊天室或者频道禁言时允许发送的消息类型
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
##禁止搜索用户
friend.disable_search false
@@ -107,12 +121,17 @@ chatroom.participant_idle_time 900000
chatroom.rejoin_when_active true
## 是否允许客户端发送操作群的自定义群通知消息
group.allow_client_custom_operation_notification false
group.allow_client_custom_operation_notification true
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
group.visible_quit_or_kickoff_notification 0
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
## 注意,修改本配置不会对已经同步的信息产生影响。
#user.hide_properties 3,4,5
#*********************************************************************
# hazelcase configuration
#*********************************************************************
@@ -203,6 +222,8 @@ push.ios.server.address http://localhost:8085/ios/push
##消息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.forward.url http://localhost:8888/im_event/message
##需要转发的消息类型,当有多个时以英文逗号分割。如果转发所有消息,请注释掉配置或者设置为空
#message.forward.types 1,2,3
##设备信息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
@@ -231,5 +252,16 @@ push.ios.server.address http://localhost:8085/ios/push
#*********************************************************************
# Sensitive configuration
#*********************************************************************
##文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
sensitive.filter.type 0
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
#sensitive.remote_sensitive_message_type 1,2,3
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
#sensitive.remote_fail_when_matched false
+1
View File
@@ -0,0 +1 @@
alter table `t_channel` modify column `_status` int(11) NOT NULL DEFAULT 0;
+1
View File
@@ -0,0 +1 @@
alter table `t_user_messages` ADD INDEX `user_messages_mid_index` ( `_mid`);
+4
View File
@@ -0,0 +1,4 @@
alter table `t_user_messages` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages` add column `_target` varchar(129) NOT NULL DEFAULT '';
alter table `t_user_messages` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
alter table `t_channel` modify column `_status` int(11) NOT NULL DEFAULT 0;
+129
View File
@@ -0,0 +1,129 @@
alter table `t_user_messages` add INDEX `user_messages_mid_index` ( `_mid` );
alter table `t_user_messages_0` add INDEX `user_messages0_mid_index` ( `_mid` );
alter table `t_user_messages_1` add INDEX `user_messages1_mid_index` ( `_mid` );
alter table `t_user_messages_2` add INDEX `user_messages2_mid_index` ( `_mid` );
alter table `t_user_messages_3` add INDEX `user_messages3_mid_index` ( `_mid` );
alter table `t_user_messages_4` add INDEX `user_messages4_mid_index` ( `_mid` );
alter table `t_user_messages_5` add INDEX `user_messages5_mid_index` ( `_mid` );
alter table `t_user_messages_6` add INDEX `user_messages6_mid_index` ( `_mid` );
alter table `t_user_messages_7` add INDEX `user_messages7_mid_index` ( `_mid` );
alter table `t_user_messages_8` add INDEX `user_messages8_mid_index` ( `_mid` );
alter table `t_user_messages_9` add INDEX `user_messages9_mid_index` ( `_mid` );
alter table `t_user_messages_10` add INDEX `user_messages10_mid_index` ( `_mid` );
alter table `t_user_messages_11` add INDEX `user_messages11_mid_index` ( `_mid` );
alter table `t_user_messages_12` add INDEX `user_messages12_mid_index` ( `_mid` );
alter table `t_user_messages_13` add INDEX `user_messages13_mid_index` ( `_mid` );
alter table `t_user_messages_14` add INDEX `user_messages14_mid_index` ( `_mid` );
alter table `t_user_messages_15` add INDEX `user_messages15_mid_index` ( `_mid` );
alter table `t_user_messages_16` add INDEX `user_messages16_mid_index` ( `_mid` );
alter table `t_user_messages_17` add INDEX `user_messages17_mid_index` ( `_mid` );
alter table `t_user_messages_18` add INDEX `user_messages18_mid_index` ( `_mid` );
alter table `t_user_messages_19` add INDEX `user_messages19_mid_index` ( `_mid` );
alter table `t_user_messages_20` add INDEX `user_messages20_mid_index` ( `_mid` );
alter table `t_user_messages_21` add INDEX `user_messages21_mid_index` ( `_mid` );
alter table `t_user_messages_22` add INDEX `user_messages22_mid_index` ( `_mid` );
alter table `t_user_messages_23` add INDEX `user_messages23_mid_index` ( `_mid` );
alter table `t_user_messages_24` add INDEX `user_messages24_mid_index` ( `_mid` );
alter table `t_user_messages_25` add INDEX `user_messages25_mid_index` ( `_mid` );
alter table `t_user_messages_26` add INDEX `user_messages26_mid_index` ( `_mid` );
alter table `t_user_messages_27` add INDEX `user_messages27_mid_index` ( `_mid` );
alter table `t_user_messages_28` add INDEX `user_messages28_mid_index` ( `_mid` );
alter table `t_user_messages_29` add INDEX `user_messages29_mid_index` ( `_mid` );
alter table `t_user_messages_30` add INDEX `user_messages30_mid_index` ( `_mid` );
alter table `t_user_messages_31` add INDEX `user_messages31_mid_index` ( `_mid` );
alter table `t_user_messages_32` add INDEX `user_messages32_mid_index` ( `_mid` );
alter table `t_user_messages_33` add INDEX `user_messages33_mid_index` ( `_mid` );
alter table `t_user_messages_34` add INDEX `user_messages34_mid_index` ( `_mid` );
alter table `t_user_messages_35` add INDEX `user_messages35_mid_index` ( `_mid` );
alter table `t_user_messages_36` add INDEX `user_messages36_mid_index` ( `_mid` );
alter table `t_user_messages_37` add INDEX `user_messages37_mid_index` ( `_mid` );
alter table `t_user_messages_38` add INDEX `user_messages38_mid_index` ( `_mid` );
alter table `t_user_messages_39` add INDEX `user_messages39_mid_index` ( `_mid` );
alter table `t_user_messages_40` add INDEX `user_messages40_mid_index` ( `_mid` );
alter table `t_user_messages_41` add INDEX `user_messages41_mid_index` ( `_mid` );
alter table `t_user_messages_42` add INDEX `user_messages42_mid_index` ( `_mid` );
alter table `t_user_messages_43` add INDEX `user_messages43_mid_index` ( `_mid` );
alter table `t_user_messages_44` add INDEX `user_messages44_mid_index` ( `_mid` );
alter table `t_user_messages_45` add INDEX `user_messages45_mid_index` ( `_mid` );
alter table `t_user_messages_46` add INDEX `user_messages46_mid_index` ( `_mid` );
alter table `t_user_messages_47` add INDEX `user_messages47_mid_index` ( `_mid` );
alter table `t_user_messages_48` add INDEX `user_messages48_mid_index` ( `_mid` );
alter table `t_user_messages_49` add INDEX `user_messages49_mid_index` ( `_mid` );
alter table `t_user_messages_50` add INDEX `user_messages50_mid_index` ( `_mid` );
alter table `t_user_messages_51` add INDEX `user_messages51_mid_index` ( `_mid` );
alter table `t_user_messages_52` add INDEX `user_messages52_mid_index` ( `_mid` );
alter table `t_user_messages_53` add INDEX `user_messages53_mid_index` ( `_mid` );
alter table `t_user_messages_54` add INDEX `user_messages54_mid_index` ( `_mid` );
alter table `t_user_messages_55` add INDEX `user_messages55_mid_index` ( `_mid` );
alter table `t_user_messages_56` add INDEX `user_messages56_mid_index` ( `_mid` );
alter table `t_user_messages_57` add INDEX `user_messages57_mid_index` ( `_mid` );
alter table `t_user_messages_58` add INDEX `user_messages58_mid_index` ( `_mid` );
alter table `t_user_messages_59` add INDEX `user_messages59_mid_index` ( `_mid` );
alter table `t_user_messages_60` add INDEX `user_messages60_mid_index` ( `_mid` );
alter table `t_user_messages_61` add INDEX `user_messages61_mid_index` ( `_mid` );
alter table `t_user_messages_62` add INDEX `user_messages62_mid_index` ( `_mid` );
alter table `t_user_messages_63` add INDEX `user_messages63_mid_index` ( `_mid` );
alter table `t_user_messages_64` add INDEX `user_messages64_mid_index` ( `_mid` );
alter table `t_user_messages_65` add INDEX `user_messages65_mid_index` ( `_mid` );
alter table `t_user_messages_66` add INDEX `user_messages66_mid_index` ( `_mid` );
alter table `t_user_messages_67` add INDEX `user_messages67_mid_index` ( `_mid` );
alter table `t_user_messages_68` add INDEX `user_messages68_mid_index` ( `_mid` );
alter table `t_user_messages_69` add INDEX `user_messages69_mid_index` ( `_mid` );
alter table `t_user_messages_70` add INDEX `user_messages70_mid_index` ( `_mid` );
alter table `t_user_messages_71` add INDEX `user_messages71_mid_index` ( `_mid` );
alter table `t_user_messages_72` add INDEX `user_messages72_mid_index` ( `_mid` );
alter table `t_user_messages_73` add INDEX `user_messages73_mid_index` ( `_mid` );
alter table `t_user_messages_74` add INDEX `user_messages74_mid_index` ( `_mid` );
alter table `t_user_messages_75` add INDEX `user_messages75_mid_index` ( `_mid` );
alter table `t_user_messages_76` add INDEX `user_messages76_mid_index` ( `_mid` );
alter table `t_user_messages_77` add INDEX `user_messages77_mid_index` ( `_mid` );
alter table `t_user_messages_78` add INDEX `user_messages78_mid_index` ( `_mid` );
alter table `t_user_messages_79` add INDEX `user_messages79_mid_index` ( `_mid` );
alter table `t_user_messages_80` add INDEX `user_messages80_mid_index` ( `_mid` );
alter table `t_user_messages_81` add INDEX `user_messages81_mid_index` ( `_mid` );
alter table `t_user_messages_82` add INDEX `user_messages82_mid_index` ( `_mid` );
alter table `t_user_messages_83` add INDEX `user_messages83_mid_index` ( `_mid` );
alter table `t_user_messages_84` add INDEX `user_messages84_mid_index` ( `_mid` );
alter table `t_user_messages_85` add INDEX `user_messages85_mid_index` ( `_mid` );
alter table `t_user_messages_86` add INDEX `user_messages86_mid_index` ( `_mid` );
alter table `t_user_messages_87` add INDEX `user_messages87_mid_index` ( `_mid` );
alter table `t_user_messages_88` add INDEX `user_messages88_mid_index` ( `_mid` );
alter table `t_user_messages_89` add INDEX `user_messages89_mid_index` ( `_mid` );
alter table `t_user_messages_90` add INDEX `user_messages90_mid_index` ( `_mid` );
alter table `t_user_messages_91` add INDEX `user_messages91_mid_index` ( `_mid` );
alter table `t_user_messages_92` add INDEX `user_messages92_mid_index` ( `_mid` );
alter table `t_user_messages_93` add INDEX `user_messages93_mid_index` ( `_mid` );
alter table `t_user_messages_94` add INDEX `user_messages94_mid_index` ( `_mid` );
alter table `t_user_messages_95` add INDEX `user_messages95_mid_index` ( `_mid` );
alter table `t_user_messages_96` add INDEX `user_messages96_mid_index` ( `_mid` );
alter table `t_user_messages_97` add INDEX `user_messages97_mid_index` ( `_mid` );
alter table `t_user_messages_98` add INDEX `user_messages98_mid_index` ( `_mid` );
alter table `t_user_messages_99` add INDEX `user_messages99_mid_index` ( `_mid` );
alter table `t_user_messages_100` add INDEX `user_messages100_mid_index` ( `_mid` );
alter table `t_user_messages_101` add INDEX `user_messages101_mid_index` ( `_mid` );
alter table `t_user_messages_102` add INDEX `user_messages102_mid_index` ( `_mid` );
alter table `t_user_messages_103` add INDEX `user_messages103_mid_index` ( `_mid` );
alter table `t_user_messages_104` add INDEX `user_messages104_mid_index` ( `_mid` );
alter table `t_user_messages_105` add INDEX `user_messages105_mid_index` ( `_mid` );
alter table `t_user_messages_106` add INDEX `user_messages106_mid_index` ( `_mid` );
alter table `t_user_messages_107` add INDEX `user_messages107_mid_index` ( `_mid` );
alter table `t_user_messages_108` add INDEX `user_messages108_mid_index` ( `_mid` );
alter table `t_user_messages_109` add INDEX `user_messages109_mid_index` ( `_mid` );
alter table `t_user_messages_110` add INDEX `user_messages110_mid_index` ( `_mid` );
alter table `t_user_messages_111` add INDEX `user_messages111_mid_index` ( `_mid` );
alter table `t_user_messages_112` add INDEX `user_messages112_mid_index` ( `_mid` );
alter table `t_user_messages_113` add INDEX `user_messages113_mid_index` ( `_mid` );
alter table `t_user_messages_114` add INDEX `user_messages114_mid_index` ( `_mid` );
alter table `t_user_messages_115` add INDEX `user_messages115_mid_index` ( `_mid` );
alter table `t_user_messages_116` add INDEX `user_messages116_mid_index` ( `_mid` );
alter table `t_user_messages_117` add INDEX `user_messages117_mid_index` ( `_mid` );
alter table `t_user_messages_118` add INDEX `user_messages118_mid_index` ( `_mid` );
alter table `t_user_messages_119` add INDEX `user_messages119_mid_index` ( `_mid` );
alter table `t_user_messages_120` add INDEX `user_messages120_mid_index` ( `_mid` );
alter table `t_user_messages_121` add INDEX `user_messages121_mid_index` ( `_mid` );
alter table `t_user_messages_122` add INDEX `user_messages122_mid_index` ( `_mid` );
alter table `t_user_messages_123` add INDEX `user_messages123_mid_index` ( `_mid` );
alter table `t_user_messages_124` add INDEX `user_messages124_mid_index` ( `_mid` );
alter table `t_user_messages_125` add INDEX `user_messages125_mid_index` ( `_mid` );
alter table `t_user_messages_126` add INDEX `user_messages126_mid_index` ( `_mid` );
alter table `t_user_messages_127` add INDEX `user_messages127_mid_index` ( `_mid` );
+644
View File
@@ -0,0 +1,644 @@
alter table `t_user_messages` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_0` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_0` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_0` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_0` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_1` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_1` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_1` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_1` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_2` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_2` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_2` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_2` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_3` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_3` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_3` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_3` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_4` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_4` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_4` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_4` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_5` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_5` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_5` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_5` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_6` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_6` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_6` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_6` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_7` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_7` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_7` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_7` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_8` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_8` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_8` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_8` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_9` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_9` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_9` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_9` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_10` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_10` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_10` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_10` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_11` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_11` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_11` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_11` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_12` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_12` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_12` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_12` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_13` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_13` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_13` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_13` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_14` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_14` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_14` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_14` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_15` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_15` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_15` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_15` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_16` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_16` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_16` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_16` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_17` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_17` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_17` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_17` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_18` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_18` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_18` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_18` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_19` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_19` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_19` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_19` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_20` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_20` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_20` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_20` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_21` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_21` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_21` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_21` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_22` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_22` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_22` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_22` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_23` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_23` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_23` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_23` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_24` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_24` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_24` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_24` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_25` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_25` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_25` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_25` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_26` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_26` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_26` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_26` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_27` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_27` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_27` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_27` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_28` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_28` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_28` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_28` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_29` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_29` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_29` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_29` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_30` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_30` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_30` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_30` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_31` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_31` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_31` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_31` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_32` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_32` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_32` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_32` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_33` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_33` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_33` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_33` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_34` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_34` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_34` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_34` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_35` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_35` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_35` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_35` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_36` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_36` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_36` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_36` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_37` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_37` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_37` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_37` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_38` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_38` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_38` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_38` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_39` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_39` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_39` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_39` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_40` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_40` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_40` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_40` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_41` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_41` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_41` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_41` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_42` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_42` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_42` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_42` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_43` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_43` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_43` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_43` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_44` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_44` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_44` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_44` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_45` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_45` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_45` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_45` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_46` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_46` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_46` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_46` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_47` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_47` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_47` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_47` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_48` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_48` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_48` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_48` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_49` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_49` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_49` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_49` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_50` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_50` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_50` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_50` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_51` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_51` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_51` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_51` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_52` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_52` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_52` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_52` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_53` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_53` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_53` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_53` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_54` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_54` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_54` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_54` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_55` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_55` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_55` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_55` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_56` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_56` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_56` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_56` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_57` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_57` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_57` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_57` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_58` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_58` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_58` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_58` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_59` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_59` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_59` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_59` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_60` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_60` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_60` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_60` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_61` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_61` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_61` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_61` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_62` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_62` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_62` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_62` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_63` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_63` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_63` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_63` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_64` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_64` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_64` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_64` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_65` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_65` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_65` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_65` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_66` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_66` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_66` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_66` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_67` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_67` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_67` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_67` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_68` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_68` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_68` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_68` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_69` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_69` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_69` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_69` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_70` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_70` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_70` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_70` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_71` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_71` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_71` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_71` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_72` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_72` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_72` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_72` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_73` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_73` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_73` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_73` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_74` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_74` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_74` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_74` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_75` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_75` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_75` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_75` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_76` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_76` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_76` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_76` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_77` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_77` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_77` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_77` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_78` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_78` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_78` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_78` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_79` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_79` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_79` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_79` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_80` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_80` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_80` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_80` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_81` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_81` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_81` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_81` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_82` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_82` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_82` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_82` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_83` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_83` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_83` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_83` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_84` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_84` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_84` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_84` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_85` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_85` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_85` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_85` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_86` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_86` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_86` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_86` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_87` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_87` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_87` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_87` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_88` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_88` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_88` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_88` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_89` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_89` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_89` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_89` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_90` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_90` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_90` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_90` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_91` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_91` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_91` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_91` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_92` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_92` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_92` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_92` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_93` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_93` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_93` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_93` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_94` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_94` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_94` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_94` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_95` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_95` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_95` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_95` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_96` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_96` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_96` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_96` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_97` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_97` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_97` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_97` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_98` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_98` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_98` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_98` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_99` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_99` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_99` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_99` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_100` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_100` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_100` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_100` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_101` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_101` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_101` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_101` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_102` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_102` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_102` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_102` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_103` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_103` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_103` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_103` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_104` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_104` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_104` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_104` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_105` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_105` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_105` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_105` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_106` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_106` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_106` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_106` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_107` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_107` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_107` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_107` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_108` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_108` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_108` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_108` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_109` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_109` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_109` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_109` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_110` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_110` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_110` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_110` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_111` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_111` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_111` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_111` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_112` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_112` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_112` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_112` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_113` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_113` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_113` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_113` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_114` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_114` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_114` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_114` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_115` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_115` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_115` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_115` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_116` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_116` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_116` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_116` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_117` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_117` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_117` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_117` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_118` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_118` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_118` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_118` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_119` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_119` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_119` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_119` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_120` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_120` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_120` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_120` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_121` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_121` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_121` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_121` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_122` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_122` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_122` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_122` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_123` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_123` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_123` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_123` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_124` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_124` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_124` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_124` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_125` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_125` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_125` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_125` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_126` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_126` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_126` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_126` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
alter table `t_user_messages_127` add column `_type` tinyint(4) NOT NULL DEFAULT '0';
alter table `t_user_messages_127` add column `_target` varchar(129) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';
alter table `t_user_messages_127` add column `_directing` tinyint(1) NOT NULL DEFAULT '0';
alter table `t_user_messages_127` add INDEX `user_messages_conv_index` ( `_uid`, `_type`, `_target`, `_line`, `_mid` desc);
+1 -1
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.51</version>
<version>0.59</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -43,7 +43,16 @@ public class PushMessage {
this.cntType = messageContentType;
this.serverTime = serverTime;
this.unReceivedMsg = unReceivedMsg;
this.pushMessageType = (cntType == 400 ? PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE : (cntType == 402 ? PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE : PushServer.PushMessageType.PUSH_MESSAGE_TYPE_NORMAL));
if (cntType == 400 || cntType == 406) {
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE;
} else if(cntType == 402) {
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE;
} else if(cntType == 401) {
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_ANSWER;
} else {
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_NORMAL;
}
this.mentionedType = mentionedType;
this.isHiddenDetail = isHiddenDetail;
this.language = language;
@@ -34,6 +34,7 @@ public class PushServer {
int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1;
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3;
int PUSH_MESSAGE_TYPE_VOIP_ANSWER = 4;
}
private static PushServer INSTANCE = new PushServer();
@@ -80,9 +80,12 @@ public class LoFileServer {
channel = b.bind(port).sync().channel();
Logger.info("***** Welcome To LoServer on port [{}], startting spend {}ms *****", port, DateUtil.spendMs(start));
} finally {
}
} catch (Exception e) {
e.printStackTrace();
Logger.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
System.exit(-1);
}
}
public void shutdown() {
if (this.channel != null) {
@@ -62,6 +62,7 @@ public class LoServer {
registerAllAction();
int bindingPort = port;
try {
final ServerBootstrap b = new ServerBootstrap();
final ServerBootstrap adminB = new ServerBootstrap();
@@ -87,6 +88,7 @@ public class LoServer {
channel = b.bind(port).sync().channel();
bindingPort = adminPort;
adminB.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 10240) // 服务端可连接队列大小
@@ -108,10 +110,14 @@ public class LoServer {
adminChannel = adminB.bind(adminPort).sync().channel();
Logger.info("***** Welcome To LoServer on port [{},{}], startting spend {}ms *****", port, adminPort, DateUtil.spendMs(start));
} finally {
}
} catch (Exception e) {
e.printStackTrace();
Logger.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", bindingPort, bindingPort);
System.out.println("端口 " + bindingPort + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + bindingPort);
System.exit(-1);
}
}
public void shutdown() {
if (this.channel!= null) {
this.channel.close();
@@ -110,7 +110,7 @@ public class FileAction extends Action {
// 路径安全检查
String path = httpPath.substring(0, httpPath.lastIndexOf("/"));
if (path.contains("/.") || path.contains("./") || path.charAt(0) == '.' || path.charAt(path.length() - 1) == '.' || ReUtil.isMatch(INSECURE_URI, path)) {
if (path.contains("/.") || path.contains("./") || ReUtil.isMatch(INSECURE_URI, path)) {
return null;
}
@@ -201,7 +201,7 @@ public class UploadFileAction extends Action {
return false;
}
if (remoteFileSize > 50 * 1024 * 1024) {
if (remoteFileSize > 200 * 1024 * 1024) {
logger.warn("file over limite!(" + remoteFileSize + ")");
response.setStatus(HttpResponseStatus.BAD_REQUEST);
response.setContent("file over limite!");
@@ -59,7 +59,7 @@ abstract public class AdminAction extends Action {
}
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign)) {
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
Long ts;
@@ -68,7 +68,7 @@ abstract public class AdminAction extends Action {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
if (!NO_CHECK_TIME && System.currentTimeMillis() - ts > 2 * 60 * 60 * 1000) {
@@ -0,0 +1,52 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* 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.InputOutputUserBlockStatus;
import cn.wildfirechat.pojos.StringPairPojo;
import com.google.gson.Gson;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.User_Kickoff_Client)
@HttpMethod("POST")
public class KickoffUserClientAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
StringPairPojo pojo = getRequestBody(request.getNettyRequest(), StringPairPojo.class);
if (pojo != null && !StringUtil.isNullOrEmpty(pojo.getFirst())) {
sessionsStore.kickoffUserClient(pojo.getFirst(), pojo.getSecond());
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null);
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,61 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* 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.pojos.InputUserId;
import cn.wildfirechat.pojos.OutputStringList;
import cn.wildfirechat.pojos.RelationPojo;
import cn.wildfirechat.pojos.StringPairPojo;
import com.google.gson.Gson;
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 com.xiaoleilu.loServer.model.FriendData;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@Route(APIPath.Relation_Get)
@HttpMethod("POST")
public class RelationGetAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
StringPairPojo input = getRequestBody(request.getNettyRequest(), StringPairPojo.class);
FriendData data = messagesStore.getFriendData(input.getFirst(), input.getSecond());
RelationPojo out = new RelationPojo();
out.userId = input.getFirst();
out.targetId = input.getSecond();
if(data != null ) {
out.isFriend = data.getState() == 0;
out.isBlacked = data.getBlacked() == 1;
out.alias = data.getAlias();
out.extra = data.getExtra();
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(out);
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -0,0 +1,65 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* 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.common.IMExceptionEvent;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.InputUpdateUserInfo;
import cn.wildfirechat.pojos.OutputCreateUser;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import win.liyufan.im.UUIDGenerator;
import win.liyufan.im.Utility;
@Route(APIPath.Update_User)
@HttpMethod("POST")
public class UpdateUserAction extends AdminAction {
private static final Logger LOG = LoggerFactory.getLogger(UpdateUserAction.class);
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputUpdateUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputUpdateUserInfo.class);
if (inputCreateUser != null
&& inputCreateUser.userInfo != null
&& !StringUtil.isNullOrEmpty(inputCreateUser.userInfo.getUserId())
&& inputCreateUser.flag > 0) {
ErrorCode errorCode = messagesStore.updateUserInfo(inputCreateUser.userInfo, inputCreateUser.flag);
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(errorCode);
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -51,7 +51,7 @@ abstract public class ChannelAction extends Action {
}
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign) || StringUtil.isNullOrEmpty(cid)) {
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
if (!mLimitCounter.isGranted(cid)) {
@@ -64,7 +64,7 @@ abstract public class ChannelAction extends Action {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.CHANNEL_API_Exception);
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
if (System.currentTimeMillis() - ts > 2 * 60 * 60 * 1000) {
@@ -0,0 +1,41 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputGetChannelInfo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Channel_Get_Profile)
@HttpMethod("POST")
public class GetChannelAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(OutputGetChannelInfo.fromPbInfo(channelInfo));
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -0,0 +1,46 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.OutputStringList;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
@Route(APIPath.Channel_Subscriber_List)
@HttpMethod("POST")
public class GetChannelSubscribersAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
OutputStringList outputStringList = new OutputStringList();
outputStringList.setList(new ArrayList<>());
outputStringList.getList().addAll(messagesStore.getChannelSubscriber(channelInfo.getTargetId()));
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(outputStringList);
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -0,0 +1,83 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
import com.xiaoleilu.loServer.action.robot.RobotAction;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Channel_User_Info)
@HttpMethod("POST")
public class GetUserAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
if (inputUserId != null
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()) || !StringUtil.isNullOrEmpty(inputUserId.getMobile()))) {
WFCMessage.User user = null;
if(!StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
user = messagesStore.getUserInfo(inputUserId.getUserId());
} else if(!StringUtil.isNullOrEmpty(inputUserId.getName())) {
user = messagesStore.getUserInfoByName(inputUserId.getName());
} else if(!StringUtil.isNullOrEmpty(inputUserId.getMobile())) {
user = messagesStore.getUserInfoByMobile(inputUserId.getMobile());
}
response.setStatus(HttpResponseStatus.OK);
RestResult result;
if (user == null || StringUtil.isNullOrEmpty(user.getName())) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
if (channelInfo.getOwner().equals(inputUserId.getUserId()) ||
messagesStore.checkUserInChannel(user.getUid(), channelInfo.getTargetId())) {
if((channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_FullInfo) > 0) {
result = RestResult.ok(InputOutputUserInfo.fromPbUser(user));
} else {
WFCMessage.User outUser = WFCMessage.User.newBuilder().setUid(user.getUid()).setName(user.getName()).setPortrait(user.getPortrait()).setDisplayName(user.getDisplayName()).build();
result = RestResult.ok(InputOutputUserInfo.fromPbUser(outUser));
}
} else {
if((channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Unsubscribed_User_Access) > 0) {
WFCMessage.User outUser = WFCMessage.User.newBuilder().setUid(user.getUid()).setName(user.getName()).setPortrait(user.getPortrait()).setDisplayName(user.getDisplayName()).build();
result = RestResult.ok(InputOutputUserInfo.fromPbUser(outUser));
} else {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_RIGHT);
}
}
}
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,84 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputModifyChannelInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.SendMessageResult;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Channel_Update_Profile)
@HttpMethod("POST")
public class ModifyChannelProfileAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputModifyChannelInfo input = getRequestBody(request.getNettyRequest(), InputModifyChannelInfo.class);
if (input != null) {
WFCMessage.ModifyChannelInfo modifyChannelInfo = WFCMessage.ModifyChannelInfo.newBuilder().setChannelId(channelInfo.getTargetId()).setType(input.getType()).setValue(input.getValue()).build();
RPCCenter.getInstance().sendRequest(channelInfo.getOwner(), null, IMTopic.ModifyChannelInfoTopic, modifyChannelInfo.toByteArray(), channelInfo.getOwner(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,90 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.channel;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputChannelSubscribe;
import cn.wildfirechat.pojos.InputModifyChannelInfo;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.hazelcast.util.StringUtil;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Channel_Subscribe)
@HttpMethod("POST")
public class SubscriberChannelAction extends ChannelAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputChannelSubscribe input = getRequestBody(request.getNettyRequest(), InputChannelSubscribe.class);
if (input != null && !StringUtil.isNullOrEmpty(input.getTarget())) {
if(input.getSubscribe() > 0 && (channelInfo.getStatus() & ProtoConstants.ChannelState.Channel_State_Mask_Active_Subscribe) == 0) {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_RIGHT);
response.setContent(new Gson().toJson(result));
return true;
}
WFCMessage.ListenChannel listenChannel = WFCMessage.ListenChannel.newBuilder().setChannelId(channelInfo.getTargetId()).setListen(input.getSubscribe()).build();
RPCCenter.getInstance().sendRequest(input.getTarget(), null, IMTopic.ChannelListenTopic, listenChannel.toByteArray(), input.getTarget(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, true);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputAddGroupMember;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Member_Add)
@HttpMethod("POST")
public class AddGroupMemberAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputAddGroupMember inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputAddGroupMember.class);
inputAddGroupMember.setOperator(robot.getUid());
if (inputAddGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.AddGroupMemberTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,95 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputCreateGroup;
import cn.wildfirechat.pojos.OutputCreateGroupResult;
import cn.wildfirechat.pojos.PojoGroupInfo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Create_Group)
@HttpMethod("POST")
public class CreateGroupAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputCreateGroup inputCreateGroup = getRequestBody(request.getNettyRequest(), InputCreateGroup.class);
inputCreateGroup.setOperator(robot.getUid());
inputCreateGroup.getGroup().getGroup_info().setOwner(robot.getUid());
if (inputCreateGroup.isValide()) {
PojoGroupInfo group_info = inputCreateGroup.getGroup().getGroup_info();
WFCMessage.CreateGroupRequest createGroupRequest = inputCreateGroup.toProtoGroupRequest();
RPCCenter.getInstance().sendRequest(inputCreateGroup.getOperator(), null, IMTopic.CreateGroupTopic, createGroupRequest.toByteArray(), inputCreateGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
byte[] data = new byte[byteBuf.readableBytes()];
byteBuf.readBytes(data);
String groupId = new String(data);
sendResponse(response, null, new OutputCreateGroupResult(groupId));
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,41 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.RobotCallbackPojo;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Robot_Delete_Callback)
@HttpMethod("POST")
public class DeleteCallbackAction extends RobotAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
if(!StringUtil.isNullOrEmpty(robot.getCallback())) {
robot = robot.toBuilder().clearCallback().setState(0).build();
messagesStore.addRobot(robot);
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok();
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputDismissGroup;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Dismiss)
@HttpMethod("POST")
public class DismissGroupAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputDismissGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputDismissGroup.class);
inputDismissGroup.setOperator(robot.getUid());
if (inputDismissGroup.isValide()) {
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.DismissGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,42 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetUserInfo;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.RobotCallbackPojo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Robot_Get_Callback)
@HttpMethod("POST")
public class GetCallbackAction extends RobotAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
RobotCallbackPojo out = new RobotCallbackPojo();
out.setUrl(robot.getCallback());
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok(out);
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -0,0 +1,70 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetGroup;
import cn.wildfirechat.pojos.PojoGroupInfo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Robot_Group_Get_Info)
@HttpMethod("POST")
public class GetGroupInfoAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
if (inputGetGroup != null
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
WFCMessage.GroupInfo groupInfo = messagesStore.getGroupInfo(inputGetGroup.getGroupId());
response.setStatus(HttpResponseStatus.OK);
RestResult result;
if (groupInfo == null) {
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
} else {
PojoGroupInfo pojoGroupInfo = new PojoGroupInfo();
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());
result = RestResult.ok(pojoGroupInfo);
}
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,90 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetGroup;
import cn.wildfirechat.pojos.OutputGroupMemberList;
import cn.wildfirechat.pojos.PojoGroupMember;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.List;
@Route(APIPath.Robot_Group_Member_List)
@HttpMethod("POST")
public class GetGroupMembersAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
String robotId = robot.getUid();
if (inputGetGroup != null
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
List<WFCMessage.GroupMember> members = new ArrayList<>();
ErrorCode errorCode = messagesStore.getGroupMembers(null, inputGetGroup.getGroupId(), 0, members);
response.setStatus(HttpResponseStatus.OK);
RestResult result;
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
result = RestResult.resultOf(errorCode);
} else {
OutputGroupMemberList out = new OutputGroupMemberList();
out.setMembers(new ArrayList<>());
boolean isInGroup = false;
for (WFCMessage.GroupMember member : members) {
if (member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
continue;
}
if(member.getMemberId().equals(robotId)) {
isInGroup = true;
}
PojoGroupMember pm = new PojoGroupMember();
pm.setMember_id(member.getMemberId());
pm.setAlias(member.getAlias());
pm.setType(member.getType());
out.getMembers().add(pm);
}
if(!isInGroup) {
out.getMembers().clear();
}
result = RestResult.ok(out);
}
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputKickoffGroupMember;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Member_Kickoff)
@HttpMethod("POST")
public class KickoffGroupMemberAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputKickoffGroupMember inputKickoffGroupMember = getRequestBody(request.getNettyRequest(), InputKickoffGroupMember.class);
inputKickoffGroupMember.setOperator(robot.getUid());
if (inputKickoffGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputKickoffGroupMember.getOperator(), null, IMTopic.KickoffGroupMemberTopic, inputKickoffGroupMember.toProtoGroupRequest().toByteArray(), inputKickoffGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputModifyGroupInfo;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Modify_Info)
@HttpMethod("POST")
public class ModifyGroupInfoAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputModifyGroupInfo inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputModifyGroupInfo.class);
inputAddGroupMember.setOperator(robot.getUid());
if (inputAddGroupMember.isValide()) {
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.ModifyGroupInfoTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputSetGroupMemberAlias;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Set_Member_Alias)
@HttpMethod("POST")
public class ModifyGroupMemberAliasAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputSetGroupMemberAlias inputSetGroupMemberAlias = getRequestBody(request.getNettyRequest(), InputSetGroupMemberAlias.class);
inputSetGroupMemberAlias.setOperator(robot.getUid());
if (inputSetGroupMemberAlias.isValide()) {
RPCCenter.getInstance().sendRequest(inputSetGroupMemberAlias.getOperator(), null, IMTopic.ModifyGroupMemberAliasTopic, inputSetGroupMemberAlias.toProtoGroupRequest().toByteArray(), inputSetGroupMemberAlias.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputQuitGroup;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Member_Quit)
@HttpMethod("POST")
public class QuitGroupMemberAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputQuitGroup inputQuitGroup = getRequestBody(request.getNettyRequest(), InputQuitGroup.class);
inputQuitGroup.setOperator(robot.getUid());
if (inputQuitGroup.isValide()) {
RPCCenter.getInstance().sendRequest(inputQuitGroup.getOperator(), null, IMTopic.QuitGroupTopic, inputQuitGroup.toProtoGroupRequest().toByteArray(), inputQuitGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -55,7 +55,7 @@ abstract public class RobotAction extends Action {
}
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign) || StringUtil.isNullOrEmpty(rid)) {
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
if (!mLimitCounter.isGranted(rid)) {
@@ -68,7 +68,7 @@ abstract public class RobotAction extends Action {
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ROBOT_API_Exception);
return ErrorCode.INVALID_PARAMETER;
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
}
if (System.currentTimeMillis() - ts > 2 * 60 * 60 * 1000) {
@@ -0,0 +1,51 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputGetGroup;
import cn.wildfirechat.pojos.RobotCallbackPojo;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
@Route(APIPath.Robot_Set_Callback)
@HttpMethod("POST")
public class SetCallbackAction extends RobotAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
RobotCallbackPojo input = getRequestBody(request.getNettyRequest(), RobotCallbackPojo.class);
if(!StringUtil.isNullOrEmpty(input.getUrl())) {
if(!input.getUrl().equals(robot.getCallback()) && robot.getState() != 1) {
robot = robot.toBuilder().setCallback(input.getUrl()).setState(1).build();
messagesStore.addRobot(robot);
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok();
response.setContent(new Gson().toJson(result));
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,86 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.InputTransferGroup;
import com.google.gson.Gson;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.action.admin.AdminAction;
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.RPCCenter;
import io.moquette.persistence.TargetEntry;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import win.liyufan.im.IMTopic;
import java.util.concurrent.Executor;
@Route(APIPath.Robot_Group_Transfer)
@HttpMethod("POST")
public class TransferGroupAction extends RobotAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputTransferGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputTransferGroup.class);
inputDismissGroup.setOperator(robot.getUid());
if (inputDismissGroup.isValide()) {
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.TransferGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
@Override
public void onSuccess(byte[] result) {
ByteBuf byteBuf = Unpooled.buffer();
byteBuf.writeBytes(result);
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
sendResponse(response, null, null);
} else {
sendResponse(response, errorCode, null);
}
}
@Override
public void onError(ErrorCode errorCode) {
sendResponse(response, errorCode, null);
}
@Override
public void onTimeout() {
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
}
@Override
public Executor getResponseExecutor() {
return command -> {
ctx.executor().execute(command);
};
}
}, false);
return false;
} else {
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
response.setContent(new Gson().toJson(result));
}
}
return true;
}
}
@@ -0,0 +1,94 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.robot;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.IntStringPairPojo;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
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.handler.codec.http.HttpResponseStatus;
import static cn.wildfirechat.pojos.MyInfoType.*;
@Route(APIPath.Robot_Update_Profile)
@HttpMethod("POST")
public class UpdateProfileAction extends RobotAction {
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
IntStringPairPojo input = getRequestBody(request.getNettyRequest(), IntStringPairPojo.class);
WFCMessage.User.Builder builder = messagesStore.getUserInfo(robot.getUid()).toBuilder();
boolean modified = false;
switch (input.getIntValue()) {
case Modify_DisplayName:
builder.setDisplayName(input.getStrValue());
modified = true;
break;
case Modify_Gender:
builder.setGender(Integer.parseInt(input.getStrValue()));
modified = true;
break;
case Modify_Portrait:
builder.setPortrait(input.getStrValue());
modified = true;
break;
//不允许修改电话号码,如果修改电话号码必须通过admin进行修改
// case Modify_Mobile:
// builder.setMobile(input.getStrValue());
// modified = true;
// break;
case Modify_Email:
builder.setEmail(input.getStrValue());
modified = true;
break;
case Modify_Address:
builder.setAddress(input.getStrValue());
modified = true;
break;
case Modify_Company:
builder.setCompany(input.getStrValue());
modified = true;
break;
case Modify_Social:
builder.setSocial(input.getStrValue());
modified = true;
break;
case Modify_Extra:
builder.setExtra(input.getStrValue());
modified = true;
break;
default:
break;
}
response.setStatus(HttpResponseStatus.OK);
RestResult result = RestResult.ok();
if(modified) {
try {
messagesStore.updateUserInfo(builder.build());
} catch (Exception e) {
e.printStackTrace();
result.setErrorCode(ErrorCode.ERROR_CODE_SERVER_ERROR);
}
}
response.setContent(new Gson().toJson(result));
}
return true;
}
}
@@ -357,8 +357,8 @@ public class Response {
final DefaultHttpResponse defaultHttpResponse = new DefaultHttpResponse(httpVersion, status);
// headers
final HttpHeaders httpHeaders = defaultHttpResponse.headers().add(headers);
HttpHeaders httpHeaders = defaultHttpResponse.headers().add(headers);
httpHeaders.set(HttpHeaderNames.CONTENT_TYPE.toString(), contentType);
// Cookies
for (Cookie cookie : cookies) {
httpHeaders.add(HttpHeaderNames.SET_COOKIE.toString(), ServerCookieEncoder.LAX.encode(cookie));
@@ -117,10 +117,16 @@ public final class BrokerConstants {
public static final String TOKEN_EXPIRE_TIME = "token.expire_time";
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
public static final String DB_AUTO_CLEAN_HISTORY_MESSAGES = "db.auto_clean_history_messages";
public static final String SENSITIVE_Filter_Type = "sensitive.filter.type";
public static final String SENSITIVE_Remote_Server_URL = "sensitive.remote_server_url";
public static final String SENSITIVE_Remote_Message_Type = "sensitive.remote_sensitive_message_type";
public static final String SENSITIVE_Remote_Fail_When_Matched = "sensitive.remote_fail_when_matched";
public static final String MESSAGE_Forward_Url = "message.forward.url";
public static final String MESSAGE_Forward_Types = "message.forward.types";
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification";
@@ -148,8 +154,12 @@ public final class BrokerConstants {
public static final String GROUP_Allow_Client_Custom_Operation_Notification = "group.allow_client_custom_operation_notification";
public static final String GROUP_Visible_Quit_Kickoff_Notification = "group.visible_quit_or_kickoff_notification";
public static final String USER_HIDE_PROPERTIES = "user.hide_properties";
public static final String MESSAGES_FORBIDDEN_CLIENT_SEND_TYPES = "message.forbidden_client_send_types";
public static final String MESSAGES_BLACKLIST_EXCEPTION_TYPES = "message.blacklist_exception_types";
public static final String MESSAGES_GROUP_MUTE_EXCEPTION_TYPES = "message.group_mute_exception_types";
public static final String MESSAGES_GLOBAL_MUTE_EXCEPTION_TYPES = "message.global_mute_exception_types";
public static final String MESSAGES_DISABLE_REMOTE_SEARCH = "message.disable_remote_search";
@@ -22,7 +22,7 @@ public class GetUserInfoHandler extends IMHandler<WFCMessage.PullUserRequest> {
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullUserRequest request, Qos1PublishHandler.IMCallback callback) {
WFCMessage.PullUserResult.Builder resultBuilder = WFCMessage.PullUserResult.newBuilder();
ErrorCode errorCode = m_messagesStore.getUserInfo(request.getRequestList(), resultBuilder);
ErrorCode errorCode = m_messagesStore.getUserInfo(fromUser, request.getRequestList(), resultBuilder);
if (errorCode == ERROR_CODE_SUCCESS) {
byte[] data = resultBuilder.build().toByteArray();
ackPayload.ensureWritable(data.length).writeBytes(data);
@@ -43,7 +43,7 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
try {
long messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
saveAndPublish(fromUser, null, builder.build(), false);
saveAndPublish(fromUser, null, builder.build());
} catch (Exception e) {
e.printStackTrace();
}
@@ -37,7 +37,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
long timestamp = System.currentTimeMillis();
builder.setMessageId(messageId);
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
saveAndPublish(request.getTargetUid(), null, builder.build());
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
String language = "zh_CN";
@@ -60,7 +60,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
messageId = MessageShardingUtil.generateId();
builder.setMessageId(messageId);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
saveAndPublish(request.getTargetUid(), null, builder.build());
if (m_messagesStore.isNewFriendWelcomeMessage()) {
contentBuilder.setType(93);
@@ -73,7 +73,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
builder.setMessageId(messageId);
timestamp = System.currentTimeMillis();
builder.setServerTimestamp(timestamp);
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
saveAndPublish(request.getTargetUid(), null, builder.build());
} catch (Exception e) {
e.printStackTrace();
@@ -204,8 +204,9 @@ abstract public class IMHandler<T> {
errorCode = ErrorCode.ERROR_CODE_SERVER_ERROR;
}
}
response(ackPayload, errorCode, callback);
if(errorCode != ErrorCode.INVALID_ASYNC_HANDLING) {
response(ackPayload, errorCode, callback);
}
} else {
LOG.error("Handler {} preAction failure", this.getClass().getName());
ByteBuf ackPayload = Unpooled.buffer(1);
@@ -236,17 +237,17 @@ abstract public class IMHandler<T> {
Set<String> notifyReceivers = new LinkedHashSet<>();
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, false);
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
return notifyReceivers.size();
}
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message, boolean ignoreMsg) {
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message) {
Set<String> notifyReceivers = new LinkedHashSet<>();
message = m_messagesStore.storeMessage(username, clientID, message);
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, ignoreMsg);
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
return notifyReceivers.size();
}
@@ -44,6 +44,8 @@ public class ModifyGroupInfoHandler extends GroupHandler<WFCMessage.ModifyGroupI
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupPrivatechatNotifyContent();
} else if(request.getType() == Modify_Group_Searchable) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupSearchableNotifyContent();
} else if(request.getType() == Modify_Group_Extra) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupExtraNotifyContent();
}
if (content != null) {
@@ -10,6 +10,7 @@ package io.moquette.imhandler;
import cn.wildfirechat.proto.WFCMessage;
import com.hazelcast.core.Member;
import io.moquette.persistence.MemorySessionStore;
import io.moquette.spi.ClientSession;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
@@ -24,6 +25,19 @@ import static io.moquette.BrokerConstants.HZ_Cluster_Node_External_Short_Port;
public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.RouteRequest request, Qos1PublishHandler.IMCallback callback) {
MemorySessionStore.Session session = m_sessionsStore.sessionForClientAndUser(fromUser, clientID);
if (session == null) {
ErrorCode errorCode = m_sessionsStore.loadActiveSession(fromUser, clientID);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
session = m_sessionsStore.sessionForClientAndUser(fromUser, clientID);
}
if (session == null || session.getDeleted() > 0) {
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
}
Member member = mServer.getHazelcastInstance().getCluster().getLocalMember();
String serverIp = member.getStringAttribute(HZ_Cluster_Node_External_IP);
String longPort = member.getStringAttribute(HZ_Cluster_Node_External_Long_Port);
@@ -8,32 +8,51 @@
package io.moquette.imhandler;
import cn.wildfirechat.pojos.MessagePayload;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
import com.google.gson.Gson;
import com.hazelcast.util.StringUtil;
import io.moquette.BrokerConstants;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import cn.wildfirechat.common.ErrorCode;
import io.netty.buffer.Unpooled;
import win.liyufan.im.HttpUtils;
import win.liyufan.im.IMTopic;
import win.liyufan.im.MessageShardingUtil;
import win.liyufan.im.Utility;
import java.util.HashSet;
import java.util.Set;
import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
@Handler(value = IMTopic.SendMessageTopic)
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
private String mForwardUrl = null;
private Set<Integer> mForwardMessageTypes = new HashSet<>();
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
private String mRemoteSensitiveServerUrl = null;
private Set<Integer> mRemoteSensitiveMessageTypes;
private boolean mWaitRemoteSensitiveServerResponse = false;
public SendMessageHandler() {
super();
String forwardUrl = mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_Url);
if (!StringUtil.isNullOrEmpty(forwardUrl)) {
mForwardUrl = forwardUrl;
String forwardTypes = mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Forward_Types);
if (!StringUtil.isNullOrEmpty(forwardTypes)) {
String[] tss = forwardTypes.split(",");
for (String ts:tss) {
mForwardMessageTypes.add(Integer.parseInt(ts.trim()));
}
}
}
try {
@@ -49,6 +68,24 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
mRemoteSensitiveServerUrl = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Server_URL);
if(!StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
mWaitRemoteSensitiveServerResponse = Boolean.parseBoolean(mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Fail_When_Matched, "false"));
String types = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Message_Type, "");
mRemoteSensitiveMessageTypes = new HashSet<>();
if(!StringUtil.isNullOrEmpty(types)) {
String[] ts = types.split(",");
for (String t:ts) {
mRemoteSensitiveMessageTypes.add(Integer.parseInt(t.trim()));
}
}
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
}
@Override
@@ -68,17 +105,21 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
int userStatus = m_messagesStore.getUserStatus(fromUser);
if (userStatus == ProtoConstants.UserStatus.Muted || userStatus == ProtoConstants.UserStatus.Forbidden) {
return ErrorCode.ERROR_CODE_FORBIDDEN_SEND_MSG;
if(!m_messagesStore.getGlobalMuteExceptionTypes().contains(message.getContent().getType())) {
return ErrorCode.ERROR_CODE_FORBIDDEN_SEND_MSG;
}
}
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
ignoreMsg = true;
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
} else {
return errorCode;
if(!m_messagesStore.getBlackListExceptionTypes().contains(message.getContent().getType())) {
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
ignoreMsg = true;
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
} else {
return errorCode;
}
}
}
@@ -89,23 +130,29 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
}
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group ) {
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
if(!m_messagesStore.getGroupMuteExceptionTypes().contains(message.getContent().getType())) {
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
}
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
if(!m_messagesStore.checkUserClientInChatroom(fromUser, clientID, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHATROOM;
if(!m_messagesStore.getGroupMuteExceptionTypes().contains(message.getContent().getType())) {
if (!m_messagesStore.checkUserClientInChatroom(fromUser, clientID, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHATROOM;
}
}
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
if(!m_messagesStore.checkUserInChannel(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
if(!m_messagesStore.getGroupMuteExceptionTypes().contains(message.getContent().getType())) {
if (!m_messagesStore.checkUserInChannel(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
}
}
}
}
long timestamp = System.currentTimeMillis();
long messageId = 0;
final long messageId;
try {
messageId = MessageShardingUtil.generateId();
} catch (Exception e) {
@@ -114,34 +161,101 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
}
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).build();
if (mForwardUrl != null) {
if (mForwardUrl != null && (mForwardMessageTypes.isEmpty() || mForwardMessageTypes.contains(message.getContent().getType()))) {
publisher.forwardMessage(message, mForwardUrl);
}
if (!isAdmin) {
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
if (matched != null && !matched.isEmpty()) {
m_messagesStore.storeSensitiveMessage(message);
if (mSensitiveType == 0) {
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
} else if(mSensitiveType == 1) {
ignoreMsg = true;
} else if(mSensitiveType == 2) {
String text = message.getContent().getSearchableContent();
for (String word : matched) {
text = text.replace(word, "***");
if(StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
if (matched != null && !matched.isEmpty()) {
m_messagesStore.storeSensitiveMessage(message);
if (mSensitiveType == 0) {
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
} else if (mSensitiveType == 1) {
ignoreMsg = true;
} else if (mSensitiveType == 2) {
String text = message.getContent().getSearchableContent();
for (String word : matched) {
text = text.replace(word, "***");
}
message = message.toBuilder().setContent(message.getContent().toBuilder().setSearchableContent(text).build()).build();
}
}
} else {
if(mRemoteSensitiveMessageTypes.contains(message.getContent().getType())) {
final WFCMessage.Message finalMsg = message;
publisher.forwardMessageWithCallback(message, mRemoteSensitiveServerUrl, new HttpUtils.HttpCallback() {
@Override
public void onSuccess(String content) {
if(StringUtil.isNullOrEmpty(content)) {
saveAndPublish(fromUser, clientID, finalMsg);
} else {
MessagePayload payload = new Gson().fromJson(content, MessagePayload.class);
if (payload != null && payload.getType() > 0) {
WFCMessage.Message newMsg = finalMsg.toBuilder().setContent(payload.toProtoMessageContent()).build();
saveAndPublish(fromUser, clientID, newMsg);
} else {
LOG.error("Response content {} from censor is invalid payload, ignore response and send original message", content);
saveAndPublish(fromUser, clientID, finalMsg);
}
}
if(mWaitRemoteSensitiveServerResponse) {
ByteBuf ackPayload = Unpooled.buffer(21);
ErrorCode errorCode = ERROR_CODE_SUCCESS;
ackPayload.writeByte(errorCode.getCode());
ackPayload.writeLong(messageId);
ackPayload.writeLong(timestamp);
callback.onIMHandled(ErrorCode.ERROR_CODE_SUCCESS, ackPayload);
}
}
message = message.toBuilder().setContent(message.getContent().toBuilder().setSearchableContent(text).build()).build();
} else if(mSensitiveType == 3) {
@Override
public void onFailure(int statusCode, String errorMessage) {
ByteBuf ackPayload = null;
ErrorCode errorCode = ERROR_CODE_SUCCESS;
if(statusCode == 403) {
if(mWaitRemoteSensitiveServerResponse) {
errorCode = ErrorCode.ERROR_CODE_SENSITIVE_MATCHED;
ackPayload = Unpooled.buffer(1);
ackPayload.writeByte(errorCode.getCode());
}
} else {
LOG.warn("Failed to censor message with status {}, errorMessage {}. Send the original message", statusCode, errorMessage);
saveAndPublish(fromUser, clientID, finalMsg);
if(mWaitRemoteSensitiveServerResponse) {
errorCode = ERROR_CODE_SUCCESS;
ackPayload = Unpooled.buffer(21);
ackPayload.writeByte(errorCode.getCode());
ackPayload.writeLong(messageId);
ackPayload.writeLong(timestamp);
}
}
if(mWaitRemoteSensitiveServerResponse) {
callback.onIMHandled(errorCode, ackPayload);
}
}
});
if(mWaitRemoteSensitiveServerResponse) {
ackPayload.clear();
return ErrorCode.INVALID_ASYNC_HANDLING;
} else {
ackPayload = ackPayload.capacity(20);
ackPayload.writeLong(messageId);
ackPayload.writeLong(timestamp);
return ErrorCode.ERROR_CODE_SUCCESS;
}
}
}
}
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
saveAndPublish(fromUser, clientID, message, ignoreMsg);
if(!ignoreMsg) {
saveAndPublish(fromUser, clientID, message);
}
ackPayload = ackPayload.capacity(20);
ackPayload.writeLong(messageId);
ackPayload.writeLong(timestamp);
@@ -1136,7 +1136,6 @@ public class DatabaseStore {
"`_type` = ?," +
"`_extra` = ?," +
"`_dt` = ?," +
"`_member_count` = ?," +
"`_mute` = ?" +
", `_join_type` = ?" +
", `_private_chat` = ?" +
@@ -1167,7 +1166,6 @@ public class DatabaseStore {
statement.setInt(index++, groupInfo.getType());
statement.setString(index++, groupInfo.getExtra());
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
statement.setInt(index++, groupInfo.getMemberCount());
statement.setInt(index++, groupInfo.getMute());
statement.setInt(index++, groupInfo.getJoinType());
statement.setInt(index++, groupInfo.getPrivateChat());
@@ -1557,6 +1555,35 @@ public class DatabaseStore {
}
}
void clearMultiUser(String uid, String clientId) {
long start = System.currentTimeMillis();
LOG.info("clearMultiUser {}, {}", uid, clientId);
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "update t_user_session set _deleted = ?, _token = ?, _voip_token = ?, _dt = ? where _cid = ? and _uid <> ? and _deleted = 0";
statement = connection.prepareStatement(sql);
int index = 1;
statement.setInt(index++, 1);
statement.setString(index++, "");
statement.setString(index++, "");
statement.setLong(index++, System.currentTimeMillis());
statement.setString(index++, clientId);
statement.setString(index++, uid);
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
}
}
MemorySessionStore.Session createSession(String uid, String clientId, ClientSession clientSession, int platform) {
Connection connection = null;
PreparedStatement statement = null;
@@ -1605,12 +1632,10 @@ public class DatabaseStore {
ResultSet rs = null;
try {
connection = DBUtil.getConnection();
String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> ?";
String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> 4";
statement = connection.prepareStatement(sql);
statement.setString(1, userId);
statement.setInt(2, ProtoConstants.GroupMemberType.GroupMemberType_Removed);
rs = statement.executeQuery();
Set<String> out = new HashSet<>();
@@ -1628,25 +1653,17 @@ public class DatabaseStore {
}
return null;
}
void updateGroupMemberCountDt(final String groupId, final int count, final long dt) {
void updateGroupMemberDt(final String groupId, final long dt) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql ;
if (count >= 0) {
sql = "update t_group set `_member_count` = ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
} else {
sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
}
String sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
statement = connection.prepareStatement(sql);
int index = 1;
if (count >=0) {
statement.setInt(index++, count);
}
statement.setLong(index++, dt);
statement.setLong(index++, dt);
statement.setString(index++, groupId);
@@ -1662,7 +1679,30 @@ public class DatabaseStore {
}
}
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList) {
void updateGroupMemberCountDt(final String groupId) {
Connection connection = null;
PreparedStatement statement = null;
try {
connection = DBUtil.getConnection();
String sql = "update t_group set `_member_count` = (select count(*) from t_group_member where `_gid` = ? and `_type` <> 4 limit 1), `_dt` = ?, `_member_dt` = `_member_dt` + 1 where `_gid` = ?";
statement = connection.prepareStatement(sql);
statement.setString(1, groupId);
statement.setLong(2, System.currentTimeMillis());
statement.setString(3, groupId);
int c = statement.executeUpdate();
LOG.info("Update rows {}", c);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
}
}
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList, boolean updateCreateTime) {
Connection connection = null;
PreparedStatement statement = null;
try {
@@ -1678,6 +1718,9 @@ public class DatabaseStore {
"`_alias` = ?," +
"`_type` = ?," +
"`_dt` = ?";
if(updateCreateTime) {
sql += ", `_create_dt` = ?";
}
statement = connection.prepareStatement(sql);
@@ -1698,14 +1741,17 @@ public class DatabaseStore {
statement.setString(index++, member.getAlias());
statement.setInt(index++, member.getType());
statement.setLong(index++, dt);
if(updateCreateTime) {
statement.setLong(index++, dt);
}
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
}
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
if (connection != null) {
try {
connection.commit();
@@ -1714,9 +1760,6 @@ public class DatabaseStore {
e1.printStackTrace();
}
}
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
}
}
@@ -1724,11 +1767,8 @@ public class DatabaseStore {
int removeGroupMember(String groupId, List<String> groupMembers) {
Connection connection = null;
PreparedStatement statement = null;
PreparedStatement statement2 = null;
try {
connection = DBUtil.getConnection();
connection.setAutoCommit(false);
StringBuilder sqlBuilder = new StringBuilder("update t_group_member set `_type` = ?, `_dt` = ? where `_mid` in (");
for (int i = 0; i < groupMembers.size(); i++) {
sqlBuilder.append("?");
@@ -1737,9 +1777,7 @@ public class DatabaseStore {
}
}
sqlBuilder.append(")");
sqlBuilder.append(" and _gid = ?");
statement = connection.prepareStatement(sqlBuilder.toString());
int index = 1;
@@ -1751,36 +1789,14 @@ public class DatabaseStore {
statement.setString(index++, memberId);
}
statement.setString(index++, groupId);
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
String sql = "update t_group set `_member_count` = `_member_count` - ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
statement2 = connection.prepareStatement(sql);
index = 1;
statement2.setInt(index++, count);
statement2.setLong(index++, current);
statement2.setLong(index++, current);
statement2.setString(index++, groupId);
statement2.executeUpdate();
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
if (connection != null) {
try {
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
DBUtil.closeDB(connection, statement2);
}
return 0;
}
@@ -3069,11 +3085,11 @@ public class DatabaseStore {
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
}
connection.commit();
connection.setAutoCommit(true);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
if (connection != null) {
try {
connection.commit();
@@ -3082,9 +3098,6 @@ public class DatabaseStore {
e1.printStackTrace();
}
}
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement);
}
});
@@ -16,7 +16,6 @@
package io.moquette.persistence;
import cn.wildfirechat.common.IMExceptionEvent;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.proto.WFCMessage;
@@ -60,10 +59,11 @@ import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static cn.wildfirechat.proto.ProtoConstants.Platform.*;
import static cn.wildfirechat.proto.ProtoConstants.UpdateUserInfoMask.*;
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 win.liyufan.im.MyInfoType.*;
import static cn.wildfirechat.pojos.MyInfoType.*;
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
public class MemoryMessagesStore implements IMessagesStore {
@@ -139,6 +139,9 @@ public class MemoryMessagesStore implements IMessagesStore {
private boolean mChatroomRejoinWhenActive = true;
private List<Integer> mForbiddenClientSendTypes = new ArrayList<>();
private List<Integer> mBlackListExceptionTypes = new ArrayList<>();
private List<Integer> mGroupMuteExceptionTypes = new ArrayList<>();
private List<Integer> mGlobalMuteExceptionTypes = new ArrayList<>();
private long mRecallTimeLimit = 300;
@@ -152,6 +155,8 @@ public class MemoryMessagesStore implements IMessagesStore {
private boolean mGroupAllowClientCustomOperationNotification;
private int mGroupVisibleQuitKickoffNotification;
private Set<Integer> mUserHideProperties = new HashSet<>();
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
m_Server = server;
this.databaseStore = databaseStore;
@@ -273,7 +278,48 @@ public class MemoryMessagesStore implements IMessagesStore {
} catch (Exception e) {
}
try {
String strTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGES_BLACKLIST_EXCEPTION_TYPES);
if(!StringUtil.isNullOrEmpty(strTypes)) {
for (String strType:strTypes.split(",")) {
try {
int type = Integer.parseInt(strType);
mBlackListExceptionTypes.add(type);
} catch (NumberFormatException e) {
}
}
}
} catch (Exception e) {
}
try {
String strTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGES_GROUP_MUTE_EXCEPTION_TYPES);
if(!StringUtil.isNullOrEmpty(strTypes)) {
for (String strType:strTypes.split(",")) {
try {
int type = Integer.parseInt(strType);
mGroupMuteExceptionTypes.add(type);
} catch (NumberFormatException e) {
}
}
}
} catch (Exception e) {
}
try {
String strTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGES_GLOBAL_MUTE_EXCEPTION_TYPES);
if(!StringUtil.isNullOrEmpty(strTypes)) {
for (String strType:strTypes.split(",")) {
try {
int type = Integer.parseInt(strType);
mGlobalMuteExceptionTypes.add(type);
} catch (NumberFormatException e) {
}
}
}
} catch (Exception e) {
}
try {
mGroupInfoUpdateCallback = server.getConfig().getProperty(GROUP_INFO_UPDATE_CALLBACK);
@@ -330,6 +376,22 @@ public class MemoryMessagesStore implements IMessagesStore {
}
try {
String userHideStr = server.getConfig().getProperty(USER_HIDE_PROPERTIES);
if(!StringUtil.isNullOrEmpty(userHideStr)) {
String[] proStrs = userHideStr.split(",");
for (String proStr:proStrs) {
int value = Integer.parseInt(proStr);
if(value > 1 && value < 9) {
mUserHideProperties.add(value);
}
}
}
} catch (NumberFormatException e) {
e.printStackTrace();
}
}
private void printMissConfigLog(String config, String defaultValue) {
@@ -389,24 +451,12 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers, boolean ignoreMsg) {
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers) {
WFCMessage.Message message = messageBuilder.build();
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
int type = message.getConversation().getType();
int pullType = ProtoConstants.PullType.Pull_Normal;
if (ignoreMsg) {
if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
pullType = ProtoConstants.PullType.Pull_ChatRoom;
}
// if (message.getContent().getPersistFlag() != Transparent) {
notifyReceivers.add(fromUser);
// }
return pullType;
}
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
notifyReceivers.add(fromUser);
notifyReceivers.add(message.getConversation().getTarget());
@@ -890,9 +940,11 @@ public class MemoryMessagesStore implements IMessagesStore {
}
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
boolean hasOwnerMember = false;
for (WFCMessage.GroupMember member : memberList) {
if (member.getMemberId().equals(owner)) {
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
hasOwnerMember = true;
} else {
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).build();
}
@@ -901,6 +953,12 @@ public class MemoryMessagesStore implements IMessagesStore {
dt++;
}
if(!hasOwnerMember && !StringUtil.isNullOrEmpty(owner)) {
WFCMessage.GroupMember member = WFCMessage.GroupMember.newBuilder().setMemberId(owner).setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
groupMembers.put(groupId, member);
updatedMemberList.add(member);
}
groupInfo = groupInfo.toBuilder()
.setTargetId(groupId)
.setName(groupInfo.getName())
@@ -909,12 +967,12 @@ public class MemoryMessagesStore implements IMessagesStore {
.setExtra(groupInfo.getExtra())
.setUpdateDt(dt)
.setMemberUpdateDt(dt)
.setMemberCount(memberList.size())
.setMemberCount(updatedMemberList.size())
.setOwner(owner)
.build();
mIMap.set(groupId, groupInfo);
databaseStore.persistGroupMember(groupId, updatedMemberList);
databaseStore.persistGroupMember(groupId, updatedMemberList, false);
callbackGroupEvent(fromUser, groupInfo.getTargetId(), ProtoConstants.GroupUpdateEventType.Group_Event_Create);
return groupInfo;
@@ -1133,26 +1191,11 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
for (WFCMessage.GroupMember member : members) {
if (newInviteUsers.contains(member.getMemberId())) {
groupMembers.remove(groupId, member);
}
}
databaseStore.persistGroupMember(groupId, memberList, true);
databaseStore.updateGroupMemberCountDt(groupId);
for (WFCMessage.GroupMember member : memberList) {
groupMembers.put(groupId, member);
}
int count = 0;
for (WFCMessage.GroupMember member : groupMembers.get(groupId)) {
if (member.getType() != GroupMemberType_Removed) {
count++;
}
}
mIMap.put(groupId, groupInfo.toBuilder().setMemberUpdateDt(updateDt).setUpdateDt(updateDt).setMemberCount(count).build());
databaseStore.persistGroupMember(groupId, memberList);
databaseStore.updateGroupMemberCountDt(groupId, count, updateDt);
groupMembers.remove(groupId);
mIMap.evict(groupId);
List<String> memberIds = new ArrayList<>();
for (WFCMessage.GroupMember member : memberList) {
@@ -1178,12 +1221,12 @@ public class MemoryMessagesStore implements IMessagesStore {
void removeGroupMember(String groupId, List<String> memberIds) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
databaseStore.removeGroupMember(groupId, memberIds);
databaseStore.updateGroupMemberCountDt(groupId);
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
groupMembers.remove(groupId);
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
mIMap.evict(groupId);
}
void removeFavGroup(String groupId, List<String> memberIds) {
@@ -1371,8 +1414,6 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
WFCMessage.GroupInfo.Builder newInfoBuilder = oldInfo.toBuilder();
if (modifyType == Modify_Group_Name)
@@ -1394,7 +1435,8 @@ public class MemoryMessagesStore implements IMessagesStore {
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
mIMap.put(groupId, newInfoBuilder.build());
databaseStore.persistGroupInfo(newInfoBuilder.build());
mIMap.evict(groupId);
if (modifyType == Modify_Group_Mute) {
if (newInfoBuilder.getMute() > 0) {
@@ -1474,8 +1516,8 @@ public class MemoryMessagesStore implements IMessagesStore {
if (member.getMemberId().equals(memberId)) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setAlias(alias).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
databaseStore.updateGroupMemberCountDt(groupId, -1, updateDt);
databaseStore.persistGroupMember(groupId, Arrays.asList(member), false);
databaseStore.updateGroupMemberDt(groupId, updateDt);
groupMembers.put(groupId, member);
mIMap.set(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
@@ -1537,8 +1579,6 @@ public class MemoryMessagesStore implements IMessagesStore {
WFCMessage.GroupInfo groupInfo = mIMap.get(groupId);
if (groupInfo == null) {
return ErrorCode.ERROR_CODE_NOT_EXIST;
} else if (groupInfo.getMemberUpdateDt() <= maxDt) {
return ErrorCode.ERROR_CODE_NOT_MODIFIED;
}
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
@@ -1633,13 +1673,13 @@ public class MemoryMessagesStore implements IMessagesStore {
if (newOwner.equals(member.getMemberId())) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
databaseStore.persistGroupMember(groupId, Arrays.asList(member), false);
groupMembers.put(groupId, member);
modifyMemeberCount++;
} else if(member.getType() == GroupMemberType_Owner) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
databaseStore.persistGroupMember(groupId, Arrays.asList(member), false);
groupMembers.put(groupId, member);
modifyMemeberCount++;
}
@@ -1677,13 +1717,12 @@ public class MemoryMessagesStore implements IMessagesStore {
if (userList.contains(member.getMemberId())) {
groupMembers.remove(groupId, member);
member = member.toBuilder().setType(type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager).setUpdateDt(updateDt).build();
databaseStore.persistGroupMember(groupId, Arrays.asList(member));
databaseStore.persistGroupMember(groupId, Arrays.asList(member), false);
groupMembers.put(groupId, member);
// userList.remove(member.getMemberId());
}
}
mIMap.put(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
databaseStore.persistGroupInfo(groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build());
mIMap.evict(groupId);
callbackGroupMemberEvent(operator, groupId, userList, ProtoConstants.GroupMemberUpdateEventType.Group_Member_Event_Type_Update, (type == 0 ? ProtoConstants.GroupMemberType.GroupMemberType_Normal : ProtoConstants.GroupMemberType.GroupMemberType_Manager) + "");
return ErrorCode.ERROR_CODE_SUCCESS;
@@ -1909,7 +1948,7 @@ public class MemoryMessagesStore implements IMessagesStore {
@Override
public ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
public ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
@@ -1931,6 +1970,27 @@ public class MemoryMessagesStore implements IMessagesStore {
} else {
LOG.debug("Get user info, user {} userDt {} : request {}",request.getUid(), user.getUpdateDt(), request.getUpdateDt());
if (user.getUpdateDt() > request.getUpdateDt()) {
if(!mUserHideProperties.isEmpty() && !user.getUid().equals(fromUser)) {
WFCMessage.User.Builder userBuilder = user.toBuilder();
for (Integer i:mUserHideProperties) {
if(i == Modify_Gender) {
userBuilder.clearGender();
} else if(i == Modify_Mobile) {
userBuilder.clearMobile();
} else if(i == Modify_Email) {
userBuilder.clearEmail();
} else if(i == Modify_Address) {
userBuilder.clearAddress();
} else if(i == Modify_Company) {
userBuilder.clearCompany();
} else if(i == Modify_Social) {
userBuilder.clearSocial();
} else if(i == Modify_Extra) {
userBuilder.clearExtra();
}
}
user = userBuilder.build();
}
resultBuilder.setUser(user);
resultBuilder.setCode(ProtoConstants.UserResultCode.Success);
} else {
@@ -1979,10 +2039,11 @@ public class MemoryMessagesStore implements IMessagesStore {
builder.setPortrait(entry.getValue());
modified = true;
break;
case Modify_Mobile:
builder.setMobile(entry.getValue());
modified = true;
break;
//禁止客户端直接修改电话号码,只能通过admin api来修改
// case Modify_Mobile:
// builder.setMobile(entry.getValue());
// modified = true;
// break;
case Modify_Email:
builder.setEmail(entry.getValue());
modified = true;
@@ -2109,6 +2170,63 @@ public class MemoryMessagesStore implements IMessagesStore {
return out;
}
@Override
public ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
WFCMessage.User user = mUserMap.get(userInfo.getUserId());
if(user == null) {
return ErrorCode.ERROR_CODE_NOT_EXIST;
}
WFCMessage.User.Builder builder = user.toBuilder();
if((flag & Update_User_DisplayName) > 0) {
builder.setDisplayName(userInfo.getDisplayName());
}
if((flag & Update_User_Portrait) > 0) {
builder.setPortrait(userInfo.getPortrait());
}
if((flag & Update_User_Gender) > 0) {
builder.setGender(userInfo.getGender());
}
if((flag & Update_User_Mobile) > 0) {
builder.setMobile(userInfo.getMobile());
}
if((flag & Update_User_Email) > 0) {
builder.setEmail(userInfo.getEmail());
}
if((flag & Update_User_Address) > 0) {
builder.setAddress(userInfo.getAddress());
}
if((flag & Update_User_Company) > 0) {
builder.setCompany(userInfo.getCompany());
}
if((flag & Update_User_Social) > 0) {
builder.setSocial(userInfo.getSocial());
}
if((flag & Update_User_Extra) > 0) {
builder.setExtra(userInfo.getExtra());
}
if((flag & Update_User_Name) > 0) {
if(StringUtil.isNullOrEmpty(userInfo.getName())) {
LOG.error("Modify user info failure, name not exist!");
return ErrorCode.INVALID_PARAMETER;
}
builder.setName(userInfo.getName());
}
builder.setUpdateDt(System.currentTimeMillis());
user = builder.build();
try {
databaseStore.updateUser(user);
} catch (Exception e) {
e.printStackTrace();
return ErrorCode.ERROR_CODE_SERVER_ERROR;
}
mUserMap.put(user.getUid(), user);
callbackUserInfoEvent(user);
return ErrorCode.ERROR_CODE_SUCCESS;
}
@Override
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
@@ -2140,6 +2258,15 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
@Override
public void updateUserInfo(WFCMessage.User user) throws Exception {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
if(mUserMap.get(user.getUid()) != null) {
databaseStore.updateUser(user);
mUserMap.put(user.getUid(), user);
}
}
@Override
public WFCMessage.User getUserInfo(String userId) {
@@ -3391,6 +3518,21 @@ public class MemoryMessagesStore implements IMessagesStore {
return mForbiddenClientSendTypes;
}
@Override
public List<Integer> getBlackListExceptionTypes() {
return mBlackListExceptionTypes;
}
@Override
public List<Integer> getGroupMuteExceptionTypes() {
return mGroupMuteExceptionTypes;
}
@Override
public List<Integer> getGlobalMuteExceptionTypes() {
return mGlobalMuteExceptionTypes;
}
@Override
public long getMessageHead(String user) {
TreeMap<Long, Long> maps = userMessages.get(user);
@@ -375,7 +375,7 @@ public class MemorySessionStore implements ISessionsStore {
session.setPlatform(platform);
databaseStore.updateSessionPlatform(username, clientID, platform);
}
databaseStore.clearMultiUser(username, clientID);
if (!supportMultiEndpoint && platform > 0) {
databaseStore.clearMultiEndpoint(username, clientID, platform);
@@ -419,6 +419,34 @@ public class MemorySessionStore implements ISessionsStore {
return session;
}
@Override
public void kickoffUserClient(String username, String cid) {
List<String> clientIds = new ArrayList<>();
if(StringUtil.isNullOrEmpty(cid)) {
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
clientIds.addAll(sessionSet);
} else {
clientIds.add(cid);
}
for (String clientID: clientIds) {
Session session = sessions.get(clientID);
if(session == null) {
ClientSession clientSession = new ClientSession(clientID, this);
session = databaseStore.getSession(username, clientID, clientSession);
if (session == null || session.getDeleted() > 0) {
continue;
}
sessions.put(clientID, session);
}
if (session.getDeleted() == 0) {
session.setDeleted(1);
databaseStore.updateSessionDeleted(username, clientID, 1);
mServer.getProcessor().kickoffSession(session);
}
}
}
@Override
public ErrorCode loadActiveSession(String username, String clientID) {
@@ -436,6 +436,7 @@ public class Server {
System.out.println("Server will flush data to db before shutting down, please wait 5 seconds!");
LOG.info("Unbinding server from the configured ports");
m_shutdowning = true;
DBUtil.SystemExiting = true;
m_acceptor.close();
LOG.trace("Stopping MQTT protocol processor");
@@ -149,12 +149,10 @@ public class NettyAcceptor implements ServerAcceptor {
} catch (InterruptedException ex) {
LOG.error("An interruptedException was caught while initializing server. Protocol={}", protocol, ex);
} catch (Exception e) {
if(e instanceof BindException) {
e.printStackTrace();
LOG.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
}
throw e;
e.printStackTrace();
LOG.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
System.exit(-1);
}
}
@@ -16,6 +16,7 @@
package io.moquette.spi;
import cn.wildfirechat.pojos.InputOutputUserInfo;
import cn.wildfirechat.pojos.SystemSettingPojo;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.model.FriendData;
@@ -100,7 +101,7 @@ public interface IMessagesStore {
DatabaseStore getDatabaseStore();
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
void storeSensitiveMessage(WFCMessage.Message message);
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers, boolean ignoreMsg);
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
Set<String> getAllEnds();
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
@@ -131,7 +132,9 @@ public interface IMessagesStore {
WFCMessage.Robot getRobot(String robotId);
void addRobot(WFCMessage.Robot robot);
ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception;
void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online);
@@ -140,8 +143,10 @@ public interface IMessagesStore {
int getUserStatus(String userId);
List<InputOutputUserBlockStatus> getUserStatusList();
ErrorCode updateUserInfo(InputOutputUserInfo userInfo, int flag);
void addUserInfo(WFCMessage.User user, String password) throws Exception;
void destoryUser(String userId);
void updateUserInfo(WFCMessage.User user) throws Exception;
WFCMessage.User getUserInfo(String userId);
WFCMessage.User getUserInfoByName(String name);
WFCMessage.User getUserInfoByMobile(String mobile);
@@ -215,6 +220,9 @@ public interface IMessagesStore {
int getVisibleQuitKickoffNotification();
List<Integer> getClientForbiddenSendTypes();
List<Integer> getBlackListExceptionTypes();
List<Integer> getGroupMuteExceptionTypes();
List<Integer> getGlobalMuteExceptionTypes();
long getMessageHead(String user);
long getFriendHead(String user);
@@ -51,6 +51,8 @@ public interface ISessionsStore {
void updateSessionToken(Session session, boolean voip);
void clearUserSession(String username);
void kickoffUserClient(String userId, String clientId);
/**
* @param clientID
* the client owning the session.
@@ -332,7 +332,7 @@ public class MessagesPublisher {
}
}
if ((StringUtil.isNullOrEmpty(pushContent) && messageContentType != 402 && messageContentType != 400)) {
if ((StringUtil.isNullOrEmpty(pushContent) && messageContentType != 402 && messageContentType != 400 && messageContentType != 401 && messageContentType != 406)) {
LOG.info("push content is empty and contenttype is {}", messageContentType);
continue;
}
@@ -624,6 +624,29 @@ public class MessagesPublisher {
});
}
public void forwardMessageWithCallback(final WFCMessage.Message message, String forwardUrl, HttpUtils.HttpCallback callback) {
try {
HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class), new HttpUtils.HttpCallback() {
@Override
public void onSuccess(String content) {
Server.getServer().getImBusinessScheduler().execute(()->{
callback.onSuccess(content);
});
}
@Override
public void onFailure(int statusCode, String errorMessage) {
Server.getServer().getImBusinessScheduler().execute(()->{
callback.onFailure(statusCode, errorMessage);
});
}
});
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
}
}
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
if (channelInfo == null || StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
return;
@@ -188,8 +188,7 @@ public class ProtocolProcessor {
String clientId = payload.clientIdentifier();
LOG.info("Processing CONNECT message. CId={}, username={}", clientId, payload.userName());
if (msg.variableHeader().version() < MqttVersion.MQTT_3_1_1.protocolLevel() ||
msg.variableHeader().version() >= MqttVersion.Wildfire_Max.protocolLevel()) {
if (msg.variableHeader().version() < MqttVersion.MQTT_3_1_1.protocolLevel()) {
MqttConnAckMessage badProto = connAck(CONNECTION_REFUSED_UNACCEPTABLE_PROTOCOL_VERSION);
LOG.error("MQTT protocol version is not valid. CId={}", clientId);
@@ -16,12 +16,10 @@
package io.moquette.spi.impl;
import static cn.wildfirechat.common.ErrorCode.*;
import static io.moquette.spi.impl.Utils.readBytesAndRewind;
import static io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader.from;
import static io.netty.handler.codec.mqtt.MqttQoS.AT_MOST_ONCE;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_NOT_IMPLEMENT;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_OVER_FREQUENCY;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -256,6 +254,13 @@ public class Qos1PublishHandler extends QosPublishHandler {
String imtopic = topic.getTopic();
ByteBuf payload = msg.payload();
byte[] payloadContent = readBytesAndRewind(payload);
if(payloadContent.length == 0) {
ByteBuf ackPayload = Unpooled.buffer();
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
return;
}
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true);
imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), false);
@@ -27,7 +27,7 @@ public enum MqttVersion {
MQTT_3_1_1("MQTT", (byte) 4),
Wildfire_1("MQTT", (byte) 5),
Wildfire_2("MQTT", (byte) 6),
Wildfire_Max("MQTT", (byte) 7);
Wildfire_Future("MQTT", (byte) 7);
private final String name;
private final byte level;
@@ -59,6 +59,9 @@ public enum MqttVersion {
}
}
}
if(protocolLevel > Wildfire_Future.level) {
return Wildfire_Future;
}
throw new MqttUnacceptableProtocolVersionException(protocolName + "is unknown protocol name");
}
@@ -68,6 +71,9 @@ public enum MqttVersion {
return mv;
}
}
if(protocolLevel > Wildfire_Future.level) {
return Wildfire_Future;
}
throw new MqttUnacceptableProtocolVersionException(protocolLevel + "is unknown protocol level");
}
}
+255 -143
View File
@@ -14,6 +14,8 @@ import java.io.BufferedReader;
import java.io.FileReader;
import java.sql.*;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.hazelcast.util.StringUtil;
@@ -27,6 +29,8 @@ import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentHashMap;
import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
public class DBUtil {
private static final Logger LOG = LoggerFactory.getLogger(DBUtil.class);
private static ComboPooledDataSource comboPooledDataSource = null;
@@ -39,118 +43,226 @@ public class DBUtil {
}
};
public static boolean IsEmbedDB = false;
public static boolean IsEmbedDB = false;
public static boolean SystemExiting = false;
public static boolean ClearDBDebugMode = false;
public static void init(IConfig config) {
String embedDB = config.getProperty(BrokerConstants.EMBED_DB_PROPERTY_NAME);
if (embedDB != null && embedDB.equals("1")) {
IsEmbedDB = true;
LOG.info("Use h2 database");
public static void init(IConfig config) {
String embedDB = config.getProperty(BrokerConstants.EMBED_DB_PROPERTY_NAME);
boolean autoCleanMsgs = "true".equals(config.getProperty(BrokerConstants.DB_AUTO_CLEAN_HISTORY_MESSAGES));
if (embedDB != null && embedDB.equals("1")) {
IsEmbedDB = true;
LOG.info("Use h2 database");
} else {
IsEmbedDB = false;
LOG.info("Use mysql database");
}
if (comboPooledDataSource == null) {
String migrateLocation;
if (IsEmbedDB) {
migrateLocation = "filesystem:./migrate/h2";
comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setJdbcUrl( "jdbc:h2:./h2db/wfchat;AUTO_SERVER=TRUE;MODE=MySQL" );
comboPooledDataSource.setUser("SA");
comboPooledDataSource.setPassword("SA");
comboPooledDataSource.setMinPoolSize(5);
comboPooledDataSource.setAcquireIncrement(5);
comboPooledDataSource.setMaxPoolSize(20);
comboPooledDataSource.setIdleConnectionTestPeriod(60 * 5);
comboPooledDataSource.setMinPoolSize(3);
comboPooledDataSource.setInitialPoolSize(3);
try {
comboPooledDataSource.setDriverClass( "org.h2.Driver" ); //loads the jdbc driver
} catch (PropertyVetoException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
System.exit(-1);
}
} else {
IsEmbedDB = false;
LOG.info("Use mysql database");
}
migrateLocation = "filesystem:./migrate/mysql";
comboPooledDataSource = new ComboPooledDataSource("mysql");
try {
String url01 = comboPooledDataSource.getJdbcUrl().substring(0,comboPooledDataSource.getJdbcUrl().indexOf("?"));
String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
// 连接已经存在的数据库,如:mysql
String jdbc = comboPooledDataSource.getJdbcUrl().replace(datasourceName, "");
Connection connection = DriverManager.getConnection(jdbc, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
Statement statement = connection.createStatement();
if (comboPooledDataSource == null) {
String migrateLocation;
if (IsEmbedDB) {
migrateLocation = "filesystem:./migrate/h2";
comboPooledDataSource = new ComboPooledDataSource();
comboPooledDataSource.setJdbcUrl( "jdbc:h2:./h2db/wfchat;AUTO_SERVER=TRUE;MODE=MySQL" );
comboPooledDataSource.setUser("SA");
comboPooledDataSource.setPassword("SA");
comboPooledDataSource.setMinPoolSize(5);
comboPooledDataSource.setAcquireIncrement(5);
comboPooledDataSource.setMaxPoolSize(20);
comboPooledDataSource.setIdleConnectionTestPeriod(60 * 5);
comboPooledDataSource.setMinPoolSize(3);
comboPooledDataSource.setInitialPoolSize(3);
try {
comboPooledDataSource.setDriverClass( "org.h2.Driver" ); //loads the jdbc driver
} catch (PropertyVetoException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
System.exit(-1);
}
} else {
migrateLocation = "filesystem:./migrate/mysql";
comboPooledDataSource = new ComboPooledDataSource("mysql");
try {
String url01 = comboPooledDataSource.getJdbcUrl().substring(0,comboPooledDataSource.getJdbcUrl().indexOf("?"));
String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
// 连接已经存在的数据库,如:mysql
String jdbc = comboPooledDataSource.getJdbcUrl().replace(datasourceName, "");
Connection connection = DriverManager.getConnection(jdbc, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
Statement statement = connection.createStatement();
// 创建数据库
statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + datasourceName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
// 创建数据库
statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + datasourceName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
Flyway flyway = Flyway.configure().dataSource(comboPooledDataSource).locations(migrateLocation).baselineOnMigrate(true).load();
flyway.migrate();
}
Flyway flyway = Flyway.configure().dataSource(comboPooledDataSource).locations(migrateLocation).baselineOnMigrate(true).load();
flyway.migrate();
if(autoCleanMsgs) {
cleanHistoryMsg();
}
}
}
private static void cleanHistoryMsg() {
new Thread(()->{
long usedTime = 0;
while (true) {
if(SystemExiting) {
break;
}
try {
long sleepTime;
if(ClearDBDebugMode) {
sleepTime = 60 * 1000 - usedTime;
} else {
sleepTime = 60 * 60 * 1000 - usedTime;
}
if(sleepTime < 0) {
sleepTime = 5 * 1000;
}
Thread.sleep(sleepTime);
LOG.info("Start clean history messages");
if(SystemExiting) {
break;
}
long start = System.currentTimeMillis();
if(IsEmbedDB) {
clearH2DB();
} else {
clearMySQL();
}
usedTime = System.currentTimeMillis() - start;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
private static boolean sleep() {
if(SystemExiting)
return true;
try {
if(ClearDBDebugMode) {
Thread.sleep(500);
} else {
Thread.sleep(10000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return SystemExiting;
}
private static long getMaxMidNeedClean() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.YEAR, -3);
cal.add(Calendar.DATE, 1);
return MessageShardingUtil.getMsgIdFromTimestamp(cal.getTimeInMillis());
}
private static void clearH2DB() {
clearOneTable("t_user_messages");
if(sleep()) {
return;
}
clearOneTable("t_messages");
}
private static void clearMySQL() {
for (int i = 0; i < 128; i++) {
clearOneTable("t_user_messages_" + i);
if(sleep()) {
return;
}
}
private static List<String> getCreateSql() {
List<String> out = new ArrayList<>();
try{
BufferedReader br = new BufferedReader(new FileReader("h2/create_table.sql"));//构造一个BufferedReader类来读取文件
String s = null;
StringBuilder result = new StringBuilder();
while((s = br.readLine())!=null) {
result.append(s);
if (s.contains(";")) {
out.add(result.toString());
result = new StringBuilder();
}
}
br.close();
}catch(Exception e){
e.printStackTrace();
Utility.printExecption(LOG, e);
}
return out;
String msgTableName = MessageShardingUtil.getMessageTable(MessageShardingUtil.getMsgIdFromTimestamp(System.currentTimeMillis()));
clearOneTable(msgTableName);
}
private static void clearOneTable(String tableName) {
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
long mid = getMaxMidNeedClean();
try {
connection = DBUtil.getConnection();
String sql = "delete from " + tableName + " where _mid <= " + mid;
statement = connection.prepareStatement(sql);
int count = statement.executeUpdate();
LOG.info("Delete history message {} rows", count);
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e, RDBS_Exception);
} finally {
DBUtil.closeDB(connection, statement, rs);
}
//从数据源中获取数据库的连接
public static Connection getConnection() throws SQLException {
long threadId = Thread.currentThread().getId();
}
if (map.get(threadId) != null) {
LOG.error("error here!!!! DB connection not close correctly");
}
map.put(threadId, Thread.currentThread().getStackTrace().toString());
Connection connection = transactionConnection.get();
if (connection != null) {
LOG.debug("Thread {} get db connection {}", threadId, connection);
return connection;
private static List<String> getCreateSql() {
List<String> out = new ArrayList<>();
try{
BufferedReader br = new BufferedReader(new FileReader("h2/create_table.sql"));//构造一个BufferedReader类来读取文件
String s = null;
StringBuilder result = new StringBuilder();
while((s = br.readLine())!=null) {
result.append(s);
if (s.contains(";")) {
out.add(result.toString());
result = new StringBuilder();
}
}
br.close();
}catch(Exception e){
e.printStackTrace();
Utility.printExecption(LOG, e);
}
return out;
}
//从数据源中获取数据库的连接
public static Connection getConnection() throws SQLException {
long threadId = Thread.currentThread().getId();
connection = comboPooledDataSource.getConnection();
if (map.get(threadId) != null) {
LOG.error("error here!!!! DB connection not close correctly");
}
map.put(threadId, Thread.currentThread().getStackTrace().toString());
Connection connection = transactionConnection.get();
if (connection != null) {
LOG.debug("Thread {} get db connection {}", threadId, connection);
return connection;
}
public static void beginTransaction() {
try {
Connection connection = getConnection();
connection.setAutoCommit(false);
transactionConnection.set(connection);
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
connection = comboPooledDataSource.getConnection();
LOG.debug("Thread {} get db connection {}", threadId, connection);
return connection;
}
public static void beginTransaction() {
try {
Connection connection = getConnection();
connection.setAutoCommit(false);
transactionConnection.set(connection);
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
}
public static void commit() {
try {
@@ -180,57 +292,57 @@ public class DBUtil {
}
}
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(Connection conn,PreparedStatement ps,ResultSet rs) {
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
try {
if (rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
if (ps!=null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
if (conn!=null && transactionConnection.get() != conn) {
conn.close();
map.remove(Thread.currentThread().getId());
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(Connection conn,PreparedStatement ps,ResultSet rs) {
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
try {
if (rs!=null) {
rs.close();
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(Connection conn, PreparedStatement ps) {
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
try {
if (ps!=null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
if (conn!=null && transactionConnection.get() != conn) {
conn.close();
map.remove(Thread.currentThread().getId());
}
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
try {
if (ps!=null) {
ps.close();
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
if (conn!=null && transactionConnection.get() != conn) {
conn.close();
map.remove(Thread.currentThread().getId());
}
} catch (Exception e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
}
//释放资源,将数据库连接还给数据库连接池
public static void closeDB(Connection conn, PreparedStatement ps) {
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
try {
if (ps!=null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
try {
if (conn!=null && transactionConnection.get() != conn) {
conn.close();
map.remove(Thread.currentThread().getId());
}
} catch (SQLException e) {
e.printStackTrace();
Utility.printExecption(LOG, e);
}
}
}
@@ -30,9 +30,19 @@ public class HttpUtils {
private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class);
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
static private OkHttpClient client = new OkHttpClient();
public interface HttpCallback {
void onSuccess(String content);
void onFailure(int statusCode, String errorMessage);
}
public static void httpJsonPost(final String url, final String jsonStr){
LOG.info("POST to {} with data {}", url, jsonStr);
public static void httpJsonPost(final String url, final String jsonStr) {
httpJsonPost(url, jsonStr, null);
}
public static void httpJsonPost(final String url, final String jsonStr, final HttpCallback httpCallback) {
//消息推送内容为 {"sender":"uCGUxUaa","senderName":"杨","convType":0,"target":"usq7v7UU","targetName":"鞋子","userId":"usq7v7UU","line":0,"cntType":400,"serverTime":1610590766485,"pushMessageType":1,"pushType":2,"pushContent":"","pushData":"","unReceivedMsg":1,"mentionedType":0,"packageName":"cn.wildfirechat.chat","deviceToken":"AFoieP9P6u6CccIkRK23gRwUJWKqSkdiqnb-6gC1kL7Wv-9XNoEYBPU7VsINU_q8_WTKfafe35qWu7ya7Z-NmgOTX9XVW3A3zd6ilh--quj6ccINXRvVnh8QmI9QQ","isHiddenDetail":false,"language":"zh"}
//推送信息只打印前100个字符,防止敏感信息打印到日志中去。
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
if (StringUtil.isNullOrEmpty(url)) {
LOG.error("http post failure with empty url");
return;
@@ -48,12 +58,27 @@ public class HttpUtils {
public void onFailure(Call call, IOException e) {
e.printStackTrace();
LOG.info("POST to {} with data {} failure", url, jsonStr);
if(httpCallback != null) {
httpCallback.onFailure(-1, e.getMessage());
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
LOG.info("POST to {} success with response: {}", url, response.body());
try {
if(httpCallback != null) {
int code = response.code();
if(code == 200) {
if(response.body() != null && response.body().contentLength() > 0) {
httpCallback.onSuccess(response.body().string());
} else {
httpCallback.onSuccess(null);
}
} else {
httpCallback.onFailure(code, response.message());
}
}
if (response.body() != null) {
response.body().close();
}
@@ -101,6 +101,26 @@ public class MessageShardingUtil {
year %= 3;
return "t_messages_" + (year * 12 + month);
}
static Calendar getCalendarFromMessageId(long mid) {
Calendar calendar = Calendar.getInstance();
if (mid != Long.MAX_VALUE && mid != 0) {
mid >>= (nodeIdWidth + rotateIdWidth);
Date date = new Date(mid + T201801010000);
calendar.setTime(date);
} else {
Date date = new Date(System.currentTimeMillis());
calendar.setTime(date);
}
return calendar;
}
public static long getMsgIdFromTimestamp(long timestamp) {
long id = timestamp - T201801010000;
id <<= rotateIdWidth;
id <<= nodeIdWidth;
return id;
}
public static String getPreviousMessageTable(long mid) {
return getMessageTable(mid, -1);
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.51</version>
<version>0.59</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -17,6 +17,7 @@ public interface APIPath {
String Sensitive_Query = "/admin/sensitive/query";
String Create_User = "/admin/user/create";
String Update_User = "/admin/user/update";
String Destroy_User = "/admin/user/destroy";
String Create_Robot = "/admin/robot/create";
String CreateOrUpdate_Device = "/admin/device/create";
@@ -28,7 +29,9 @@ public interface APIPath {
String User_Get_Blocked_List = "/admin/user/get_blocked_list";
String User_Check_Block_Status = "/admin/user/check_block_status";
String User_Get_Online_Status = "/admin/user/onlinestatus";
String User_Put_Setting = "/admin/user/put_setting";
String User_Get_Setting = "/admin/user/get_setting";
String User_Kickoff_Client = "/admin/user/kickoff_client";
String Friend_Update_Status = "/admin/friend/status";
String Friend_Get_List = "/admin/friend/list";
@@ -38,6 +41,7 @@ public interface APIPath {
String Friend_Set_Alias = "/admin/friend/set_alias";
String Friend_Send_Request = "/admin/friend/send_request";
String Friend_Get_Requests = "/admin/friend/get_requests";
String Relation_Get = "/admin/relation/get";
String Msg_Send = "/admin/message/send";
String Msg_Recall = "/admin/message/recall";
@@ -75,4 +79,25 @@ public interface APIPath {
String Robot_User_Info = "/robot/user_info";
String Robot_Message_Send = "/robot/message/send";
String Robot_Set_Callback = "/robot/set_callback";
String Robot_Get_Callback = "/robot/get_callback";
String Robot_Delete_Callback = "/robot/delete_callback";
String Robot_Update_Profile = "/robot/update_profile";
String Robot_Verify_Application_User = "/robot/user/verify";
String Robot_Group_Member_Add = "/robot/group/member/add";
String Robot_Group_Allow_Member = "/robot/group/manager/allow";
String Robot_Create_Group = "/robot/group/create";
String Robot_Group_Dismiss = "/robot/group/del";
String Robot_Group_Get_Info = "/robot/group/get_info";
String Robot_Group_Member_List = "/robot/group/member/list";
String Robot_Group_Member_Kickoff = "/robot/group/member/del";
String Robot_Group_Modify_Info = "/robot/group/modify";
String Robot_Group_Set_Member_Alias = "/robot/group/member/set_alias";
String Robot_Group_Mute_Member = "/robot/group/manager/mute";
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";
}
@@ -40,8 +40,9 @@ public enum ErrorCode {
ERROR_CODE_ALREADY_FRIENDS(23, "already friends"),
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
ERROR_CODE_RECALL_TIME_EXPIRED(24, "recall time expired"),
ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"),
ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
ERROR_CODE_GROUP_MUTED(241, "group is muted"),
ERROR_CODE_SENSITIVE_MATCHED(242, "sensitive matched"),
@@ -54,6 +55,7 @@ public enum ErrorCode {
ERROR_CODE_TIMEOUT(249, "timeout"),
ERROR_CODE_OVER_FREQUENCY(250, "over frequency"),
INVALID_PARAMETER(251, "Invalid parameter"),
INVALID_ASYNC_HANDLING(252, "Async handling"),
ERROR_CODE_NOT_EXIST(253, "not exist"),
ERROR_CODE_NOT_IMPLEMENT(254, "not implement"),
@@ -160,4 +160,9 @@ public class GroupNotificationBinaryContent {
public WFCMessage.MessageContent getAllowGroupMemberNotifyContent() {
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_ALLOW_MEMBER);
}
public WFCMessage.MessageContent getChangeGroupExtraNotifyContent() {
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_MODIFY_GROUP_EXTRA);
}
}
@@ -49,11 +49,21 @@ public class InputModifyGroupInfo extends InputGroupBase {
}
public WFCMessage.ModifyGroupInfoRequest toProtoGroupRequest() {
return WFCMessage.ModifyGroupInfoRequest.newBuilder()
.setGroupId(group_id)
.setType(type)
.setValue(value)
.addAllToLine(to_lines == null || to_lines.isEmpty() ? Arrays.asList(0) : to_lines)
.build();
if(notify_message != null && notify_message.getType() > 0) {
return WFCMessage.ModifyGroupInfoRequest.newBuilder()
.setGroupId(group_id)
.setType(type)
.setValue(value)
.addAllToLine(to_lines == null || to_lines.isEmpty() ? Arrays.asList(0) : to_lines)
.build();
} else {
return WFCMessage.ModifyGroupInfoRequest.newBuilder()
.setGroupId(group_id)
.setType(type)
.setValue(value)
.addAllToLine(to_lines == null || to_lines.isEmpty() ? Arrays.asList(0) : to_lines)
.setNotifyContent(notify_message.toProtoMessageContent())
.build();
}
}
}
@@ -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;
public class InputUpdateUserInfo {
//UpdateUserInfoMask
public int flag;
public InputOutputUserInfo userInfo;
}
@@ -0,0 +1,38 @@
/*
* 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 IntStringPairPojo {
private int intValue;
private String strValue;
public IntStringPairPojo() {
}
public IntStringPairPojo(int intValue, String strValue) {
this.intValue = intValue;
this.strValue = strValue;
}
public int getIntValue() {
return intValue;
}
public void setIntValue(int intValue) {
this.intValue = intValue;
}
public String getStrValue() {
return strValue;
}
public void setStrValue(String strValue) {
this.strValue = strValue;
}
}
@@ -6,7 +6,7 @@
* file that was distributed with this source code.
*/
package win.liyufan.im;
package cn.wildfirechat.pojos;
public interface MyInfoType {
int Modify_DisplayName = 0;
@@ -0,0 +1,10 @@
package cn.wildfirechat.pojos;
public class RelationPojo {
public String userId;
public String targetId;
public boolean isFriend;
public boolean isBlacked;
public String alias;
public String extra;
}
@@ -0,0 +1,21 @@
/*
* 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 RobotCallbackPojo {
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
@@ -0,0 +1,38 @@
/*
* 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 StringPairPojo {
private String first;
private String second;
public StringPairPojo() {
}
public StringPairPojo(String first, String second) {
this.first = first;
this.second = second;
}
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
}
@@ -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 cn.wildfirechat.pojos;
import cn.wildfirechat.proto.WFCMessage;
import io.netty.util.internal.StringUtil;
public class UserSettingPojo {
private String userId;
private int scope;
private String key;
private String value;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public int getScope() {
return scope;
}
public void setScope(int scope) {
this.scope = scope;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public WFCMessage.ModifyUserSettingReq toProtoRequest() {
WFCMessage.ModifyUserSettingReq.Builder builder = WFCMessage.ModifyUserSettingReq.newBuilder();
builder.setScope(scope);
if (!StringUtil.isNullOrEmpty(key))
builder.setKey(key);
if(!StringUtil.isNullOrEmpty(value))
builder.setValue(value);
return builder.build();
}
}
@@ -201,6 +201,20 @@ public class ProtoConstants {
int Chatroom_Member_Event_Unmute = 4;
}
public interface UpdateUserInfoMask {
int Update_User_DisplayName = 0x01;
int Update_User_Portrait = 0x02;
int Update_User_Gender = 0x04;
int Update_User_Mobile = 0x08;
int Update_User_Email = 0x10;
int Update_User_Address = 0x20;
int Update_User_Company = 0x40;
int Update_User_Social = 0x80;
int Update_User_Extra = 0x100;
int Update_User_Name = 0x200;
}
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
@@ -221,5 +235,7 @@ public class ProtoConstants {
public static final int MESSAGE_CONTENT_TYPE_ALLOW_MEMBER = 119;
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER_VISIBLE = 120;
public static final int MESSAGE_CONTENT_TYPE_QUIT_GROUP_VISIBLE = 121;
public static final int MESSAGE_CONTENT_TYPE_MODIFY_GROUP_EXTRA = 122;
}
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.51</version>
<version>0.59</version>
</parent>
<artifactId>distribution</artifactId>
@@ -10,7 +10,7 @@
# (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
server.ip 0.0.0.0
##原生客户端长链接端口
##原生客户端长链接端口。如果使用4层的反向代理或者类似组件,需要设置长链接保持时间为10分钟。
port 1883
##客户端短链接端口
@@ -31,6 +31,11 @@ local_port 80
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
embed.db 1
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
db.auto_clean_history_messages true
##服务器管理接口密钥
http.admin.secret_key 123456
@@ -71,6 +76,14 @@ message.recall_time_limit 120
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
message.forbidden_client_send_types 3999,4000,4001
## 当禁止发送消息时,允许例外发送的消息。这种一般用户需要被动回应的消息。比如群中被禁言的用户,他无法主动发起音视频,但可以接听未被禁言用户的音视频
## 因为音视频使用了消息作为信令,所以就需要允许发送音视频信令。如果开发了其它场景也需要被动回应消息,可以加在这里。
## 黑名单时允许发送的消息类型
message.blacklist_exception_types 401,402,403,404,405,407,408,410,411
## 群禁言或者聊天室或者频道禁言时允许发送的消息类型
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
##禁止搜索用户
friend.disable_search false
@@ -102,13 +115,18 @@ chatroom.participant_idle_time 900000
chatroom.rejoin_when_active true
## 是否允许客户端发送操作群的自定义群通知消息
group.allow_client_custom_operation_notification false
group.allow_client_custom_operation_notification true
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
## 如果应用需要退群或者踢人不通知普通成员,请设置此参数为3,然后修改客户端踢人或退群消息的flag为not_presist。
group.visible_quit_or_kickoff_notification 0
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
## 注意,修改本配置不会对已经同步的信息产生影响。
#user.hide_properties 3,4
#*********************************************************************
# hazelcase configuration
#*********************************************************************
@@ -202,6 +220,8 @@ push.ios.server.address http://localhost:8085/ios/push
##消息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.forward.url http://localhost:8087/im_event/message
##需要转发的消息类型,当有多个时以英文逗号分割。如果转发所有消息,请注释掉配置或者设置为空
#message.forward.types 1,2,3
##设备信息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
@@ -240,5 +260,16 @@ push.ios.server.address http://localhost:8085/ios/push
#*********************************************************************
# Sensitive configuration
#*********************************************************************
##文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***
## 内置文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***;3 记录并继续发送
sensitive.filter.type 0
## 如果内置敏感词库无法满足您的需求,可以自己开发部署敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
## 独立审核服务地址,IM服务会post SendMessageData。如果需要修改消息内容,返回 MessagePayload。请参考应用服务中 "/message/censor" Mapping.
#sensitive.remote_server_url http://192.168.3.202:8888/message/censor
## 需要进行敏感词审核的消息类型,当有多个时以英文逗号分割
#sensitive.remote_sensitive_message_type 1,2,3
## 如果远程审核服务返回403,返回给发送端发送失败还是成功?实际上这个值影响发送响应是否等待审核结果,当为false时,消息发送给审核服务就立即返回
## 成功给客户端。当为true时,消息发送给审核服务,等待审核结果,如果结果为继续发送就返回给客户端为成功,结果为禁止发送就返回失败给客户端。
## 客户端操作的超时一般为10s左右,且考虑到复杂的网络情况,建议处理时间不要超过3s。建议这个值为false。
#sensitive.remote_fail_when_matched false
@@ -1,12 +1,11 @@
@ECHO OFF
set "CURRENT_DIR=%cd%"
if not "%WILDFIRECHAT_HOME%" == "" goto gotHome
set "WILDFIRECHAT_HOME=%CURRENT_DIR%"
if exist "%WILDFIRECHAT_HOME%\bin\wildfirechat.bat" goto okHome
cd ..
set "WILDFIRECHAT_HOME=%cd%"
cd "%CURRENT_DIR%"
set "CURRENT_DIR=%cd%"
:gotHome
if exist "%WILDFIRECHAT_HOME%\bin\wildfirechat.bat" goto okHome
echo The WILDFIRECHAT_HOME environment variable is not defined correctly
@@ -11,11 +11,14 @@ while [ -h "$PRG" ]; do
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
PRGDIR=`dirname "$PRG"`
cd $PRGDIR
PRG="`pwd`"/"$link"
fi
done
PRGDIR=`dirname "$PRG"`
cd $PRGDIR
cd ..
WILDFIRECHAT_HOME=`pwd`
+19
View File
@@ -0,0 +1,19 @@
FROM openjdk:8-jre-alpine
ADD ../distribution/target/distribution-*-bundle-tar.tar.gz /opt/im-server/
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh
WORKDIR /opt/im-server
VOLUME /opt/im-server/config
VOLUME /opt/im-server/logs
EXPOSE 80/tcp 1883/tcp 8083/tcp 8084/tcp 18080/tcp
ENV JVM_XMX 256M
ENV JVM_XMS 256M
CMD ./bin/wildfirechat.sh
+19
View File
@@ -0,0 +1,19 @@
# 野火IM服务docker使用说明
## 编译镜像
首先需要先编译应用服务,在项目根目录下使用下面命令编译
```
mvn clean package
```
然后进入到docker目录下,编译镜像
```
sudo docker build -t wildfire_im .
```
## 运行
配置:
运行需要手动指定配置目录,这样不用重新打包镜像。手动指定配置目录的方法如下,其中$PATH_TO_CONFIG为im配置目录,模版为```distribution/src/main/resources```目录:
```
sudo docker run -it -v $PATH_TO_CONFIG:/opt/im-server/config -v $PATH_TO_LOGS:/opt/im-server/logs -e JVM_XMX=256M -e JVM_XMS=256M -p 80:80 -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18080:18080 wildfire_im
```
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>0.51</version>
<version>0.59</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>0.51</version>
<version>0.59</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -27,4 +27,40 @@ public class GeneralAdmin {
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
}
//以下仅专业版支持
public static IMResult<Void> setConversationTop(String userId, int conversationType, String target, int line, boolean isTop) throws Exception {
String key = conversationType + "-" + line + "-" + target;
String value = isTop?"1":"0";
return setUserSetting(userId, 3, key, value);
}
public static IMResult<Boolean> getConversationTop(String userId, int conversationType, String target, int line) throws Exception {
String key = conversationType + "-" + line + "-" + target;
IMResult<UserSettingPojo> result = getUserSetting(userId, 3, key);
IMResult<Boolean> out = new IMResult<Boolean>();
out.code = result.code;
out.msg = result.msg;
out.result = result.result != null && "1".equals(result.result.getValue());
return out;
}
private static IMResult<UserSettingPojo> getUserSetting(String userId, int scope, String key) throws Exception {
String path = APIPath.User_Get_Setting;
UserSettingPojo pojo = new UserSettingPojo();
pojo.setUserId(userId);
pojo.setScope(scope);
pojo.setKey(key);
return AdminHttpUtils.httpJsonPost(path, pojo, UserSettingPojo.class);
}
private static IMResult<Void> setUserSetting(String userId, int scope, String key, String value) throws Exception {
String path = APIPath.User_Put_Setting;
UserSettingPojo pojo = new UserSettingPojo();
pojo.setUserId(userId);
pojo.setScope(scope);
pojo.setKey(key);
pojo.setValue(value);
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
}
}
+378 -96
View File
@@ -14,6 +14,7 @@ import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static cn.wildfirechat.pojos.MyInfoType.Modify_DisplayName;
import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_Member_Count;
public class Main {
@@ -133,6 +134,43 @@ public class Main {
System.exit(-1);
}
InputOutputUserInfo updateUserInfo = new InputOutputUserInfo();
updateUserInfo.setUserId(System.currentTimeMillis()+"");
updateUserInfo.setDisplayName("updatedUserName");
updateUserInfo.setPortrait("updatedUserPortrait");
int updateUserFlag = ProtoConstants.UpdateUserInfoMask.Update_User_DisplayName | ProtoConstants.UpdateUserInfoMask.Update_User_Portrait;
IMResult<Void> result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag);
if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_NOT_EXIST) {
System.out.println("updateUserInfo success");
} else {
System.out.println("updateUserInfo failure");
System.exit(-1);
}
updateUserInfo.setUserId(userInfo.getUserId());
result = UserAdmin.updateUserInfo(updateUserInfo, updateUserFlag);
if(result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("updateUserInfo success");
} else {
System.out.println("updateUserInfo failure");
System.exit(-1);
}
IMResult<InputOutputUserInfo> resultGetUserInfo4 = UserAdmin.getUserByUserId(userInfo.getUserId());
if (resultGetUserInfo4 != null && resultGetUserInfo4.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
if (userInfo.getUserId().equals(resultGetUserInfo4.getResult().getUserId())
&& updateUserInfo.getDisplayName().equals(resultGetUserInfo4.getResult().getDisplayName())
&& updateUserInfo.getPortrait().equals(resultGetUserInfo4.getResult().getPortrait())) {
System.out.println("get user info success");
} else {
System.out.println("get user info by userId failure");
System.exit(-1);
}
} else {
System.out.println("get user info by userId failure");
System.exit(-1);
}
IMResult<OutputGetIMTokenData> resultGetToken = UserAdmin.getUserToken(userInfo.getUserId(), "client111", ProtoConstants.Platform.Platform_Android);
if (resultGetToken != null && resultGetToken.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get token success: " + resultGetToken.getResult().getToken());
@@ -254,7 +292,7 @@ public class Main {
System.exit(-1);
}
IMResult<Void> result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello", true);
IMResult<Void> result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello", true);
if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("send friend request success");
} else {
@@ -262,7 +300,7 @@ public class Main {
System.exit(-1);
}
result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello2", false);
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello2", false);
if (result != null && result.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("success");
} else {
@@ -270,7 +308,7 @@ public class Main {
System.exit(-1);
}
result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello3", true);
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello3", true);
if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("success");
} else {
@@ -330,17 +368,25 @@ public class Main {
String alias = "hello" + System.currentTimeMillis();
IMResult<Void> updateFriendAlias = RelationAdmin.updateFriendAlias("ff1", "ff2", alias);
if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("update friend status success");
System.out.println("update friend alias success");
} else {
System.out.println("update friend status failure");
System.out.println("update friend alias failure");
System.exit(-1);
}
IMResult<OutputGetAlias> getFriendAlias = RelationAdmin.getFriendAlias("ff1", "ff2");
if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) {
System.out.println("update friend status success");
System.out.println("get friend alias success");
} else {
System.out.println("update friend status failure");
System.out.println("get friend alias failure");
System.exit(-1);
}
IMResult<RelationPojo> getRelation = RelationAdmin.getRelation("ff1", "ff2");
if (getRelation != null && getRelation.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get friend relation success");
} else {
System.out.println("get friend relation failure");
System.exit(-1);
}
}
@@ -356,6 +402,7 @@ public class Main {
groupInfo.setOwner("user1");
groupInfo.setName("test_group");
groupInfo.setExtra("hello extra");
groupInfo.setType(2);
groupInfo.setPortrait("http://portrait");
List<PojoGroupMember> members = new ArrayList<>();
PojoGroupMember member1 = new PojoGroupMember();
@@ -647,8 +694,8 @@ public class Main {
System.exit(-1);
}
}
static void testChatroom() throws Exception {
static void testChatroom() throws Exception {
String chatroomId = "chatroomId1";
String chatroomTitle = "TESTCHATROM";
String chatroomDesc = "this is a test chatroom";
@@ -704,111 +751,171 @@ public class Main {
}
//下面仅专业版支持
/*
//设置用户聊天室黑名单。0正常;1禁言;2禁止加入。
IMResult<Void> voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 1);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室黑名单
IMResult<OutputChatroomBlackInfos> blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !blackInfos.getResult().infos.isEmpty()) {
boolean success = false;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = true;
break;
}
}
if (success) {
if(commercialServer) {
//设置用户聊天室黑名单。0正常;1禁言;2禁止加入。
IMResult<Void> voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 1);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//取消用户聊天室黑名单。0正常;1禁言;2禁止加入。
voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 0);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("remove chatroom black success");
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
//获取聊天室黑名单
blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
boolean success = true;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = false;
break;
//获取聊天室黑名单
IMResult<OutputChatroomBlackInfos> blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !blackInfos.getResult().infos.isEmpty()) {
boolean success = false;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = true;
break;
}
}
if (success) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
if (success) {
//取消用户聊天室黑名单。0正常;1禁言;2禁止加入。
voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 0);
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("remove chatroom black success");
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
//设置聊天室管理员
IMResult<Void> voidIMResult2 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 1);
if (voidIMResult2 != null && voidIMResult2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室黑名单
blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
boolean success = true;
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
if (info.userId.equals("oto9o9__")) {
success = false;
break;
}
}
if (success) {
System.out.println("remove chatroom black success");
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
} else {
System.out.println("remove chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers != null && managers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers.getResult().getList().isEmpty() && managers.getResult().getList().contains("UserId1")) {
//设置聊天室管理员
IMResult<Void> voidIMResult2 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 1);
if (voidIMResult2 != null && voidIMResult2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers != null && managers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers.getResult().getList().isEmpty() && managers.getResult().getList().contains("UserId1")) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//取消聊天室管理员
IMResult<Void> voidIMResult3 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 0);
if (voidIMResult3 != null && voidIMResult3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers2 = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers2 != null && managers2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers2.getResult().getList().contains("UserId1")) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
}
//取消聊天室管理员
IMResult<Void> voidIMResult3 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 0);
if (voidIMResult3 != null && voidIMResult3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add chatroom manager success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}
//获取聊天室管理员
IMResult<OutputStringList> managers2 = ChatroomAdmin.getChatroomManagerList("chatroom1");
if (managers2 != null && managers2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers2.getResult().getList().contains("UserId1")) {
System.out.println("add chatroom black success");
} else {
System.out.println("add chatroom black failure");
System.exit(-1);
}*/
}
static void testRobot() throws Exception {
//初始化机器人API
RobotHttpUtils.init("http://localhost", "robot1", "123456");
//初始化机器人API,注意端口是80,不是18080
String robotId = "robot1";
RobotHttpUtils.init("http://localhost", robotId, "123456");
//***********************************************
//**** 机器人API
//***********************************************
IMResult<InputOutputUserInfo> userInfoIMResult = RobotService.getProfile(robotId);
if(userInfoIMResult != null && userInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get profile success");
} else {
System.out.println("get profile failure");
System.exit(-1);
}
String displayName = "testrobot"+System.currentTimeMillis();
IMResult<Void> voidIMResult1 = RobotService.updateProfile(Modify_DisplayName, displayName);
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("modify profile success");
} else {
System.out.println("modify profile failure");
System.exit(-1);
}
userInfoIMResult = RobotService.getProfile(robotId);
if(userInfoIMResult != null && userInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && displayName.equals(userInfoIMResult.getResult().getDisplayName())) {
System.out.println("get profile success");
} else {
System.out.println("get profile failure");
System.exit(-1);
}
String robotCallback = "http://hellow123";
voidIMResult1 = RobotService.setCallback(robotCallback);
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("set callback success");
} else {
System.out.println("set callback failure");
System.exit(-1);
}
IMResult<RobotCallbackPojo> callbackPojoIMResult = RobotService.getCallback();
if(callbackPojoIMResult != null && callbackPojoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && robotCallback.equals(callbackPojoIMResult.getResult().getUrl())) {
System.out.println("get callback success");
} else {
System.out.println("get callback failure");
System.exit(-1);
}
voidIMResult1 = RobotService.deleteCallback();
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("delete callback success");
} else {
System.out.println("delete callback failure");
System.exit(-1);
}
callbackPojoIMResult = RobotService.getCallback();
if(callbackPojoIMResult != null && callbackPojoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && StringUtil.isNullOrEmpty(callbackPojoIMResult.getResult().getUrl())) {
System.out.println("get callback success");
} else {
System.out.println("get callback failure");
System.exit(-1);
}
Conversation conversation = new Conversation();
conversation.setTarget("user2");
conversation.setType(ProtoConstants.ConversationType.ConversationType_Private);
@@ -831,6 +938,182 @@ public class Main {
System.out.println("robot get user info by userId failure");
System.exit(-1);
}
String groupId = "robot_group" + System.currentTimeMillis();
PojoGroupInfo groupInfo = new PojoGroupInfo();
groupInfo.setTarget_id(groupId);
groupInfo.setName("test_group");
groupInfo.setType(2);
groupInfo.setExtra("hello extra");
groupInfo.setPortrait("http://portrait");
List<PojoGroupMember> members = new ArrayList<>();
PojoGroupMember member1 = new PojoGroupMember();
member1.setMember_id("user1");
members.add(member1);
PojoGroupMember member2 = new PojoGroupMember();
member2.setMember_id("user2");
members.add(member2);
PojoGroupMember member3 = new PojoGroupMember();
member3.setMember_id("user3");
members.add(member3);
IMResult<OutputCreateGroupResult> resultCreateGroup = RobotService.createGroup(groupInfo, members, null, null);
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("create group success");
} else {
System.out.println("create group failure");
System.exit(-1);
}
IMResult<PojoGroupInfo> resultGetGroupInfo = RobotService.getGroupInfo(groupInfo.getTarget_id());
if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
if (groupInfo.getExtra().equals(resultGetGroupInfo.getResult().getExtra())
&& groupInfo.getName().equals(resultGetGroupInfo.getResult().getName())
&& robotId.equals(resultGetGroupInfo.getResult().getOwner())) {
System.out.println("get group success");
} else {
System.out.println("group info is not expected");
System.exit(-1);
}
} else {
System.out.println("create group failure");
System.exit(-1);
}
IMResult<Void> voidIMResult = RobotService.modifyGroupInfo(groupInfo.getTarget_id(), ProtoConstants.ModifyGroupInfoType.Modify_Group_Name,"HelloWorld", null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("modify group success");
} else {
System.out.println("modify group failure");
System.exit(-1);
}
IMResult<OutputGroupMemberList> resultGetMembers = RobotService.getGroupMembers(groupInfo.getTarget_id());
if (resultGetMembers != null && resultGetMembers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("get group member success");
} else {
System.out.println("create group failure");
System.exit(-1);
}
PojoGroupMember m = new PojoGroupMember();
m.setMember_id("user1");
m.setAlias("hello user1");
voidIMResult = RobotService.addGroupMembers(groupInfo.getTarget_id(), Arrays.asList(m), null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("add group member success");
} else {
System.out.println("add group member failure");
System.exit(-1);
}
voidIMResult = RobotService.kickoffGroupMembers(groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("kickoff group member success");
} else {
System.out.println("kickoff group member failure");
System.exit(-1);
}
voidIMResult = RobotService.setGroupMemberAlias(groupInfo.getTarget_id(), "user3", "test user3", null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("set group member alias success");
} else {
System.out.println("set group member alias failure");
System.exit(-1);
}
if(commercialServer) {
voidIMResult = RobotService.setGroupManager(groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("set group manager success");
} else {
System.out.println("set group manager failure");
System.exit(-1);
}
voidIMResult = RobotService.setGroupManager(groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("cancel group manager success");
} else {
System.out.println("cancel group manager failure");
System.exit(-1);
}
}
//仅专业版支持
if (commercialServer) {
//开启群成员禁言
voidIMResult = RobotService.muteGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("mute group member success");
} else {
System.out.println("mute group member failure");
System.exit(-1);
}
//关闭群成员禁言
voidIMResult = RobotService.muteGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("unmute group member success");
} else {
System.out.println("unmute group member failure");
System.exit(-1);
}
//开启群成员白名单,当群全局禁言时,白名单用户可以发言
voidIMResult = RobotService.allowGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("allow group member success");
} else {
System.out.println("allow group member failure");
System.exit(-1);
}
//关闭群成员白名单
voidIMResult = RobotService.allowGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("unallow group member success");
} else {
System.out.println("unallow group member failure");
System.exit(-1);
}
}
voidIMResult = RobotService.transferGroup(groupInfo.getTarget_id(), "user2", null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("transfer success");
} else {
System.out.println("create group failure");
System.exit(-1);
}
resultGetGroupInfo = RobotService.getGroupInfo(groupInfo.getTarget_id());
if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
if ("user2".equals(resultGetGroupInfo.getResult().getOwner())) {
groupInfo.setOwner("user2");
} else {
System.out.println("group info is not expected");
System.exit(-1);
}
} else {
System.out.println("create group failure");
System.exit(-1);
}
voidIMResult = RobotService.quitGroup(groupInfo.getTarget_id(), null, null);
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("quit group success");
} else {
System.out.println("quit group failure");
System.exit(-1);
}
}
//***测试频道API功能,仅专业版支持***
@@ -887,6 +1170,7 @@ public class Main {
inputCreateChannel.setOwner("userId1");
String secret = "channelsecret";
inputCreateChannel.setSecret(secret);
inputCreateChannel.setState(0xff);
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("create channel success");
@@ -896,12 +1180,10 @@ public class Main {
}
//2. 初始化api
//2. 初始化api,注意端口是80,不是18080
ChannelServiceApi channelServiceApi = new ChannelServiceApi("http://localhost", resultCreateChannel.getResult().getTargetId(), secret);
if (commercialServer) {
//3. 测试channel api功能
IMResult<Void> resultVoid = channelServiceApi.subscribe("userId2");
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
@@ -950,7 +1232,7 @@ public class Main {
System.out.println("get user info failure");
System.exit(-1);
}
}
MessagePayload payload = new MessagePayload();
@@ -986,9 +1268,9 @@ public class Main {
IMResult<OutputGetChannelInfo> outputGetChannelInfoIMResult = channelServiceApi.getChannelInfo();
if (outputGetChannelInfoIMResult != null && outputGetChannelInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("destroy user success");
System.out.println("get channel info success");
} else {
System.out.println("destroy user failure");
System.out.println("get channel info failure");
System.exit(-1);
}
}
@@ -56,7 +56,7 @@ public class RelationAdmin {
return AdminHttpUtils.httpJsonPost(path, input, OutputGetAlias.class);
}
public static IMResult<Void> sendFrienRequest(String userId, String targetId, String reason, boolean force) throws Exception {
public static IMResult<Void> sendFriendRequest(String userId, String targetId, String reason, boolean force) throws Exception {
String path = APIPath.Friend_Send_Request;
InputAddFriendRequest input = new InputAddFriendRequest();
input.setUserId(userId);
@@ -65,4 +65,10 @@ public class RelationAdmin {
input.setForce(force);
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
}
public static IMResult<RelationPojo> getRelation(String userId, String targetId) throws Exception {
String path = APIPath.Relation_Get;
StringPairPojo input = new StringPairPojo(userId, targetId);
return AdminHttpUtils.httpJsonPost(path, input, RelationPojo.class);
}
}
@@ -3,8 +3,10 @@ package cn.wildfirechat.sdk;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.sdk.model.IMResult;
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
import java.util.List;
public class RobotService {
public static IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception {
@@ -33,4 +35,166 @@ public class RobotService {
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, userName, null);
return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
}
public static IMResult<Void> setCallback(String url) throws Exception {
String path = APIPath.Robot_Set_Callback;
RobotCallbackPojo pojo = new RobotCallbackPojo();
pojo.setUrl(url);
return RobotHttpUtils.httpJsonPost(path, pojo, Void.class);
}
public static IMResult<RobotCallbackPojo> getCallback() throws Exception {
String path = APIPath.Robot_Get_Callback;
return RobotHttpUtils.httpJsonPost(path, null, RobotCallbackPojo.class);
}
public static IMResult<Void> deleteCallback() throws Exception {
String path = APIPath.Robot_Delete_Callback;
return RobotHttpUtils.httpJsonPost(path, null, Void.class);
}
public static IMResult<InputOutputUserInfo> getProfile(String robotId) throws Exception {
return getUserInfo(robotId);
}
/*
type可选范围为MyInfoType,注意不能修改电话号码,如果要修改电话号码请使用adminapi进行修改
*/
public static IMResult<Void> updateProfile(int/*MyInfoType*/ type, String value) throws Exception {
String path = APIPath.Robot_Update_Profile;
IntStringPairPojo pojo = new IntStringPairPojo(type, value);
return RobotHttpUtils.httpJsonPost(path, pojo, Void.class);
}
public static IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Create_Group;
PojoGroup pojoGroup = new PojoGroup();
pojoGroup.setGroup_info(group_info);
pojoGroup.setMembers(members);
InputCreateGroup createGroup = new InputCreateGroup();
createGroup.setGroup(pojoGroup);
createGroup.setTo_lines(to_lines);
createGroup.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, createGroup, OutputCreateGroupResult.class);
}
public static IMResult<PojoGroupInfo> getGroupInfo(String groupId) throws Exception {
String path = APIPath.Robot_Group_Get_Info;
InputGetGroup input = new InputGetGroup();
input.setGroupId(groupId);
return RobotHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class);
}
public static IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Dismiss;
InputDismissGroup dismissGroup = new InputDismissGroup();
dismissGroup.setGroup_id(groupId);
dismissGroup.setTo_lines(to_lines);
dismissGroup.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, dismissGroup, Void.class);
}
public static IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Transfer;
InputTransferGroup transferGroup = new InputTransferGroup();
transferGroup.setGroup_id(groupId);
transferGroup.setNew_owner(newOwner);
transferGroup.setTo_lines(to_lines);
transferGroup.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, transferGroup, Void.class);
}
public static IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Modify_Info;
InputModifyGroupInfo modifyGroupInfo = new InputModifyGroupInfo();
modifyGroupInfo.setGroup_id(groupId);
modifyGroupInfo.setTo_lines(to_lines);
modifyGroupInfo.setType(type);
modifyGroupInfo.setValue(value);
modifyGroupInfo.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, modifyGroupInfo, Void.class);
}
public static IMResult<OutputGroupMemberList> getGroupMembers(String groupId) throws Exception {
String path = APIPath.Robot_Group_Member_List;
InputGetGroup input = new InputGetGroup();
input.setGroupId(groupId);
return RobotHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
}
public static IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Member_Add;
InputAddGroupMember addGroupMember = new InputAddGroupMember();
addGroupMember.setGroup_id(groupId);
addGroupMember.setMembers(groupMembers);
addGroupMember.setTo_lines(to_lines);
addGroupMember.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Set_Manager;
InputSetGroupManager addGroupMember = new InputSetGroupManager();
addGroupMember.setGroup_id(groupId);
addGroupMember.setMembers(groupMemberIds);
addGroupMember.setIs_manager(isManager);
addGroupMember.setTo_lines(to_lines);
addGroupMember.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Mute_Member;
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
addGroupMember.setGroup_id(groupId);
addGroupMember.setMembers(groupMemberIds);
addGroupMember.setIs_manager(isMute);
addGroupMember.setTo_lines(to_lines);
addGroupMember.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Allow_Member;
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
addGroupMember.setGroup_id(groupId);
addGroupMember.setMembers(groupMemberIds);
addGroupMember.setIs_manager(isAllow);
addGroupMember.setTo_lines(to_lines);
addGroupMember.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public static IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Member_Kickoff;
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
kickoffGroupMember.setGroup_id(groupId);
kickoffGroupMember.setMembers(groupMemberIds);
kickoffGroupMember.setTo_lines(to_lines);
kickoffGroupMember.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class);
}
public static IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Member_Quit;
InputQuitGroup quitGroup = new InputQuitGroup();
quitGroup.setGroup_id(groupId);
quitGroup.setTo_lines(to_lines);
quitGroup.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, quitGroup, Void.class);
}
public static IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Set_Member_Alias;
InputSetGroupMemberAlias input = new InputSetGroupMemberAlias();
input.setGroup_id(groupId);
input.setMemberId(memberId);
input.setAlias(alias);
input.setTo_lines(to_lines);
input.setNotify_message(notify_message);
return RobotHttpUtils.httpJsonPost(path, input, Void.class);
}
}
@@ -29,6 +29,14 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
}
public static IMResult<Void> updateUserInfo(InputOutputUserInfo user, int/*UpdateUserInfoMask*/ flag) throws Exception {
String path = APIPath.Update_User;
InputUpdateUserInfo updateUserInfo = new InputUpdateUserInfo();
updateUserInfo.flag = flag;
updateUserInfo.userInfo = user;
return AdminHttpUtils.httpJsonPost(path, updateUserInfo, Void.class);
}
public static IMResult<OutputCreateRobot> createRobot(InputCreateRobot robot) throws Exception {
String path = APIPath.Create_Robot;
return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);
@@ -63,6 +71,15 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputCheckUserOnline.class);
}
/* 强迫用户下线,需要用户重新获取token才能进行连接。
userId必须有效,clientId可以为空,当为空时,踢下线说有客户端,当不为空时仅踢掉对应客户端。
*/
public static IMResult<Void> kickoffUserClient(String userId, String clientId) throws Exception {
String path = APIPath.User_Kickoff_Client;
StringPairPojo pojo = new StringPairPojo(userId, clientId);
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
}
public static IMResult<Void> destroyUser(String userId) throws Exception {
String path = APIPath.Destroy_User;
InputDestroyUser inputDestroyUser = new InputDestroyUser();
@@ -3,6 +3,7 @@ package cn.wildfirechat.sdk.utilities;
import cn.wildfirechat.sdk.model.IMResult;
import com.google.gson.Gson;
import ikidou.reflect.TypeBuilder;
import io.netty.util.internal.StringUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
@@ -63,10 +64,12 @@ public class RobotHttpUtils {
}
LOG.info("http request content: {}", jsonStr);
StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8"));
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
post.setEntity(entity);
if(!StringUtil.isNullOrEmpty(jsonStr)) {
StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8"));
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
post.setEntity(entity);
}
HttpResponse response = httpClient.execute(post);
int statusCode = response.getStatusLine().getStatusCode();