Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
59cb884772 | ||
|
|
3d0a36b4f3 | ||
|
|
7923a3e0c4 | ||
|
|
e5a4aa4741 | ||
|
|
e76e8b38df | ||
|
|
5f7df37664 | ||
|
|
2c9e8d66e8 | ||
|
|
d7eddbf7b4 | ||
|
|
3b783fb72e | ||
|
|
4e9e87f113 | ||
|
|
0f0b3398d7 | ||
|
|
a725b507c7 | ||
|
|
46423a341d | ||
|
|
f70ae457af | ||
|
|
29b30cec28 | ||
|
|
fc05973b5d | ||
|
|
97a21ff201 | ||
|
|
0b90f0c56c | ||
|
|
07454aedce | ||
|
|
ee26284d39 | ||
|
|
99e24dca1c | ||
|
|
5dbfeaabf9 | ||
|
|
38595c06d8 | ||
|
|
e65e313ef3 | ||
|
|
4e5355af11 | ||
|
|
fa47de1904 | ||
|
|
4abf1ed941 | ||
|
|
9b0ca7ac3c | ||
|
|
772940e50d | ||
|
|
c63cc74028 | ||
|
|
76aff64a1b | ||
|
|
9502b01b49 | ||
|
|
5b476b205e | ||
|
|
d24d71d040 | ||
|
|
11b0e6454c | ||
|
|
31d69e78cf | ||
|
|
28b732788c | ||
|
|
2d1d5309bf | ||
|
|
6d9eeb25d6 | ||
|
|
32f63a7d9c | ||
|
|
4d903ca379 | ||
|
|
d233dbdd99 | ||
|
|
0f32aa30ce | ||
|
|
9e007185ba |
@@ -20,9 +20,6 @@ port 1883
|
||||
##客户端短链接端口
|
||||
http_port 80
|
||||
|
||||
##WEB客户端长链接端口
|
||||
websocket_port 8083
|
||||
|
||||
#管理端口
|
||||
http.admin.port 18080
|
||||
|
||||
@@ -38,6 +35,11 @@ local_port 80
|
||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
||||
embed.db 1
|
||||
|
||||
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
||||
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
||||
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
|
||||
db.auto_clean_history_messages true
|
||||
|
||||
##服务器管理接口密钥
|
||||
http.admin.secret_key 123456
|
||||
|
||||
@@ -46,9 +48,6 @@ http.admin.secret_key 123456
|
||||
##这个地方上线前要改为false
|
||||
http.admin.no_check_time true
|
||||
|
||||
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥对安全性帮助不大,客户不要修改
|
||||
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
|
||||
|
||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||
token.key testim
|
||||
|
||||
@@ -78,6 +77,10 @@ message.disable_remote_search false
|
||||
##允许客户端撤回消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
||||
message.recall_time_limit 120
|
||||
|
||||
## 禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
||||
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
||||
message.forbidden_client_send_types 3999,4000,4001
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -108,6 +111,18 @@ chatroom.participant_idle_time 900000
|
||||
## 用户向聊天室发送消息,自动加入聊天室
|
||||
chatroom.rejoin_when_active true
|
||||
|
||||
## 是否允许客户端发送操作群的自定义群通知消息
|
||||
group.allow_client_custom_operation_notification false
|
||||
|
||||
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
||||
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
||||
group.visible_quit_or_kickoff_notification 0
|
||||
|
||||
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
|
||||
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
|
||||
## 注意,修改本配置不会对已经同步的信息产生影响。
|
||||
#user.hide_properties 3,4,5
|
||||
|
||||
#*********************************************************************
|
||||
# hazelcase configuration
|
||||
#*********************************************************************
|
||||
@@ -166,6 +181,7 @@ server.multi_platform_notification false
|
||||
#*********************************************************************
|
||||
# Push server configuration
|
||||
#*********************************************************************
|
||||
##推送服务项目地址:https://github.com/wildfirechat/push_server。
|
||||
##安卓推送服务器地址
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.android.server.address http://localhost:8085/android/push
|
||||
@@ -174,6 +190,11 @@ push.android.server.address http://localhost:8085/android/push
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.ios.server.address http://localhost:8085/ios/push
|
||||
|
||||
#*********************************************************************
|
||||
# 监控配置
|
||||
#*********************************************************************
|
||||
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
||||
|
||||
#*********************************************************************
|
||||
# 各种事件回调
|
||||
#*********************************************************************
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
alter table `t_channel` modify column `_status` int(11) NOT NULL DEFAULT 0;
|
||||
@@ -0,0 +1 @@
|
||||
alter table `t_user_messages` ADD INDEX `user_messages_mid_index` ( `_mid`);
|
||||
@@ -0,0 +1 @@
|
||||
alter table `t_channel` modify column `_status` int(11) NOT NULL DEFAULT 0;
|
||||
+129
@@ -0,0 +1,129 @@
|
||||
alter table `t_user_messages` add INDEX `user_messages_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_0` add INDEX `user_messages0_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_1` add INDEX `user_messages1_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_2` add INDEX `user_messages2_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_3` add INDEX `user_messages3_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_4` add INDEX `user_messages4_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_5` add INDEX `user_messages5_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_6` add INDEX `user_messages6_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_7` add INDEX `user_messages7_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_8` add INDEX `user_messages8_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_9` add INDEX `user_messages9_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_10` add INDEX `user_messages10_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_11` add INDEX `user_messages11_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_12` add INDEX `user_messages12_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_13` add INDEX `user_messages13_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_14` add INDEX `user_messages14_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_15` add INDEX `user_messages15_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_16` add INDEX `user_messages16_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_17` add INDEX `user_messages17_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_18` add INDEX `user_messages18_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_19` add INDEX `user_messages19_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_20` add INDEX `user_messages20_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_21` add INDEX `user_messages21_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_22` add INDEX `user_messages22_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_23` add INDEX `user_messages23_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_24` add INDEX `user_messages24_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_25` add INDEX `user_messages25_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_26` add INDEX `user_messages26_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_27` add INDEX `user_messages27_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_28` add INDEX `user_messages28_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_29` add INDEX `user_messages29_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_30` add INDEX `user_messages30_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_31` add INDEX `user_messages31_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_32` add INDEX `user_messages32_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_33` add INDEX `user_messages33_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_34` add INDEX `user_messages34_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_35` add INDEX `user_messages35_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_36` add INDEX `user_messages36_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_37` add INDEX `user_messages37_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_38` add INDEX `user_messages38_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_39` add INDEX `user_messages39_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_40` add INDEX `user_messages40_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_41` add INDEX `user_messages41_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_42` add INDEX `user_messages42_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_43` add INDEX `user_messages43_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_44` add INDEX `user_messages44_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_45` add INDEX `user_messages45_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_46` add INDEX `user_messages46_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_47` add INDEX `user_messages47_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_48` add INDEX `user_messages48_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_49` add INDEX `user_messages49_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_50` add INDEX `user_messages50_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_51` add INDEX `user_messages51_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_52` add INDEX `user_messages52_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_53` add INDEX `user_messages53_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_54` add INDEX `user_messages54_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_55` add INDEX `user_messages55_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_56` add INDEX `user_messages56_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_57` add INDEX `user_messages57_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_58` add INDEX `user_messages58_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_59` add INDEX `user_messages59_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_60` add INDEX `user_messages60_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_61` add INDEX `user_messages61_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_62` add INDEX `user_messages62_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_63` add INDEX `user_messages63_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_64` add INDEX `user_messages64_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_65` add INDEX `user_messages65_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_66` add INDEX `user_messages66_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_67` add INDEX `user_messages67_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_68` add INDEX `user_messages68_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_69` add INDEX `user_messages69_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_70` add INDEX `user_messages70_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_71` add INDEX `user_messages71_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_72` add INDEX `user_messages72_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_73` add INDEX `user_messages73_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_74` add INDEX `user_messages74_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_75` add INDEX `user_messages75_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_76` add INDEX `user_messages76_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_77` add INDEX `user_messages77_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_78` add INDEX `user_messages78_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_79` add INDEX `user_messages79_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_80` add INDEX `user_messages80_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_81` add INDEX `user_messages81_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_82` add INDEX `user_messages82_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_83` add INDEX `user_messages83_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_84` add INDEX `user_messages84_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_85` add INDEX `user_messages85_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_86` add INDEX `user_messages86_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_87` add INDEX `user_messages87_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_88` add INDEX `user_messages88_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_89` add INDEX `user_messages89_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_90` add INDEX `user_messages90_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_91` add INDEX `user_messages91_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_92` add INDEX `user_messages92_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_93` add INDEX `user_messages93_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_94` add INDEX `user_messages94_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_95` add INDEX `user_messages95_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_96` add INDEX `user_messages96_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_97` add INDEX `user_messages97_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_98` add INDEX `user_messages98_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_99` add INDEX `user_messages99_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_100` add INDEX `user_messages100_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_101` add INDEX `user_messages101_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_102` add INDEX `user_messages102_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_103` add INDEX `user_messages103_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_104` add INDEX `user_messages104_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_105` add INDEX `user_messages105_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_106` add INDEX `user_messages106_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_107` add INDEX `user_messages107_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_108` add INDEX `user_messages108_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_109` add INDEX `user_messages109_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_110` add INDEX `user_messages110_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_111` add INDEX `user_messages111_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_112` add INDEX `user_messages112_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_113` add INDEX `user_messages113_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_114` add INDEX `user_messages114_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_115` add INDEX `user_messages115_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_116` add INDEX `user_messages116_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_117` add INDEX `user_messages117_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_118` add INDEX `user_messages118_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_119` add INDEX `user_messages119_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_120` add INDEX `user_messages120_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_121` add INDEX `user_messages121_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_122` add INDEX `user_messages122_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_123` add INDEX `user_messages123_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_124` add INDEX `user_messages124_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_125` add INDEX `user_messages125_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_126` add INDEX `user_messages126_mid_index` ( `_mid` );
|
||||
alter table `t_user_messages_127` add INDEX `user_messages127_mid_index` ( `_mid` );
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<relativePath>../</relativePath>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.49</version>
|
||||
<version>0.52</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>moquette-broker</artifactId>
|
||||
|
||||
@@ -43,7 +43,16 @@ public class PushMessage {
|
||||
this.cntType = messageContentType;
|
||||
this.serverTime = serverTime;
|
||||
this.unReceivedMsg = unReceivedMsg;
|
||||
this.pushMessageType = (cntType == 400 ? PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE : (cntType == 402 ? PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE : PushServer.PushMessageType.PUSH_MESSAGE_TYPE_NORMAL));
|
||||
if (cntType == 400) {
|
||||
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_INVITE;
|
||||
} else if(cntType == 402) {
|
||||
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_BYE;
|
||||
} else if(cntType == 401) {
|
||||
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_VOIP_ANSWER;
|
||||
} else {
|
||||
this.pushMessageType = PushServer.PushMessageType.PUSH_MESSAGE_TYPE_NORMAL;
|
||||
}
|
||||
|
||||
this.mentionedType = mentionedType;
|
||||
this.isHiddenDetail = isHiddenDetail;
|
||||
this.language = language;
|
||||
|
||||
@@ -8,12 +8,11 @@
|
||||
|
||||
package cn.wildfirechat.push;
|
||||
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import io.moquette.persistence.MemorySessionStore;
|
||||
import io.moquette.server.config.IConfig;
|
||||
import io.moquette.spi.ClientSession;
|
||||
import io.moquette.spi.ISessionsStore;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.slf4j.Logger;
|
||||
@@ -35,6 +34,7 @@ public class PushServer {
|
||||
int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1;
|
||||
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
|
||||
int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3;
|
||||
int PUSH_MESSAGE_TYPE_VOIP_ANSWER = 4;
|
||||
}
|
||||
|
||||
private static PushServer INSTANCE = new PushServer();
|
||||
@@ -64,7 +64,7 @@ public class PushServer {
|
||||
pushMessageInternel(pushMessage, deviceId, pushContent);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.PUSH_SERVER_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ public class FileAction extends Action {
|
||||
|
||||
// 路径安全检查
|
||||
String path = httpPath.substring(0, httpPath.lastIndexOf("/"));
|
||||
if (path.contains("/.") || path.contains("./") || path.charAt(0) == '.' || path.charAt(path.length() - 1) == '.' || ReUtil.isMatch(INSECURE_URI, path)) {
|
||||
if (path.contains("/.") || path.contains("./") || ReUtil.isMatch(INSECURE_URI, path)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
@@ -63,7 +64,7 @@ public class CreateRobotAction extends AdminAction {
|
||||
messagesStore.addUserInfo(newUser, inputCreateRobot.getPassword());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ADMIN_API_Exception);
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.ERROR_CODE_SERVER_ERROR, e.getMessage());
|
||||
response.setContent(new Gson().toJson(result));
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
@@ -25,7 +26,6 @@ import io.netty.util.internal.StringUtil;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.DBUtil;
|
||||
import win.liyufan.im.UUIDGenerator;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
@@ -88,7 +88,7 @@ public class CreateUserAction extends AdminAction {
|
||||
messagesStore.addUserInfo(newUserBuilder.build(), inputCreateUser.getPassword());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ADMIN_API_Exception);
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.ERROR_CODE_SERVER_ERROR, e.getMessage());
|
||||
response.setContent(new Gson().toJson(result));
|
||||
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
||||
import cn.wildfirechat.pojos.StringPairPojo;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@Route(APIPath.User_Kickoff_Client)
|
||||
@HttpMethod("POST")
|
||||
public class KickoffUserClientAction extends AdminAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
StringPairPojo pojo = getRequestBody(request.getNettyRequest(), StringPairPojo.class);
|
||||
if (pojo != null && !StringUtil.isNullOrEmpty(pojo.getFirst())) {
|
||||
sessionsStore.kickoffUserClient(pojo.getFirst(), pojo.getSecond());
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null);
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Executable
+85
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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.InputKickoffGroupMember;
|
||||
import cn.wildfirechat.pojos.InputSetGroupMemberAlias;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Group_Set_Member_Alias)
|
||||
@HttpMethod("POST")
|
||||
public class ModifyGroupMemberAliasAction extends AdminAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputSetGroupMemberAlias inputSetGroupMemberAlias = getRequestBody(request.getNettyRequest(), InputSetGroupMemberAlias.class);
|
||||
if (inputSetGroupMemberAlias.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputSetGroupMemberAlias.getOperator(), null, IMTopic.ModifyGroupMemberAliasTopic, inputSetGroupMemberAlias.toProtoGroupRequest().toByteArray(), inputSetGroupMemberAlias.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, true);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -8,11 +8,11 @@
|
||||
|
||||
package com.xiaoleilu.loServer.action.channel;
|
||||
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.spi.impl.Utils;
|
||||
@@ -63,7 +63,7 @@ abstract public class ChannelAction extends Action {
|
||||
ts = Long.parseLong(timestamp);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.CHANNEL_API_Exception);
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputAddGroupMember;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Member_Add)
|
||||
@HttpMethod("POST")
|
||||
public class AddGroupMemberAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputAddGroupMember inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputAddGroupMember.class);
|
||||
inputAddGroupMember.setOperator(robot.getUid());
|
||||
if (inputAddGroupMember.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.AddGroupMemberTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+95
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputCreateGroup;
|
||||
import cn.wildfirechat.pojos.OutputCreateGroupResult;
|
||||
import cn.wildfirechat.pojos.PojoGroupInfo;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Create_Group)
|
||||
@HttpMethod("POST")
|
||||
public class CreateGroupAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputCreateGroup inputCreateGroup = getRequestBody(request.getNettyRequest(), InputCreateGroup.class);
|
||||
inputCreateGroup.setOperator(robot.getUid());
|
||||
inputCreateGroup.getGroup().getGroup_info().setOwner(robot.getUid());
|
||||
if (inputCreateGroup.isValide()) {
|
||||
PojoGroupInfo group_info = inputCreateGroup.getGroup().getGroup_info();
|
||||
WFCMessage.CreateGroupRequest createGroupRequest = inputCreateGroup.toProtoGroupRequest();
|
||||
RPCCenter.getInstance().sendRequest(inputCreateGroup.getOperator(), null, IMTopic.CreateGroupTopic, createGroupRequest.toByteArray(), inputCreateGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
byte[] data = new byte[byteBuf.readableBytes()];
|
||||
byteBuf.readBytes(data);
|
||||
String groupId = new String(data);
|
||||
sendResponse(response, null, new OutputCreateGroupResult(groupId));
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.RobotCallbackPojo;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@Route(APIPath.Robot_Delete_Callback)
|
||||
@HttpMethod("POST")
|
||||
public class DeleteCallbackAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
if(!StringUtil.isNullOrEmpty(robot.getCallback())) {
|
||||
robot = robot.toBuilder().clearCallback().setState(0).build();
|
||||
messagesStore.addRobot(robot);
|
||||
}
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.ok();
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputDismissGroup;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Dismiss)
|
||||
@HttpMethod("POST")
|
||||
public class DismissGroupAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputDismissGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputDismissGroup.class);
|
||||
inputDismissGroup.setOperator(robot.getUid());
|
||||
if (inputDismissGroup.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.DismissGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputGetUserInfo;
|
||||
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||
import cn.wildfirechat.pojos.RobotCallbackPojo;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@Route(APIPath.Robot_Get_Callback)
|
||||
@HttpMethod("POST")
|
||||
public class GetCallbackAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
RobotCallbackPojo out = new RobotCallbackPojo();
|
||||
out.setUrl(robot.getCallback());
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.ok(out);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputGetGroup;
|
||||
import cn.wildfirechat.pojos.PojoGroupInfo;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@Route(APIPath.Robot_Group_Get_Info)
|
||||
@HttpMethod("POST")
|
||||
public class GetGroupInfoAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
|
||||
if (inputGetGroup != null
|
||||
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
|
||||
|
||||
WFCMessage.GroupInfo groupInfo = messagesStore.getGroupInfo(inputGetGroup.getGroupId());
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result;
|
||||
if (groupInfo == null) {
|
||||
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
|
||||
} else {
|
||||
PojoGroupInfo pojoGroupInfo = new PojoGroupInfo();
|
||||
pojoGroupInfo.setExtra(groupInfo.getExtra());
|
||||
pojoGroupInfo.setName(groupInfo.getName());
|
||||
pojoGroupInfo.setOwner(groupInfo.getOwner());
|
||||
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
||||
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
||||
pojoGroupInfo.setType(groupInfo.getType());
|
||||
result = RestResult.ok(pojoGroupInfo);
|
||||
}
|
||||
|
||||
response.setContent(new Gson().toJson(result));
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputGetGroup;
|
||||
import cn.wildfirechat.pojos.OutputGroupMemberList;
|
||||
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@Route(APIPath.Robot_Group_Member_List)
|
||||
@HttpMethod("POST")
|
||||
public class GetGroupMembersAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class);
|
||||
String robotId = robot.getUid();
|
||||
if (inputGetGroup != null
|
||||
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
|
||||
|
||||
List<WFCMessage.GroupMember> members = new ArrayList<>();
|
||||
ErrorCode errorCode = messagesStore.getGroupMembers(null, inputGetGroup.getGroupId(), 0, members);
|
||||
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result;
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
result = RestResult.resultOf(errorCode);
|
||||
} else {
|
||||
OutputGroupMemberList out = new OutputGroupMemberList();
|
||||
out.setMembers(new ArrayList<>());
|
||||
boolean isInGroup = false;
|
||||
for (WFCMessage.GroupMember member : members) {
|
||||
if (member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
|
||||
continue;
|
||||
}
|
||||
if(member.getMemberId().equals(robotId)) {
|
||||
isInGroup = true;
|
||||
}
|
||||
PojoGroupMember pm = new PojoGroupMember();
|
||||
pm.setMember_id(member.getMemberId());
|
||||
pm.setAlias(member.getAlias());
|
||||
pm.setType(member.getType());
|
||||
out.getMembers().add(pm);
|
||||
}
|
||||
if(!isInGroup) {
|
||||
out.getMembers().clear();
|
||||
}
|
||||
result = RestResult.ok(out);
|
||||
}
|
||||
|
||||
response.setContent(new Gson().toJson(result));
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputKickoffGroupMember;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Member_Kickoff)
|
||||
@HttpMethod("POST")
|
||||
public class KickoffGroupMemberAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputKickoffGroupMember inputKickoffGroupMember = getRequestBody(request.getNettyRequest(), InputKickoffGroupMember.class);
|
||||
inputKickoffGroupMember.setOperator(robot.getUid());
|
||||
if (inputKickoffGroupMember.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputKickoffGroupMember.getOperator(), null, IMTopic.KickoffGroupMemberTopic, inputKickoffGroupMember.toProtoGroupRequest().toByteArray(), inputKickoffGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputModifyGroupInfo;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Modify_Info)
|
||||
@HttpMethod("POST")
|
||||
public class ModifyGroupInfoAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputModifyGroupInfo inputAddGroupMember = getRequestBody(request.getNettyRequest(), InputModifyGroupInfo.class);
|
||||
inputAddGroupMember.setOperator(robot.getUid());
|
||||
if (inputAddGroupMember.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputAddGroupMember.getOperator(), null, IMTopic.ModifyGroupInfoTopic, inputAddGroupMember.toProtoGroupRequest().toByteArray(), inputAddGroupMember.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
Executable
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputSetGroupMemberAlias;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Set_Member_Alias)
|
||||
@HttpMethod("POST")
|
||||
public class ModifyGroupMemberAliasAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputSetGroupMemberAlias inputSetGroupMemberAlias = getRequestBody(request.getNettyRequest(), InputSetGroupMemberAlias.class);
|
||||
inputSetGroupMemberAlias.setOperator(robot.getUid());
|
||||
if (inputSetGroupMemberAlias.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputSetGroupMemberAlias.getOperator(), null, IMTopic.ModifyGroupMemberAliasTopic, inputSetGroupMemberAlias.toProtoGroupRequest().toByteArray(), inputSetGroupMemberAlias.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputQuitGroup;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Member_Quit)
|
||||
@HttpMethod("POST")
|
||||
public class QuitGroupMemberAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputQuitGroup inputQuitGroup = getRequestBody(request.getNettyRequest(), InputQuitGroup.class);
|
||||
inputQuitGroup.setOperator(robot.getUid());
|
||||
if (inputQuitGroup.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputQuitGroup.getOperator(), null, IMTopic.QuitGroupTopic, inputQuitGroup.toProtoGroupRequest().toByteArray(), inputQuitGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -8,13 +8,13 @@
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.imhandler.IMHandler;
|
||||
import io.moquette.spi.impl.Utils;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpRequest;
|
||||
@@ -67,7 +67,7 @@ abstract public class RobotAction extends Action {
|
||||
ts = Long.parseLong(timestamp);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ROBOT_API_Exception);
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -112,7 +112,7 @@ abstract public class RobotAction extends Action {
|
||||
return t;
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, IMExceptionEvent.EventType.ROBOT_API_Exception);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
+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.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputGetGroup;
|
||||
import cn.wildfirechat.pojos.RobotCallbackPojo;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@Route(APIPath.Robot_Set_Callback)
|
||||
@HttpMethod("POST")
|
||||
public class SetCallbackAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
RobotCallbackPojo input = getRequestBody(request.getNettyRequest(), RobotCallbackPojo.class);
|
||||
if(!StringUtil.isNullOrEmpty(input.getUrl())) {
|
||||
if(!input.getUrl().equals(robot.getCallback()) && robot.getState() != 1) {
|
||||
robot = robot.toBuilder().setCallback(input.getUrl()).setState(1).build();
|
||||
messagesStore.addRobot(robot);
|
||||
}
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.ok();
|
||||
response.setContent(new Gson().toJson(result));
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.InputTransferGroup;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.persistence.RPCCenter;
|
||||
import io.moquette.persistence.TargetEntry;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import win.liyufan.im.IMTopic;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.Robot_Group_Transfer)
|
||||
@HttpMethod("POST")
|
||||
public class TransferGroupAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputTransferGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputTransferGroup.class);
|
||||
inputDismissGroup.setOperator(robot.getUid());
|
||||
if (inputDismissGroup.isValide()) {
|
||||
RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.TransferGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@Override
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
sendResponse(response, null, null);
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onError(ErrorCode errorCode) {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTimeout() {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Executor getResponseExecutor() {
|
||||
return command -> {
|
||||
ctx.executor().execute(command);
|
||||
};
|
||||
}
|
||||
}, false);
|
||||
return false;
|
||||
} else {
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package com.xiaoleilu.loServer.action.robot;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.IntStringPairPojo;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
import com.xiaoleilu.loServer.annotation.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
|
||||
import static cn.wildfirechat.pojos.MyInfoType.*;
|
||||
|
||||
@Route(APIPath.Robot_Update_Profile)
|
||||
@HttpMethod("POST")
|
||||
public class UpdateProfileAction extends RobotAction {
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
IntStringPairPojo input = getRequestBody(request.getNettyRequest(), IntStringPairPojo.class);
|
||||
|
||||
WFCMessage.User.Builder builder = messagesStore.getUserInfo(robot.getUid()).toBuilder();
|
||||
boolean modified = false;
|
||||
switch (input.getIntValue()) {
|
||||
case Modify_DisplayName:
|
||||
builder.setDisplayName(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Gender:
|
||||
builder.setGender(Integer.parseInt(input.getStrValue()));
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Portrait:
|
||||
builder.setPortrait(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
//不允许修改电话号码,如果修改电话号码必须通过admin进行修改
|
||||
// case Modify_Mobile:
|
||||
// builder.setMobile(input.getStrValue());
|
||||
// modified = true;
|
||||
// break;
|
||||
case Modify_Email:
|
||||
builder.setEmail(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Address:
|
||||
builder.setAddress(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Company:
|
||||
builder.setCompany(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Social:
|
||||
builder.setSocial(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Extra:
|
||||
builder.setExtra(input.getStrValue());
|
||||
modified = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.ok();
|
||||
if(modified) {
|
||||
try {
|
||||
messagesStore.updateUserInfo(builder.build());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
result.setErrorCode(ErrorCode.ERROR_CODE_SERVER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
package com.xiaoleilu.loServer.handler;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import com.xiaoleilu.hutool.lang.Singleton;
|
||||
import com.xiaoleilu.hutool.log.Log;
|
||||
import com.xiaoleilu.hutool.log.StaticLog;
|
||||
import com.xiaoleilu.loServer.ServerSetting;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.action.UnknownErrorAction;
|
||||
@@ -53,7 +49,7 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(Logger, e);
|
||||
Utility.printExecption(Logger, e, IMExceptionEvent.EventType.SHORT_LINK_Exception);
|
||||
Action errorAction = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
|
||||
request.putParam(UnknownErrorAction.ERROR_PARAM_NAME, e);
|
||||
response.setContent(e.toString());
|
||||
|
||||
@@ -357,8 +357,8 @@ public class Response {
|
||||
final DefaultHttpResponse defaultHttpResponse = new DefaultHttpResponse(httpVersion, status);
|
||||
|
||||
// headers
|
||||
final HttpHeaders httpHeaders = defaultHttpResponse.headers().add(headers);
|
||||
|
||||
HttpHeaders httpHeaders = defaultHttpResponse.headers().add(headers);
|
||||
httpHeaders.set(HttpHeaderNames.CONTENT_TYPE.toString(), contentType);
|
||||
// Cookies
|
||||
for (Cookie cookie : cookies) {
|
||||
httpHeaders.add(HttpHeaderNames.SET_COOKIE.toString(), ServerCookieEncoder.LAX.encode(cookie));
|
||||
|
||||
@@ -35,7 +35,6 @@ public final class BrokerConstants {
|
||||
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
|
||||
+ DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME;
|
||||
public static final String WEB_SOCKET_PORT_PROPERTY_NAME = "websocket_port";
|
||||
public static final String WSS_PORT_PROPERTY_NAME = "secure_websocket_port";
|
||||
public static final String SSL_PORT_PROPERTY_NAME = "ssl_port";
|
||||
public static final String JKS_PATH_PROPERTY_NAME = "jks_path";
|
||||
@@ -47,7 +46,6 @@ public final class BrokerConstants {
|
||||
public static final String DB_AUTHENTICATOR_QUERY = "authenticator.db.query";
|
||||
public static final String DB_AUTHENTICATOR_DIGEST = "authenticator.db.digest";
|
||||
public static final int PORT = 1883;
|
||||
public static final int WEBSOCKET_PORT = 8080;
|
||||
public static final String DISABLED_PORT_BIND = "disabled";
|
||||
public static final String HOST = "0.0.0.0";
|
||||
public static final String NEED_CLIENT_AUTH = "need_client_auth";
|
||||
@@ -92,6 +90,9 @@ public final class BrokerConstants {
|
||||
public static final String PUSH_ANDROID_SERVER_ADDRESS = "push.android.server.address";
|
||||
public static final String PUSH_IOS_SERVER_ADDRESS = "push.ios.server.address";
|
||||
|
||||
public static final String MONITOR_Exception_Event_Address = "monitor.exception_event_address";
|
||||
|
||||
|
||||
public static final String USER_ONLINE_STATUS_CALLBACK = "user.online_status_callback";
|
||||
|
||||
public static final String GROUP_INFO_UPDATE_CALLBACK = "group.group_info_update_callback";
|
||||
@@ -112,13 +113,11 @@ public final class BrokerConstants {
|
||||
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 CLIENT_PROTO_SECRET_KEY = "client.proto.secret_key";
|
||||
public static final String TOKEN_SECRET_KEY = "token.key";
|
||||
public static final String TOKEN_EXPIRE_TIME = "token.expire_time";
|
||||
|
||||
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
|
||||
|
||||
public static final String HZ_Cluster_Master_Node = "master_node";
|
||||
public static final String DB_AUTO_CLEAN_HISTORY_MESSAGES = "db.auto_clean_history_messages";
|
||||
|
||||
public static final String SENSITIVE_Filter_Type = "sensitive.filter.type";
|
||||
|
||||
@@ -127,10 +126,6 @@ public final class BrokerConstants {
|
||||
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
|
||||
public static final String SERVER_MULTI_PLATFROM_NOTIFICATION = "server.multi_platform_notification";
|
||||
|
||||
public static final String MONGODB_Client_URI = "mongodb.client_uri";
|
||||
public static final String MONGODB_Database = "mongodb.database";
|
||||
public static final String MONGODB_Data_Expire_Days = "mongodb.data_expire_days";
|
||||
|
||||
public static final String MESSAGE_ROAMING = "message.roaming";
|
||||
public static final String MESSAGE_Remote_History_Message = "message.remote_history_message";
|
||||
|
||||
@@ -151,6 +146,13 @@ public final class BrokerConstants {
|
||||
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
|
||||
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
|
||||
|
||||
public static final String GROUP_Allow_Client_Custom_Operation_Notification = "group.allow_client_custom_operation_notification";
|
||||
public static final String GROUP_Visible_Quit_Kickoff_Notification = "group.visible_quit_or_kickoff_notification";
|
||||
|
||||
public static final String USER_HIDE_PROPERTIES = "user.hide_properties";
|
||||
|
||||
public static final String MESSAGES_FORBIDDEN_CLIENT_SEND_TYPES = "message.forbidden_client_send_types";
|
||||
|
||||
public static final String MESSAGES_DISABLE_REMOTE_SEARCH = "message.disable_remote_search";
|
||||
|
||||
public static final String MESSAGES_RECALL_TIME_LIMIT = "message.recall_time_limit";
|
||||
|
||||
@@ -27,9 +27,15 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
|
||||
return ErrorCode.ERROR_CODE_GROUP_ALREADY_EXIST;
|
||||
}
|
||||
}
|
||||
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), isAdmin);
|
||||
|
||||
if (groupInfo != null) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent();
|
||||
|
||||
@@ -29,8 +29,12 @@ public class DismissGroupHandler extends GroupHandler<WFCMessage.DismissGroupReq
|
||||
} else if (isAdmin || (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted)
|
||||
&& groupInfo.getOwner() != null && groupInfo.getOwner().equals(fromUser)) {
|
||||
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
//send notify message first, then dismiss group
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, null, "").getDismissGroupNotifyContent();
|
||||
|
||||
@@ -22,7 +22,7 @@ public class GetUserInfoHandler extends IMHandler<WFCMessage.PullUserRequest> {
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullUserRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
WFCMessage.PullUserResult.Builder resultBuilder = WFCMessage.PullUserResult.newBuilder();
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.getUserInfo(request.getRequestList(), resultBuilder);
|
||||
ErrorCode errorCode = m_messagesStore.getUserInfo(fromUser, request.getRequestList(), resultBuilder);
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
byte[] data = resultBuilder.build().toByteArray();
|
||||
ackPayload.ensureWritable(data.length).writeBytes(data);
|
||||
|
||||
@@ -13,10 +13,15 @@ import cn.wildfirechat.proto.WFCMessage;
|
||||
import win.liyufan.im.MessageShardingUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
abstract public class GroupHandler<T> extends IMHandler<T> {
|
||||
protected void sendGroupNotification(String fromUser, String targetId, List<Integer> lines, WFCMessage.MessageContent content) {
|
||||
sendGroupNotification(fromUser, targetId, lines, content, null);
|
||||
}
|
||||
|
||||
protected void sendGroupNotification(String fromUser, String targetId, List<Integer> lines, WFCMessage.MessageContent content, Collection<String> toUsers) {
|
||||
if (lines == null) {
|
||||
lines = new ArrayList<>();
|
||||
} else {
|
||||
@@ -32,6 +37,9 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
||||
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder().setContent(content).setServerTimestamp(timestamp);
|
||||
builder.setConversation(builder.getConversationBuilder().setType(ProtoConstants.ConversationType.ConversationType_Group).setTarget(targetId).setLine(line));
|
||||
builder.setFromUser(fromUser);
|
||||
if(toUsers != null && !toUsers.isEmpty()) {
|
||||
builder.addAllTo(toUsers);
|
||||
}
|
||||
try {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
|
||||
@@ -14,6 +14,9 @@ import cn.wildfirechat.pojos.GroupNotificationBinaryContent;
|
||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static win.liyufan.im.IMTopic.KickoffGroupMemberTopic;
|
||||
|
||||
@Handler(value = KickoffGroupMemberTopic)
|
||||
@@ -47,13 +50,24 @@ public class KickoffGroupMember extends GroupHandler<WFCMessage.RemoveGroupMembe
|
||||
if (!isAllow && (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted)) {
|
||||
errorCode = ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
} else {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
//send notify message first, then kickoff the member
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getRemovedMemberList()).getKickokfMemberGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||
}
|
||||
|
||||
if((m_messagesStore.getVisibleQuitKickoffNotification() & 0x02) > 0) {
|
||||
Set<String> toUsers = m_messagesStore.getGroupManagers(request.getGroupId(), true);
|
||||
toUsers.addAll(request.getRemovedMemberList());
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getRemovedMemberList()).getKickokfMemberVisibleGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content, toUsers);
|
||||
}
|
||||
errorCode = m_messagesStore.kickoffGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getRemovedMemberList());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||
public class ModifyGroupAliasHandler extends GroupHandler<WFCMessage.ModifyGroupMemberAlias> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), null, isAdmin);
|
||||
if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) {
|
||||
if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) {
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getAlias(), "").getModifyGroupMemberAliasNotifyContent();
|
||||
|
||||
@@ -22,9 +22,13 @@ import static win.liyufan.im.IMTopic.ModifyGroupInfoTopic;
|
||||
public class ModifyGroupInfoHandler extends GroupHandler<WFCMessage.ModifyGroupInfoRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupInfoRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode= m_messagesStore.modifyGroupInfo(fromUser, request.getGroupId(), request.getType(), request.getValue(), isAdmin);
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = null;
|
||||
|
||||
@@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||
public class ModifyGroupMemberAliasHandler extends GroupHandler<WFCMessage.ModifyGroupMemberAlias> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), request.getMemberId(), isAdmin);
|
||||
if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) {
|
||||
if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getAlias(), request.getMemberId()).getModifyGroupMemberAliasNotifyContent();
|
||||
|
||||
@@ -14,20 +14,32 @@ import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
import static win.liyufan.im.IMTopic.QuitGroupTopic;
|
||||
|
||||
@Handler(value = QuitGroupTopic)
|
||||
public class QuitGroupHandler extends GroupHandler<WFCMessage.QuitGroupRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.QuitGroupRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.quitGroup(fromUser, request.getGroupId());
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||
}
|
||||
|
||||
if((m_messagesStore.getVisibleQuitKickoffNotification() & 0x01) > 0) {
|
||||
Set<String> toUsers = m_messagesStore.getGroupManagers(request.getGroupId(), true);
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getQuitVisibleGroupNotifyContent();
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content, toUsers);
|
||||
}
|
||||
}
|
||||
return errorCode;
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ package io.moquette.imhandler;
|
||||
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.hazelcast.core.Member;
|
||||
import io.moquette.persistence.MemorySessionStore;
|
||||
import io.moquette.spi.ClientSession;
|
||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
@@ -24,6 +25,19 @@ import static io.moquette.BrokerConstants.HZ_Cluster_Node_External_Short_Port;
|
||||
public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.RouteRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
MemorySessionStore.Session session = m_sessionsStore.sessionForClientAndUser(fromUser, clientID);
|
||||
if (session == null) {
|
||||
ErrorCode errorCode = m_sessionsStore.loadActiveSession(fromUser, clientID);
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
return errorCode;
|
||||
}
|
||||
session = m_sessionsStore.sessionForClientAndUser(fromUser, clientID);
|
||||
}
|
||||
|
||||
if (session == null || session.getDeleted() > 0) {
|
||||
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
||||
}
|
||||
|
||||
Member member = mServer.getHazelcastInstance().getCluster().getLocalMember();
|
||||
String serverIp = member.getStringAttribute(HZ_Cluster_Node_External_IP);
|
||||
String longPort = member.getStringAttribute(HZ_Cluster_Node_External_Long_Port);
|
||||
|
||||
@@ -58,9 +58,14 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
boolean ignoreMsg = false;
|
||||
if (!isAdmin) { //admin do not check the right
|
||||
// 不能在端上直接发送撤回和群通知
|
||||
if (message.getContent().getType() == 80 || (message.getContent().getType() >= 100 && message.getContent().getType() < 200)) {
|
||||
if (message.getContent().getType() == 80 || message.getContent().getType() == 81 || (message.getContent().getType() >= 100 && message.getContent().getType() < 200)) {
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if(m_messagesStore.getClientForbiddenSendTypes().contains(message.getContent().getType())) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
int userStatus = m_messagesStore.getUserStatus(fromUser);
|
||||
if (userStatus == ProtoConstants.UserStatus.Muted || userStatus == ProtoConstants.UserStatus.Forbidden) {
|
||||
return ErrorCode.ERROR_CODE_FORBIDDEN_SEND_MSG;
|
||||
|
||||
@@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||
public class SetGroupManagerHandler extends GroupHandler<WFCMessage.SetGroupManagerRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SetGroupManagerRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.setGroupManager(fromUser, request.getGroupId(), request.getType(), request.getUserIdList(), isAdmin);
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getType() + "", request.getUserIdList()).getSetGroupManagerNotifyContent();
|
||||
|
||||
@@ -21,9 +21,13 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||
public class TransferGroupHandler extends GroupHandler<WFCMessage.TransferGroupRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.TransferGroupRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && !isAdmin && !m_messagesStore.isAllowClientCustomGroupNotification()) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
ErrorCode errorCode = m_messagesStore.transferGroup(fromUser, request.getGroupId(), request.getNewOwner(), isAdmin);
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0 && (isAdmin || m_messagesStore.isAllowClientCustomGroupNotification())) {
|
||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||
} else {
|
||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, request.getNewOwner()).getTransferGroupNotifyContent();
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package io.moquette.persistence;
|
||||
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import cn.wildfirechat.pojos.SystemSettingPojo;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
@@ -32,6 +33,7 @@ import java.util.*;
|
||||
import java.util.function.Function;
|
||||
|
||||
|
||||
import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
|
||||
@@ -72,7 +74,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -106,7 +108,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -146,7 +148,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -203,10 +205,9 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
if (page > 0) {
|
||||
sql += "offset = '" + page * 20 + "'";
|
||||
sql += " offset " + page * 20;
|
||||
}
|
||||
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
int index = 1;
|
||||
|
||||
@@ -286,7 +287,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -310,7 +311,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -368,7 +369,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -424,7 +425,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -483,7 +484,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -556,7 +557,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -607,7 +608,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -668,10 +669,10 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
try {
|
||||
if (resultSet!=null) {
|
||||
@@ -679,14 +680,14 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, null);
|
||||
}
|
||||
@@ -724,7 +725,7 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException | IOException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, resultSet);
|
||||
}
|
||||
@@ -744,7 +745,7 @@ public class DatabaseStore {
|
||||
LOG.info("Update rows {}", count);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -851,7 +852,7 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException | IOException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, resultSet);
|
||||
}
|
||||
@@ -877,7 +878,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -905,12 +906,12 @@ public class DatabaseStore {
|
||||
statement = null;
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -949,7 +950,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -986,7 +987,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1011,7 +1012,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1067,7 +1068,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -1104,7 +1105,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1177,7 +1178,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1220,7 +1221,7 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, resultSet);
|
||||
}
|
||||
@@ -1242,7 +1243,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1282,7 +1283,7 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, resultSet);
|
||||
}
|
||||
@@ -1315,7 +1316,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1354,7 +1355,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1382,7 +1383,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1409,7 +1410,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1500,7 +1501,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1550,7 +1551,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1591,7 +1592,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1621,7 +1622,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -1655,7 +1656,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1714,7 +1715,7 @@ public class DatabaseStore {
|
||||
}
|
||||
}
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1776,7 +1777,7 @@ public class DatabaseStore {
|
||||
}
|
||||
}
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
DBUtil.closeDB(connection, statement2);
|
||||
@@ -1863,7 +1864,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -1915,7 +1916,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -1939,7 +1940,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2005,7 +2006,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2039,7 +2040,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2062,7 +2063,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2084,7 +2085,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2140,7 +2141,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2192,7 +2193,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2219,7 +2220,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2299,7 +2300,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
throw new Exception(e.getMessage());
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
@@ -2320,7 +2321,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2355,7 +2356,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2380,7 +2381,7 @@ public class DatabaseStore {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
}
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -2395,7 +2396,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
return -1;
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
@@ -2478,6 +2479,8 @@ public class DatabaseStore {
|
||||
builder.setDeleted(deleted);
|
||||
|
||||
long longValue = rs.getLong(index++);
|
||||
if(longValue <= 0)
|
||||
longValue = 1;
|
||||
builder.setUpdateDt(longValue);
|
||||
|
||||
return builder.build();
|
||||
@@ -2485,7 +2488,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2508,7 +2511,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2531,7 +2534,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2559,7 +2562,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2596,7 +2599,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2621,7 +2624,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2643,7 +2646,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2712,7 +2715,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -2742,7 +2745,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2781,7 +2784,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2820,7 +2823,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2841,7 +2844,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2862,7 +2865,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2929,7 +2932,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2952,7 +2955,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -3032,7 +3035,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -3080,7 +3083,7 @@ public class DatabaseStore {
|
||||
}
|
||||
}
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -3111,7 +3114,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -3146,10 +3149,9 @@ public class DatabaseStore {
|
||||
|
||||
|
||||
if (page > 0) {
|
||||
sql += "offset = '" + page * 20 + "'";
|
||||
sql += " offset " + page * 20;
|
||||
}
|
||||
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
int index = 1;
|
||||
if (buzzy) {
|
||||
@@ -3198,7 +3200,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -3242,7 +3244,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -3269,7 +3271,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
@@ -3293,7 +3295,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -3316,7 +3318,7 @@ public class DatabaseStore {
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
|
||||
@@ -39,11 +39,6 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.*;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
import java.sql.Connection;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -52,6 +47,7 @@ import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import static cn.wildfirechat.common.IMExceptionEvent.EventType.EVENT_CALLBACK_Exception;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ChannelState.Channel_State_Mask_Deleted;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ChannelUpdateEventType.*;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ChatroomMemberUpdateEventType.Chatroom_Member_Event_Join;
|
||||
@@ -66,7 +62,7 @@ import static cn.wildfirechat.proto.ProtoConstants.Platform.*;
|
||||
import static io.moquette.BrokerConstants.*;
|
||||
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
|
||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||
import static win.liyufan.im.MyInfoType.*;
|
||||
import static cn.wildfirechat.pojos.MyInfoType.*;
|
||||
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
|
||||
|
||||
public class MemoryMessagesStore implements IMessagesStore {
|
||||
@@ -141,6 +137,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private long mChatroomParticipantIdleTime = 900000;
|
||||
private boolean mChatroomRejoinWhenActive = true;
|
||||
|
||||
private List<Integer> mForbiddenClientSendTypes = new ArrayList<>();
|
||||
|
||||
private long mRecallTimeLimit = 300;
|
||||
|
||||
private String mGroupInfoUpdateCallback;
|
||||
@@ -150,6 +148,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private String mChannelInfoUpdateCallback;
|
||||
private String mChatroomInfoUpdateCallback;
|
||||
private String mChatroomMemberUpdateCallback;
|
||||
private boolean mGroupAllowClientCustomOperationNotification;
|
||||
private int mGroupVisibleQuitKickoffNotification;
|
||||
|
||||
private Set<Integer> mUserHideProperties = new HashSet<>();
|
||||
|
||||
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
|
||||
m_Server = server;
|
||||
@@ -257,6 +259,23 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
String strTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGES_FORBIDDEN_CLIENT_SEND_TYPES);
|
||||
if(!StringUtil.isNullOrEmpty(strTypes)) {
|
||||
for (String strType:strTypes.split(",")) {
|
||||
try {
|
||||
int type = Integer.parseInt(strType);
|
||||
mForbiddenClientSendTypes.add(type);
|
||||
} catch (NumberFormatException e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
|
||||
|
||||
try {
|
||||
mGroupInfoUpdateCallback = server.getConfig().getProperty(GROUP_INFO_UPDATE_CALLBACK);
|
||||
} catch (Exception e) {
|
||||
@@ -298,6 +317,36 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mGroupAllowClientCustomOperationNotification = Boolean.parseBoolean(server.getConfig().getProperty(GROUP_Allow_Client_Custom_Operation_Notification));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
mGroupVisibleQuitKickoffNotification = Integer.parseInt(server.getConfig().getProperty(GROUP_Visible_Quit_Kickoff_Notification, "0"));
|
||||
} catch (Exception e) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
String userHideStr = server.getConfig().getProperty(USER_HIDE_PROPERTIES);
|
||||
if(!StringUtil.isNullOrEmpty(userHideStr)) {
|
||||
String[] proStrs = userHideStr.split(",");
|
||||
for (String proStr:proStrs) {
|
||||
int value = Integer.parseInt(proStr);
|
||||
if(value > 1 && value < 9) {
|
||||
mUserHideProperties.add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (NumberFormatException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void printMissConfigLog(String config, String defaultValue) {
|
||||
@@ -528,9 +577,13 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
boolean noRoaming = false;
|
||||
if (pullType == ProtoConstants.PullType.Pull_Normal && fromMessageId == 0 && !IS_MESSAGE_ROAMING) {
|
||||
noRoaming = true;
|
||||
if (pullType == ProtoConstants.PullType.Pull_Normal && fromMessageId == 0) {
|
||||
if(!IS_MESSAGE_ROAMING) {
|
||||
noRoaming = true;
|
||||
}
|
||||
session.setPullHistoryMsg(true);
|
||||
}
|
||||
|
||||
while (true) {
|
||||
Map.Entry<Long, Long> entry = maps.higherEntry(current);
|
||||
if (entry == null) {
|
||||
@@ -542,7 +595,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
MessageBundle bundle = mIMap.get(targetMessageId);
|
||||
|
||||
if (bundle != null) {
|
||||
if (exceptClientId == null || !exceptClientId.equals(bundle.getFromClientId()) || !user.equals(bundle.getFromUser())) {
|
||||
if (exceptClientId == null || session.isPullHistoryMsg() || !exceptClientId.equals(bundle.getFromClientId()) || !user.equals(bundle.getFromUser())) {
|
||||
|
||||
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
|
||||
if (!bundle.getMessage().getConversation().getTarget().equals(chatroomId)) {
|
||||
@@ -576,6 +629,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (lastEntry != null) {
|
||||
head = lastEntry.getKey();
|
||||
}
|
||||
if (pullType == ProtoConstants.PullType.Pull_Normal && current == head) {
|
||||
session.setPullHistoryMsg(false);
|
||||
}
|
||||
} finally {
|
||||
mReadLock.unlock();
|
||||
}
|
||||
@@ -851,9 +907,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
|
||||
boolean hasOwnerMember = false;
|
||||
for (WFCMessage.GroupMember member : memberList) {
|
||||
if (member.getMemberId().equals(owner)) {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
|
||||
hasOwnerMember = true;
|
||||
} else {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).build();
|
||||
}
|
||||
@@ -862,6 +920,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
dt++;
|
||||
}
|
||||
|
||||
if(!hasOwnerMember && !StringUtil.isNullOrEmpty(owner)) {
|
||||
WFCMessage.GroupMember member = WFCMessage.GroupMember.newBuilder().setMemberId(owner).setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
|
||||
groupMembers.put(groupId, member);
|
||||
updatedMemberList.add(member);
|
||||
}
|
||||
|
||||
groupInfo = groupInfo.toBuilder()
|
||||
.setTargetId(groupId)
|
||||
.setName(groupInfo.getName())
|
||||
@@ -888,7 +952,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
event.operatorId = operatorId;
|
||||
event.groupId = groupId;
|
||||
event.type = type;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mGroupInfoUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mGroupInfoUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -900,7 +971,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
event.memberIds = memberIds;
|
||||
event.type = type;
|
||||
event.value = value;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mGroupMemberUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mGroupMemberUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -911,13 +989,27 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
event.targetId = targetId;
|
||||
event.type = type;
|
||||
event.value = value;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mRelationUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mRelationUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void callbackUserInfoEvent(WFCMessage.User user) {
|
||||
if (!StringUtil.isNullOrEmpty(mUserInfoUpdateCallback)) {
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mUserInfoUpdateCallback, new Gson().toJson(InputOutputUserInfo.fromPbUser(user))));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mUserInfoUpdateCallback, new Gson().toJson(InputOutputUserInfo.fromPbUser(user)));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -927,7 +1019,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
event.operatorId = operatorId;
|
||||
event.channelId = channelId;
|
||||
event.type = type;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mChannelInfoUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mChannelInfoUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -936,7 +1035,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
ChatroomUpdateEvent event = new ChatroomUpdateEvent();
|
||||
event.chatroomId = chatroomId;
|
||||
event.type = type;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mChatroomInfoUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mChatroomInfoUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -947,7 +1053,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
event.chatroomId = chatroomId;
|
||||
event.memberIds = memberIds;
|
||||
event.type = type;
|
||||
m_Server.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mChatroomMemberUpdateCallback, new Gson().toJson(event)));
|
||||
m_Server.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mChatroomMemberUpdateCallback, new Gson().toJson(event));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1665,6 +1778,25 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getGroupManagers(String groupId, boolean includeOwner) {
|
||||
Set<String> ret = new HashSet<>();
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
|
||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
|
||||
if (members == null || members.size() == 0) {
|
||||
members = loadGroupMemberFromDB(hzInstance, groupId);
|
||||
}
|
||||
for (WFCMessage.GroupMember member : members) {
|
||||
if(member.getType() == GroupMemberType_Manager || (member.getType() == GroupMemberType_Owner && includeOwner)) {
|
||||
ret.add(member.getMemberId());
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
@@ -1802,7 +1934,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
|
||||
@Override
|
||||
public ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
|
||||
public ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||
|
||||
@@ -1824,6 +1956,27 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} else {
|
||||
LOG.debug("Get user info, user {} userDt {} : request {}",request.getUid(), user.getUpdateDt(), request.getUpdateDt());
|
||||
if (user.getUpdateDt() > request.getUpdateDt()) {
|
||||
if(!mUserHideProperties.isEmpty() && !user.getUid().equals(fromUser)) {
|
||||
WFCMessage.User.Builder userBuilder = user.toBuilder();
|
||||
for (Integer i:mUserHideProperties) {
|
||||
if(i == Modify_Gender) {
|
||||
userBuilder.clearGender();
|
||||
} else if(i == Modify_Mobile) {
|
||||
userBuilder.clearMobile();
|
||||
} else if(i == Modify_Email) {
|
||||
userBuilder.clearEmail();
|
||||
} else if(i == Modify_Address) {
|
||||
userBuilder.clearAddress();
|
||||
} else if(i == Modify_Company) {
|
||||
userBuilder.clearCompany();
|
||||
} else if(i == Modify_Social) {
|
||||
userBuilder.clearSocial();
|
||||
} else if(i == Modify_Extra) {
|
||||
userBuilder.clearExtra();
|
||||
}
|
||||
}
|
||||
user = userBuilder.build();
|
||||
}
|
||||
resultBuilder.setUser(user);
|
||||
resultBuilder.setCode(ProtoConstants.UserResultCode.Success);
|
||||
} else {
|
||||
@@ -1872,10 +2025,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
builder.setPortrait(entry.getValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Mobile:
|
||||
builder.setMobile(entry.getValue());
|
||||
modified = true;
|
||||
break;
|
||||
//禁止客户端直接修改电话号码,只能通过admin api来修改
|
||||
// case Modify_Mobile:
|
||||
// builder.setMobile(entry.getValue());
|
||||
// modified = true;
|
||||
// break;
|
||||
case Modify_Email:
|
||||
builder.setEmail(entry.getValue());
|
||||
modified = true;
|
||||
@@ -2033,6 +2187,15 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
}
|
||||
@Override
|
||||
public void updateUserInfo(WFCMessage.User user) throws Exception {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||
if(mUserMap.get(user.getUid()) != null) {
|
||||
databaseStore.updateUser(user);
|
||||
mUserMap.put(user.getUid(), user);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public WFCMessage.User getUserInfo(String userId) {
|
||||
@@ -2920,9 +3083,20 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
userSettingMap.put(userId, settingEntry);
|
||||
userGlobalSlientMap.remove(userId);
|
||||
userConvSlientMap.remove(userId);
|
||||
userPushHiddenDetail.remove(userId);
|
||||
|
||||
if(request.getScope() == UserSettingScope.kUserSettingConversationSilent) {
|
||||
int firstSplit = request.getKey().indexOf("-");
|
||||
int type = Integer.parseInt(request.getKey().substring(0, firstSplit));
|
||||
int secondSplit = request.getKey().indexOf("-", firstSplit+1);
|
||||
int line = Integer.parseInt(request.getKey().substring(firstSplit+1, secondSplit));
|
||||
String target = request.getKey().substring(secondSplit+1);
|
||||
String key = userId + "|" + type + "|" + target + "|" + line;
|
||||
userConvSlientMap.remove(key);
|
||||
} else if(request.getScope() == UserSettingScope.kUserSettingGlobalSilent) {
|
||||
userGlobalSlientMap.remove(userId);
|
||||
} else if(request.getScope() == UserSettingScope.kUserSettingHiddenNotificationDetail) {
|
||||
userPushHiddenDetail.remove(userId);
|
||||
}
|
||||
IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt);
|
||||
return updateDt;
|
||||
}
|
||||
@@ -2977,7 +3151,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} else {
|
||||
slient = true;
|
||||
}
|
||||
userConvSlientMap.put(userId, slient);
|
||||
userConvSlientMap.put(key, slient);
|
||||
}
|
||||
return slient;
|
||||
}
|
||||
@@ -3257,6 +3431,22 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAllowClientCustomGroupNotification() {
|
||||
return mGroupAllowClientCustomOperationNotification;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getVisibleQuitKickoffNotification() {
|
||||
return mGroupVisibleQuitKickoffNotification;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<Integer> getClientForbiddenSendTypes() {
|
||||
return mForbiddenClientSendTypes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMessageHead(String user) {
|
||||
TreeMap<Long, Long> maps = userMessages.get(user);
|
||||
|
||||
@@ -57,6 +57,8 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
|
||||
private int deleted;
|
||||
|
||||
private boolean pullHistoryMsg;
|
||||
|
||||
public int getDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
@@ -139,6 +141,14 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
this.carrierName = carrierName;
|
||||
}
|
||||
|
||||
public boolean isPullHistoryMsg() {
|
||||
return pullHistoryMsg;
|
||||
}
|
||||
|
||||
public void setPullHistoryMsg(boolean pullHistoryMsg) {
|
||||
this.pullHistoryMsg = pullHistoryMsg;
|
||||
}
|
||||
|
||||
public long getUpdateDt() {
|
||||
return updateDt;
|
||||
}
|
||||
@@ -339,18 +349,22 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
Session session = sessions.get(clientID);
|
||||
|
||||
if (session != null && !session.username.equals(username)) {
|
||||
if (userSessions.get(username) != null) {
|
||||
userSessions.get(username).remove(clientID);
|
||||
if (userSessions.get(session.username) != null) {
|
||||
userSessions.get(session.username).remove(clientID);
|
||||
}
|
||||
session = null;
|
||||
}
|
||||
ClientSession clientSession = new ClientSession(clientID, this);
|
||||
session = databaseStore.getSession(username, clientID, clientSession);
|
||||
|
||||
if (session == null) {
|
||||
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
||||
if(session == null) {
|
||||
session = databaseStore.getSession(username, clientID, clientSession);
|
||||
if (session == null) {
|
||||
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
||||
}
|
||||
}
|
||||
sessions.put(clientID, session);
|
||||
|
||||
sessions.put(clientID, session);
|
||||
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||
sessionSet.add(clientID);
|
||||
|
||||
if (session.getDeleted() > 0) {
|
||||
session.setDeleted(0);
|
||||
@@ -393,8 +407,8 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
|
||||
if (remove) {
|
||||
sessions.remove(c);
|
||||
mServer.getProcessor().kickoffSession(s);
|
||||
it.remove();
|
||||
mServer.getProcessor().kickoffSession(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -405,6 +419,34 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
return session;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void kickoffUserClient(String username, String cid) {
|
||||
List<String> clientIds = new ArrayList<>();
|
||||
if(StringUtil.isNullOrEmpty(cid)) {
|
||||
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||
clientIds.addAll(sessionSet);
|
||||
} else {
|
||||
clientIds.add(cid);
|
||||
}
|
||||
|
||||
for (String clientID: clientIds) {
|
||||
Session session = sessions.get(clientID);
|
||||
if(session == null) {
|
||||
ClientSession clientSession = new ClientSession(clientID, this);
|
||||
session = databaseStore.getSession(username, clientID, clientSession);
|
||||
if (session == null || session.getDeleted() > 0) {
|
||||
continue;
|
||||
}
|
||||
sessions.put(clientID, session);
|
||||
}
|
||||
|
||||
if (session.getDeleted() == 0) {
|
||||
session.setDeleted(1);
|
||||
databaseStore.updateSessionDeleted(username, clientID, 1);
|
||||
mServer.getProcessor().kickoffSession(session);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode loadActiveSession(String username, String clientID) {
|
||||
@@ -452,7 +494,6 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
|
||||
session.setUsername(username);
|
||||
sessions.put(clientID, session);
|
||||
|
||||
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||
sessionSet.add(clientID);
|
||||
|
||||
@@ -491,11 +532,15 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
@Override
|
||||
public void loadUserSession(String username, String clientID) {
|
||||
if (sessions.containsKey(clientID)) {
|
||||
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||
sessionSet.add(clientID);
|
||||
return;
|
||||
}
|
||||
Session session = databaseStore.getSession(username, clientID, new ClientSession(clientID, this));
|
||||
if (session != null) {
|
||||
sessions.put(clientID, session);
|
||||
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||
sessionSet.add(clientID);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -226,7 +226,7 @@ public class Server {
|
||||
handlers = Collections.emptyList();
|
||||
}
|
||||
DBUtil.init(config);
|
||||
String strKey = config.getProperty(BrokerConstants.CLIENT_PROTO_SECRET_KEY);
|
||||
String strKey = "0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F";
|
||||
String[] strs = strKey.split(",");
|
||||
if(strs.length != 16) {
|
||||
LOG.error("Key error, it length should be 16");
|
||||
@@ -253,6 +253,9 @@ public class Server {
|
||||
|
||||
initMediaServerConfig(config);
|
||||
|
||||
String monitorEventAddress = config.getProperty(MONITOR_Exception_Event_Address);
|
||||
Utility.setMonitorEventAddress(monitorEventAddress);
|
||||
|
||||
final String persistencePath = config.getProperty(BrokerConstants.PERSISTENT_STORE_PROPERTY_NAME);
|
||||
LOG.info("Configuring Using persistent store file, path={}", persistencePath);
|
||||
m_store = initStore(config, this);
|
||||
@@ -433,6 +436,7 @@ public class Server {
|
||||
System.out.println("Server will flush data to db before shutting down, please wait 5 seconds!");
|
||||
LOG.info("Unbinding server from the configured ports");
|
||||
m_shutdowning = true;
|
||||
DBUtil.SystemExiting = true;
|
||||
|
||||
m_acceptor.close();
|
||||
LOG.trace("Stopping MQTT protocol processor");
|
||||
|
||||
@@ -35,10 +35,6 @@ public abstract class IConfig {
|
||||
void assignDefaults() {
|
||||
setProperty(BrokerConstants.PORT_PROPERTY_NAME, Integer.toString(BrokerConstants.PORT));
|
||||
setProperty(BrokerConstants.HOST_PROPERTY_NAME, BrokerConstants.HOST);
|
||||
// setProperty(BrokerConstants.WEB_SOCKET_PORT_PROPERTY_NAME,
|
||||
// Integer.toString(BrokerConstants.WEBSOCKET_PORT));
|
||||
// setProperty(BrokerConstants.PERSISTENT_STORE_PROPERTY_NAME,
|
||||
// BrokerConstants.DEFAULT_PERSISTENT_PATH);
|
||||
setProperty(BrokerConstants.AUTHORIZATOR_CLASS_NAME, "");
|
||||
}
|
||||
|
||||
|
||||
@@ -33,19 +33,6 @@ public class MemoryConfig extends IConfig {
|
||||
}
|
||||
}
|
||||
|
||||
// private void createDefaults() {
|
||||
// m_properties.put(BrokerConstants.PORT_PROPERTY_NAME, Integer.toString(BrokerConstants.PORT));
|
||||
// m_properties.put(BrokerConstants.HOST_PROPERTY_NAME, BrokerConstants.HOST);
|
||||
// m_properties.put(BrokerConstants.WEB_SOCKET_PORT_PROPERTY_NAME,
|
||||
// Integer.toString(BrokerConstants.WEBSOCKET_PORT));
|
||||
// m_properties.put(BrokerConstants.PASSWORD_FILE_PROPERTY_NAME, "");
|
||||
// m_properties.put(BrokerConstants.PERSISTENT_STORE_PROPERTY_NAME,
|
||||
// BrokerConstants.DEFAULT_PERSISTENT_PATH);
|
||||
// m_properties.put(BrokerConstants.ALLOW_ANONYMOUS_PROPERTY_NAME, true);
|
||||
// m_properties.put(BrokerConstants.AUTHENTICATOR_CLASS_NAME, "");
|
||||
// m_properties.put(BrokerConstants.AUTHORIZATOR_CLASS_NAME, "");
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void setProperty(String name, String value) {
|
||||
m_properties.setProperty(name, value);
|
||||
|
||||
@@ -49,6 +49,7 @@ import org.slf4j.LoggerFactory;
|
||||
import javax.net.ssl.SSLContext;
|
||||
import javax.net.ssl.SSLEngine;
|
||||
import java.io.IOException;
|
||||
import java.net.BindException;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
@@ -57,35 +58,6 @@ import static io.netty.channel.ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE;
|
||||
|
||||
public class NettyAcceptor implements ServerAcceptor {
|
||||
|
||||
private static final String MQTT_SUBPROTOCOL_CSV_LIST = "mqtt, mqttv3.1, mqttv3.1.1";
|
||||
|
||||
static class WebSocketFrameToByteBufDecoder extends MessageToMessageDecoder<BinaryWebSocketFrame> {
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext chc, BinaryWebSocketFrame frame, List<Object> out)
|
||||
throws Exception {
|
||||
// convert the frame to a ByteBuf
|
||||
ByteBuf bb = frame.content();
|
||||
// System.out.println("WebSocketFrameToByteBufDecoder decode - " +
|
||||
// ByteBufUtil.hexDump(bb));
|
||||
bb.retain();
|
||||
out.add(bb);
|
||||
}
|
||||
}
|
||||
|
||||
static class ByteBufToWebSocketFrameEncoder extends MessageToMessageEncoder<ByteBuf> {
|
||||
|
||||
@Override
|
||||
protected void encode(ChannelHandlerContext chc, ByteBuf bb, List<Object> out) throws Exception {
|
||||
// convert the ByteBuf to a WebSocketFrame
|
||||
BinaryWebSocketFrame result = new BinaryWebSocketFrame();
|
||||
// System.out.println("ByteBufToWebSocketFrameEncoder encode - " +
|
||||
// ByteBufUtil.hexDump(bb));
|
||||
result.content().writeBytes(bb);
|
||||
out.add(result);
|
||||
}
|
||||
}
|
||||
|
||||
abstract class PipelineInitializer {
|
||||
|
||||
abstract void init(ChannelPipeline pipeline) throws Exception;
|
||||
@@ -144,17 +116,6 @@ public class NettyAcceptor implements ServerAcceptor {
|
||||
this.errorsCather = Optional.empty();
|
||||
|
||||
initializePlainTCPTransport(mqttHandler, props);
|
||||
String sslTcpPortProp = props.getProperty(BrokerConstants.SSL_PORT_PROPERTY_NAME);
|
||||
String wssPortProp = props.getProperty(BrokerConstants.WSS_PORT_PROPERTY_NAME);
|
||||
if (sslTcpPortProp != null || wssPortProp != null) {
|
||||
SSLContext sslContext = sslCtxCreator.initSSLContext();
|
||||
if (sslContext == null) {
|
||||
LOG.error("Can't initialize SSLHandler layer! Exiting, check your configuration of jks");
|
||||
return;
|
||||
}
|
||||
initializeSSLTCPTransport(mqttHandler, props, sslContext);
|
||||
initializeWSSTransport(mqttHandler, props, sslContext);
|
||||
}
|
||||
}
|
||||
|
||||
private void initFactory(String host, int port, String protocol, final PipelineInitializer pipeliner) {
|
||||
@@ -187,6 +148,13 @@ public class NettyAcceptor implements ServerAcceptor {
|
||||
f.sync().addListener(FIRE_EXCEPTION_ON_FAILURE);
|
||||
} catch (InterruptedException ex) {
|
||||
LOG.error("An interruptedException was caught while initializing server. Protocol={}", protocol, ex);
|
||||
} catch (Exception e) {
|
||||
if(e instanceof BindException) {
|
||||
e.printStackTrace();
|
||||
LOG.error("端口 {} 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep {}", port, port);
|
||||
System.out.println("端口 " + port + " 已经被占用。请检查该端口被那个程序占用,找到程序停掉。\n查找端口被那个程序占用的命令是: netstat -tunlp | grep " + port);
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -225,81 +193,6 @@ public class NettyAcceptor implements ServerAcceptor {
|
||||
});
|
||||
}
|
||||
|
||||
private void initializeSSLTCPTransport(final NettyMQTTHandler handler, IConfig props, final SSLContext sslContext)
|
||||
throws IOException {
|
||||
LOG.info("Configuring SSL MQTT transport");
|
||||
String sslPortProp = props.getProperty(SSL_PORT_PROPERTY_NAME, DISABLED_PORT_BIND);
|
||||
if (DISABLED_PORT_BIND.equals(sslPortProp)) {
|
||||
// Do nothing no SSL configured
|
||||
LOG.info("Property {} has been set to {}. SSL MQTT will be disabled",
|
||||
BrokerConstants.SSL_PORT_PROPERTY_NAME, DISABLED_PORT_BIND);
|
||||
return;
|
||||
}
|
||||
|
||||
int sslPort = Integer.parseInt(sslPortProp);
|
||||
LOG.info("Starting SSL on port {}", sslPort);
|
||||
|
||||
final MoquetteIdleTimeoutHandler timeoutHandler = new MoquetteIdleTimeoutHandler();
|
||||
String host = props.getProperty(BrokerConstants.HOST_PROPERTY_NAME);
|
||||
String sNeedsClientAuth = props.getProperty(BrokerConstants.NEED_CLIENT_AUTH, "false");
|
||||
final boolean needsClientAuth = Boolean.valueOf(sNeedsClientAuth);
|
||||
initFactory(host, sslPort, "SSL MQTT", new PipelineInitializer() {
|
||||
|
||||
@Override
|
||||
void init(ChannelPipeline pipeline) throws Exception {
|
||||
pipeline.addLast("ssl", createSslHandler(sslContext, needsClientAuth));
|
||||
pipeline.addFirst("idleStateHandler", new IdleStateHandler(nettyChannelTimeoutSeconds, 0, 0));
|
||||
pipeline.addAfter("idleStateHandler", "idleEventHandler", timeoutHandler);
|
||||
// pipeline.addLast("logger", new LoggingHandler("Netty", LogLevel.ERROR));
|
||||
pipeline.addFirst("bytemetrics", new BytesMetricsHandler(m_bytesMetricsCollector));
|
||||
pipeline.addLast("decoder", new MqttDecoder());
|
||||
pipeline.addLast("encoder", MqttEncoder.INSTANCE);
|
||||
pipeline.addLast("metrics", new MessageMetricsHandler(m_metricsCollector));
|
||||
pipeline.addLast("messageLogger", new MQTTMessageLogger());
|
||||
pipeline.addLast("handler", handler);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initializeWSSTransport(final NettyMQTTHandler handler, IConfig props, final SSLContext sslContext)
|
||||
throws IOException {
|
||||
LOG.info("Configuring secure websocket MQTT transport");
|
||||
String sslPortProp = props.getProperty(WSS_PORT_PROPERTY_NAME, DISABLED_PORT_BIND);
|
||||
if (DISABLED_PORT_BIND.equals(sslPortProp)) {
|
||||
// Do nothing no SSL configured
|
||||
LOG.info("Property {} has been set to {}. Secure websocket MQTT will be disabled",
|
||||
BrokerConstants.WSS_PORT_PROPERTY_NAME, DISABLED_PORT_BIND);
|
||||
return;
|
||||
}
|
||||
int sslPort = Integer.parseInt(sslPortProp);
|
||||
final MoquetteIdleTimeoutHandler timeoutHandler = new MoquetteIdleTimeoutHandler();
|
||||
String host = props.getProperty(BrokerConstants.HOST_PROPERTY_NAME);
|
||||
String sNeedsClientAuth = props.getProperty(BrokerConstants.NEED_CLIENT_AUTH, "false");
|
||||
final boolean needsClientAuth = Boolean.valueOf(sNeedsClientAuth);
|
||||
initFactory(host, sslPort, "Secure websocket", new PipelineInitializer() {
|
||||
|
||||
@Override
|
||||
void init(ChannelPipeline pipeline) throws Exception {
|
||||
pipeline.addLast("ssl", createSslHandler(sslContext, needsClientAuth));
|
||||
pipeline.addLast("httpEncoder", new HttpResponseEncoder());
|
||||
pipeline.addLast("httpDecoder", new HttpRequestDecoder());
|
||||
pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
|
||||
pipeline.addLast("webSocketHandler",
|
||||
new WebSocketServerProtocolHandler("/org/fusesource/mqtt", MQTT_SUBPROTOCOL_CSV_LIST));
|
||||
pipeline.addLast("ws2bytebufDecoder", new WebSocketFrameToByteBufDecoder());
|
||||
pipeline.addLast("bytebuf2wsEncoder", new ByteBufToWebSocketFrameEncoder());
|
||||
pipeline.addFirst("idleStateHandler", new IdleStateHandler(nettyChannelTimeoutSeconds, 0, 0));
|
||||
pipeline.addAfter("idleStateHandler", "idleEventHandler", timeoutHandler);
|
||||
pipeline.addFirst("bytemetrics", new BytesMetricsHandler(m_bytesMetricsCollector));
|
||||
pipeline.addLast("decoder", new MqttDecoder());
|
||||
pipeline.addLast("encoder", MqttEncoder.INSTANCE);
|
||||
pipeline.addLast("metrics", new MessageMetricsHandler(m_metricsCollector));
|
||||
pipeline.addLast("messageLogger", new MQTTMessageLogger());
|
||||
pipeline.addLast("handler", handler);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void close() {
|
||||
LOG.info("Closing Netty acceptor...");
|
||||
if (m_workerGroup == null || m_bossGroup == null) {
|
||||
|
||||
@@ -122,6 +122,7 @@ public interface IMessagesStore {
|
||||
ErrorCode setGroupManager(String operator, String groupId, int type, List<String> userList, boolean isAdmin);
|
||||
boolean isMemberInGroup(String member, String groupId);
|
||||
ErrorCode canSendMessageInGroup(String member, String groupId);
|
||||
Set<String> getGroupManagers(String groupId, boolean includeOwner);
|
||||
|
||||
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin);
|
||||
ErrorCode recallCastMessage(long messageUid, String operatorId);
|
||||
@@ -130,7 +131,9 @@ public interface IMessagesStore {
|
||||
|
||||
WFCMessage.Robot getRobot(String robotId);
|
||||
void addRobot(WFCMessage.Robot robot);
|
||||
ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
||||
|
||||
ErrorCode getUserInfo(String fromUser, List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
||||
|
||||
ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception;
|
||||
|
||||
void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online);
|
||||
@@ -141,6 +144,7 @@ public interface IMessagesStore {
|
||||
|
||||
void addUserInfo(WFCMessage.User user, String password) throws Exception;
|
||||
void destoryUser(String userId);
|
||||
void updateUserInfo(WFCMessage.User user) throws Exception;
|
||||
WFCMessage.User getUserInfo(String userId);
|
||||
WFCMessage.User getUserInfoByName(String name);
|
||||
WFCMessage.User getUserInfoByMobile(String mobile);
|
||||
@@ -209,6 +213,12 @@ public interface IMessagesStore {
|
||||
List<String> getAllSensitiveWords();
|
||||
|
||||
WFCMessage.Message getMessage(long messageId);
|
||||
|
||||
boolean isAllowClientCustomGroupNotification();
|
||||
int getVisibleQuitKickoffNotification();
|
||||
|
||||
List<Integer> getClientForbiddenSendTypes();
|
||||
|
||||
long getMessageHead(String user);
|
||||
long getFriendHead(String user);
|
||||
long getFriendRqHead(String user);
|
||||
|
||||
@@ -51,6 +51,8 @@ public interface ISessionsStore {
|
||||
void updateSessionToken(Session session, boolean voip);
|
||||
|
||||
void clearUserSession(String username);
|
||||
|
||||
void kickoffUserClient(String userId, String clientId);
|
||||
/**
|
||||
* @param clientID
|
||||
* the client owning the session.
|
||||
|
||||
@@ -49,6 +49,7 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.function.BiFunction;
|
||||
|
||||
import static cn.wildfirechat.common.IMExceptionEvent.EventType.EVENT_CALLBACK_Exception;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||
|
||||
public class MessagesPublisher {
|
||||
@@ -176,7 +177,14 @@ public class MessagesPublisher {
|
||||
message = m_messagesStore.getMessage(messageHead);
|
||||
}
|
||||
final WFCMessage.Message finalMsg = message;
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(SendMessageData.fromProtoMessage(finalMsg), SendMessageData.class)));
|
||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(robot.getCallback(), new Gson().toJson(SendMessageData.fromProtoMessage(finalMsg), SendMessageData.class));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -324,7 +332,7 @@ public class MessagesPublisher {
|
||||
}
|
||||
}
|
||||
|
||||
if ((StringUtil.isNullOrEmpty(pushContent) && messageContentType != 402 && messageContentType != 400)) {
|
||||
if ((StringUtil.isNullOrEmpty(pushContent) && messageContentType != 402 && messageContentType != 400 && messageContentType != 401)) {
|
||||
LOG.info("push content is empty and contenttype is {}", messageContentType);
|
||||
continue;
|
||||
}
|
||||
@@ -365,6 +373,25 @@ public class MessagesPublisher {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean sendOfflineNotify(String clientId) {
|
||||
boolean targetIsActive = this.connectionDescriptors.isConnected(clientId);
|
||||
if (targetIsActive) {
|
||||
ByteBuf payload = Unpooled.buffer();
|
||||
payload.ensureWritable(1).writeBytes("1".getBytes());
|
||||
MqttPublishMessage publishMsg;
|
||||
publishMsg = notRetainedPublish(IMTopic.NotifyOffline, MqttQoS.AT_MOST_ONCE, payload);
|
||||
|
||||
boolean sent = this.messageSender.sendPublish(clientId, publishMsg);
|
||||
if (sent) {
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
LOG.info("the target {} is not active", clientId);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private void publishTransparentMessage2Receivers(long messageHead, Collection<String> receivers, int pullType, String exceptClientId) {
|
||||
WFCMessage.Message message = m_messagesStore.getMessage(messageHead);
|
||||
@@ -540,7 +567,14 @@ public class MessagesPublisher {
|
||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(message.getConversation().getTarget());
|
||||
if (channelInfo != null && !StringUtil.isNullOrEmpty(channelInfo.getCallback())) {
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(SendMessageData.fromProtoMessage(message), SendMessageData.class)));
|
||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/message", new Gson().toJson(SendMessageData.fromProtoMessage(message), SendMessageData.class));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
long messageId = message.getMessageId();
|
||||
@@ -580,7 +614,14 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
public void forwardMessage(final WFCMessage.Message message, String forwardUrl) {
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class)));
|
||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(forwardUrl, new Gson().toJson(OutputMessageData.fromProtoMessage(message), OutputMessageData.class));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void notifyChannelListenStatusChanged(WFCMessage.ChannelInfo channelInfo, String user, boolean listen) {
|
||||
@@ -588,6 +629,13 @@ public class MessagesPublisher {
|
||||
return;
|
||||
}
|
||||
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(channelInfo.getCallback() + "/subscribe", new Gson().toJson(new OutputNotifyChannelSubscribeStatus(user, channelInfo.getTargetId(), listen), OutputNotifyChannelSubscribeStatus.class)));
|
||||
Server.getServer().getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(channelInfo.getCallback() + "/subscribe", new Gson().toJson(new OutputNotifyChannelSubscribeStatus(user, channelInfo.getTargetId(), listen), OutputNotifyChannelSubscribeStatus.class));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,10 @@ class PersistentQueueMessageSender {
|
||||
|
||||
boolean sendPublish(ClientSession clientsession, MqttPublishMessage pubMessage) {
|
||||
String clientId = clientsession.clientID;
|
||||
return sendPublish(clientId, pubMessage);
|
||||
}
|
||||
|
||||
boolean sendPublish(String clientId, MqttPublishMessage pubMessage) {
|
||||
final int messageId = pubMessage.variableHeader().packetId();
|
||||
final String topicName = pubMessage.variableHeader().topicName();
|
||||
if (LOG.isDebugEnabled()) {
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package io.moquette.spi.impl;
|
||||
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import cn.wildfirechat.pojos.SendMessageData;
|
||||
import cn.wildfirechat.pojos.UserOnlineStatus;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
@@ -54,6 +53,7 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
import static io.moquette.spi.impl.InternalRepublisher.createPublishForQos;
|
||||
import static cn.wildfirechat.common.IMExceptionEvent.EventType.EVENT_CALLBACK_Exception;
|
||||
import static io.moquette.spi.impl.Utils.readBytesAndRewind;
|
||||
import static io.netty.handler.codec.mqtt.MqttConnectReturnCode.*;
|
||||
import static io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader.from;
|
||||
@@ -72,15 +72,30 @@ public class ProtocolProcessor {
|
||||
|
||||
public void kickoffSession(final MemorySessionStore.Session session) {
|
||||
mServer.getImBusinessScheduler().execute(()->{
|
||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
||||
try {
|
||||
if (descriptor != null) {
|
||||
processDisconnect(descriptor.getChannel(), true, false);
|
||||
new Thread(() -> {
|
||||
messagesPublisher.sendOfflineNotify(session.getClientID());
|
||||
try {
|
||||
Thread.sleep(3000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
mServer.getImBusinessScheduler().execute(()->{
|
||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
||||
try {
|
||||
if (descriptor != null) {
|
||||
processDisconnect(descriptor.getChannel(), true, false);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
m_messagesStore.updateUserOnlineSetting(session, false);
|
||||
});
|
||||
}).start();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -252,7 +267,14 @@ public class ProtocolProcessor {
|
||||
|
||||
public void forwardOnlineStatusEvent(String userId, String clientId, int platform, int status, String packageName) {
|
||||
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
|
||||
mServer.getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName))));
|
||||
mServer.getCallbackScheduler().execute(() -> {
|
||||
try {
|
||||
HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName)));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,12 +16,10 @@
|
||||
|
||||
package io.moquette.spi.impl;
|
||||
|
||||
import static cn.wildfirechat.common.ErrorCode.*;
|
||||
import static io.moquette.spi.impl.Utils.readBytesAndRewind;
|
||||
import static io.netty.handler.codec.mqtt.MqttMessageIdVariableHeader.from;
|
||||
import static io.netty.handler.codec.mqtt.MqttQoS.AT_MOST_ONCE;
|
||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_NOT_IMPLEMENT;
|
||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
@@ -256,6 +254,13 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
||||
String imtopic = topic.getTopic();
|
||||
ByteBuf payload = msg.payload();
|
||||
byte[] payloadContent = readBytesAndRewind(payload);
|
||||
if(payloadContent.length == 0) {
|
||||
ByteBuf ackPayload = Unpooled.buffer();
|
||||
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
|
||||
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
|
||||
return;
|
||||
}
|
||||
|
||||
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
|
||||
payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true);
|
||||
imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), false);
|
||||
|
||||
@@ -14,6 +14,8 @@ import java.io.BufferedReader;
|
||||
import java.io.FileReader;
|
||||
import java.sql.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.hazelcast.util.StringUtil;
|
||||
@@ -27,6 +29,8 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
|
||||
|
||||
public class DBUtil {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(DBUtil.class);
|
||||
private static ComboPooledDataSource comboPooledDataSource = null;
|
||||
@@ -39,118 +43,226 @@ public class DBUtil {
|
||||
}
|
||||
};
|
||||
|
||||
public static boolean IsEmbedDB = false;
|
||||
public static boolean IsEmbedDB = false;
|
||||
public static boolean SystemExiting = false;
|
||||
public static boolean ClearDBDebugMode = false;
|
||||
|
||||
public static void init(IConfig config) {
|
||||
String embedDB = config.getProperty(BrokerConstants.EMBED_DB_PROPERTY_NAME);
|
||||
if (embedDB != null && embedDB.equals("1")) {
|
||||
IsEmbedDB = true;
|
||||
LOG.info("Use h2 database");
|
||||
public static void init(IConfig config) {
|
||||
String embedDB = config.getProperty(BrokerConstants.EMBED_DB_PROPERTY_NAME);
|
||||
boolean autoCleanMsgs = "true".equals(config.getProperty(BrokerConstants.DB_AUTO_CLEAN_HISTORY_MESSAGES));
|
||||
if (embedDB != null && embedDB.equals("1")) {
|
||||
IsEmbedDB = true;
|
||||
LOG.info("Use h2 database");
|
||||
} else {
|
||||
IsEmbedDB = false;
|
||||
LOG.info("Use mysql database");
|
||||
}
|
||||
|
||||
if (comboPooledDataSource == null) {
|
||||
String migrateLocation;
|
||||
if (IsEmbedDB) {
|
||||
migrateLocation = "filesystem:./migrate/h2";
|
||||
comboPooledDataSource = new ComboPooledDataSource();
|
||||
|
||||
comboPooledDataSource.setJdbcUrl( "jdbc:h2:./h2db/wfchat;AUTO_SERVER=TRUE;MODE=MySQL" );
|
||||
comboPooledDataSource.setUser("SA");
|
||||
comboPooledDataSource.setPassword("SA");
|
||||
comboPooledDataSource.setMinPoolSize(5);
|
||||
comboPooledDataSource.setAcquireIncrement(5);
|
||||
comboPooledDataSource.setMaxPoolSize(20);
|
||||
|
||||
comboPooledDataSource.setIdleConnectionTestPeriod(60 * 5);
|
||||
comboPooledDataSource.setMinPoolSize(3);
|
||||
comboPooledDataSource.setInitialPoolSize(3);
|
||||
|
||||
try {
|
||||
comboPooledDataSource.setDriverClass( "org.h2.Driver" ); //loads the jdbc driver
|
||||
} catch (PropertyVetoException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
IsEmbedDB = false;
|
||||
LOG.info("Use mysql database");
|
||||
}
|
||||
migrateLocation = "filesystem:./migrate/mysql";
|
||||
comboPooledDataSource = new ComboPooledDataSource("mysql");
|
||||
try {
|
||||
String url01 = comboPooledDataSource.getJdbcUrl().substring(0,comboPooledDataSource.getJdbcUrl().indexOf("?"));
|
||||
String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
|
||||
// 连接已经存在的数据库,如:mysql
|
||||
String jdbc = comboPooledDataSource.getJdbcUrl().replace(datasourceName, "");
|
||||
Connection connection = DriverManager.getConnection(jdbc, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
|
||||
Statement statement = connection.createStatement();
|
||||
|
||||
if (comboPooledDataSource == null) {
|
||||
String migrateLocation;
|
||||
if (IsEmbedDB) {
|
||||
migrateLocation = "filesystem:./migrate/h2";
|
||||
comboPooledDataSource = new ComboPooledDataSource();
|
||||
|
||||
comboPooledDataSource.setJdbcUrl( "jdbc:h2:./h2db/wfchat;AUTO_SERVER=TRUE;MODE=MySQL" );
|
||||
comboPooledDataSource.setUser("SA");
|
||||
comboPooledDataSource.setPassword("SA");
|
||||
comboPooledDataSource.setMinPoolSize(5);
|
||||
comboPooledDataSource.setAcquireIncrement(5);
|
||||
comboPooledDataSource.setMaxPoolSize(20);
|
||||
|
||||
comboPooledDataSource.setIdleConnectionTestPeriod(60 * 5);
|
||||
comboPooledDataSource.setMinPoolSize(3);
|
||||
comboPooledDataSource.setInitialPoolSize(3);
|
||||
|
||||
try {
|
||||
comboPooledDataSource.setDriverClass( "org.h2.Driver" ); //loads the jdbc driver
|
||||
} catch (PropertyVetoException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
migrateLocation = "filesystem:./migrate/mysql";
|
||||
comboPooledDataSource = new ComboPooledDataSource("mysql");
|
||||
try {
|
||||
String url01 = comboPooledDataSource.getJdbcUrl().substring(0,comboPooledDataSource.getJdbcUrl().indexOf("?"));
|
||||
String datasourceName = url01.substring(url01.lastIndexOf("/")+1);
|
||||
// 连接已经存在的数据库,如:mysql
|
||||
String jdbc = comboPooledDataSource.getJdbcUrl().replace(datasourceName, "");
|
||||
Connection connection = DriverManager.getConnection(jdbc, comboPooledDataSource.getUser(), comboPooledDataSource.getPassword());
|
||||
Statement statement = connection.createStatement();
|
||||
|
||||
// 创建数据库
|
||||
statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + datasourceName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
|
||||
|
||||
statement.close();
|
||||
connection.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.exit(-1);
|
||||
}
|
||||
// 创建数据库
|
||||
statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `" + datasourceName + "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
|
||||
|
||||
statement.close();
|
||||
connection.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
System.exit(-1);
|
||||
}
|
||||
Flyway flyway = Flyway.configure().dataSource(comboPooledDataSource).locations(migrateLocation).baselineOnMigrate(true).load();
|
||||
flyway.migrate();
|
||||
|
||||
}
|
||||
Flyway flyway = Flyway.configure().dataSource(comboPooledDataSource).locations(migrateLocation).baselineOnMigrate(true).load();
|
||||
flyway.migrate();
|
||||
|
||||
if(autoCleanMsgs) {
|
||||
cleanHistoryMsg();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void cleanHistoryMsg() {
|
||||
new Thread(()->{
|
||||
long usedTime = 0;
|
||||
while (true) {
|
||||
if(SystemExiting) {
|
||||
break;
|
||||
}
|
||||
try {
|
||||
long sleepTime;
|
||||
if(ClearDBDebugMode) {
|
||||
sleepTime = 60 * 1000 - usedTime;
|
||||
} else {
|
||||
sleepTime = 60 * 60 * 1000 - usedTime;
|
||||
}
|
||||
if(sleepTime < 0) {
|
||||
sleepTime = 5 * 1000;
|
||||
}
|
||||
|
||||
Thread.sleep(sleepTime);
|
||||
LOG.info("Start clean history messages");
|
||||
|
||||
if(SystemExiting) {
|
||||
break;
|
||||
}
|
||||
long start = System.currentTimeMillis();
|
||||
if(IsEmbedDB) {
|
||||
clearH2DB();
|
||||
} else {
|
||||
clearMySQL();
|
||||
}
|
||||
usedTime = System.currentTimeMillis() - start;
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
private static boolean sleep() {
|
||||
if(SystemExiting)
|
||||
return true;
|
||||
|
||||
try {
|
||||
if(ClearDBDebugMode) {
|
||||
Thread.sleep(500);
|
||||
} else {
|
||||
Thread.sleep(10000);
|
||||
}
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return SystemExiting;
|
||||
}
|
||||
|
||||
private static long getMaxMidNeedClean() {
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(new Date());
|
||||
cal.add(Calendar.YEAR, -3);
|
||||
cal.add(Calendar.DATE, 1);
|
||||
return MessageShardingUtil.getMsgIdFromTimestamp(cal.getTimeInMillis());
|
||||
}
|
||||
|
||||
private static void clearH2DB() {
|
||||
clearOneTable("t_user_messages");
|
||||
if(sleep()) {
|
||||
return;
|
||||
}
|
||||
clearOneTable("t_messages");
|
||||
}
|
||||
|
||||
private static void clearMySQL() {
|
||||
for (int i = 0; i < 128; i++) {
|
||||
clearOneTable("t_user_messages_" + i);
|
||||
if(sleep()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private static List<String> getCreateSql() {
|
||||
List<String> out = new ArrayList<>();
|
||||
try{
|
||||
BufferedReader br = new BufferedReader(new FileReader("h2/create_table.sql"));//构造一个BufferedReader类来读取文件
|
||||
String s = null;
|
||||
StringBuilder result = new StringBuilder();
|
||||
while((s = br.readLine())!=null) {
|
||||
result.append(s);
|
||||
if (s.contains(";")) {
|
||||
out.add(result.toString());
|
||||
result = new StringBuilder();
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
return out;
|
||||
String msgTableName = MessageShardingUtil.getMessageTable(MessageShardingUtil.getMsgIdFromTimestamp(System.currentTimeMillis()));
|
||||
clearOneTable(msgTableName);
|
||||
}
|
||||
|
||||
private static void clearOneTable(String tableName) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
long mid = getMaxMidNeedClean();
|
||||
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "delete from " + tableName + " where _mid <= " + mid;
|
||||
statement = connection.prepareStatement(sql);
|
||||
int count = statement.executeUpdate();
|
||||
LOG.info("Delete history message {} rows", count);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
//从数据源中获取数据库的连接
|
||||
public static Connection getConnection() throws SQLException {
|
||||
long threadId = Thread.currentThread().getId();
|
||||
}
|
||||
|
||||
if (map.get(threadId) != null) {
|
||||
LOG.error("error here!!!! DB connection not close correctly");
|
||||
}
|
||||
map.put(threadId, Thread.currentThread().getStackTrace().toString());
|
||||
Connection connection = transactionConnection.get();
|
||||
if (connection != null) {
|
||||
LOG.debug("Thread {} get db connection {}", threadId, connection);
|
||||
return connection;
|
||||
private static List<String> getCreateSql() {
|
||||
List<String> out = new ArrayList<>();
|
||||
try{
|
||||
BufferedReader br = new BufferedReader(new FileReader("h2/create_table.sql"));//构造一个BufferedReader类来读取文件
|
||||
String s = null;
|
||||
StringBuilder result = new StringBuilder();
|
||||
while((s = br.readLine())!=null) {
|
||||
result.append(s);
|
||||
if (s.contains(";")) {
|
||||
out.add(result.toString());
|
||||
result = new StringBuilder();
|
||||
}
|
||||
}
|
||||
br.close();
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
//从数据源中获取数据库的连接
|
||||
public static Connection getConnection() throws SQLException {
|
||||
long threadId = Thread.currentThread().getId();
|
||||
|
||||
connection = comboPooledDataSource.getConnection();
|
||||
if (map.get(threadId) != null) {
|
||||
LOG.error("error here!!!! DB connection not close correctly");
|
||||
}
|
||||
map.put(threadId, Thread.currentThread().getStackTrace().toString());
|
||||
Connection connection = transactionConnection.get();
|
||||
if (connection != null) {
|
||||
LOG.debug("Thread {} get db connection {}", threadId, connection);
|
||||
return connection;
|
||||
}
|
||||
|
||||
public static void beginTransaction() {
|
||||
try {
|
||||
Connection connection = getConnection();
|
||||
connection.setAutoCommit(false);
|
||||
transactionConnection.set(connection);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
connection = comboPooledDataSource.getConnection();
|
||||
LOG.debug("Thread {} get db connection {}", threadId, connection);
|
||||
return connection;
|
||||
}
|
||||
|
||||
public static void beginTransaction() {
|
||||
try {
|
||||
Connection connection = getConnection();
|
||||
connection.setAutoCommit(false);
|
||||
transactionConnection.set(connection);
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void commit() {
|
||||
try {
|
||||
@@ -180,57 +292,57 @@ public class DBUtil {
|
||||
}
|
||||
}
|
||||
|
||||
//释放资源,将数据库连接还给数据库连接池
|
||||
public static void closeDB(Connection conn,PreparedStatement ps,ResultSet rs) {
|
||||
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
|
||||
try {
|
||||
if (rs!=null) {
|
||||
rs.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (ps!=null) {
|
||||
ps.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (conn!=null && transactionConnection.get() != conn) {
|
||||
conn.close();
|
||||
map.remove(Thread.currentThread().getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
//释放资源,将数据库连接还给数据库连接池
|
||||
public static void closeDB(Connection conn,PreparedStatement ps,ResultSet rs) {
|
||||
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
|
||||
try {
|
||||
if (rs!=null) {
|
||||
rs.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
//释放资源,将数据库连接还给数据库连接池
|
||||
public static void closeDB(Connection conn, PreparedStatement ps) {
|
||||
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
|
||||
try {
|
||||
if (ps!=null) {
|
||||
ps.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (conn!=null && transactionConnection.get() != conn) {
|
||||
conn.close();
|
||||
map.remove(Thread.currentThread().getId());
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
try {
|
||||
if (ps!=null) {
|
||||
ps.close();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (conn!=null && transactionConnection.get() != conn) {
|
||||
conn.close();
|
||||
map.remove(Thread.currentThread().getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
//释放资源,将数据库连接还给数据库连接池
|
||||
public static void closeDB(Connection conn, PreparedStatement ps) {
|
||||
LOG.debug("Thread {} release db connection {}", Thread.currentThread().getId(), conn);
|
||||
try {
|
||||
if (ps!=null) {
|
||||
ps.close();
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
try {
|
||||
if (conn!=null && transactionConnection.get() != conn) {
|
||||
conn.close();
|
||||
map.remove(Thread.currentThread().getId());
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,9 @@ public class HttpUtils {
|
||||
static private OkHttpClient client = new OkHttpClient();
|
||||
|
||||
public static void httpJsonPost(final String url, final String jsonStr){
|
||||
LOG.info("POST to {} with data {}", url, jsonStr);
|
||||
//消息推送内容为 {"sender":"uCGUxUaa","senderName":"杨","convType":0,"target":"usq7v7UU","targetName":"鞋子","userId":"usq7v7UU","line":0,"cntType":400,"serverTime":1610590766485,"pushMessageType":1,"pushType":2,"pushContent":"","pushData":"","unReceivedMsg":1,"mentionedType":0,"packageName":"cn.wildfirechat.chat","deviceToken":"AFoieP9P6u6CccIkRK23gRwUJWKqSkdiqnb-6gC1kL7Wv-9XNoEYBPU7VsINU_q8_WTKfafe35qWu7ya7Z-NmgOTX9XVW3A3zd6ilh--quj6ccINXRvVnh8QmI9QQ","isHiddenDetail":false,"language":"zh"}
|
||||
//推送信息只打印前100个字符,防止敏感信息打印到日志中去。
|
||||
LOG.info("POST to {} with data {}...", url, jsonStr.substring(0, Math.min(jsonStr.length(), 100)));
|
||||
if (StringUtil.isNullOrEmpty(url)) {
|
||||
LOG.error("http post failure with empty url");
|
||||
return;
|
||||
|
||||
@@ -16,6 +16,8 @@ public interface IMTopic {
|
||||
String PullMessageTopic = "MP";
|
||||
String NotifyMessageTopic = "MN";
|
||||
String NotifyRecallMessageTopic = "RMN";
|
||||
String NotifyOffline = "ROFL";
|
||||
|
||||
String BroadcastMessageTopic = "MBC";
|
||||
|
||||
String GetUserSettingTopic = "UG";
|
||||
|
||||
@@ -101,6 +101,26 @@ public class MessageShardingUtil {
|
||||
year %= 3;
|
||||
return "t_messages_" + (year * 12 + month);
|
||||
}
|
||||
static Calendar getCalendarFromMessageId(long mid) {
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
if (mid != Long.MAX_VALUE && mid != 0) {
|
||||
mid >>= (nodeIdWidth + rotateIdWidth);
|
||||
Date date = new Date(mid + T201801010000);
|
||||
calendar.setTime(date);
|
||||
} else {
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
calendar.setTime(date);
|
||||
}
|
||||
return calendar;
|
||||
}
|
||||
public static long getMsgIdFromTimestamp(long timestamp) {
|
||||
long id = timestamp - T201801010000;
|
||||
|
||||
id <<= rotateIdWidth;
|
||||
id <<= nodeIdWidth;
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
public static String getPreviousMessageTable(long mid) {
|
||||
return getMessageTable(mid, -1);
|
||||
|
||||
@@ -8,12 +8,35 @@
|
||||
|
||||
package win.liyufan.im;
|
||||
|
||||
import cn.wildfirechat.common.IMExceptionEvent;
|
||||
import com.google.gson.Gson;
|
||||
import com.hazelcast.util.StringUtil;
|
||||
import io.moquette.server.Server;
|
||||
import org.slf4j.Logger;
|
||||
|
||||
import java.net.*;
|
||||
import java.util.Enumeration;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicLong;
|
||||
|
||||
public class Utility {
|
||||
private static Map<String, IMExceptionEvent> exceptionEventHashMap = new ConcurrentHashMap<>();
|
||||
static AtomicLong SendExceptionExpireTime = new AtomicLong(0);
|
||||
static int SendExceptionDuration = 180000;
|
||||
static long lastSendTime = System.currentTimeMillis();
|
||||
static {
|
||||
new Thread(()->{
|
||||
while (true) {
|
||||
try {
|
||||
Thread.sleep(60 * 1000);
|
||||
sendExceptionEvent();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
public static InetAddress getLocalAddress(){
|
||||
try {
|
||||
Enumeration<NetworkInterface> b = NetworkInterface.getNetworkInterfaces();
|
||||
@@ -29,6 +52,10 @@ public class Utility {
|
||||
}
|
||||
|
||||
public static void printExecption(Logger LOG, Exception e) {
|
||||
printExecption(LOG, e, 0);
|
||||
}
|
||||
|
||||
public static void printExecption(Logger LOG, Exception e, int eventType) {
|
||||
String message = "";
|
||||
|
||||
for(StackTraceElement stackTraceElement : e.getStackTrace()) {
|
||||
@@ -36,6 +63,58 @@ public class Utility {
|
||||
}
|
||||
LOG.error("Exception: {}", e.getMessage());
|
||||
LOG.error(message);
|
||||
if(eventType > 0) {
|
||||
String key = eventType+(e.getMessage() != null ? e.getMessage().split("\n")[0] : "null");
|
||||
IMExceptionEvent event = exceptionEventHashMap.get(key);
|
||||
if(event == null) {
|
||||
event = new IMExceptionEvent();
|
||||
event.event_type = eventType;
|
||||
event.msg = e.getMessage();
|
||||
event.call_stack = message;
|
||||
event.count = 0;
|
||||
|
||||
exceptionEventHashMap.put(key, event);
|
||||
}
|
||||
event.count++;
|
||||
|
||||
sendExceptionEvent();
|
||||
}
|
||||
}
|
||||
|
||||
private static String gMonitorEventAddress;
|
||||
|
||||
public static void setMonitorEventAddress(String gMonitorEventAddress) {
|
||||
Utility.gMonitorEventAddress = gMonitorEventAddress;
|
||||
}
|
||||
|
||||
private static void sendExceptionEvent() {
|
||||
if(StringUtil.isNullOrEmpty(gMonitorEventAddress)) {
|
||||
return;
|
||||
}
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
long t = SendExceptionExpireTime.getAndUpdate((long l) -> now - l >= SendExceptionDuration ? now : l);
|
||||
|
||||
if(now - t >= SendExceptionDuration) {
|
||||
for (Map.Entry<String, IMExceptionEvent> entry : exceptionEventHashMap.entrySet()) {
|
||||
if(entry.getValue().count > 0) {
|
||||
String jsonStr = new Gson().toJson(entry.getValue());
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr));
|
||||
entry.getValue().count = 0;
|
||||
lastSendTime = now;
|
||||
}
|
||||
}
|
||||
if(now - lastSendTime > 24 * 3600 * 1000) {
|
||||
lastSendTime = now;
|
||||
IMExceptionEvent event = new IMExceptionEvent();
|
||||
event.event_type = 0;
|
||||
event.msg = "监控心跳通知";
|
||||
event.call_stack = "别担心!这个是心跳消息,已经有24小时没有出现异常消息了!";
|
||||
event.count = IMExceptionEvent.EventType.HEART_BEAT;
|
||||
String jsonStr = new Gson().toJson(event);
|
||||
Server.getServer().getCallbackScheduler().execute(() -> HttpUtils.httpJsonPost(gMonitorEventAddress, jsonStr));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static String getMacAddress() throws UnknownHostException,
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.49</version>
|
||||
<version>0.52</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -28,7 +28,9 @@ public interface APIPath {
|
||||
String User_Get_Blocked_List = "/admin/user/get_blocked_list";
|
||||
String User_Check_Block_Status = "/admin/user/check_block_status";
|
||||
String User_Get_Online_Status = "/admin/user/onlinestatus";
|
||||
|
||||
String User_Put_Setting = "/admin/user/put_setting";
|
||||
String User_Get_Setting = "/admin/user/get_setting";
|
||||
String User_Kickoff_Client = "/admin/user/kickoff_client";
|
||||
|
||||
String Friend_Update_Status = "/admin/friend/status";
|
||||
String Friend_Get_List = "/admin/friend/list";
|
||||
@@ -60,7 +62,7 @@ public interface APIPath {
|
||||
String Group_Mute_Member = "/admin/group/manager/mute";
|
||||
String Group_Allow_Member = "/admin/group/manager/allow";
|
||||
String Get_User_Groups = "/admin/group/of_user";
|
||||
|
||||
String Group_Set_Member_Alias = "/admin/group/member/set_alias";
|
||||
|
||||
String Create_Channel = "/admin/channel/create";
|
||||
String Get_System_Setting = "/admin/system/get_setting";
|
||||
@@ -75,4 +77,25 @@ public interface APIPath {
|
||||
|
||||
String Robot_User_Info = "/robot/user_info";
|
||||
String Robot_Message_Send = "/robot/message/send";
|
||||
|
||||
String Robot_Set_Callback = "/robot/set_callback";
|
||||
String Robot_Get_Callback = "/robot/get_callback";
|
||||
String Robot_Delete_Callback = "/robot/delete_callback";
|
||||
String Robot_Update_Profile = "/robot/update_profile";
|
||||
|
||||
String Robot_Verify_Application_User = "/robot/user/verify";
|
||||
|
||||
String Robot_Group_Member_Add = "/robot/group/member/add";
|
||||
String Robot_Group_Allow_Member = "/robot/group/manager/allow";
|
||||
String Robot_Create_Group = "/robot/group/create";
|
||||
String Robot_Group_Dismiss = "/robot/group/del";
|
||||
String Robot_Group_Get_Info = "/robot/group/get_info";
|
||||
String Robot_Group_Member_List = "/robot/group/member/list";
|
||||
String Robot_Group_Member_Kickoff = "/robot/group/member/del";
|
||||
String Robot_Group_Modify_Info = "/robot/group/modify";
|
||||
String Robot_Group_Set_Member_Alias = "/robot/group/member/set_alias";
|
||||
String Robot_Group_Mute_Member = "/robot/group/manager/mute";
|
||||
String Robot_Group_Member_Quit = "/robot/group/member/quit";
|
||||
String Robot_Group_Transfer = "/robot/group/transfer";
|
||||
String Robot_Group_Set_Manager = "/robot/group/manager/set";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package cn.wildfirechat.common;
|
||||
|
||||
public class IMExceptionEvent {
|
||||
public interface EventType {
|
||||
int RDBS_Exception = 1;
|
||||
int MONGO_Exception = 2;
|
||||
int RPC_Exception = 3;
|
||||
int PUSH_SERVER_Exception = 4;
|
||||
int ADMIN_API_Exception = 5;
|
||||
int CHANNEL_API_Exception = 6;
|
||||
int ROBOT_API_Exception = 7;
|
||||
int SHORT_LINK_Exception = 8;
|
||||
int EVENT_CALLBACK_Exception = 9;
|
||||
int HEART_BEAT = 100;
|
||||
}
|
||||
|
||||
public int event_type;
|
||||
public String msg;
|
||||
public String call_stack;
|
||||
public int count;
|
||||
}
|
||||
@@ -105,10 +105,18 @@ public class GroupNotificationBinaryContent {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER);
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getKickokfMemberVisibleGroupNotifyContent() {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER_VISIBLE);
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getQuitGroupNotifyContent() {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_QUIT_GROUP);
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getQuitVisibleGroupNotifyContent() {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_QUIT_GROUP_VISIBLE);
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getTransferGroupNotifyContent() {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_TRANSFER_GROUP_OWNER);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InputSetGroupMemberAlias extends InputGroupBase {
|
||||
private String group_id;
|
||||
private String memberId;
|
||||
private String alias;
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public boolean isValide() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public WFCMessage.ModifyGroupMemberAlias toProtoGroupRequest() {
|
||||
WFCMessage.ModifyGroupMemberAlias.Builder modifyAliasBuilder = WFCMessage.ModifyGroupMemberAlias.newBuilder();
|
||||
modifyAliasBuilder.setGroupId(group_id);
|
||||
modifyAliasBuilder.setAlias(StringUtil.isNullOrEmpty(alias)?"":alias);
|
||||
modifyAliasBuilder.setMemberId(memberId);
|
||||
|
||||
if (to_lines != null) {
|
||||
for (Integer line : to_lines) {
|
||||
modifyAliasBuilder.addToLine(line);
|
||||
}
|
||||
}
|
||||
|
||||
if (notify_message != null) {
|
||||
modifyAliasBuilder.setNotifyContent(notify_message.toProtoMessageContent());
|
||||
}
|
||||
return modifyAliasBuilder.build();
|
||||
}
|
||||
|
||||
public String getMemberId() {
|
||||
return memberId;
|
||||
}
|
||||
|
||||
public void setMemberId(String memberId) {
|
||||
this.memberId = memberId;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class IntStringPairPojo {
|
||||
private int intValue;
|
||||
private String strValue;
|
||||
|
||||
public IntStringPairPojo() {
|
||||
}
|
||||
|
||||
public IntStringPairPojo(int intValue, String strValue) {
|
||||
this.intValue = intValue;
|
||||
this.strValue = strValue;
|
||||
}
|
||||
|
||||
public int getIntValue() {
|
||||
return intValue;
|
||||
}
|
||||
|
||||
public void setIntValue(int intValue) {
|
||||
this.intValue = intValue;
|
||||
}
|
||||
|
||||
public String getStrValue() {
|
||||
return strValue;
|
||||
}
|
||||
|
||||
public void setStrValue(String strValue) {
|
||||
this.strValue = strValue;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -6,7 +6,7 @@
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package win.liyufan.im;
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public interface MyInfoType {
|
||||
int Modify_DisplayName = 0;
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class RobotCallbackPojo {
|
||||
private String url;
|
||||
|
||||
public String getUrl() {
|
||||
return url;
|
||||
}
|
||||
|
||||
public void setUrl(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class StringPairPojo {
|
||||
private String first;
|
||||
private String second;
|
||||
|
||||
public StringPairPojo() {
|
||||
}
|
||||
|
||||
public StringPairPojo(String first, String second) {
|
||||
this.first = first;
|
||||
this.second = second;
|
||||
}
|
||||
|
||||
public String getFirst() {
|
||||
return first;
|
||||
}
|
||||
|
||||
public void setFirst(String first) {
|
||||
this.first = first;
|
||||
}
|
||||
|
||||
public String getSecond() {
|
||||
return second;
|
||||
}
|
||||
|
||||
public void setSecond(String second) {
|
||||
this.second = second;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
public class UserSettingPojo {
|
||||
private String userId;
|
||||
private int scope;
|
||||
private String key;
|
||||
private String value;
|
||||
|
||||
public String getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(String userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public int getScope() {
|
||||
return scope;
|
||||
}
|
||||
|
||||
public void setScope(int scope) {
|
||||
this.scope = scope;
|
||||
}
|
||||
|
||||
public String getKey() {
|
||||
return key;
|
||||
}
|
||||
|
||||
public void setKey(String key) {
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
public WFCMessage.ModifyUserSettingReq toProtoRequest() {
|
||||
WFCMessage.ModifyUserSettingReq.Builder builder = WFCMessage.ModifyUserSettingReq.newBuilder();
|
||||
builder.setScope(scope);
|
||||
if (!StringUtil.isNullOrEmpty(key))
|
||||
builder.setKey(key);
|
||||
if(!StringUtil.isNullOrEmpty(value))
|
||||
builder.setValue(value);
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
}
|
||||
@@ -219,5 +219,7 @@ public class ProtoConstants {
|
||||
public static final int MESSAGE_CONTENT_TYPE_SET_MANAGER = 117;
|
||||
public static final int MESSAGE_CONTENT_TYPE_MUTE_MEMBER = 118;
|
||||
public static final int MESSAGE_CONTENT_TYPE_ALLOW_MEMBER = 119;
|
||||
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER_VISIBLE = 120;
|
||||
public static final int MESSAGE_CONTENT_TYPE_QUIT_GROUP_VISIBLE = 121;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<relativePath>../pom.xml</relativePath>-->
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.49</version>
|
||||
<version>0.52</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>distribution</artifactId>
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
## 注意事项:
|
||||
#1. 配置文件修改是不能直接生效的,需要重启后才能生效。
|
||||
#2. Linux下使用windows格式配置文件会出错,包括本文件,c3p0文件,hz配置。常见于在windows系统上修改,然后上传到linux服务器,可以在linux服务器上直接修改或者上传到linux服务器后转换成unix格式,具体转换方法请百度。
|
||||
|
||||
#*********************************************************************
|
||||
# Server configuration
|
||||
#*********************************************************************
|
||||
@@ -6,15 +10,12 @@
|
||||
# (如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
||||
server.ip 0.0.0.0
|
||||
|
||||
##原生客户端长链接端口
|
||||
##原生客户端长链接端口。如果使用4层的反向代理或者类似组件,需要设置长链接保持时间为10分钟。
|
||||
port 1883
|
||||
|
||||
##客户端短链接端口
|
||||
http_port 80
|
||||
|
||||
##WEB客户端长链接端口
|
||||
websocket_port 8083
|
||||
|
||||
#管理端口
|
||||
http.admin.port 18080
|
||||
|
||||
@@ -30,6 +31,11 @@ local_port 80
|
||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
||||
embed.db 1
|
||||
|
||||
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉3年前的历史消息。
|
||||
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
|
||||
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
|
||||
db.auto_clean_history_messages true
|
||||
|
||||
##服务器管理接口密钥
|
||||
http.admin.secret_key 123456
|
||||
|
||||
@@ -37,9 +43,6 @@ http.admin.secret_key 123456
|
||||
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
|
||||
http.admin.no_check_time false
|
||||
|
||||
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥不能修改!!!
|
||||
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
|
||||
|
||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||
token.key testim
|
||||
|
||||
@@ -69,6 +72,10 @@ message.disable_remote_search false
|
||||
##允许客户端撤回消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
||||
message.recall_time_limit 120
|
||||
|
||||
## 禁止客户端发送消息类型,消息类型以逗号分开,下面3个值为示例,可以删除。
|
||||
## 一般用于重要类型消息,比如交易、充值等,禁止客户端发送,仅限于服务器发送,提高安全性。
|
||||
message.forbidden_client_send_types 3999,4000,4001
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -99,6 +106,19 @@ chatroom.participant_idle_time 900000
|
||||
## 用户向聊天室发送消息,自动加入聊天室
|
||||
chatroom.rejoin_when_active true
|
||||
|
||||
## 是否允许客户端发送操作群的自定义群通知消息
|
||||
group.allow_client_custom_operation_notification false
|
||||
|
||||
## 当群成员退出或者被移除时,是否同时给管理员和相关人员发送显式通知消息。
|
||||
## 0 不发送,1 退群时发送,2 踢人时发送,3 退群和踢人时都发送。
|
||||
## 如果应用需要退群或者踢人不通知普通成员,请设置此参数为3,然后修改客户端踢人或退群消息的flag为not_presist。
|
||||
group.visible_quit_or_kickoff_notification 0
|
||||
|
||||
## 隐藏用户信息属性类型,2是性别,3是电话号码,4是邮箱,5是地址,6是公司信息,7是社交账号,8是Extra信息。当需要隐藏多个时以英文逗号分开;
|
||||
## 本配置是为了提高安全性,避免把对应信息同步到客户端,这样就能防止程序被破解从而拿到用户关键信息。仅对客户端有效,server api不受影响。
|
||||
## 注意,修改本配置不会对已经同步的信息产生影响。
|
||||
#user.hide_properties 3,4
|
||||
|
||||
#*********************************************************************
|
||||
# hazelcase configuration
|
||||
#*********************************************************************
|
||||
@@ -160,6 +180,7 @@ server.multi_platform_notification false
|
||||
#*********************************************************************
|
||||
# Push server configuration
|
||||
#*********************************************************************
|
||||
##推送服务项目地址:https://github.com/wildfirechat/push_server。
|
||||
##安卓推送服务器地址
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.android.server.address http://localhost:8085/android/push
|
||||
@@ -168,6 +189,11 @@ push.android.server.address http://localhost:8085/android/push
|
||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||
push.ios.server.address http://localhost:8085/ios/push
|
||||
|
||||
#*********************************************************************
|
||||
# 监控配置
|
||||
#*********************************************************************
|
||||
#monitor.exception_event_address http://localhost:8888/im_exception_event/
|
||||
|
||||
#*********************************************************************
|
||||
# 各种事件回调
|
||||
#*********************************************************************
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
FROM openjdk:8-jre-alpine
|
||||
|
||||
ADD ../distribution/target/distribution-*-bundle-tar.tar.gz /opt/im-server/
|
||||
|
||||
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh
|
||||
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh
|
||||
|
||||
WORKDIR /opt/im-server
|
||||
|
||||
VOLUME /opt/im-server/config
|
||||
VOLUME /opt/im-server/logs
|
||||
|
||||
EXPOSE 80/tcp 1883/tcp 8083/tcp 8084/tcp 18080/tcp
|
||||
|
||||
ENV JVM_XMX 256M
|
||||
ENV JVM_XMS 256M
|
||||
|
||||
|
||||
CMD ./bin/wildfirechat.sh
|
||||
@@ -0,0 +1,19 @@
|
||||
# 野火IM服务docker使用说明
|
||||
|
||||
## 编译镜像
|
||||
首先需要先编译应用服务,在项目根目录下使用下面命令编译
|
||||
```
|
||||
mvn clean package
|
||||
```
|
||||
|
||||
然后进入到docker目录下,编译镜像
|
||||
```
|
||||
sudo docker build -t wildfire_im .
|
||||
```
|
||||
|
||||
## 运行
|
||||
配置:
|
||||
运行需要手动指定配置目录,这样不用重新打包镜像。手动指定配置目录的方法如下,其中$PATH_TO_CONFIG为im配置目录,模版为```distribution/src/main/resources```目录:
|
||||
```
|
||||
sudo docker run -it -v $PATH_TO_CONFIG:/opt/im-server/config -v $PATH_TO_LOGS:/opt/im-server/logs -e JVM_XMX=256M -e JVM_XMS=256M -p 80:80 -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 18080:18080 wildfire_im
|
||||
```
|
||||
@@ -12,7 +12,7 @@
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
<version>0.49</version>
|
||||
<version>0.52</version>
|
||||
<name>Wildfire Chat</name>
|
||||
<description>Wildfire Chat Server</description>
|
||||
<inceptionYear>2019</inceptionYear>
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.49</version>
|
||||
<version>0.52</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -27,4 +27,40 @@ public class GeneralAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, inputCreateChannel, OutputCreateChannel.class);
|
||||
}
|
||||
|
||||
//以下仅专业版支持
|
||||
public static IMResult<Void> setConversationTop(String userId, int conversationType, String target, int line, boolean isTop) throws Exception {
|
||||
String key = conversationType + "-" + line + "-" + target;
|
||||
String value = isTop?"1":"0";
|
||||
return setUserSetting(userId, 3, key, value);
|
||||
}
|
||||
|
||||
public static IMResult<Boolean> getConversationTop(String userId, int conversationType, String target, int line) throws Exception {
|
||||
String key = conversationType + "-" + line + "-" + target;
|
||||
IMResult<UserSettingPojo> result = getUserSetting(userId, 3, key);
|
||||
IMResult<Boolean> out = new IMResult<Boolean>();
|
||||
out.code = result.code;
|
||||
out.msg = result.msg;
|
||||
out.result = result.result != null && "1".equals(result.result.getValue());
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
private static IMResult<UserSettingPojo> getUserSetting(String userId, int scope, String key) throws Exception {
|
||||
String path = APIPath.User_Get_Setting;
|
||||
UserSettingPojo pojo = new UserSettingPojo();
|
||||
pojo.setUserId(userId);
|
||||
pojo.setScope(scope);
|
||||
pojo.setKey(key);
|
||||
return AdminHttpUtils.httpJsonPost(path, pojo, UserSettingPojo.class);
|
||||
}
|
||||
|
||||
private static IMResult<Void> setUserSetting(String userId, int scope, String key, String value) throws Exception {
|
||||
String path = APIPath.User_Put_Setting;
|
||||
UserSettingPojo pojo = new UserSettingPojo();
|
||||
pojo.setUserId(userId);
|
||||
pojo.setScope(scope);
|
||||
pojo.setKey(key);
|
||||
pojo.setValue(value);
|
||||
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,6 +140,18 @@ public class GroupAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, quitGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> setGroupMemberAlias(String operator, String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Set_Member_Alias;
|
||||
InputSetGroupMemberAlias input = new InputSetGroupMemberAlias();
|
||||
input.setGroup_id(groupId);
|
||||
input.setOperator(operator);
|
||||
input.setMemberId(memberId);
|
||||
input.setAlias(alias);
|
||||
input.setTo_lines(to_lines);
|
||||
input.setNotify_message(notify_message);
|
||||
return AdminHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputGroupIds> getUserGroups(String user) throws Exception {
|
||||
String path = APIPath.Get_User_Groups;
|
||||
InputUserId inputUserId = new InputUserId();
|
||||
|
||||
@@ -14,6 +14,7 @@ import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static cn.wildfirechat.pojos.MyInfoType.Modify_DisplayName;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_Member_Count;
|
||||
|
||||
public class Main {
|
||||
@@ -356,6 +357,7 @@ public class Main {
|
||||
groupInfo.setOwner("user1");
|
||||
groupInfo.setName("test_group");
|
||||
groupInfo.setExtra("hello extra");
|
||||
groupInfo.setType(2);
|
||||
groupInfo.setPortrait("http://portrait");
|
||||
List<PojoGroupMember> members = new ArrayList<>();
|
||||
PojoGroupMember member1 = new PojoGroupMember();
|
||||
@@ -434,7 +436,7 @@ public class Main {
|
||||
PojoGroupMember m = new PojoGroupMember();
|
||||
m.setMember_id("user1");
|
||||
m.setAlias("hello user1");
|
||||
|
||||
|
||||
voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList(m), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add group member success");
|
||||
@@ -451,22 +453,31 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
|
||||
voidIMResult = GroupAdmin.setGroupMemberAlias("user1", groupInfo.getTarget_id(), "user3", "test user3", null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("set group manager success");
|
||||
System.out.println("set group member alias success");
|
||||
} else {
|
||||
System.out.println("set group manager failure");
|
||||
System.out.println("set group member alias failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("cancel group manager success");
|
||||
} else {
|
||||
System.out.println("cancel group manager failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
if(commercialServer) {
|
||||
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("set group manager success");
|
||||
} else {
|
||||
System.out.println("set group manager failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.setGroupManager("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("cancel group manager success");
|
||||
} else {
|
||||
System.out.println("cancel group manager failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.quitGroup("user4", groupInfo.getTarget_id(), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
@@ -638,8 +649,8 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
static void testChatroom() throws Exception {
|
||||
|
||||
static void testChatroom() throws Exception {
|
||||
String chatroomId = "chatroomId1";
|
||||
String chatroomTitle = "TESTCHATROM";
|
||||
String chatroomDesc = "this is a test chatroom";
|
||||
@@ -695,111 +706,171 @@ public class Main {
|
||||
}
|
||||
|
||||
//下面仅专业版支持
|
||||
/*
|
||||
//设置用户聊天室黑名单。0正常;1禁言;2禁止加入。
|
||||
IMResult<Void> voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 1);
|
||||
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室黑名单
|
||||
IMResult<OutputChatroomBlackInfos> blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
|
||||
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !blackInfos.getResult().infos.isEmpty()) {
|
||||
boolean success = false;
|
||||
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
|
||||
if (info.userId.equals("oto9o9__")) {
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (success) {
|
||||
if(commercialServer) {
|
||||
//设置用户聊天室黑名单。0正常;1禁言;2禁止加入。
|
||||
IMResult<Void> voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 1);
|
||||
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//取消用户聊天室黑名单。0正常;1禁言;2禁止加入。
|
||||
voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 0);
|
||||
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("remove chatroom black success");
|
||||
} else {
|
||||
System.out.println("remove chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室黑名单
|
||||
blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
|
||||
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
boolean success = true;
|
||||
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
|
||||
if (info.userId.equals("oto9o9__")) {
|
||||
success = false;
|
||||
break;
|
||||
//获取聊天室黑名单
|
||||
IMResult<OutputChatroomBlackInfos> blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
|
||||
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !blackInfos.getResult().infos.isEmpty()) {
|
||||
boolean success = false;
|
||||
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
|
||||
if (info.userId.equals("oto9o9__")) {
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (success) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
if (success) {
|
||||
|
||||
//取消用户聊天室黑名单。0正常;1禁言;2禁止加入。
|
||||
voidIMResult1 = ChatroomAdmin.setChatroomBlacklist("chatroom1", "oto9o9__", 0);
|
||||
if (voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("remove chatroom black success");
|
||||
} else {
|
||||
System.out.println("remove chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("remove chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//设置聊天室管理员
|
||||
IMResult<Void> voidIMResult2 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 1);
|
||||
if (voidIMResult2 != null && voidIMResult2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom manager success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
//获取聊天室黑名单
|
||||
blackInfos = ChatroomAdmin.getChatroomBlacklist("chatroom1");
|
||||
if (blackInfos != null && blackInfos.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
boolean success = true;
|
||||
for (OutputChatroomBlackInfos.OutputChatroomBlackInfo info : blackInfos.getResult().infos) {
|
||||
if (info.userId.equals("oto9o9__")) {
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (success) {
|
||||
System.out.println("remove chatroom black success");
|
||||
} else {
|
||||
System.out.println("remove chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("remove chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室管理员
|
||||
IMResult<OutputStringList> managers = ChatroomAdmin.getChatroomManagerList("chatroom1");
|
||||
if (managers != null && managers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers.getResult().getList().isEmpty() && managers.getResult().getList().contains("UserId1")) {
|
||||
//设置聊天室管理员
|
||||
IMResult<Void> voidIMResult2 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 1);
|
||||
if (voidIMResult2 != null && voidIMResult2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom manager success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室管理员
|
||||
IMResult<OutputStringList> managers = ChatroomAdmin.getChatroomManagerList("chatroom1");
|
||||
if (managers != null && managers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers.getResult().getList().isEmpty() && managers.getResult().getList().contains("UserId1")) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//取消聊天室管理员
|
||||
IMResult<Void> voidIMResult3 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 0);
|
||||
if (voidIMResult3 != null && voidIMResult3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom manager success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室管理员
|
||||
IMResult<OutputStringList> managers2 = ChatroomAdmin.getChatroomManagerList("chatroom1");
|
||||
if (managers2 != null && managers2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers2.getResult().getList().contains("UserId1")) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
//取消聊天室管理员
|
||||
IMResult<Void> voidIMResult3 = ChatroomAdmin.setChatroomManager("chatroom1", "UserId1", 0);
|
||||
if (voidIMResult3 != null && voidIMResult3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add chatroom manager success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//获取聊天室管理员
|
||||
IMResult<OutputStringList> managers2 = ChatroomAdmin.getChatroomManagerList("chatroom1");
|
||||
if (managers2 != null && managers2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !managers2.getResult().getList().contains("UserId1")) {
|
||||
System.out.println("add chatroom black success");
|
||||
} else {
|
||||
System.out.println("add chatroom black failure");
|
||||
System.exit(-1);
|
||||
}*/
|
||||
|
||||
}
|
||||
|
||||
static void testRobot() throws Exception {
|
||||
//初始化机器人API
|
||||
RobotHttpUtils.init("http://localhost", "robot1", "123456");
|
||||
//初始化机器人API,注意端口是80,不是18080
|
||||
String robotId = "robot1";
|
||||
RobotHttpUtils.init("http://localhost", robotId, "123456");
|
||||
|
||||
//***********************************************
|
||||
//**** 机器人API
|
||||
//***********************************************
|
||||
|
||||
IMResult<InputOutputUserInfo> userInfoIMResult = RobotService.getProfile(robotId);
|
||||
if(userInfoIMResult != null && userInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("get profile success");
|
||||
} else {
|
||||
System.out.println("get profile failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
String displayName = "testrobot"+System.currentTimeMillis();
|
||||
IMResult<Void> voidIMResult1 = RobotService.updateProfile(Modify_DisplayName, displayName);
|
||||
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("modify profile success");
|
||||
} else {
|
||||
System.out.println("modify profile failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
userInfoIMResult = RobotService.getProfile(robotId);
|
||||
if(userInfoIMResult != null && userInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && displayName.equals(userInfoIMResult.getResult().getDisplayName())) {
|
||||
System.out.println("get profile success");
|
||||
} else {
|
||||
System.out.println("get profile failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
String robotCallback = "http://hellow123";
|
||||
voidIMResult1 = RobotService.setCallback(robotCallback);
|
||||
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("set callback success");
|
||||
} else {
|
||||
System.out.println("set callback failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<RobotCallbackPojo> callbackPojoIMResult = RobotService.getCallback();
|
||||
if(callbackPojoIMResult != null && callbackPojoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && robotCallback.equals(callbackPojoIMResult.getResult().getUrl())) {
|
||||
System.out.println("get callback success");
|
||||
} else {
|
||||
System.out.println("get callback failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult1 = RobotService.deleteCallback();
|
||||
if(voidIMResult1 != null && voidIMResult1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("delete callback success");
|
||||
} else {
|
||||
System.out.println("delete callback failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
callbackPojoIMResult = RobotService.getCallback();
|
||||
if(callbackPojoIMResult != null && callbackPojoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && StringUtil.isNullOrEmpty(callbackPojoIMResult.getResult().getUrl())) {
|
||||
System.out.println("get callback success");
|
||||
} else {
|
||||
System.out.println("get callback failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
Conversation conversation = new Conversation();
|
||||
conversation.setTarget("user2");
|
||||
conversation.setType(ProtoConstants.ConversationType.ConversationType_Private);
|
||||
@@ -822,6 +893,182 @@ public class Main {
|
||||
System.out.println("robot get user info by userId failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
String groupId = "robot_group" + System.currentTimeMillis();
|
||||
PojoGroupInfo groupInfo = new PojoGroupInfo();
|
||||
groupInfo.setTarget_id(groupId);
|
||||
groupInfo.setName("test_group");
|
||||
groupInfo.setType(2);
|
||||
groupInfo.setExtra("hello extra");
|
||||
groupInfo.setPortrait("http://portrait");
|
||||
List<PojoGroupMember> members = new ArrayList<>();
|
||||
|
||||
PojoGroupMember member1 = new PojoGroupMember();
|
||||
member1.setMember_id("user1");
|
||||
members.add(member1);
|
||||
|
||||
PojoGroupMember member2 = new PojoGroupMember();
|
||||
member2.setMember_id("user2");
|
||||
members.add(member2);
|
||||
|
||||
PojoGroupMember member3 = new PojoGroupMember();
|
||||
member3.setMember_id("user3");
|
||||
members.add(member3);
|
||||
|
||||
IMResult<OutputCreateGroupResult> resultCreateGroup = RobotService.createGroup(groupInfo, members, null, null);
|
||||
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("create group success");
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<PojoGroupInfo> resultGetGroupInfo = RobotService.getGroupInfo(groupInfo.getTarget_id());
|
||||
if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if (groupInfo.getExtra().equals(resultGetGroupInfo.getResult().getExtra())
|
||||
&& groupInfo.getName().equals(resultGetGroupInfo.getResult().getName())
|
||||
&& robotId.equals(resultGetGroupInfo.getResult().getOwner())) {
|
||||
System.out.println("get group success");
|
||||
} else {
|
||||
System.out.println("group info is not expected");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<Void> voidIMResult = RobotService.modifyGroupInfo(groupInfo.getTarget_id(), ProtoConstants.ModifyGroupInfoType.Modify_Group_Name,"HelloWorld", null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("modify group success");
|
||||
} else {
|
||||
System.out.println("modify group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
|
||||
IMResult<OutputGroupMemberList> resultGetMembers = RobotService.getGroupMembers(groupInfo.getTarget_id());
|
||||
if (resultGetMembers != null && resultGetMembers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("get group member success");
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
PojoGroupMember m = new PojoGroupMember();
|
||||
m.setMember_id("user1");
|
||||
m.setAlias("hello user1");
|
||||
|
||||
voidIMResult = RobotService.addGroupMembers(groupInfo.getTarget_id(), Arrays.asList(m), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add group member success");
|
||||
} else {
|
||||
System.out.println("add group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = RobotService.kickoffGroupMembers(groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("kickoff group member success");
|
||||
} else {
|
||||
System.out.println("kickoff group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = RobotService.setGroupMemberAlias(groupInfo.getTarget_id(), "user3", "test user3", null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("set group member alias success");
|
||||
} else {
|
||||
System.out.println("set group member alias failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
if(commercialServer) {
|
||||
voidIMResult = RobotService.setGroupManager(groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("set group manager success");
|
||||
} else {
|
||||
System.out.println("set group manager failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = RobotService.setGroupManager(groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("cancel group manager success");
|
||||
} else {
|
||||
System.out.println("cancel group manager failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
//仅专业版支持
|
||||
if (commercialServer) {
|
||||
//开启群成员禁言
|
||||
voidIMResult = RobotService.muteGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("mute group member success");
|
||||
} else {
|
||||
System.out.println("mute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
//关闭群成员禁言
|
||||
voidIMResult = RobotService.muteGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unmute group member success");
|
||||
} else {
|
||||
System.out.println("unmute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//开启群成员白名单,当群全局禁言时,白名单用户可以发言
|
||||
voidIMResult = RobotService.allowGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("allow group member success");
|
||||
} else {
|
||||
System.out.println("allow group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//关闭群成员白名单
|
||||
voidIMResult = RobotService.allowGroupMember(groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unallow group member success");
|
||||
} else {
|
||||
System.out.println("unallow group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
voidIMResult = RobotService.transferGroup(groupInfo.getTarget_id(), "user2", null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("transfer success");
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultGetGroupInfo = RobotService.getGroupInfo(groupInfo.getTarget_id());
|
||||
if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if ("user2".equals(resultGetGroupInfo.getResult().getOwner())) {
|
||||
groupInfo.setOwner("user2");
|
||||
} else {
|
||||
System.out.println("group info is not expected");
|
||||
System.exit(-1);
|
||||
}
|
||||
} else {
|
||||
System.out.println("create group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = RobotService.quitGroup(groupInfo.getTarget_id(), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("quit group success");
|
||||
} else {
|
||||
System.out.println("quit group failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//***测试频道API功能,仅专业版支持***
|
||||
@@ -878,6 +1125,7 @@ public class Main {
|
||||
inputCreateChannel.setOwner("userId1");
|
||||
String secret = "channelsecret";
|
||||
inputCreateChannel.setSecret(secret);
|
||||
inputCreateChannel.setState(0xff);
|
||||
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
||||
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("create channel success");
|
||||
@@ -887,7 +1135,7 @@ public class Main {
|
||||
}
|
||||
|
||||
|
||||
//2. 初始化api
|
||||
//2. 初始化api,注意端口是80,不是18080
|
||||
ChannelServiceApi channelServiceApi = new ChannelServiceApi("http://localhost", resultCreateChannel.getResult().getTargetId(), secret);
|
||||
|
||||
|
||||
@@ -977,9 +1225,9 @@ public class Main {
|
||||
|
||||
IMResult<OutputGetChannelInfo> outputGetChannelInfoIMResult = channelServiceApi.getChannelInfo();
|
||||
if (outputGetChannelInfoIMResult != null && outputGetChannelInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("destroy user success");
|
||||
System.out.println("get channel info success");
|
||||
} else {
|
||||
System.out.println("destroy user failure");
|
||||
System.out.println("get channel info failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,8 +3,10 @@ package cn.wildfirechat.sdk;
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.pojos.*;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
|
||||
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class RobotService {
|
||||
public static IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception {
|
||||
@@ -33,4 +35,166 @@ public class RobotService {
|
||||
InputGetUserInfo getUserInfo = new InputGetUserInfo(null, userName, null);
|
||||
return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> setCallback(String url) throws Exception {
|
||||
String path = APIPath.Robot_Set_Callback;
|
||||
RobotCallbackPojo pojo = new RobotCallbackPojo();
|
||||
pojo.setUrl(url);
|
||||
return RobotHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<RobotCallbackPojo> getCallback() throws Exception {
|
||||
String path = APIPath.Robot_Get_Callback;
|
||||
return RobotHttpUtils.httpJsonPost(path, null, RobotCallbackPojo.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> deleteCallback() throws Exception {
|
||||
String path = APIPath.Robot_Delete_Callback;
|
||||
return RobotHttpUtils.httpJsonPost(path, null, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<InputOutputUserInfo> getProfile(String robotId) throws Exception {
|
||||
return getUserInfo(robotId);
|
||||
}
|
||||
|
||||
/*
|
||||
type可选范围为MyInfoType,注意不能修改电话号码,如果要修改电话号码请使用adminapi进行修改
|
||||
*/
|
||||
public static IMResult<Void> updateProfile(int/*MyInfoType*/ type, String value) throws Exception {
|
||||
String path = APIPath.Robot_Update_Profile;
|
||||
IntStringPairPojo pojo = new IntStringPairPojo(type, value);
|
||||
return RobotHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Create_Group;
|
||||
PojoGroup pojoGroup = new PojoGroup();
|
||||
pojoGroup.setGroup_info(group_info);
|
||||
pojoGroup.setMembers(members);
|
||||
InputCreateGroup createGroup = new InputCreateGroup();
|
||||
createGroup.setGroup(pojoGroup);
|
||||
createGroup.setTo_lines(to_lines);
|
||||
createGroup.setNotify_message(notify_message);
|
||||
|
||||
return RobotHttpUtils.httpJsonPost(path, createGroup, OutputCreateGroupResult.class);
|
||||
}
|
||||
|
||||
public static IMResult<PojoGroupInfo> getGroupInfo(String groupId) throws Exception {
|
||||
String path = APIPath.Robot_Group_Get_Info;
|
||||
InputGetGroup input = new InputGetGroup();
|
||||
input.setGroupId(groupId);
|
||||
|
||||
return RobotHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Dismiss;
|
||||
InputDismissGroup dismissGroup = new InputDismissGroup();
|
||||
dismissGroup.setGroup_id(groupId);
|
||||
dismissGroup.setTo_lines(to_lines);
|
||||
dismissGroup.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, dismissGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Transfer;
|
||||
InputTransferGroup transferGroup = new InputTransferGroup();
|
||||
transferGroup.setGroup_id(groupId);
|
||||
transferGroup.setNew_owner(newOwner);
|
||||
transferGroup.setTo_lines(to_lines);
|
||||
transferGroup.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, transferGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Modify_Info;
|
||||
InputModifyGroupInfo modifyGroupInfo = new InputModifyGroupInfo();
|
||||
modifyGroupInfo.setGroup_id(groupId);
|
||||
modifyGroupInfo.setTo_lines(to_lines);
|
||||
modifyGroupInfo.setType(type);
|
||||
modifyGroupInfo.setValue(value);
|
||||
modifyGroupInfo.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, modifyGroupInfo, Void.class);
|
||||
}
|
||||
|
||||
|
||||
public static IMResult<OutputGroupMemberList> getGroupMembers(String groupId) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_List;
|
||||
InputGetGroup input = new InputGetGroup();
|
||||
input.setGroupId(groupId);
|
||||
return RobotHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Add;
|
||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMembers);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Set_Manager;
|
||||
InputSetGroupManager addGroupMember = new InputSetGroupManager();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMemberIds);
|
||||
addGroupMember.setIs_manager(isManager);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Mute_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMemberIds);
|
||||
addGroupMember.setIs_manager(isMute);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Allow_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMemberIds);
|
||||
addGroupMember.setIs_manager(isAllow);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Kickoff;
|
||||
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
|
||||
kickoffGroupMember.setGroup_id(groupId);
|
||||
kickoffGroupMember.setMembers(groupMemberIds);
|
||||
kickoffGroupMember.setTo_lines(to_lines);
|
||||
kickoffGroupMember.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Member_Quit;
|
||||
InputQuitGroup quitGroup = new InputQuitGroup();
|
||||
quitGroup.setGroup_id(groupId);
|
||||
quitGroup.setTo_lines(to_lines);
|
||||
quitGroup.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, quitGroup, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Robot_Group_Set_Member_Alias;
|
||||
InputSetGroupMemberAlias input = new InputSetGroupMemberAlias();
|
||||
input.setGroup_id(groupId);
|
||||
input.setMemberId(memberId);
|
||||
input.setAlias(alias);
|
||||
input.setTo_lines(to_lines);
|
||||
input.setNotify_message(notify_message);
|
||||
return RobotHttpUtils.httpJsonPost(path, input, Void.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,6 +63,15 @@ public class UserAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputCheckUserOnline.class);
|
||||
}
|
||||
|
||||
/* 强迫用户下线,需要用户重新获取token才能进行连接。
|
||||
userId必须有效,clientId可以为空,当为空时,踢下线说有客户端,当不为空时仅踢掉对应客户端。
|
||||
*/
|
||||
public static IMResult<Void> kickoffUserClient(String userId, String clientId) throws Exception {
|
||||
String path = APIPath.User_Kickoff_Client;
|
||||
StringPairPojo pojo = new StringPairPojo(userId, clientId);
|
||||
return AdminHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> destroyUser(String userId) throws Exception {
|
||||
String path = APIPath.Destroy_User;
|
||||
InputDestroyUser inputDestroyUser = new InputDestroyUser();
|
||||
|
||||
@@ -3,6 +3,7 @@ package cn.wildfirechat.sdk.utilities;
|
||||
import cn.wildfirechat.sdk.model.IMResult;
|
||||
import com.google.gson.Gson;
|
||||
import ikidou.reflect.TypeBuilder;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import org.apache.http.HttpResponse;
|
||||
import org.apache.http.HttpStatus;
|
||||
@@ -63,10 +64,12 @@ public class RobotHttpUtils {
|
||||
}
|
||||
LOG.info("http request content: {}", jsonStr);
|
||||
|
||||
StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8"));
|
||||
entity.setContentEncoding("UTF-8");
|
||||
entity.setContentType("application/json");
|
||||
post.setEntity(entity);
|
||||
if(!StringUtil.isNullOrEmpty(jsonStr)) {
|
||||
StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8"));
|
||||
entity.setContentEncoding("UTF-8");
|
||||
entity.setContentType("application/json");
|
||||
post.setEntity(entity);
|
||||
}
|
||||
HttpResponse response = httpClient.execute(post);
|
||||
|
||||
int statusCode = response.getStatusLine().getStatusCode();
|
||||
|
||||
Reference in New Issue
Block a user