Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9858b6060c | ||
|
|
05476bb678 | ||
|
|
54aa4d5dcf | ||
|
|
c992286af5 | ||
|
|
3ed9381084 | ||
|
|
1099c87246 | ||
|
|
e4752c832e | ||
|
|
74ac13726e | ||
|
|
6ad672be76 | ||
|
|
63dd936675 | ||
|
|
5ae8e375bf | ||
|
|
d7a0fd29bb | ||
|
|
92c59d2fe8 | ||
|
|
7824fb3844 | ||
|
|
0390d44c63 | ||
|
|
4fdc883f25 | ||
|
|
3862ab5254 | ||
|
|
38002aecc9 | ||
|
|
c74cddc387 | ||
|
|
b2e4fd9546 | ||
|
|
9e8c364642 | ||
|
|
8127ec03ad | ||
|
|
c02e9066be | ||
|
|
ffd1492ea2 | ||
|
|
5e9bbcb1e9 | ||
|
|
63770c75fa | ||
|
|
bf0eb5b8aa | ||
|
|
8cbf66930f | ||
|
|
ce48f67b04 | ||
|
|
2fdf11006d | ||
|
|
4a2d7a4cc5 | ||
|
|
0513da8993 |
@@ -65,6 +65,9 @@ message.remote_history_message 0
|
|||||||
##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。
|
##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。
|
||||||
message.max_queue 1024
|
message.max_queue 1024
|
||||||
|
|
||||||
|
##是否开启拉取聊天室远程历史消息。如果为1,可以下拉继续加载在服务器上的该聊天室的消息;如果为0则不能。默认为1
|
||||||
|
message.chatroom_remote_history_message 1
|
||||||
|
|
||||||
##是否禁止陌生人聊天
|
##是否禁止陌生人聊天
|
||||||
message.disable_stranger_chat false
|
message.disable_stranger_chat false
|
||||||
|
|
||||||
@@ -111,7 +114,7 @@ friend.disable_search false
|
|||||||
##禁止按照昵称搜索用户。
|
##禁止按照昵称搜索用户。
|
||||||
friend.disable_nick_name_search false
|
friend.disable_nick_name_search false
|
||||||
|
|
||||||
##禁止发送好友邀请,通过server api添加好友不受此限制
|
##禁止发送好友邀请,通过server api添加好友不受此限制(force参数需要为true)
|
||||||
friend.disable_friend_request false
|
friend.disable_friend_request false
|
||||||
|
|
||||||
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
|
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
|
||||||
@@ -154,6 +157,20 @@ group.visible_quit_or_kickoff_notification 0
|
|||||||
# 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。
|
# 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。
|
||||||
#sync.data_part_size 1000
|
#sync.data_part_size 1000
|
||||||
|
|
||||||
|
#*********************************************************************
|
||||||
|
# 限频配置
|
||||||
|
#*********************************************************************
|
||||||
|
##API接口限频设置,时间是10秒内允许的请求次数。
|
||||||
|
##管理api频率限制,默认是10秒10000次。
|
||||||
|
http.admin.rate_limit 10000
|
||||||
|
##机器人api频率限制,默认是10秒1000次,按照机器人ID区分。
|
||||||
|
http.robot.rate_limit 1000
|
||||||
|
##频道api频率限制,默认是10秒1000次,按照频道ID区分。
|
||||||
|
http.channel.rate_limit 1000
|
||||||
|
|
||||||
|
##客户端请求频率限制,默认是5秒100次。通常情况下不要修改这个值。
|
||||||
|
client.request_rate_limit 100
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# hazelcase configuration
|
# hazelcase configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
@@ -163,7 +180,8 @@ hazelcast.configuration config/hazelcast.xml
|
|||||||
# Media server configuration
|
# Media server configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||||
##配置使用七牛请参考:https://docs.wildfirechat.cn/server/media_server.html
|
##专业版另外支持阿里云存储和野火私有存储,关于野火私有存储请参考:https://github.com/wildfirechat/WF-minio
|
||||||
|
##关于对象存储的详细信息请参考:https://docs.wildfirechat.cn/server/oss.html
|
||||||
media.server.use_qiniu 0
|
media.server.use_qiniu 0
|
||||||
|
|
||||||
##媒体类型分类
|
##媒体类型分类
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
alter table `t_user_messages` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
+257
@@ -0,0 +1,257 @@
|
|||||||
|
alter table `t_user_messages` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_0` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_1` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_2` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_3` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_4` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_5` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_6` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_7` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_8` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_9` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_10` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_11` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_12` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_13` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_14` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_15` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_16` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_17` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_18` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_19` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_20` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_21` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_22` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_23` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_24` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_25` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_26` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_27` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_28` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_29` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_30` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_31` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_32` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_33` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_34` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_35` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_36` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_37` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_38` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_39` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_40` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_41` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_42` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_43` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_44` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_45` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_46` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_47` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_48` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_49` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_50` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_51` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_52` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_53` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_54` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_55` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_56` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_57` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_58` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_59` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_60` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_61` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_62` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_63` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_64` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_65` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_66` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_67` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_68` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_69` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_70` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_71` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_72` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_73` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_74` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_75` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_76` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_77` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_78` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_79` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_80` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_81` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_82` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_83` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_84` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_85` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_86` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_87` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_88` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_89` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_90` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_91` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_92` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_93` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_94` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_95` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_96` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_97` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_98` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_99` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_100` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_101` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_102` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_103` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_104` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_105` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_106` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_107` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_108` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_109` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_110` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_111` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_112` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_113` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_114` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_115` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_116` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_117` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_118` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_119` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_120` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_121` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_122` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_123` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_124` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_125` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_126` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
|
|
||||||
|
alter table `t_user_messages_127` add column `_cont_type` int(11) NOT NULL DEFAULT '0';
|
||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.72</version>
|
<version>0.77</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import java.util.concurrent.Executors;
|
|||||||
|
|
||||||
import static io.moquette.BrokerConstants.PUSH_ANDROID_SERVER_ADDRESS;
|
import static io.moquette.BrokerConstants.PUSH_ANDROID_SERVER_ADDRESS;
|
||||||
import static io.moquette.BrokerConstants.PUSH_IOS_SERVER_ADDRESS;
|
import static io.moquette.BrokerConstants.PUSH_IOS_SERVER_ADDRESS;
|
||||||
|
import static win.liyufan.im.HttpUtils.HttpPostType.POST_TYPE_Push;
|
||||||
|
|
||||||
public class PushServer {
|
public class PushServer {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(PushServer.class);
|
private static final Logger LOG = LoggerFactory.getLogger(PushServer.class);
|
||||||
@@ -99,7 +100,7 @@ public class PushServer {
|
|||||||
url = iOSPushServerUrl;
|
url = iOSPushServerUrl;
|
||||||
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
|
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
|
||||||
}
|
}
|
||||||
HttpUtils.httpJsonPost(url, new Gson().toJson(pushMessage, pushMessage.getClass()));
|
HttpUtils.httpJsonPost(url, new Gson().toJson(pushMessage, pushMessage.getClass()), POST_TYPE_Push);
|
||||||
} else {
|
} else {
|
||||||
LOG.info("Not mobile platform {}", session.getPlatform());
|
LOG.info("Not mobile platform {}", session.getPlatform());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,27 +43,17 @@ public class ServerSetting {
|
|||||||
/** 根目录 */
|
/** 根目录 */
|
||||||
private static File root;
|
private static File root;
|
||||||
/** Filter映射表 */
|
/** Filter映射表 */
|
||||||
private static Map<String, Filter> filterMap;
|
private static Map<String, Filter> filterMap = new ConcurrentHashMap<>();
|
||||||
/** Action映射表 */
|
/** Action映射表 */
|
||||||
private static Map<String, Action> getActionMap;
|
private static Map<String, Class<? extends Action>> getActionMap = new ConcurrentHashMap<>();
|
||||||
private static Map<String, Action> postActionMap;
|
private static Map<String, Class<? extends Action>> postActionMap = new ConcurrentHashMap<>();
|
||||||
private static Map<String, Action> putActionMap;
|
private static Map<String, Class<? extends Action>> putActionMap = new ConcurrentHashMap<>();
|
||||||
private static Map<String, Action> deleteActionMap;
|
private static Map<String, Class<? extends Action>> deleteActionMap = new ConcurrentHashMap<>();
|
||||||
private static Map<String, Action> errorActionMap;
|
private static Map<String, Class<? extends Action>> errorActionMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
static{
|
static{
|
||||||
filterMap = new ConcurrentHashMap<String, Filter>();
|
errorActionMap.put(StrUtil.SLASH, DefaultIndexAction.class);
|
||||||
|
errorActionMap.put(MAPPING_ERROR, UnknownErrorAction.class);
|
||||||
getActionMap = new ConcurrentHashMap<String, Action>();
|
|
||||||
postActionMap = new ConcurrentHashMap<String, Action>();
|
|
||||||
|
|
||||||
putActionMap = new ConcurrentHashMap<String, Action>();
|
|
||||||
|
|
||||||
deleteActionMap = new ConcurrentHashMap<String, Action>();
|
|
||||||
|
|
||||||
errorActionMap = new ConcurrentHashMap<String, Action>();
|
|
||||||
errorActionMap.put(StrUtil.SLASH, new DefaultIndexAction());
|
|
||||||
errorActionMap.put(MAPPING_ERROR, new UnknownErrorAction());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -207,7 +197,7 @@ public class ServerSetting {
|
|||||||
/**
|
/**
|
||||||
* @return 获取ActionMap
|
* @return 获取ActionMap
|
||||||
*/
|
*/
|
||||||
public static Map<String, Action> getActionMap(String method) {
|
public static Map<String, Class<? extends Action>> getActionMap(String method) {
|
||||||
if (method.equals("GET")) {
|
if (method.equals("GET")) {
|
||||||
return getActionMap;
|
return getActionMap;
|
||||||
} else if(method.equals("POST")) {
|
} else if(method.equals("POST")) {
|
||||||
@@ -221,7 +211,17 @@ public class ServerSetting {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Action getErrorAction(String path) {
|
public static Action getErrorAction(String path) {
|
||||||
return errorActionMap.get(path);
|
Class<? extends Action> cls = errorActionMap.get(path);
|
||||||
|
if(cls != null) {
|
||||||
|
try {
|
||||||
|
return cls.newInstance();
|
||||||
|
} catch (InstantiationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
} catch (IllegalAccessException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -233,33 +233,17 @@ public class ServerSetting {
|
|||||||
if(StrUtil.isBlank(path)){
|
if(StrUtil.isBlank(path)){
|
||||||
path = StrUtil.SLASH;
|
path = StrUtil.SLASH;
|
||||||
}
|
}
|
||||||
return getActionMap(method).get(path.trim());
|
Class<? extends Action> cls = getActionMap(method).get(path.trim());
|
||||||
}
|
if(cls != null) {
|
||||||
|
try {
|
||||||
/**
|
return cls.newInstance();
|
||||||
* 设置Action类,已有的Action类将被覆盖
|
} catch (InstantiationException e) {
|
||||||
* @param path 拦截路径(必须以"/"开头)
|
e.printStackTrace();
|
||||||
* @param action Action类
|
} catch (IllegalAccessException e) {
|
||||||
*/
|
e.printStackTrace();
|
||||||
public static void setAction(String path, Action action) {
|
}
|
||||||
if(StrUtil.isBlank(path)){
|
|
||||||
path = StrUtil.SLASH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(null == action) {
|
|
||||||
Logger.warn("Added blank action, pass it.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//所有路径必须以 "/" 开头,如果没有则补全之
|
|
||||||
if(false == path.startsWith(StrUtil.SLASH)) {
|
|
||||||
path = StrUtil.SLASH + path;
|
|
||||||
}
|
|
||||||
String method = "GET";
|
|
||||||
HttpMethod methodAnnotation = action.getClass().getAnnotation(HttpMethod.class);
|
|
||||||
if (methodAnnotation != null) {
|
|
||||||
method = methodAnnotation.value();
|
|
||||||
}
|
}
|
||||||
ServerSetting.getActionMap(method).put(path, action);
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -269,24 +253,24 @@ public class ServerSetting {
|
|||||||
* @param actionClass Action类
|
* @param actionClass Action类
|
||||||
*/
|
*/
|
||||||
public static void setAction(String path, Class<? extends Action> actionClass) {
|
public static void setAction(String path, Class<? extends Action> actionClass) {
|
||||||
setAction(path, (Action)Singleton.get(actionClass));
|
if(StrUtil.isBlank(path)){
|
||||||
}
|
path = StrUtil.SLASH;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
if(null == actionClass) {
|
||||||
* 增加Action类,已有的Action类将被覆盖<br>
|
Logger.warn("Added blank action, pass it.");
|
||||||
* 自动读取Route的注解来获得Path路径
|
return;
|
||||||
* @param action 带注解的Action对象
|
}
|
||||||
*/
|
//所有路径必须以 "/" 开头,如果没有则补全之
|
||||||
public static void setAction(Action action) {
|
if(false == path.startsWith(StrUtil.SLASH)) {
|
||||||
final Route route = action.getClass().getAnnotation(Route.class);
|
path = StrUtil.SLASH + path;
|
||||||
if(route != null){
|
}
|
||||||
final String path = route.value();
|
String method = "GET";
|
||||||
if(StrUtil.isNotBlank(path)){
|
HttpMethod methodAnnotation = actionClass.getAnnotation(HttpMethod.class);
|
||||||
setAction(path, action);
|
if (methodAnnotation != null) {
|
||||||
return;
|
method = methodAnnotation.value();
|
||||||
}
|
}
|
||||||
}
|
ServerSetting.getActionMap(method).put(path, actionClass);
|
||||||
throw new ServerSettingException("Can not find Route annotation,please add annotation to Action class!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -295,7 +279,15 @@ public class ServerSetting {
|
|||||||
* @param actionClass 带注解的Action类
|
* @param actionClass 带注解的Action类
|
||||||
*/
|
*/
|
||||||
public static void setAction(Class<? extends Action> actionClass) {
|
public static void setAction(Class<? extends Action> actionClass) {
|
||||||
setAction((Action)Singleton.get(actionClass));
|
final Route route = actionClass.getAnnotation(Route.class);
|
||||||
|
if(route != null){
|
||||||
|
final String path = route.value();
|
||||||
|
if(StrUtil.isNotBlank(path)){
|
||||||
|
setAction(path, actionClass);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new ServerSettingException("Can not find Route annotation,please add annotation to Action class!");
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------- Action start
|
//----------------------------------------------------------------------------------------------- Action start
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import com.xiaoleilu.loServer.RestResult;
|
|||||||
import com.xiaoleilu.loServer.annotation.RequireAuthentication;
|
import com.xiaoleilu.loServer.annotation.RequireAuthentication;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
import com.xiaoleilu.loServer.handler.Response;
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.server.config.IConfig;
|
||||||
import io.moquette.spi.IMessagesStore;
|
import io.moquette.spi.IMessagesStore;
|
||||||
import io.moquette.spi.ISessionsStore;
|
import io.moquette.spi.ISessionsStore;
|
||||||
import io.moquette.spi.impl.Utils;
|
import io.moquette.spi.impl.Utils;
|
||||||
@@ -21,10 +22,12 @@ import io.netty.handler.codec.http.FullHttpRequest;
|
|||||||
import io.netty.handler.codec.http.HttpRequest;
|
import io.netty.handler.codec.http.HttpRequest;
|
||||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import win.liyufan.im.RateLimiter;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
import static io.moquette.BrokerConstants.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求处理接口<br>
|
* 请求处理接口<br>
|
||||||
@@ -38,6 +41,36 @@ abstract public class Action {
|
|||||||
public static ISessionsStore sessionsStore = null;
|
public static ISessionsStore sessionsStore = null;
|
||||||
|
|
||||||
public ChannelHandlerContext ctx;
|
public ChannelHandlerContext ctx;
|
||||||
|
|
||||||
|
protected static RateLimiter adminLimiter = null;
|
||||||
|
protected static RateLimiter robotLimiter = null;
|
||||||
|
protected static RateLimiter channelLimiter = null;
|
||||||
|
|
||||||
|
public static void init(IConfig config) {
|
||||||
|
int adminRate = 10000;
|
||||||
|
int robotRate = 1000;
|
||||||
|
int channelRate = 1000;
|
||||||
|
|
||||||
|
try {
|
||||||
|
adminRate = Integer.parseInt(config.getProperty(HTTP_ADMIN_RATE_LIMIT, "10000"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
robotRate = Integer.parseInt(config.getProperty(HTTP_ROBOT_RATE_LIMIT, "1000"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
channelRate = Integer.parseInt(config.getProperty(HTTP_CHANNEL_RATE_LIMIT, "1000"));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
adminLimiter = new RateLimiter(10, adminRate);
|
||||||
|
robotLimiter = new RateLimiter(10, robotRate);
|
||||||
|
channelLimiter = new RateLimiter(10, channelRate);
|
||||||
|
}
|
||||||
|
|
||||||
protected class Result {
|
protected class Result {
|
||||||
Object data;
|
Object data;
|
||||||
ErrorCode errorCode;
|
ErrorCode errorCode;
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ abstract public class AdminAction extends Action {
|
|||||||
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(AdminAction.class);
|
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(AdminAction.class);
|
||||||
private static String SECRET_KEY = "123456";
|
private static String SECRET_KEY = "123456";
|
||||||
private static boolean NO_CHECK_TIME = false;
|
private static boolean NO_CHECK_TIME = false;
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 500);
|
|
||||||
public static void setSecretKey(String secretKey) {
|
public static void setSecretKey(String secretKey) {
|
||||||
SECRET_KEY = secretKey;
|
SECRET_KEY = secretKey;
|
||||||
}
|
}
|
||||||
@@ -44,7 +43,7 @@ abstract public class AdminAction extends Action {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode preAction(Request request, Response response) {
|
public ErrorCode preAction(Request request, Response response) {
|
||||||
if (!mLimitCounter.isGranted("admin")) {
|
if (!adminLimiter.isGranted("admin")) {
|
||||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,14 +87,16 @@ abstract public class AdminAction extends Action {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void sendResponse(Response response, ErrorCode errorCode, Object data) {
|
protected void sendResponse(Response response, ErrorCode errorCode, Object data) {
|
||||||
response.setStatus(HttpResponseStatus.OK);
|
if(response != null) {
|
||||||
if (errorCode == null) {
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
if (errorCode == null) {
|
||||||
}
|
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
RestResult result = RestResult.resultOf(errorCode, errorCode.getMsg(), data);
|
RestResult result = RestResult.resultOf(errorCode, errorCode.getMsg(), data);
|
||||||
response.setContent(new Gson().toJson(result));
|
response.setContent(new Gson().toJson(result));
|
||||||
response.send();
|
response.send();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
protected void sendApiMessage(Response response, String fromUser, String topic, byte[] message, ApiCallback callback) {
|
protected void sendApiMessage(Response response, String fromUser, String topic, byte[] message, ApiCallback callback) {
|
||||||
sendApiMessage(response, fromUser, null, topic, message, callback, false);
|
sendApiMessage(response, fromUser, null, topic, message, callback, false);
|
||||||
|
|||||||
@@ -12,16 +12,22 @@ import cn.wildfirechat.common.APIPath;
|
|||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import cn.wildfirechat.pojos.InputGetFriendList;
|
import cn.wildfirechat.pojos.InputGetFriendList;
|
||||||
import cn.wildfirechat.pojos.InputUpdateAlias;
|
import cn.wildfirechat.pojos.InputUpdateAlias;
|
||||||
|
import cn.wildfirechat.pojos.OutputCreateChannel;
|
||||||
import cn.wildfirechat.pojos.OutputStringList;
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
import com.hazelcast.util.StringUtil;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
import com.xiaoleilu.loServer.annotation.Route;
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
import com.xiaoleilu.loServer.handler.Response;
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
import com.xiaoleilu.loServer.model.FriendData;
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.handler.codec.http.FullHttpRequest;
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -39,8 +45,26 @@ public class AliasPutAction extends AdminAction {
|
|||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
InputUpdateAlias input = getRequestBody(request.getNettyRequest(), InputUpdateAlias.class);
|
InputUpdateAlias input = getRequestBody(request.getNettyRequest(), InputUpdateAlias.class);
|
||||||
ErrorCode errorCode = messagesStore.setFriendAliasRequest(input.getOperator(), input.getTargetId(), input.getAlias(), new long[1]);
|
if(!StringUtil.isNullOrEmpty(input.getOperator()) && !StringUtil.isNullOrEmpty(input.getTargetId())) {
|
||||||
setResponseContent(RestResult.resultOf(errorCode), response);
|
WFCMessage.AddFriendRequest addFriendRequest = WFCMessage.AddFriendRequest.newBuilder().setTargetUid(input.getTargetId()).setReason(input.getAlias()==null?"":input.getAlias()).build();
|
||||||
|
sendApiMessage(response, input.getOperator(), IMTopic.SetFriendAliasTopic, addFriendRequest.toByteArray(), 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 channelId = new String(data);
|
||||||
|
return new Result(ErrorCode.ERROR_CODE_SUCCESS, new OutputCreateChannel(channelId));
|
||||||
|
} else {
|
||||||
|
return new Result(errorCode);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
ErrorCode errorCode = messagesStore.setFriendAliasRequest(input.getOperator(), input.getTargetId(), input.getAlias(), new long[1]);
|
||||||
|
setResponseContent(RestResult.resultOf(errorCode), response);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public class BlockUserAction extends AdminAction {
|
|||||||
response.setContent(new Gson().toJson(result));
|
response.setContent(new Gson().toJson(result));
|
||||||
|
|
||||||
if (inputUserBlock.getStatus() == 2) {
|
if (inputUserBlock.getStatus() == 2) {
|
||||||
sendApiMessage(response, null, ServerAPIHelper.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), null);
|
sendApiMessage(null, null, ServerAPIHelper.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null);
|
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null);
|
||||||
|
|||||||
+62
@@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputChannelId;
|
||||||
|
import cn.wildfirechat.pojos.OutputCreateChannel;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
@Route(APIPath.Destroy_Channel)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class DestroyChannelAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputChannelId inputCreateChannel = getRequestBody(request.getNettyRequest(), InputChannelId.class);
|
||||||
|
if (inputCreateChannel != null
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputCreateChannel.channelId)) {
|
||||||
|
WFCMessage.ChannelInfo channelInfo = messagesStore.getChannelInfo(inputCreateChannel.channelId);
|
||||||
|
if(channelInfo == null) {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST), response);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
WFCMessage.IDBuf.Builder builder = WFCMessage.IDBuf.newBuilder().setId(inputCreateChannel.channelId);
|
||||||
|
sendApiMessage(response, channelInfo.getOwner(), IMTopic.DestroyChannelInfoTopic, builder.build().toByteArray(), result -> {
|
||||||
|
ByteBuf byteBuf = Unpooled.buffer();
|
||||||
|
byteBuf.writeBytes(result);
|
||||||
|
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||||
|
return new Result(errorCode);
|
||||||
|
});
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+51
@@ -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.admin;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.pojos.InputChannelId;
|
||||||
|
import cn.wildfirechat.pojos.OutputGetChannelInfo;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
@Route(APIPath.Get_Channel_Info)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetChannelAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputChannelId inputCreateChannel = getRequestBody(request.getNettyRequest(), InputChannelId.class);
|
||||||
|
if (inputCreateChannel != null
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputCreateChannel.channelId)) {
|
||||||
|
WFCMessage.ChannelInfo channelInfo = messagesStore.getChannelInfo(inputCreateChannel.channelId);
|
||||||
|
if (channelInfo == null) {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST), response);
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.ok(OutputGetChannelInfo.fromPbInfo(channelInfo)), response);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -27,11 +27,11 @@ import org.slf4j.LoggerFactory;
|
|||||||
import win.liyufan.im.RateLimiter;
|
import win.liyufan.im.RateLimiter;
|
||||||
import win.liyufan.im.Utility;
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
abstract public class ChannelAction extends Action {
|
abstract public class ChannelAction extends Action {
|
||||||
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ChannelAction.class);
|
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ChannelAction.class);
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 200);
|
|
||||||
protected WFCMessage.ChannelInfo channelInfo;
|
protected WFCMessage.ChannelInfo channelInfo;
|
||||||
|
|
||||||
protected interface Callback {
|
protected interface Callback {
|
||||||
@@ -61,7 +61,7 @@ abstract public class ChannelAction extends Action {
|
|||||||
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
|
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mLimitCounter.isGranted(cid)) {
|
if (!channelLimiter.isGranted(cid)) {
|
||||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,7 +84,7 @@ abstract public class ChannelAction extends Action {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtil.isNullOrEmpty(channelInfo.getSecret())) {
|
if (StringUtil.isNullOrEmpty(channelInfo.getSecret())) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
return ErrorCode.ERROR_CODE_CHANNEL_NO_SECRET;
|
||||||
}
|
}
|
||||||
|
|
||||||
String str = nonce + "|" + channelInfo.getSecret() + "|" + timestamp;
|
String str = nonce + "|" + channelInfo.getSecret() + "|" + timestamp;
|
||||||
@@ -107,7 +107,7 @@ abstract public class ChannelAction extends Action {
|
|||||||
if (request instanceof FullHttpRequest) {
|
if (request instanceof FullHttpRequest) {
|
||||||
FullHttpRequest fullHttpRequest = (FullHttpRequest) request;
|
FullHttpRequest fullHttpRequest = (FullHttpRequest) request;
|
||||||
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
|
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
|
||||||
String content = new String(bytes);
|
String content = new String(bytes, StandardCharsets.UTF_8);
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
T t = gson.fromJson(content, cls);
|
T t = gson.fromJson(content, cls);
|
||||||
return t;
|
return t;
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ import java.util.concurrent.Executor;
|
|||||||
|
|
||||||
abstract public class RobotAction extends Action {
|
abstract public class RobotAction extends Action {
|
||||||
protected static final Logger LOG = LoggerFactory.getLogger(RobotAction.class);
|
protected static final Logger LOG = LoggerFactory.getLogger(RobotAction.class);
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 1000);
|
|
||||||
|
|
||||||
protected WFCMessage.Robot robot;
|
protected WFCMessage.Robot robot;
|
||||||
|
|
||||||
@@ -64,7 +63,7 @@ abstract public class RobotAction extends Action {
|
|||||||
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
|
return ErrorCode.ERROR_CODE_API_NOT_SIGNED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!mLimitCounter.isGranted(rid)) {
|
if (!robotLimiter.isGranted(rid)) {
|
||||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ public final class BrokerConstants {
|
|||||||
public static final String HTTP_LOCAL_PORT = "local_port";
|
public static final String HTTP_LOCAL_PORT = "local_port";
|
||||||
|
|
||||||
public static final String HTTP_ADMIN_PORT = "http.admin.port";
|
public static final String HTTP_ADMIN_PORT = "http.admin.port";
|
||||||
public static final String NODE_ID = "node_id";
|
|
||||||
public static final String NODE_IDS = "node_ids";
|
|
||||||
public static final String DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME = "moquette_store.mapdb";
|
public static final String DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME = "moquette_store.mapdb";
|
||||||
public static final String DEFAULT_PERSISTENT_PATH = System.getProperty("user.dir") + File.separator
|
public static final String DEFAULT_PERSISTENT_PATH = System.getProperty("user.dir") + File.separator
|
||||||
+ DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME;
|
+ DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME;
|
||||||
@@ -106,11 +104,6 @@ public final class BrokerConstants {
|
|||||||
public static final String CHATROOM_INFO_UPDATE_CALLBACK = "chatroom.chatroom_info_update_callback";
|
public static final String CHATROOM_INFO_UPDATE_CALLBACK = "chatroom.chatroom_info_update_callback";
|
||||||
public static final String CHATROOM_MEMBER_UPDATE_CALLBACK = "chatroom.chatroom_member_update_callback";
|
public static final String CHATROOM_MEMBER_UPDATE_CALLBACK = "chatroom.chatroom_member_update_callback";
|
||||||
|
|
||||||
|
|
||||||
public static final String HZ_Cluster_Node_External_IP = "node_external_ip";
|
|
||||||
public static final String HZ_Cluster_Node_External_Long_Port = "node_external_long_port";
|
|
||||||
public static final String HZ_Cluster_Node_External_Short_Port = "node_external_short_port";
|
|
||||||
public static final String HZ_Cluster_Node_ID = "node_id";
|
|
||||||
public static final String HTTP_SERVER_SECRET_KEY = "http.admin.secret_key";
|
public static final String HTTP_SERVER_SECRET_KEY = "http.admin.secret_key";
|
||||||
public static final String HTTP_SERVER_API_NO_CHECK_TIME = "http.admin.no_check_time";
|
public static final String HTTP_SERVER_API_NO_CHECK_TIME = "http.admin.no_check_time";
|
||||||
|
|
||||||
@@ -138,6 +131,7 @@ public final class BrokerConstants {
|
|||||||
|
|
||||||
public static final String MESSAGE_ROAMING = "message.roaming";
|
public static final String MESSAGE_ROAMING = "message.roaming";
|
||||||
public static final String MESSAGE_Remote_History_Message = "message.remote_history_message";
|
public static final String MESSAGE_Remote_History_Message = "message.remote_history_message";
|
||||||
|
public static final String MESSAGE_Remote_Chatroom_History_Message = "message.chatroom_remote_history_message";
|
||||||
|
|
||||||
public static final String MESSAGE_Max_Queue = "message.max_queue";
|
public static final String MESSAGE_Max_Queue = "message.max_queue";
|
||||||
|
|
||||||
@@ -178,6 +172,10 @@ public final class BrokerConstants {
|
|||||||
public static final String MESSAGES_RECALL_TIME_LIMIT = "message.recall_time_limit";
|
public static final String MESSAGES_RECALL_TIME_LIMIT = "message.recall_time_limit";
|
||||||
public static final String MESSAGES_DISABLE_GROUP_MANAGER_RECALL = "message.disable_group_manager_recall";
|
public static final String MESSAGES_DISABLE_GROUP_MANAGER_RECALL = "message.disable_group_manager_recall";
|
||||||
|
|
||||||
|
public static final String HTTP_ADMIN_RATE_LIMIT = "http.admin.rate_limit";
|
||||||
|
public static final String HTTP_ROBOT_RATE_LIMIT = "http.robot.rate_limit";
|
||||||
|
public static final String HTTP_CHANNEL_RATE_LIMIT = "http.channel.rate_limit";
|
||||||
|
public static final String CLIENT_REQUEST_RATE_LIMIT = "client.request_rate_limit";
|
||||||
|
|
||||||
private BrokerConstants() {
|
private BrokerConstants() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public class DestroyUserHandler extends IMHandler<WFCMessage.IDBuf> {
|
|||||||
m_messagesStore.clearUserGroups(fromUser);
|
m_messagesStore.clearUserGroups(fromUser);
|
||||||
m_messagesStore.clearUserChannels(fromUser);
|
m_messagesStore.clearUserChannels(fromUser);
|
||||||
m_messagesStore.destoryUser(fromUser);
|
m_messagesStore.destoryUser(fromUser);
|
||||||
|
|
||||||
|
m_messagesStore.destroyRobot(fromUser);
|
||||||
});
|
});
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* 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 io.moquette.imhandler;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.hazelcast.util.StringUtil;
|
||||||
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Handler(value = IMTopic.ClearSessionTopic)
|
||||||
|
public class DisconnectHandler extends IMHandler<Byte> {
|
||||||
|
@Override
|
||||||
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, Byte request, Qos1PublishHandler.IMCallback callback) {
|
||||||
|
if (request == 8) {
|
||||||
|
m_sessionsStore.cleanSession(fromUser, clientID);
|
||||||
|
} else if(request == 1) {
|
||||||
|
m_sessionsStore.disableSession(fromUser, clientID);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-2
@@ -17,8 +17,8 @@ import win.liyufan.im.IMTopic;
|
|||||||
import static win.liyufan.im.IMTopic.PutUserSettingTopic;
|
import static win.liyufan.im.IMTopic.PutUserSettingTopic;
|
||||||
import static win.liyufan.im.UserSettingScope.kUserSettingMyChannels;
|
import static win.liyufan.im.UserSettingScope.kUserSettingMyChannels;
|
||||||
|
|
||||||
@Handler(value = IMTopic.DestoryChannelInfoTopic)
|
@Handler(value = IMTopic.DestroyChannelInfoTopic)
|
||||||
public class DistoryChannelHandler extends GroupHandler<WFCMessage.IDBuf> {
|
public class DistroyChannelHandler extends GroupHandler<WFCMessage.IDBuf> {
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
|
||||||
ErrorCode errorCode = m_messagesStore.distoryChannel(fromUser, request.getId());
|
ErrorCode errorCode = m_messagesStore.distoryChannel(fromUser, request.getId());
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
package io.moquette.imhandler;
|
package io.moquette.imhandler;
|
||||||
|
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.hutool.system.UserInfo;
|
||||||
import io.moquette.persistence.MemorySessionStore;
|
import io.moquette.persistence.MemorySessionStore;
|
||||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
import io.moquette.spi.impl.security.TokenAuthenticator;
|
import io.moquette.spi.impl.security.TokenAuthenticator;
|
||||||
@@ -21,6 +22,11 @@ public class GetTokenHandler extends IMHandler<WFCMessage.GetTokenRequest> {
|
|||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||||
MemorySessionStore.Session session = m_sessionsStore.updateOrCreateUserSession(fromUser, clientID, request.getPlatform());
|
MemorySessionStore.Session session = m_sessionsStore.updateOrCreateUserSession(fromUser, clientID, request.getPlatform());
|
||||||
|
WFCMessage.User userInfo = m_messagesStore.getUserInfo(fromUser);
|
||||||
|
if(userInfo != null && userInfo.getType() == 1) {
|
||||||
|
return ErrorCode.ERROR_CODE_ROBOT_NO_TOKEN;
|
||||||
|
}
|
||||||
|
|
||||||
TokenAuthenticator authenticator = new TokenAuthenticator();
|
TokenAuthenticator authenticator = new TokenAuthenticator();
|
||||||
String strToken = authenticator.generateToken(fromUser);
|
String strToken = authenticator.generateToken(fromUser);
|
||||||
String result = strToken + "|" + session.getSecret() + "|" + session.getDbSecret();
|
String result = strToken + "|" + session.getSecret() + "|" + session.getDbSecret();
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import win.liyufan.im.I18n;
|
|||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
import win.liyufan.im.MessageShardingUtil;
|
import win.liyufan.im.MessageShardingUtil;
|
||||||
|
|
||||||
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
||||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
|
||||||
@Handler(IMTopic.HandleFriendRequestTopic)
|
@Handler(IMTopic.HandleFriendRequestTopic)
|
||||||
@@ -57,8 +58,7 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
builder.setFromUser(request.getTargetUid());
|
builder.setFromUser(request.getTargetUid());
|
||||||
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||||
builder.setContent(contentBuilder);
|
builder.setContent(contentBuilder);
|
||||||
timestamp = System.currentTimeMillis();
|
builder.setServerTimestamp(++timestamp);
|
||||||
builder.setServerTimestamp(timestamp);
|
|
||||||
|
|
||||||
messageId = MessageShardingUtil.generateId();
|
messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
@@ -73,10 +73,8 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
builder.setContent(contentBuilder);
|
builder.setContent(contentBuilder);
|
||||||
messageId = MessageShardingUtil.generateId();
|
messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
timestamp = System.currentTimeMillis();
|
builder.setServerTimestamp(++timestamp);
|
||||||
builder.setServerTimestamp(timestamp);
|
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
@@ -86,6 +84,10 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(errorCode == ERROR_CODE_ALREADY_FRIENDS) {
|
||||||
|
errorCode = ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
return errorCode;
|
return errorCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import java.util.*;
|
|||||||
|
|
||||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
import static io.moquette.BrokerConstants.CLIENT_REQUEST_RATE_LIMIT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 请求处理接口<br>
|
* 请求处理接口<br>
|
||||||
@@ -52,7 +53,7 @@ abstract public class IMHandler<T> {
|
|||||||
protected static Server mServer = null;
|
protected static Server mServer = null;
|
||||||
protected static MessagesPublisher publisher;
|
protected static MessagesPublisher publisher;
|
||||||
private static ThreadPoolExecutorWrapper m_imBusinessExecutor;
|
private static ThreadPoolExecutorWrapper m_imBusinessExecutor;
|
||||||
private static final RateLimiter mLimitCounter = new RateLimiter(5, 100);
|
private static RateLimiter mLimitCounter;
|
||||||
private Method parseDataMethod;
|
private Method parseDataMethod;
|
||||||
private Class dataCls;
|
private Class dataCls;
|
||||||
|
|
||||||
@@ -147,12 +148,24 @@ abstract public class IMHandler<T> {
|
|||||||
publisher = p;
|
publisher = p;
|
||||||
m_imBusinessExecutor = businessExecutor;
|
m_imBusinessExecutor = businessExecutor;
|
||||||
mServer = server;
|
mServer = server;
|
||||||
|
int clientRateLimit = 100;
|
||||||
|
try {
|
||||||
|
clientRateLimit = Integer.parseInt(server.getConfig().getProperty(CLIENT_REQUEST_RATE_LIMIT, "100"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(clientRateLimit == 0) {
|
||||||
|
clientRateLimit = 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
mLimitCounter = new RateLimiter(5, clientRateLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ErrorCode preAction(String clientID, String fromUser, String topic, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode preAction(String clientID, String fromUser, String topic, Qos1PublishHandler.IMCallback callback, boolean isAdmin, boolean isRobotOrChannel) {
|
||||||
LOG.info("imHandler fromUser={}, clientId={}, topic={}", fromUser, clientID, topic);
|
LOG.info("imHandler fromUser={}, clientId={}, topic={}", fromUser, clientID, topic);
|
||||||
if(!mLimitCounter.isGranted(clientID + fromUser + topic)) {
|
if(!isAdmin && !isRobotOrChannel && !mLimitCounter.isGranted(clientID + fromUser + topic)) {
|
||||||
ByteBuf ackPayload = Unpooled.buffer();
|
ByteBuf ackPayload = Unpooled.buffer();
|
||||||
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_OVER_FREQUENCY.getCode());
|
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_OVER_FREQUENCY.getCode());
|
||||||
try {
|
try {
|
||||||
@@ -166,7 +179,7 @@ abstract public class IMHandler<T> {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void doHandler(String clientID, String fromUser, String topic, byte[] payloadContent, Qos1PublishHandler.IMCallback callback, boolean isAdmin) {
|
public void doHandler(String clientID, String fromUser, String topic, byte[] payloadContent, Qos1PublishHandler.IMCallback callback, boolean isAdmin, boolean isRobotOrChannel) {
|
||||||
m_imBusinessExecutor.execute(() -> {
|
m_imBusinessExecutor.execute(() -> {
|
||||||
Qos1PublishHandler.IMCallback callbackWrapper = new Qos1PublishHandler.IMCallback() {
|
Qos1PublishHandler.IMCallback callbackWrapper = new Qos1PublishHandler.IMCallback() {
|
||||||
@Override
|
@Override
|
||||||
@@ -177,7 +190,7 @@ abstract public class IMHandler<T> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ErrorCode preActionCode = preAction(clientID, fromUser, topic, callbackWrapper);
|
ErrorCode preActionCode = preAction(clientID, fromUser, topic, callbackWrapper, isAdmin, isRobotOrChannel);
|
||||||
|
|
||||||
if (preActionCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (preActionCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
ByteBuf ackPayload = Unpooled.buffer(1);
|
ByteBuf ackPayload = Unpooled.buffer(1);
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public class LoadRemoteMessagesHandler extends IMHandler<WFCMessage.LoadRemoteMe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
WFCMessage.PullMessageResult result = m_messagesStore.loadRemoteMessages(fromUser, request.getConversation(), beforeUid, request.getCount());
|
WFCMessage.PullMessageResult result = m_messagesStore.loadRemoteMessages(fromUser, request.getConversation(), beforeUid, request.getCount(), request.getContentTypeList());
|
||||||
byte[] data = result.toByteArray();
|
byte[] data = result.toByteArray();
|
||||||
LOG.info("User {} load message with count({}), payload size({})", fromUser, result.getMessageCount(), data.length);
|
LOG.info("User {} load message with count({}), payload size({})", fromUser, result.getMessageCount(), data.length);
|
||||||
ackPayload.ensureWritable(data.length).writeBytes(data);
|
ackPayload.ensureWritable(data.length).writeBytes(data);
|
||||||
|
|||||||
@@ -17,10 +17,6 @@ import io.netty.buffer.ByteBuf;
|
|||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
import static io.moquette.BrokerConstants.HZ_Cluster_Node_External_IP;
|
|
||||||
import static io.moquette.BrokerConstants.HZ_Cluster_Node_External_Long_Port;
|
|
||||||
import static io.moquette.BrokerConstants.HZ_Cluster_Node_External_Short_Port;
|
|
||||||
|
|
||||||
@Handler(IMTopic.RouteTopic)
|
@Handler(IMTopic.RouteTopic)
|
||||||
public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
|
public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
|
||||||
@Override
|
@Override
|
||||||
@@ -38,10 +34,9 @@ public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
|
|||||||
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
Member member = mServer.getHazelcastInstance().getCluster().getLocalMember();
|
String serverIp = mServer.getServerIp();
|
||||||
String serverIp = member.getStringAttribute(HZ_Cluster_Node_External_IP);
|
String longPort = mServer.getLongPort();
|
||||||
String longPort = member.getStringAttribute(HZ_Cluster_Node_External_Long_Port);
|
String shortPort = mServer.getShortPort();
|
||||||
String shortPort = member.getStringAttribute(HZ_Cluster_Node_External_Short_Port);
|
|
||||||
|
|
||||||
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
|
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
|
||||||
boolean isSessionAlreadyStored = clientSession != null;
|
boolean isSessionAlreadyStored = clientSession != null;
|
||||||
|
|||||||
@@ -784,13 +784,13 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<WFCMessage.Message> loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count) {
|
List<WFCMessage.Message> loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count, Collection<Integer> contentTypes, String channelOwner) {
|
||||||
List<WFCMessage.Message> messages = new ArrayList<>();
|
List<WFCMessage.Message> messages = new ArrayList<>();
|
||||||
long[] before = new long[1];
|
long[] before = new long[1];
|
||||||
before[0] = beforeUid;
|
before[0] = beforeUid;
|
||||||
boolean hasMore = loadRemoteMessagesFromTable(user, conversation, before, count, MessageShardingUtil.getMessageTable(beforeUid), messages);
|
boolean hasMore = loadRemoteMessagesFromTable(user, conversation, before, count, MessageShardingUtil.getMessageTable(beforeUid), messages, contentTypes, channelOwner);
|
||||||
while (messages.size() < count && hasMore) {
|
while (messages.size() < count && hasMore) {
|
||||||
hasMore = loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), MessageShardingUtil.getMessageTable(beforeUid), messages);
|
hasMore = loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), MessageShardingUtil.getMessageTable(beforeUid), messages, contentTypes, channelOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
int month = 0;
|
int month = 0;
|
||||||
@@ -800,7 +800,7 @@ public class DatabaseStore {
|
|||||||
int size = messages.size();
|
int size = messages.size();
|
||||||
hasMore = true;
|
hasMore = true;
|
||||||
while (size == messages.size() && hasMore) {
|
while (size == messages.size() && hasMore) {
|
||||||
hasMore = loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), nexTable, messages);
|
hasMore = loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), nexTable, messages, contentTypes, channelOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size < messages.size()) {
|
if (size < messages.size()) {
|
||||||
@@ -811,16 +811,32 @@ public class DatabaseStore {
|
|||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long[] before, int count, String table, List<WFCMessage.Message> messages) {
|
boolean loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long[] before, int count, String table, List<WFCMessage.Message> messages, Collection<Integer> contentTypes, String channelOwner) {
|
||||||
long beforeUid = before[0];
|
long beforeUid = before[0];
|
||||||
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt`, `_to` from " + table +" where";
|
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt`, `_to` from " + table +" where";
|
||||||
if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
|
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
|
||||||
|
} else if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Channel && !user.equals(channelOwner)) {
|
||||||
|
sql += " _type = ? and _line = ? and _mid < ? and _target = ? and ((_from = ? and (_to = '' or _to = ?)) or (_from = ?))";
|
||||||
} else {
|
} else {
|
||||||
sql += " _type = ? and _line = ? and _mid < ? and _target = ?";
|
sql += " _type = ? and _line = ? and _mid < ? and _target = ?";
|
||||||
}
|
}
|
||||||
|
|
||||||
sql += "order by `_mid` DESC limit ?";
|
if(contentTypes != null && !contentTypes.isEmpty()) {
|
||||||
|
sql += " and _content_type in (";
|
||||||
|
boolean first = true;
|
||||||
|
for (int i:contentTypes) {
|
||||||
|
if(first) {
|
||||||
|
first = false;
|
||||||
|
} else {
|
||||||
|
sql += ",";
|
||||||
|
}
|
||||||
|
sql += i;
|
||||||
|
}
|
||||||
|
sql += ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
sql += " order by `_mid` DESC limit ?";
|
||||||
|
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -837,7 +853,12 @@ public class DatabaseStore {
|
|||||||
statement.setString(index++, user);
|
statement.setString(index++, user);
|
||||||
statement.setString(index++, user);
|
statement.setString(index++, user);
|
||||||
statement.setString(index++, conversation.getTarget());
|
statement.setString(index++, conversation.getTarget());
|
||||||
|
} else if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Channel && !user.equals(channelOwner)) {
|
||||||
|
statement.setString(index++, channelOwner);
|
||||||
|
statement.setString(index++, user);
|
||||||
|
statement.setString(index++, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
statement.setInt(index++, count);
|
statement.setInt(index++, count);
|
||||||
resultSet = statement.executeQuery();
|
resultSet = statement.executeQuery();
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
@@ -893,20 +914,21 @@ public class DatabaseStore {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void persistUserMessage(final String userId, final long messageId, final long messageSeq) {
|
void persistUserMessage(final String userId, final long messageId, final long messageSeq, final int messageContentType) {
|
||||||
mScheduler.execute(()->{
|
mScheduler.execute(()->{
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
String sql = "insert into " + getUserMessageTable(userId) + " (`_mid`, `_uid`, `_seq`) values(?, ?, ?)";
|
String sql = "insert into " + getUserMessageTable(userId) + " (`_mid`, `_uid`, `_seq`, `_cont_type`) values(?, ?, ?, ?)";
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
int index = 1;
|
int index = 1;
|
||||||
statement.setLong(index++, messageId);
|
statement.setLong(index++, messageId);
|
||||||
statement.setString(index++, userId);
|
statement.setString(index++, userId);
|
||||||
statement.setLong(index++, messageSeq);
|
statement.setLong(index++, messageSeq);
|
||||||
|
statement.setInt(index++, messageContentType);
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private static boolean IS_MESSAGE_ROAMING = true;
|
private static boolean IS_MESSAGE_ROAMING = true;
|
||||||
|
|
||||||
private static boolean IS_MESSAGE_REMOTE_HISTORY_MESSAGE = true;
|
private static boolean IS_MESSAGE_REMOTE_HISTORY_MESSAGE = true;
|
||||||
|
private static boolean IS_CHATROOM_MESSAGE_REMOTE_HISTORY_MESSAGE = true;
|
||||||
|
|
||||||
static final String USER_ROBOTS = "user_robots";
|
static final String USER_ROBOTS = "user_robots";
|
||||||
static final String USER_THINGS = "user_things";
|
static final String USER_THINGS = "user_things";
|
||||||
@@ -167,6 +168,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
IS_MESSAGE_ROAMING = "1".equals(m_Server.getConfig().getProperty(MESSAGE_ROAMING));
|
IS_MESSAGE_ROAMING = "1".equals(m_Server.getConfig().getProperty(MESSAGE_ROAMING));
|
||||||
IS_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_History_Message));
|
IS_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_History_Message));
|
||||||
|
IS_CHATROOM_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_Chatroom_History_Message, "1"));
|
||||||
Constants.MAX_MESSAGE_QUEUE = Integer.parseInt(m_Server.getConfig().getProperty(MESSAGE_Max_Queue));
|
Constants.MAX_MESSAGE_QUEUE = Integer.parseInt(m_Server.getConfig().getProperty(MESSAGE_Max_Queue));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -730,18 +732,36 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count) {
|
public WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count, Collection<Integer> contentTypes) {
|
||||||
WFCMessage.PullMessageResult.Builder builder = WFCMessage.PullMessageResult.newBuilder();
|
WFCMessage.PullMessageResult.Builder builder = WFCMessage.PullMessageResult.newBuilder();
|
||||||
List<WFCMessage.Message> messages;
|
List<WFCMessage.Message> messages;
|
||||||
if (IS_MESSAGE_REMOTE_HISTORY_MESSAGE) {
|
boolean loadMessage = IS_MESSAGE_REMOTE_HISTORY_MESSAGE;
|
||||||
messages = databaseStore.loadRemoteMessages(user, conversation, beforeUid, count);
|
if(conversation.getType() == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
|
||||||
} else {
|
loadMessage = IS_CHATROOM_MESSAGE_REMOTE_HISTORY_MESSAGE;
|
||||||
messages = new ArrayList<>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String channelOwner = null;
|
||||||
|
if(conversation.getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||||
|
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
|
||||||
|
WFCMessage.ChannelInfo info = mIMap.get(conversation.getTarget());
|
||||||
|
if(info == null) {
|
||||||
|
loadMessage = false;
|
||||||
|
} else {
|
||||||
|
channelOwner = info.getOwner();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loadMessage) {
|
||||||
|
messages = databaseStore.loadRemoteMessages(user, conversation, beforeUid, count, contentTypes, channelOwner);
|
||||||
|
} else {
|
||||||
|
messages = new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
builder.setCurrent(0).setHead(0);
|
builder.setCurrent(0).setHead(0);
|
||||||
if(messages != null) {
|
if(messages != null) {
|
||||||
builder.addAllMessage(messages);
|
builder.addAllMessage(messages);
|
||||||
}
|
}
|
||||||
|
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -862,7 +882,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
mWriteLock.unlock();
|
mWriteLock.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
databaseStore.persistUserMessage(user, messageId, messageSeq);
|
databaseStore.persistUserMessage(user, messageId, messageSeq, messageContentType);
|
||||||
return messageSeq;
|
return messageSeq;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1062,7 +1082,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.type = type;
|
event.type = type;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mGroupInfoUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mGroupInfoUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_Grout_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1081,7 +1101,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.value = value;
|
event.value = value;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mGroupMemberUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mGroupMemberUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_Grout_Member_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1099,7 +1119,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.value = value;
|
event.value = value;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mRelationUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mRelationUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_User_Relation_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1112,7 +1132,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (!StringUtil.isNullOrEmpty(mUserInfoUpdateCallback)) {
|
if (!StringUtil.isNullOrEmpty(mUserInfoUpdateCallback)) {
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mUserInfoUpdateCallback, new Gson().toJson(InputOutputUserInfo.fromPbUser(user)));
|
HttpUtils.httpJsonPost(mUserInfoUpdateCallback, new Gson().toJson(InputOutputUserInfo.fromPbUser(user)), HttpUtils.HttpPostType.POST_TYPE_User_Info_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1129,7 +1149,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.type = type;
|
event.type = type;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mChannelInfoUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mChannelInfoUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_Channel_Info_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1145,7 +1165,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.type = type;
|
event.type = type;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mChatroomInfoUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mChatroomInfoUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_Chatroom_Info_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -1163,7 +1183,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
event.type = type;
|
event.type = type;
|
||||||
m_Server.getCallbackScheduler().execute(() -> {
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mChatroomMemberUpdateCallback, new Gson().toJson(event));
|
HttpUtils.httpJsonPost(mChatroomMemberUpdateCallback, new Gson().toJson(event), HttpUtils.HttpPostType.POST_TYPE_Chatroom_Member_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -2125,6 +2145,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
mUserMap.put(robot.getUid(), robot);
|
mUserMap.put(robot.getUid(), robot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroyRobot(String robotId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
IMap<String, WFCMessage.Robot> mUserMap = hzInstance.getMap(ROBOTS);
|
||||||
|
mUserMap.remove(robotId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
|
public ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
|
||||||
@@ -2588,10 +2614,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
if (tokenUserId != null) {
|
if (tokenUserId != null) {
|
||||||
if (tokenUserId.equals(userId)) {
|
if (tokenUserId.equals(userId)) {
|
||||||
Member member = m_Server.getHazelcastInstance().getCluster().getLocalMember();
|
String serverIp = m_Server.getServerIp();
|
||||||
String serverIp = member.getStringAttribute(HZ_Cluster_Node_External_IP);
|
String longPort = m_Server.getLongPort();
|
||||||
String longPort = member.getStringAttribute(HZ_Cluster_Node_External_Long_Port);
|
String shortPort = m_Server.getShortPort();
|
||||||
String shortPort = member.getStringAttribute(HZ_Cluster_Node_External_Short_Port);
|
|
||||||
if (!StringUtil.isNullOrEmpty(serverIp)) {
|
if (!StringUtil.isNullOrEmpty(serverIp)) {
|
||||||
serverIPs.add(serverIp);
|
serverIPs.add(serverIp);
|
||||||
}
|
}
|
||||||
@@ -2819,6 +2844,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (friendData1 != null && friendData1.getState() == 0) {
|
||||||
|
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
||||||
|
}
|
||||||
|
|
||||||
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
|
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.setFromUid(userId)
|
.setFromUid(userId)
|
||||||
@@ -2856,7 +2885,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
public ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin) {
|
public ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
|
||||||
|
boolean alreadyFriend = false;
|
||||||
if(!isAdmin && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
if(!isAdmin && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
@@ -2868,10 +2897,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
for (FriendData fd : friends) {
|
for (FriendData fd : friends) {
|
||||||
if (fd.getFriendUid().equals(request.getTargetUid())) {
|
if (fd.getFriendUid().equals(request.getTargetUid())) {
|
||||||
if (fd.getState() == 0) {
|
if (fd.getState() == 0) {
|
||||||
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
alreadyFriend = true;
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2950,7 +2978,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existRequest != null) {
|
if (existRequest != null) {
|
||||||
if (mFriendRequestExpiration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestExpiration) {
|
if (!alreadyFriend && mFriendRequestExpiration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestExpiration) {
|
||||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_EXPIRED;
|
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_EXPIRED;
|
||||||
} else {
|
} else {
|
||||||
existRequest = existRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(System.currentTimeMillis()).build();
|
existRequest = existRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(System.currentTimeMillis()).build();
|
||||||
@@ -2976,7 +3004,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted){
|
if(!alreadyFriend && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted){
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), 0, 0, System.currentTimeMillis());
|
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), 0, 0, System.currentTimeMillis());
|
||||||
databaseStore.persistOrUpdateFriendData(friendData1);
|
databaseStore.persistOrUpdateFriendData(friendData1);
|
||||||
@@ -2997,6 +3025,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
callbackRelationEvent(userId, request.getTargetUid(), 0, "1");
|
callbackRelationEvent(userId, request.getTargetUid(), 0, "1");
|
||||||
}
|
}
|
||||||
|
if(alreadyFriend) {
|
||||||
|
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
||||||
|
}
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import com.hazelcast.config.FileSystemXmlConfig;
|
|||||||
import com.hazelcast.core.*;
|
import com.hazelcast.core.*;
|
||||||
import com.xiaoleilu.loServer.LoServer;
|
import com.xiaoleilu.loServer.LoServer;
|
||||||
import com.xiaoleilu.loServer.ServerSetting;
|
import com.xiaoleilu.loServer.ServerSetting;
|
||||||
|
import com.xiaoleilu.loServer.action.Action;
|
||||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||||
import io.moquette.BrokerConstants;
|
import io.moquette.BrokerConstants;
|
||||||
import io.moquette.persistence.*;
|
import io.moquette.persistence.*;
|
||||||
@@ -257,6 +258,7 @@ public class Server {
|
|||||||
|
|
||||||
initMediaServerConfig(config);
|
initMediaServerConfig(config);
|
||||||
|
|
||||||
|
Action.init(config);
|
||||||
String monitorEventAddress = config.getProperty(MONITOR_Exception_Event_Address);
|
String monitorEventAddress = config.getProperty(MONITOR_Exception_Event_Address);
|
||||||
Utility.setMonitorEventAddress(monitorEventAddress);
|
Utility.setMonitorEventAddress(monitorEventAddress);
|
||||||
|
|
||||||
@@ -354,23 +356,31 @@ public class Server {
|
|||||||
MediaServerConfig.FILE_STROAGE_REMOTE_SERVER_URL = config.getProperty(FILE_STORAGE_REMOTE_SERVER_URL);
|
MediaServerConfig.FILE_STROAGE_REMOTE_SERVER_URL = config.getProperty(FILE_STORAGE_REMOTE_SERVER_URL);
|
||||||
|
|
||||||
MediaServerConfig.USER_QINIU = Integer.parseInt(config.getProperty(BrokerConstants.USER_QINIU)) > 0;
|
MediaServerConfig.USER_QINIU = Integer.parseInt(config.getProperty(BrokerConstants.USER_QINIU)) > 0;
|
||||||
|
if(MediaServerConfig.USER_QINIU) {
|
||||||
|
if(MediaServerConfig.QINIU_SERVER_URL.split(":").length == 2) {
|
||||||
|
String error = "媒体存储服务只能填上Host,不能带端口";
|
||||||
|
System.out.println(error);
|
||||||
|
LOG.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getServerIp(IConfig config) {
|
private String getServerIp(IConfig config) {
|
||||||
String serverIp = config.getProperty(BrokerConstants.SERVER_IP_PROPERTY_NAME);
|
String serverIp = config.getProperty(BrokerConstants.SERVER_IP_PROPERTY_NAME);
|
||||||
|
|
||||||
if (serverIp == null || serverIp.equals("0.0.0.0")) {
|
if (serverIp == null || serverIp.equals("0.0.0.0")) {
|
||||||
|
String warning = "警告:无效配置,server.ip不能为空,需要配置服务的公网IP地址或者域名才能在公网使用!!!\nIM服务将使用本地地址,只能在局域网内使用!";
|
||||||
|
System.out.println(warning);
|
||||||
|
LOG.error(warning);
|
||||||
serverIp = Utility.getLocalAddress().getHostAddress();
|
serverIp = Utility.getLocalAddress().getHostAddress();
|
||||||
}
|
}
|
||||||
return serverIp;
|
return serverIp;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean configureCluster(IConfig config) throws FileNotFoundException {
|
private boolean configureCluster(IConfig config) throws FileNotFoundException {
|
||||||
LOG.info("Configuring embedded Hazelcast instance");
|
LOG.info("Configuring embedded Hazelcast instance");
|
||||||
String serverIp = getServerIp(config);
|
|
||||||
|
|
||||||
|
serverIp = getServerIp(config);
|
||||||
String hzConfigPath = "config/hazelcast.xml";
|
String hzConfigPath = "config/hazelcast.xml";
|
||||||
String hzClientIp = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_IP, "localhost");
|
|
||||||
String hzClientPort = config.getProperty(BrokerConstants.HAZELCAST_CLIENT_PORT, "5703");
|
|
||||||
|
|
||||||
if (hzConfigPath != null) {
|
if (hzConfigPath != null) {
|
||||||
boolean isHzConfigOnClasspath = this.getClass().getClassLoader().getResource(hzConfigPath) != null;
|
boolean isHzConfigOnClasspath = this.getClass().getClassLoader().getResource(hzConfigPath) != null;
|
||||||
Config hzconfig = isHzConfigOnClasspath
|
Config hzconfig = isHzConfigOnClasspath
|
||||||
@@ -383,29 +393,10 @@ public class Server {
|
|||||||
hazelcastInstance = Hazelcast.newHazelcastInstance();
|
hazelcastInstance = Hazelcast.newHazelcastInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
longPort = config.getProperty(BrokerConstants.PORT_PROPERTY_NAME);
|
||||||
|
shortPort = config.getProperty(BrokerConstants.HTTP_SERVER_PORT);
|
||||||
|
|
||||||
String longPort = config.getProperty(BrokerConstants.PORT_PROPERTY_NAME);
|
MessageShardingUtil.setNodeId(1);
|
||||||
String shortPort = config.getProperty(BrokerConstants.HTTP_SERVER_PORT);
|
|
||||||
String nodeIdStr = config.getProperty(BrokerConstants.NODE_ID);
|
|
||||||
ISet<Integer> nodeIdSet = hazelcastInstance.getSet(BrokerConstants.NODE_IDS);
|
|
||||||
int nodeId;
|
|
||||||
try {
|
|
||||||
nodeId = Integer.parseInt(nodeIdStr);
|
|
||||||
}catch (Exception e){
|
|
||||||
throw new IllegalArgumentException("nodeId error: " + nodeIdStr);
|
|
||||||
}
|
|
||||||
if (nodeIdSet != null && nodeIdSet.contains(nodeId)){
|
|
||||||
LOG.error("只允许一个实例运行,多个实例会引起冲突,进程终止");
|
|
||||||
System.exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
MessageShardingUtil.setNodeId(nodeId);
|
|
||||||
nodeIdSet.add(nodeId);
|
|
||||||
|
|
||||||
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_Long_Port, longPort);
|
|
||||||
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_Short_Port, shortPort);
|
|
||||||
hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId);
|
|
||||||
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp);
|
|
||||||
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
||||||
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
|
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
|
||||||
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
|
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
|
||||||
@@ -419,6 +410,22 @@ public class Server {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String serverIp;
|
||||||
|
private String longPort;
|
||||||
|
private String shortPort;
|
||||||
|
|
||||||
|
public String getServerIp() {
|
||||||
|
return serverIp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLongPort() {
|
||||||
|
return longPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getShortPort() {
|
||||||
|
return shortPort;
|
||||||
|
}
|
||||||
|
|
||||||
public HazelcastInstance getHazelcastInstance() {
|
public HazelcastInstance getHazelcastInstance() {
|
||||||
return hazelcastInstance;
|
return hazelcastInstance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ public interface IMessagesStore {
|
|||||||
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
|
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
|
||||||
Set<String> getAllEnds();
|
Set<String> getAllEnds();
|
||||||
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
||||||
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
|
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count, Collection<Integer> contentTypes);
|
||||||
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId);
|
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId);
|
||||||
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin);
|
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin);
|
||||||
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra);
|
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra);
|
||||||
@@ -133,6 +133,7 @@ public interface IMessagesStore {
|
|||||||
|
|
||||||
WFCMessage.Robot getRobot(String robotId);
|
WFCMessage.Robot getRobot(String robotId);
|
||||||
void addRobot(WFCMessage.Robot robot);
|
void addRobot(WFCMessage.Robot robot);
|
||||||
|
void destroyRobot(String robotId);
|
||||||
|
|
||||||
ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
||||||
|
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ public class MessagesPublisher {
|
|||||||
final WFCMessage.Message finalMsg = message;
|
final WFCMessage.Message finalMsg = message;
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(SendMessageData.fromProtoMessage(finalMsg), SendMessageData.class));
|
HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(SendMessageData.fromProtoMessage(finalMsg), SendMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Robot_Message_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -598,7 +598,7 @@ public class MessagesPublisher {
|
|||||||
if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(SendMessageData.fromProtoMessage(message), SendMessageData.class));
|
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(SendMessageData.fromProtoMessage(message), SendMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Channel_Message_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -645,7 +645,7 @@ public class MessagesPublisher {
|
|||||||
public void forwardMessage(final WFCMessage.Message message, String forwardUrl) {
|
public void forwardMessage(final WFCMessage.Message message, String forwardUrl) {
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class));
|
HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class), HttpUtils.HttpPostType.POST_TYPE_Forward_Message_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -669,7 +669,7 @@ public class MessagesPublisher {
|
|||||||
callback.onFailure(statusCode, errorMessage);
|
callback.onFailure(statusCode, errorMessage);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}, HttpUtils.HttpPostType.POST_TYPE_Forward_Message_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
@@ -683,7 +683,7 @@ public class MessagesPublisher {
|
|||||||
|
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/subscribe", new Gson().toJson(new OutputNotifyChannelSubscribeStatus(user, channelInfo.getTargetId(), listen), OutputNotifyChannelSubscribeStatus.class));
|
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/subscribe", new Gson().toJson(new OutputNotifyChannelSubscribeStatus(user, channelInfo.getTargetId(), listen), OutputNotifyChannelSubscribeStatus.class), HttpUtils.HttpPostType.POST_TYPE_Channel_Subscriber_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
|
|||||||
@@ -264,7 +264,7 @@ public class ProtocolProcessor {
|
|||||||
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
|
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
|
||||||
mServer.getCallbackScheduler().execute(() -> {
|
mServer.getCallbackScheduler().execute(() -> {
|
||||||
try {
|
try {
|
||||||
HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName)));
|
HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName)), HttpUtils.HttpPostType.POST_TYPE_User_Online_Event_Callback);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
|
|||||||
@@ -69,7 +69,6 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
private final MessagesPublisher publisher;
|
private final MessagesPublisher publisher;
|
||||||
private final ISessionsStore m_sessionStore;
|
private final ISessionsStore m_sessionStore;
|
||||||
private final ThreadPoolExecutorWrapper m_imBusinessExecutor;
|
private final ThreadPoolExecutorWrapper m_imBusinessExecutor;
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(5, 100);
|
|
||||||
|
|
||||||
private HashMap<String, IMHandler> m_imHandlers = new HashMap<>();
|
private HashMap<String, IMHandler> m_imHandlers = new HashMap<>();
|
||||||
|
|
||||||
@@ -148,19 +147,6 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
|
|
||||||
void imHandler(String clientID, String fromUser, String topic, byte[] payloadContent, IMCallback callback, boolean isAdmin, boolean isRobotOrChannel) {
|
void imHandler(String clientID, String fromUser, String topic, byte[] payloadContent, IMCallback callback, boolean isAdmin, boolean isRobotOrChannel) {
|
||||||
LOG.info("imHandler fromUser={}, topic={}", fromUser, topic);
|
LOG.info("imHandler fromUser={}, topic={}", fromUser, topic);
|
||||||
if(!isAdmin && !isRobotOrChannel && !mLimitCounter.isGranted(clientID + fromUser + topic)) {
|
|
||||||
ByteBuf ackPayload = Unpooled.buffer();
|
|
||||||
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_OVER_FREQUENCY.getCode());
|
|
||||||
try {
|
|
||||||
callback.onIMHandled(ERROR_CODE_OVER_FREQUENCY, ackPayload);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
Utility.printExecption(LOG, e);
|
|
||||||
}
|
|
||||||
LOG.warn("user {} request over frequency", fromUser);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
IMCallback wrapper = (errorcode, ackPayload) -> {
|
IMCallback wrapper = (errorcode, ackPayload) -> {
|
||||||
ackPayload.resetReaderIndex();
|
ackPayload.resetReaderIndex();
|
||||||
byte code = ackPayload.readByte();
|
byte code = ackPayload.readByte();
|
||||||
@@ -215,7 +201,7 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
|
|
||||||
IMHandler handler = m_imHandlers.get(topic);
|
IMHandler handler = m_imHandlers.get(topic);
|
||||||
if (handler != null) {
|
if (handler != null) {
|
||||||
handler.doHandler(clientID, fromUser, topic, payloadContent, wrapper, isAdmin);
|
handler.doHandler(clientID, fromUser, topic, payloadContent, wrapper, isAdmin, isRobotOrChannel);
|
||||||
} else {
|
} else {
|
||||||
LOG.error("imHandler unknown topic={}", topic);
|
LOG.error("imHandler unknown topic={}", topic);
|
||||||
ByteBuf ackPayload = Unpooled.buffer();
|
ByteBuf ackPayload = Unpooled.buffer();
|
||||||
|
|||||||
@@ -54,6 +54,9 @@ public class DBUtil {
|
|||||||
if (embedDB != null && embedDB.equals("1")) {
|
if (embedDB != null && embedDB.equals("1")) {
|
||||||
IsEmbedDB = true;
|
IsEmbedDB = true;
|
||||||
LOG.info("Use h2 database");
|
LOG.info("Use h2 database");
|
||||||
|
String warning = "您正在使用内置h2数据库,建议仅在开发验证或者用户数小于100人时才使用此数据库,其它情况建议使用MySQL。";
|
||||||
|
System.out.println(warning);
|
||||||
|
LOG.warn(warning);
|
||||||
} else {
|
} else {
|
||||||
IsEmbedDB = false;
|
IsEmbedDB = false;
|
||||||
LOG.info("Use mysql database");
|
LOG.info("Use mysql database");
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package win.liyufan.im;
|
package win.liyufan.im;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import okhttp3.*;
|
import okhttp3.*;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
@@ -35,11 +36,28 @@ public class HttpUtils {
|
|||||||
void onFailure(int statusCode, String errorMessage);
|
void onFailure(int statusCode, String errorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void httpJsonPost(final String url, final String jsonStr) {
|
public enum HttpPostType {
|
||||||
httpJsonPost(url, jsonStr, null);
|
POST_TYPE_Push,
|
||||||
|
POST_TYPE_Grout_Event_Callback,
|
||||||
|
POST_TYPE_Grout_Member_Event_Callback,
|
||||||
|
POST_TYPE_User_Relation_Event_Callback,
|
||||||
|
POST_TYPE_User_Info_Event_Callback,
|
||||||
|
POST_TYPE_Channel_Info_Event_Callback,
|
||||||
|
POST_TYPE_Channel_Subscriber_Event_Callback,
|
||||||
|
POST_TYPE_Chatroom_Info_Event_Callback,
|
||||||
|
POST_TYPE_Chatroom_Member_Event_Callback,
|
||||||
|
POST_TYPE_Robot_Message_Callback,
|
||||||
|
POST_TYPE_Channel_Message_Callback,
|
||||||
|
POST_TYPE_Forward_Message_Callback,
|
||||||
|
POST_TYPE_User_Online_Event_Callback,
|
||||||
|
POST_TYPE_Server_Exception_Callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void httpJsonPost(final String url, final String jsonStr, final HttpCallback httpCallback) {
|
public static void httpJsonPost(String url, String jsonStr, HttpPostType postType) {
|
||||||
|
httpJsonPost(url, jsonStr, null, postType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void httpJsonPost(String url, String jsonStr, HttpCallback httpCallback, HttpPostType postType) {
|
||||||
//消息推送内容为 {"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"}
|
//消息推送内容为 {"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个字符,防止敏感信息打印到日志中去。
|
//推送信息只打印前100个字符,防止敏感信息打印到日志中去。
|
||||||
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
|
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
|
||||||
@@ -56,7 +74,20 @@ public class HttpUtils {
|
|||||||
client.newCall(request).enqueue(new Callback() {
|
client.newCall(request).enqueue(new Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Call call, IOException e) {
|
public void onFailure(Call call, IOException e) {
|
||||||
|
String logText;
|
||||||
|
if(postType == HttpPostType.POST_TYPE_Push) {
|
||||||
|
logText = "Http请求到推送服务失败,请检查推送服务是否正在运行或者配置文件中推送服务地址是否正确。";
|
||||||
|
} else if(postType == HttpPostType.POST_TYPE_Robot_Message_Callback) {
|
||||||
|
logText = "Http请求转发消息到机器人服务失败,请检查机器人服务是否部署且在机器人信息中的回调地址是否正确。\n如果不需要机器人及机器人服务,请关掉应用服务中自动添加机器人好友和发送机器人欢迎语的代码,用户不给机器人发送消息就不会有转发请求了。";
|
||||||
|
} else if(postType == HttpPostType.POST_TYPE_Channel_Message_Callback ||
|
||||||
|
postType == HttpPostType.POST_TYPE_Channel_Subscriber_Event_Callback) {
|
||||||
|
logText = "Http请求到频道服务失败,请检查频道服务是否部署且在频道信息中的回调地址是否正确。";
|
||||||
|
} else {
|
||||||
|
logText = "Http请求回调地址失败,请检查IM服务配置文件中对应的回调地址是否正确";
|
||||||
|
}
|
||||||
|
System.out.println(logText);
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
LOG.info(logText);
|
||||||
LOG.info("POST to {} with data {} failure", url, jsonStr);
|
LOG.info("POST to {} with data {} failure", url, jsonStr);
|
||||||
if(httpCallback != null) {
|
if(httpCallback != null) {
|
||||||
httpCallback.onFailure(-1, e.getMessage());
|
httpCallback.onFailure(-1, e.getMessage());
|
||||||
@@ -88,5 +119,4 @@ public class HttpUtils {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public interface IMTopic {
|
|||||||
String CreateChannelTopic = "CHC";
|
String CreateChannelTopic = "CHC";
|
||||||
String ModifyChannelInfoTopic = "CHMI";
|
String ModifyChannelInfoTopic = "CHMI";
|
||||||
String TransferChannelInfoTopic = "CHT";
|
String TransferChannelInfoTopic = "CHT";
|
||||||
String DestoryChannelInfoTopic = "CHD";
|
String DestroyChannelInfoTopic = "CHD";
|
||||||
String ChannelSearchTopic = "CHS";
|
String ChannelSearchTopic = "CHS";
|
||||||
String ChannelListenTopic = "CHL";
|
String ChannelListenTopic = "CHL";
|
||||||
String ChannelPullTopic = "CHP";
|
String ChannelPullTopic = "CHP";
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class Utility {
|
|||||||
for (Map.Entry<String, IMExceptionEvent> entry : exceptionEventHashMap.entrySet()) {
|
for (Map.Entry<String, IMExceptionEvent> entry : exceptionEventHashMap.entrySet()) {
|
||||||
if(entry.getValue().count > 0) {
|
if(entry.getValue().count > 0) {
|
||||||
String jsonStr = new Gson().toJson(entry.getValue());
|
String jsonStr = new Gson().toJson(entry.getValue());
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr));
|
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr, HttpUtils.HttpPostType.POST_TYPE_Server_Exception_Callback));
|
||||||
entry.getValue().count = 0;
|
entry.getValue().count = 0;
|
||||||
lastSendTime = now;
|
lastSendTime = now;
|
||||||
}
|
}
|
||||||
@@ -112,7 +112,7 @@ public class Utility {
|
|||||||
event.call_stack = "别担心!这个是心跳消息,已经有24小时没有出现异常消息了!";
|
event.call_stack = "别担心!这个是心跳消息,已经有24小时没有出现异常消息了!";
|
||||||
event.count = IMExceptionEvent.EventType.HEART_BEAT;
|
event.count = IMExceptionEvent.EventType.HEART_BEAT;
|
||||||
String jsonStr = new Gson().toJson(event);
|
String jsonStr = new Gson().toJson(event);
|
||||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr));
|
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr, HttpUtils.HttpPostType.POST_TYPE_Server_Exception_Callback));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.72</version>
|
<version>0.77</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -69,6 +69,8 @@ public interface APIPath {
|
|||||||
String Group_Set_Member_Extra = "/admin/group/member/set_extra";
|
String Group_Set_Member_Extra = "/admin/group/member/set_extra";
|
||||||
|
|
||||||
String Create_Channel = "/admin/channel/create";
|
String Create_Channel = "/admin/channel/create";
|
||||||
|
String Destroy_Channel = "/admin/channel/destroy";
|
||||||
|
String Get_Channel_Info = "/admin/channel/get";
|
||||||
String Get_System_Setting = "/admin/system/get_setting";
|
String Get_System_Setting = "/admin/system/get_setting";
|
||||||
String Put_System_Setting = "/admin/system/put_setting";
|
String Put_System_Setting = "/admin/system/put_setting";
|
||||||
|
|
||||||
|
|||||||
@@ -43,8 +43,13 @@ public enum ErrorCode {
|
|||||||
ERROR_CODE_ALREADY_FRIENDS(23, "already friends"),
|
ERROR_CODE_ALREADY_FRIENDS(23, "already friends"),
|
||||||
|
|
||||||
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
|
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
|
||||||
|
ERROR_CODE_LOCK_ALREADY_LOCKED(25, "already locked"),
|
||||||
|
ERROR_CODE_NOT_YOUR_LOCKED(26, "unload failure, not your lock"),
|
||||||
|
ERROR_CODE_ROBOT_NO_TOKEN(27, "robot no token"),
|
||||||
|
ERROR_CODE_WS_NOT_CONFIGURED_CORRECTLY(28, "ws not configured correctly"),
|
||||||
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
||||||
|
|
||||||
|
ERROR_CODE_CHANNEL_NO_SECRET(237, "channel no secret"),
|
||||||
ERROR_CODE_USER_NOT_PREPARED(238, "user not prepared"),
|
ERROR_CODE_USER_NOT_PREPARED(238, "user not prepared"),
|
||||||
ERROR_CODE_API_NOT_SIGNED(239, "api not signed or sign parameter not completion"),
|
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_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
public class InputChannelId {
|
||||||
|
public String channelId;
|
||||||
|
|
||||||
|
public InputChannelId() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputChannelId(String channelId) {
|
||||||
|
this.channelId = channelId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,6 +18,9 @@ public class OutputGetChannelInfo {
|
|||||||
private String portrait;
|
private String portrait;
|
||||||
private String extra;
|
private String extra;
|
||||||
private String owner;
|
private String owner;
|
||||||
|
private int state;
|
||||||
|
//此字段已经废弃,为了兼容旧的SDK版本,以后会移除
|
||||||
|
@Deprecated()
|
||||||
private int status;
|
private int status;
|
||||||
private long updateDt;
|
private long updateDt;
|
||||||
private String callback;
|
private String callback;
|
||||||
@@ -72,12 +75,12 @@ public class OutputGetChannelInfo {
|
|||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getStatus() {
|
public int getState() {
|
||||||
return status;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(int status) {
|
public void setState(int state) {
|
||||||
this.status = status;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getUpdateDt() {
|
public long getUpdateDt() {
|
||||||
@@ -104,6 +107,14 @@ public class OutputGetChannelInfo {
|
|||||||
this.automatic = automatic;
|
this.automatic = automatic;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(int status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
|
||||||
public static OutputGetChannelInfo fromPbInfo(WFCMessage.ChannelInfo channelInfo) {
|
public static OutputGetChannelInfo fromPbInfo(WFCMessage.ChannelInfo channelInfo) {
|
||||||
OutputGetChannelInfo out = new OutputGetChannelInfo();
|
OutputGetChannelInfo out = new OutputGetChannelInfo();
|
||||||
out.automatic = channelInfo.getAutomatic();
|
out.automatic = channelInfo.getAutomatic();
|
||||||
@@ -114,7 +125,8 @@ public class OutputGetChannelInfo {
|
|||||||
out.name = channelInfo.getName();
|
out.name = channelInfo.getName();
|
||||||
out.owner = channelInfo.getOwner();
|
out.owner = channelInfo.getOwner();
|
||||||
out.portrait = channelInfo.getPortrait();
|
out.portrait = channelInfo.getPortrait();
|
||||||
out.status = channelInfo.getStatus();
|
out.state = channelInfo.getStatus();
|
||||||
|
out.status = out.state;
|
||||||
out.updateDt = channelInfo.getUpdateDt();
|
out.updateDt = channelInfo.getUpdateDt();
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59417,6 +59417,20 @@ public final class WFCMessage {
|
|||||||
* <code>required int32 count = 3;</code>
|
* <code>required int32 count = 3;</code>
|
||||||
*/
|
*/
|
||||||
int getCount();
|
int getCount();
|
||||||
|
|
||||||
|
// repeated int32 content_type = 4;
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
java.util.List<java.lang.Integer> getContentTypeList();
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
int getContentTypeCount();
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
int getContentType(int index);
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Protobuf type {@code LoadRemoteMessages}
|
* Protobuf type {@code LoadRemoteMessages}
|
||||||
@@ -59492,6 +59506,27 @@ public final class WFCMessage {
|
|||||||
count_ = input.readInt32();
|
count_ = input.readInt32();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 32: {
|
||||||
|
if (!((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
|
||||||
|
contentType_ = new java.util.ArrayList<java.lang.Integer>();
|
||||||
|
mutable_bitField0_ |= 0x00000008;
|
||||||
|
}
|
||||||
|
contentType_.add(input.readInt32());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 34: {
|
||||||
|
int length = input.readRawVarint32();
|
||||||
|
int limit = input.pushLimit(length);
|
||||||
|
if (!((mutable_bitField0_ & 0x00000008) == 0x00000008) && input.getBytesUntilLimit() > 0) {
|
||||||
|
contentType_ = new java.util.ArrayList<java.lang.Integer>();
|
||||||
|
mutable_bitField0_ |= 0x00000008;
|
||||||
|
}
|
||||||
|
while (input.getBytesUntilLimit() > 0) {
|
||||||
|
contentType_.add(input.readInt32());
|
||||||
|
}
|
||||||
|
input.popLimit(limit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||||
@@ -59500,6 +59535,9 @@ public final class WFCMessage {
|
|||||||
throw new com.google.protobuf.InvalidProtocolBufferException(
|
throw new com.google.protobuf.InvalidProtocolBufferException(
|
||||||
e.getMessage()).setUnfinishedMessage(this);
|
e.getMessage()).setUnfinishedMessage(this);
|
||||||
} finally {
|
} finally {
|
||||||
|
if (((mutable_bitField0_ & 0x00000008) == 0x00000008)) {
|
||||||
|
contentType_ = java.util.Collections.unmodifiableList(contentType_);
|
||||||
|
}
|
||||||
this.unknownFields = unknownFields.build();
|
this.unknownFields = unknownFields.build();
|
||||||
makeExtensionsImmutable();
|
makeExtensionsImmutable();
|
||||||
}
|
}
|
||||||
@@ -59586,10 +59624,34 @@ public final class WFCMessage {
|
|||||||
return count_;
|
return count_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// repeated int32 content_type = 4;
|
||||||
|
public static final int CONTENT_TYPE_FIELD_NUMBER = 4;
|
||||||
|
private java.util.List<java.lang.Integer> contentType_;
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public java.util.List<java.lang.Integer>
|
||||||
|
getContentTypeList() {
|
||||||
|
return contentType_;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public int getContentTypeCount() {
|
||||||
|
return contentType_.size();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public int getContentType(int index) {
|
||||||
|
return contentType_.get(index);
|
||||||
|
}
|
||||||
|
|
||||||
private void initFields() {
|
private void initFields() {
|
||||||
conversation_ = cn.wildfirechat.proto.WFCMessage.Conversation.getDefaultInstance();
|
conversation_ = cn.wildfirechat.proto.WFCMessage.Conversation.getDefaultInstance();
|
||||||
beforeUid_ = 0L;
|
beforeUid_ = 0L;
|
||||||
count_ = 0;
|
count_ = 0;
|
||||||
|
contentType_ = java.util.Collections.emptyList();
|
||||||
}
|
}
|
||||||
private byte memoizedIsInitialized = -1;
|
private byte memoizedIsInitialized = -1;
|
||||||
public final boolean isInitialized() {
|
public final boolean isInitialized() {
|
||||||
@@ -59628,6 +59690,9 @@ public final class WFCMessage {
|
|||||||
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
||||||
output.writeInt32(3, count_);
|
output.writeInt32(3, count_);
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < contentType_.size(); i++) {
|
||||||
|
output.writeInt32(4, contentType_.get(i));
|
||||||
|
}
|
||||||
getUnknownFields().writeTo(output);
|
getUnknownFields().writeTo(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59649,6 +59714,15 @@ public final class WFCMessage {
|
|||||||
size += com.google.protobuf.CodedOutputStream
|
size += com.google.protobuf.CodedOutputStream
|
||||||
.computeInt32Size(3, count_);
|
.computeInt32Size(3, count_);
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
int dataSize = 0;
|
||||||
|
for (int i = 0; i < contentType_.size(); i++) {
|
||||||
|
dataSize += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeInt32SizeNoTag(contentType_.get(i));
|
||||||
|
}
|
||||||
|
size += dataSize;
|
||||||
|
size += 1 * getContentTypeList().size();
|
||||||
|
}
|
||||||
size += getUnknownFields().getSerializedSize();
|
size += getUnknownFields().getSerializedSize();
|
||||||
memoizedSerializedSize = size;
|
memoizedSerializedSize = size;
|
||||||
return size;
|
return size;
|
||||||
@@ -59776,6 +59850,8 @@ public final class WFCMessage {
|
|||||||
bitField0_ = (bitField0_ & ~0x00000002);
|
bitField0_ = (bitField0_ & ~0x00000002);
|
||||||
count_ = 0;
|
count_ = 0;
|
||||||
bitField0_ = (bitField0_ & ~0x00000004);
|
bitField0_ = (bitField0_ & ~0x00000004);
|
||||||
|
contentType_ = java.util.Collections.emptyList();
|
||||||
|
bitField0_ = (bitField0_ & ~0x00000008);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59820,6 +59896,11 @@ public final class WFCMessage {
|
|||||||
to_bitField0_ |= 0x00000004;
|
to_bitField0_ |= 0x00000004;
|
||||||
}
|
}
|
||||||
result.count_ = count_;
|
result.count_ = count_;
|
||||||
|
if (((bitField0_ & 0x00000008) == 0x00000008)) {
|
||||||
|
contentType_ = java.util.Collections.unmodifiableList(contentType_);
|
||||||
|
bitField0_ = (bitField0_ & ~0x00000008);
|
||||||
|
}
|
||||||
|
result.contentType_ = contentType_;
|
||||||
result.bitField0_ = to_bitField0_;
|
result.bitField0_ = to_bitField0_;
|
||||||
onBuilt();
|
onBuilt();
|
||||||
return result;
|
return result;
|
||||||
@@ -59845,6 +59926,16 @@ public final class WFCMessage {
|
|||||||
if (other.hasCount()) {
|
if (other.hasCount()) {
|
||||||
setCount(other.getCount());
|
setCount(other.getCount());
|
||||||
}
|
}
|
||||||
|
if (!other.contentType_.isEmpty()) {
|
||||||
|
if (contentType_.isEmpty()) {
|
||||||
|
contentType_ = other.contentType_;
|
||||||
|
bitField0_ = (bitField0_ & ~0x00000008);
|
||||||
|
} else {
|
||||||
|
ensureContentTypeIsMutable();
|
||||||
|
contentType_.addAll(other.contentType_);
|
||||||
|
}
|
||||||
|
onChanged();
|
||||||
|
}
|
||||||
this.mergeUnknownFields(other.getUnknownFields());
|
this.mergeUnknownFields(other.getUnknownFields());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -60071,6 +60162,72 @@ public final class WFCMessage {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// repeated int32 content_type = 4;
|
||||||
|
private java.util.List<java.lang.Integer> contentType_ = java.util.Collections.emptyList();
|
||||||
|
private void ensureContentTypeIsMutable() {
|
||||||
|
if (!((bitField0_ & 0x00000008) == 0x00000008)) {
|
||||||
|
contentType_ = new java.util.ArrayList<java.lang.Integer>(contentType_);
|
||||||
|
bitField0_ |= 0x00000008;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public java.util.List<java.lang.Integer>
|
||||||
|
getContentTypeList() {
|
||||||
|
return java.util.Collections.unmodifiableList(contentType_);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public int getContentTypeCount() {
|
||||||
|
return contentType_.size();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public int getContentType(int index) {
|
||||||
|
return contentType_.get(index);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public Builder setContentType(
|
||||||
|
int index, int value) {
|
||||||
|
ensureContentTypeIsMutable();
|
||||||
|
contentType_.set(index, value);
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public Builder addContentType(int value) {
|
||||||
|
ensureContentTypeIsMutable();
|
||||||
|
contentType_.add(value);
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public Builder addAllContentType(
|
||||||
|
java.lang.Iterable<? extends java.lang.Integer> values) {
|
||||||
|
ensureContentTypeIsMutable();
|
||||||
|
super.addAll(values, contentType_);
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>repeated int32 content_type = 4;</code>
|
||||||
|
*/
|
||||||
|
public Builder clearContentType() {
|
||||||
|
contentType_ = java.util.Collections.emptyList();
|
||||||
|
bitField0_ = (bitField0_ & ~0x00000008);
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
// @@protoc_insertion_point(builder_scope:LoadRemoteMessages)
|
// @@protoc_insertion_point(builder_scope:LoadRemoteMessages)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62158,14 +62315,15 @@ public final class WFCMessage {
|
|||||||
"t\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_port" +
|
"t\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_port" +
|
||||||
"\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 \002" +
|
"\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 \002" +
|
||||||
"(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"" +
|
"(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"" +
|
||||||
"\\\n\022LoadRemoteMessages\022#\n\014conversation\030\001 " +
|
"r\n\022LoadRemoteMessages\022#\n\014conversation\030\001 " +
|
||||||
"\002(\0132\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r" +
|
"\002(\0132\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r" +
|
||||||
"\n\005count\030\003 \002(\005\"a\n\020MultiCastMessage\022\021\n\tfro",
|
"\n\005count\030\003 \002(\005\022\024\n\014content_type\030\004 \003(\005\"a\n\020M",
|
||||||
"m_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.MessageC" +
|
"ultiCastMessage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007co" +
|
||||||
"ontent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005\"E\n\035Reca" +
|
"ntent\030\002 \002(\0132\017.MessageContent\022\n\n\002to\030\003 \003(\t" +
|
||||||
"llMultiCastMessageRequest\022\022\n\nmessage_id\030" +
|
"\022\014\n\004line\030\004 \002(\005\"E\n\035RecallMultiCastMessage" +
|
||||||
"\001 \002(\003\022\020\n\010receiver\030\002 \003(\tB#\n\025cn.wildfirech" +
|
"Request\022\022\n\nmessage_id\030\001 \002(\003\022\020\n\010receiver\030" +
|
||||||
"at.protoB\nWFCMessage"
|
"\002 \003(\tB#\n\025cn.wildfirechat.protoB\nWFCMessa" +
|
||||||
|
"ge"
|
||||||
};
|
};
|
||||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||||
@@ -62591,7 +62749,7 @@ public final class WFCMessage {
|
|||||||
internal_static_LoadRemoteMessages_fieldAccessorTable = new
|
internal_static_LoadRemoteMessages_fieldAccessorTable = new
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||||
internal_static_LoadRemoteMessages_descriptor,
|
internal_static_LoadRemoteMessages_descriptor,
|
||||||
new java.lang.String[] { "Conversation", "BeforeUid", "Count", });
|
new java.lang.String[] { "Conversation", "BeforeUid", "Count", "ContentType", });
|
||||||
internal_static_MultiCastMessage_descriptor =
|
internal_static_MultiCastMessage_descriptor =
|
||||||
getDescriptor().getMessageTypes().get(70);
|
getDescriptor().getMessageTypes().get(70);
|
||||||
internal_static_MultiCastMessage_fieldAccessorTable = new
|
internal_static_MultiCastMessage_fieldAccessorTable = new
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!--<relativePath>../pom.xml</relativePath>-->
|
<!--<relativePath>../pom.xml</relativePath>-->
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.72</version>
|
<version>0.77</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>distribution</artifactId>
|
<artifactId>distribution</artifactId>
|
||||||
|
|||||||
@@ -60,6 +60,9 @@ message.remote_history_message 0
|
|||||||
##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。
|
##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。
|
||||||
message.max_queue 1024
|
message.max_queue 1024
|
||||||
|
|
||||||
|
##是否开启拉取聊天室远程历史消息。如果为1,可以下拉继续加载在服务器上的该聊天室的消息;如果为0则不能。默认为1
|
||||||
|
message.chatroom_remote_history_message 1
|
||||||
|
|
||||||
##是否禁止陌生人聊天
|
##是否禁止陌生人聊天
|
||||||
message.disable_stranger_chat false
|
message.disable_stranger_chat false
|
||||||
|
|
||||||
@@ -106,7 +109,7 @@ friend.disable_search false
|
|||||||
##禁止按照昵称搜索用户。
|
##禁止按照昵称搜索用户。
|
||||||
friend.disable_nick_name_search false
|
friend.disable_nick_name_search false
|
||||||
|
|
||||||
##禁止发送好友邀请,通过server api添加好友不受此限制
|
##禁止发送好友邀请,通过server api添加好友不受此限制(force参数需要为true)
|
||||||
friend.disable_friend_request false
|
friend.disable_friend_request false
|
||||||
|
|
||||||
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
|
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
|
||||||
@@ -150,6 +153,20 @@ group.visible_quit_or_kickoff_notification 0
|
|||||||
# 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。
|
# 因此需要分段多次同步,此开关定义了每次同步的数据的条数。此需要客户端支持,客户端SDK在2021.5.25日后支持此功能。如果确认所有客户端都在这个日志之后才可以打开此设置。
|
||||||
#sync.data_part_size 1000
|
#sync.data_part_size 1000
|
||||||
|
|
||||||
|
#*********************************************************************
|
||||||
|
# 限频配置
|
||||||
|
#*********************************************************************
|
||||||
|
##API接口限频设置,时间是10秒内允许的请求次数。
|
||||||
|
##管理api频率限制,默认是10秒10000次。
|
||||||
|
http.admin.rate_limit 10000
|
||||||
|
##机器人api频率限制,默认是10秒1000次,按照机器人ID区分。
|
||||||
|
http.robot.rate_limit 1000
|
||||||
|
##频道api频率限制,默认是10秒1000次,按照频道ID区分。
|
||||||
|
http.channel.rate_limit 1000
|
||||||
|
|
||||||
|
##客户端请求频率限制,默认是5秒100次。通常情况下不要修改这个值。
|
||||||
|
client.request_rate_limit 100
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# hazelcase configuration
|
# hazelcase configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
@@ -159,7 +176,8 @@ hazelcast.configuration config/hazelcast.xml
|
|||||||
# Media server configuration
|
# Media server configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||||
##配置使用七牛请参考:https://docs.wildfirechat.cn/server/media_server.html
|
##专业版另外支持阿里云存储和野火私有存储,关于野火私有存储请参考:https://github.com/wildfirechat/WF-minio
|
||||||
|
##关于对象存储的详细信息请参考:https://docs.wildfirechat.cn/server/oss.html
|
||||||
media.server.use_qiniu 0
|
media.server.use_qiniu 0
|
||||||
|
|
||||||
##媒体类型分类
|
##媒体类型分类
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>0.72</version>
|
<version>0.77</version>
|
||||||
<name>Wildfire Chat</name>
|
<name>Wildfire Chat</name>
|
||||||
<description>Wildfire Chat Server</description>
|
<description>Wildfire Chat Server</description>
|
||||||
<inceptionYear>2019</inceptionYear>
|
<inceptionYear>2019</inceptionYear>
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.72</version>
|
<version>0.77</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,18 @@ public class GeneralAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
|
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<Void> destroyChannel(String channelId) throws Exception {
|
||||||
|
String path = APIPath.Destroy_Channel;
|
||||||
|
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, inputChannelId, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IMResult<OutputGetChannelInfo> getChannelInfo(String channelId) throws Exception {
|
||||||
|
String path = APIPath.Get_Channel_Info;
|
||||||
|
InputChannelId inputChannelId = new InputChannelId(channelId);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, inputChannelId, OutputGetChannelInfo.class);
|
||||||
|
}
|
||||||
|
|
||||||
//以下仅专业版支持
|
//以下仅专业版支持
|
||||||
public static IMResult<Void> setConversationTop(String userId, int conversationType, String target, int line, boolean isTop) throws Exception {
|
public static IMResult<Void> setConversationTop(String userId, int conversationType, String target, int line, boolean isTop) throws Exception {
|
||||||
String key = conversationType + "-" + line + "-" + target;
|
String key = conversationType + "-" + line + "-" + target;
|
||||||
|
|||||||
@@ -15,10 +15,18 @@ import java.util.Date;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import static cn.wildfirechat.pojos.MyInfoType.Modify_DisplayName;
|
import static cn.wildfirechat.pojos.MyInfoType.Modify_DisplayName;
|
||||||
|
import static cn.wildfirechat.proto.ProtoConstants.ChannelState.*;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_Member_Count;
|
import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_Member_Count;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
private static boolean commercialServer = false;
|
private static boolean commercialServer = false;
|
||||||
|
//管理端口是8080
|
||||||
|
private static String AdminUrl = "http://localhost:18080";
|
||||||
|
private static String AdminSecret = "123456";
|
||||||
|
|
||||||
|
//机器人和频道使用IM服务的公开端口80,注意不是18080
|
||||||
|
private static String IMUrl = "http://localhost";
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
|
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
|
||||||
@@ -32,7 +40,7 @@ public class Main {
|
|||||||
|
|
||||||
static void testAdmin() throws Exception {
|
static void testAdmin() throws Exception {
|
||||||
//初始化服务API
|
//初始化服务API
|
||||||
AdminConfig.initAdmin("http://localhost:18080", "123456");
|
AdminConfig.initAdmin(AdminUrl, AdminSecret);
|
||||||
|
|
||||||
testUser();
|
testUser();
|
||||||
testUserRelation();
|
testUserRelation();
|
||||||
@@ -84,7 +92,13 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IMResult<Void> destroyResult = UserAdmin.destroyRobot("robot1");
|
||||||
|
if(destroyResult != null && destroyResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("success");
|
||||||
|
} else {
|
||||||
|
System.out.println("destroy user failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
IMResult<InputOutputUserInfo> resultGetUserInfo1 = UserAdmin.getUserByName(userInfo.getName());
|
IMResult<InputOutputUserInfo> resultGetUserInfo1 = UserAdmin.getUserByName(userInfo.getName());
|
||||||
if (resultGetUserInfo1 != null && resultGetUserInfo1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultGetUserInfo1 != null && resultGetUserInfo1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
@@ -292,7 +306,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
IMResult<Void> result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello", true);
|
IMResult<Void> result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello", true);
|
||||||
if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (result != null && (result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || result.getErrorCode() == ErrorCode.ERROR_CODE_ALREADY_FRIENDS)) {
|
||||||
System.out.println("send friend request success");
|
System.out.println("send friend request success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("failure");
|
System.out.println("failure");
|
||||||
@@ -308,7 +322,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello3", true);
|
result = RelationAdmin.sendFriendRequest("ff1", "ff2", "hello3", true);
|
||||||
if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (result != null && (result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || result.getErrorCode() == ErrorCode.ERROR_CODE_ALREADY_FRIENDS)) {
|
||||||
System.out.println("success");
|
System.out.println("success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("send friend request success");
|
System.out.println("send friend request success");
|
||||||
@@ -711,17 +725,46 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String channelName = "MyChannel";
|
||||||
|
String channelOwner = "user1";
|
||||||
InputCreateChannel inputCreateChannel = new InputCreateChannel();
|
InputCreateChannel inputCreateChannel = new InputCreateChannel();
|
||||||
inputCreateChannel.setName("MyChannel");
|
inputCreateChannel.setName(channelName);
|
||||||
inputCreateChannel.setOwner("user1");
|
inputCreateChannel.setOwner(channelOwner);
|
||||||
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
||||||
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("success");
|
System.out.println("success");
|
||||||
|
inputCreateChannel.setTargetId(resultCreateChannel.result.getTargetId());
|
||||||
} else {
|
} else {
|
||||||
System.out.println("create channel failure");
|
System.out.println("create channel failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IMResult<OutputGetChannelInfo> resultGetChannel = GeneralAdmin.getChannelInfo(inputCreateChannel.getTargetId());
|
||||||
|
if(resultGetChannel != null && resultGetChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS
|
||||||
|
&& resultGetChannel.getResult().getName().equals(channelName)
|
||||||
|
&& resultGetChannel.getResult().getOwner().equals(channelOwner)) {
|
||||||
|
System.out.println("success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get channel failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
IMResult<Void> voidIMResult = GeneralAdmin.destroyChannel(inputCreateChannel.getTargetId());
|
||||||
|
if(voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("success");
|
||||||
|
} else {
|
||||||
|
System.out.println("destroy channel failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
resultGetChannel = GeneralAdmin.getChannelInfo(inputCreateChannel.getTargetId());
|
||||||
|
if(resultGetChannel != null && resultGetChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && (resultGetChannel.getResult().getState() & ProtoConstants.ChannelState.Channel_State_Mask_Deleted) > 0) {
|
||||||
|
System.out.println("success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get channel failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
IMResult<HealthCheckResult> health = GeneralAdmin.healthCheck();
|
IMResult<HealthCheckResult> health = GeneralAdmin.healthCheck();
|
||||||
if(health != null && health.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if(health != null && health.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println(health.result);
|
System.out.println(health.result);
|
||||||
@@ -887,10 +930,27 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void testRobot() throws Exception {
|
static void testRobot() throws Exception {
|
||||||
//初始化机器人API,注意端口是80,不是18080
|
|
||||||
String robotId = "robot1";
|
String robotId = "robot1";
|
||||||
|
String robotSecret = "123456";
|
||||||
|
//初始化服务API
|
||||||
|
AdminConfig.initAdmin(AdminUrl, AdminSecret);
|
||||||
|
//创建机器人
|
||||||
|
InputCreateRobot createRobot = new InputCreateRobot();
|
||||||
|
createRobot.setUserId(robotId);
|
||||||
|
createRobot.setName(robotId);
|
||||||
|
createRobot.setDisplayName("机器人");
|
||||||
|
createRobot.setOwner("userId1");
|
||||||
|
createRobot.setSecret(robotSecret);
|
||||||
|
createRobot.setCallback("http://127.0.0.1:8883/robot/recvmsg");
|
||||||
|
IMResult<OutputCreateRobot> resultCreateRobot = UserAdmin.createRobot(createRobot);
|
||||||
|
if (resultCreateRobot != null && resultCreateRobot.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("Create robot " + resultCreateRobot.getResult().getUserId() + " success");
|
||||||
|
} else {
|
||||||
|
System.out.println("Create robot failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
RobotService robotService = new RobotService("http://localhost", robotId, "123456");
|
RobotService robotService = new RobotService(IMUrl, robotId, robotSecret);
|
||||||
|
|
||||||
//***********************************************
|
//***********************************************
|
||||||
//**** 机器人API
|
//**** 机器人API
|
||||||
@@ -1156,7 +1216,7 @@ public class Main {
|
|||||||
//***测试频道API功能,仅专业版支持***
|
//***测试频道API功能,仅专业版支持***
|
||||||
static void testChannel() throws Exception {
|
static void testChannel() throws Exception {
|
||||||
//初始化服务API
|
//初始化服务API
|
||||||
AdminConfig.initAdmin("http://localhost:18080", "123456");
|
AdminConfig.initAdmin(AdminUrl, AdminSecret);
|
||||||
|
|
||||||
//先创建3个用户
|
//先创建3个用户
|
||||||
InputOutputUserInfo userInfo = new InputOutputUserInfo();
|
InputOutputUserInfo userInfo = new InputOutputUserInfo();
|
||||||
@@ -1207,7 +1267,7 @@ public class Main {
|
|||||||
inputCreateChannel.setOwner("userId1");
|
inputCreateChannel.setOwner("userId1");
|
||||||
String secret = "channelsecret";
|
String secret = "channelsecret";
|
||||||
inputCreateChannel.setSecret(secret);
|
inputCreateChannel.setSecret(secret);
|
||||||
inputCreateChannel.setState(0xff);
|
inputCreateChannel.setState(Channel_State_Mask_FullInfo | Channel_State_Mask_Unsubscribed_User_Access | Channel_State_Mask_Active_Subscribe | Channel_State_Mask_Message_Unsubscribed);
|
||||||
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
||||||
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("create channel success");
|
System.out.println("create channel success");
|
||||||
@@ -1218,7 +1278,7 @@ public class Main {
|
|||||||
|
|
||||||
|
|
||||||
//2. 初始化api,注意端口是80,不是18080
|
//2. 初始化api,注意端口是80,不是18080
|
||||||
ChannelServiceApi channelServiceApi = new ChannelServiceApi("http://localhost", resultCreateChannel.getResult().getTargetId(), secret);
|
ChannelServiceApi channelServiceApi = new ChannelServiceApi(IMUrl, resultCreateChannel.getResult().getTargetId(), secret);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -42,6 +42,16 @@ public class UserAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);
|
return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
销毁机器人和销毁用户是同一个接口
|
||||||
|
*/
|
||||||
|
public static IMResult<Void> destroyRobot(String userId) throws Exception {
|
||||||
|
String path = APIPath.Destroy_User;
|
||||||
|
InputDestroyUser inputDestroyUser = new InputDestroyUser();
|
||||||
|
inputDestroyUser.setUserId(userId);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, inputDestroyUser, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
public static IMResult<OutputGetIMTokenData> getUserToken(String userId, String clientId, int platform) throws Exception {
|
public static IMResult<OutputGetIMTokenData> getUserToken(String userId, String clientId, int platform) throws Exception {
|
||||||
String path = APIPath.User_Get_Token;
|
String path = APIPath.User_Get_Token;
|
||||||
InputGetToken getToken = new InputGetToken(userId, clientId, platform);
|
InputGetToken getToken = new InputGetToken(userId, clientId, platform);
|
||||||
|
|||||||
Reference in New Issue
Block a user