Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e2a334af91 | ||
|
|
7927cea105 | ||
|
|
029cdd5817 | ||
|
|
54e868a36c | ||
|
|
d099c2aa14 | ||
|
|
2f554bd046 | ||
|
|
310b2e1016 | ||
|
|
117f5e6678 | ||
|
|
49edf8e06d | ||
|
|
93a56e4bbc | ||
|
|
4533c2aac6 | ||
|
|
9cd3fe6b8c | ||
|
|
7e0f268b7c | ||
|
|
c03a6f46fb | ||
|
|
7888c1e0d9 | ||
|
|
c0dd1c6581 | ||
|
|
4f13cdeb76 | ||
|
|
a7aa42b851 | ||
|
|
5187e63329 | ||
|
|
4b89774206 | ||
|
|
46211aae44 | ||
|
|
3c241295ce | ||
|
|
e366962c65 | ||
|
|
a01fa84cae | ||
|
|
a22f76d8d6 | ||
|
|
dd5ecd09f2 | ||
|
|
1bd060936c | ||
|
|
0d03ef5758 | ||
|
|
498bfccfe8 | ||
|
|
de064aa582 | ||
|
|
54ce0d5b51 | ||
|
|
b2e495b3ac | ||
|
|
603e8cf5fc | ||
|
|
c3ae7cb0a7 | ||
|
|
a1b4eca6f2 | ||
|
|
f65fe87119 | ||
|
|
a4a9e1418e | ||
|
|
5e92735e27 | ||
|
|
4f27d492a1 | ||
|
|
7c6ef9b66c | ||
|
|
6bfd175781 | ||
|
|
1fc093a2ed | ||
|
|
969d865061 | ||
|
|
6a6c59bdf2 | ||
|
|
7adadd21a6 | ||
|
|
21394985b3 | ||
|
|
b55694624d | ||
|
|
cca9cafb7e | ||
|
|
950334aad3 | ||
|
|
ce578234f4 | ||
|
|
5daa4b1dc8 | ||
|
|
22a23a3f33 | ||
|
|
5d9196939f | ||
|
|
2e4cf566c7 | ||
|
|
a856b96b59 | ||
|
|
9eb5fdd805 | ||
|
|
bace7ec70c | ||
|
|
0bcf2fea7b | ||
|
|
60730c57cb | ||
|
|
3b61f8f6dd | ||
|
|
e6ca9f5c78 | ||
|
|
95beca8e05 | ||
|
|
7c4fe831b3 | ||
|
|
e4da3780f5 | ||
|
|
998f01a584 | ||
|
|
d71644c209 | ||
|
|
70c390dea9 | ||
|
|
41d326d40f | ||
|
|
1dbf431e4d | ||
|
|
0c0d712869 | ||
|
|
73015c7a17 | ||
|
|
9baa1f9b23 | ||
|
|
190da8934f | ||
|
|
9d1031594e | ||
|
|
1d987c1569 | ||
|
|
ac225b1541 | ||
|
|
11375133ba | ||
|
|
91b209d0fa | ||
|
|
216860c573 | ||
|
|
c7579877a1 | ||
|
|
6c5354d17b | ||
|
|
c98bd1fb9b | ||
|
|
fe525e9483 | ||
|
|
6acea9b140 | ||
|
|
4beb573052 | ||
|
|
220e010193 | ||
|
|
865888824c | ||
|
|
583df110fd | ||
|
|
f204bd693e | ||
|
|
b6be1ca045 | ||
|
|
beb403a9f7 | ||
|
|
00f1187200 | ||
|
|
7ee490cc1b | ||
|
|
3dc0ae7a47 | ||
|
|
994a8b5c4a | ||
|
|
5cd2e7affe | ||
|
|
f29ffe4cd2 | ||
|
|
6c7d2ab3ad | ||
|
|
ab7b20871a | ||
|
|
6883418e22 | ||
|
|
32f7266a5f | ||
|
|
35db76e9cd | ||
|
|
4f6aa87b9f | ||
|
|
f5816e20dd | ||
|
|
e72ae59e49 | ||
|
|
f0c2fd82ca | ||
|
|
5a588c8268 | ||
|
|
2adc030d6f | ||
|
|
b0ca8ed2b7 | ||
|
|
f9d5c861ce | ||
|
|
9aaaa71ce9 |
@@ -56,3 +56,7 @@ broker/media
|
|||||||
common/target
|
common/target
|
||||||
server/target
|
server/target
|
||||||
sdk/target
|
sdk/target
|
||||||
|
moments/target
|
||||||
|
monitor
|
||||||
|
wildfire_jmeter
|
||||||
|
git.properties
|
||||||
|
|||||||
@@ -61,6 +61,15 @@
|
|||||||
</map-store>
|
</map-store>
|
||||||
</map>
|
</map>
|
||||||
|
|
||||||
|
<map name="user_friends_empty">
|
||||||
|
<time-to-live-seconds>86400</time-to-live-seconds>
|
||||||
|
<eviction-policy>LRU</eviction-policy>
|
||||||
|
<max-size policy="PER_NODE">1000000</max-size>
|
||||||
|
<eviction-percentage>10</eviction-percentage>
|
||||||
|
</map>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<set name="node_ids"/>
|
<set name="node_ids"/>
|
||||||
|
|
||||||
<multimap name="user_setting">
|
<multimap name="user_setting">
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#native2ascii -encoding UTF-8 messages.properties temp_messages.properties
|
||||||
|
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
|
||||||
|
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Above_Greeting_Message=This's the greeting
|
||||||
|
Friend_Can_Start_Chat=You're already friend, start chat now.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Above_Greeting_Message=This's the greeting
|
||||||
|
Friend_Can_Start_Chat=You're already friend, start chat now.
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
|
||||||
|
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
Above_Greeting_Message=\u4ee5\u4e0a\u662f\u6253\u62db\u547c\u4fe1\u606f
|
||||||
|
Friend_Can_Start_Chat=\u4f60\u4eec\u5df2\u7ecf\u6210\u4e3a\u597d\u53cb\u4e86\uff0c\u73b0\u5728\u53ef\u4ee5\u5f00\u59cb\u804a\u5929\u4e86
|
||||||
@@ -36,7 +36,7 @@ host 0.0.0.0
|
|||||||
local_port 80
|
local_port 80
|
||||||
|
|
||||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
||||||
embed.db 0
|
embed.db 1
|
||||||
|
|
||||||
##服务器管理接口密钥
|
##服务器管理接口密钥
|
||||||
http.admin.secret_key 123456
|
http.admin.secret_key 123456
|
||||||
@@ -52,12 +52,40 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0
|
|||||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||||
token.key testim
|
token.key testim
|
||||||
|
|
||||||
|
##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题
|
||||||
|
##token.expire_time 2592000000
|
||||||
|
|
||||||
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
|
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
|
||||||
message.roaming 0
|
message.roaming 0
|
||||||
|
|
||||||
##是否开启拉取远程历史消息
|
##是否开启拉取远程历史消息
|
||||||
message.remote_history_message 0
|
message.remote_history_message 0
|
||||||
|
|
||||||
|
##服务器为每个用户缓存的消息数量。这个值改得太大,拉取消息时间变长,另外会占用大量内存。
|
||||||
|
message.max_queue 1024
|
||||||
|
|
||||||
|
##是否禁止陌生人聊天
|
||||||
|
message.disable_stranger_chat false
|
||||||
|
|
||||||
|
|
||||||
|
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;
|
||||||
|
message.blacklist.strategy 0
|
||||||
|
|
||||||
|
##好友请求重复发送的间隔,单位是毫秒,默认是7天,0为不限制
|
||||||
|
friend.repeat_request_duration 604800000
|
||||||
|
|
||||||
|
##好友请求被拒绝后再次发送的间隔,单位是毫秒,默认是30天,0为不限制
|
||||||
|
friend.reject_request_duration 2592000000
|
||||||
|
|
||||||
|
##好友请求过期时间,单位是毫秒,默认是7天,0为不限制
|
||||||
|
friend.request_expiration_duration 604800000
|
||||||
|
|
||||||
|
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
||||||
|
chatroom.participant_idle_time 900000
|
||||||
|
|
||||||
|
## 用户向聊天室发送消息,自动加入聊天室
|
||||||
|
chatroom.rejoin_when_active true
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# hazelcase configuration
|
# hazelcase configuration
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
@@ -113,6 +141,11 @@ push.android.server.address http://localhost:8085/android/push
|
|||||||
##苹果推送服务器地址
|
##苹果推送服务器地址
|
||||||
push.ios.server.address http://localhost:8085/ios/push
|
push.ios.server.address http://localhost:8085/ios/push
|
||||||
|
|
||||||
|
#*********************************************************************
|
||||||
|
# User online status event callback
|
||||||
|
#*********************************************************************
|
||||||
|
##用户在线状态事件回调地址
|
||||||
|
#user.online_status_callback http://localhost:8888/user/online_event
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# MongoDB configuration
|
# MongoDB configuration
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
alter table `t_user_session` add column `_deleted` tinyint DEFAULT 0;
|
||||||
Executable
+1
@@ -0,0 +1 @@
|
|||||||
|
alter table `t_user` add column `_deleted` tinyint DEFAULT 0;
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
update t_channel set `_status` = 64 where `_status` = 3;
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
alter table t_messages add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
|
||||||
Executable
+1
@@ -0,0 +1 @@
|
|||||||
|
alter table t_friend add column `_extra` TEXT DEFAULT NULL;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
alter table `t_user_session` add column `_deleted` tinyint DEFAULT 0;
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
alter table `t_user` add column `_deleted` tinyint DEFAULT 0;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
update t_channel set `_status` = 64 where `_status` = 3;
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
alter table t_messages add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
|
||||||
|
alter table t_messages_0 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_1 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_2 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_3 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_4 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_5 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_6 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_7 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_8 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_9 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_10 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_11 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_12 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_13 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_14 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_15 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_16 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_17 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_18 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_19 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_20 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_21 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_22 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_23 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_24 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_25 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_26 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_27 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_28 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_29 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_30 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_31 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_32 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_33 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_34 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
|
alter table t_messages_35 add column `_to` varchar(64) DEFAULT NULL;
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
alter table t_friend add column `_extra` TEXT DEFAULT NULL;
|
||||||
@@ -9,19 +9,40 @@ server {
|
|||||||
root html;
|
root html;
|
||||||
index index.html index.htm index.php;
|
index index.html index.htm index.php;
|
||||||
|
|
||||||
## send request back to im server ##
|
location /route {
|
||||||
location /im {
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-real-ip $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_pass http://imserver;
|
proxy_pass http://imserver;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /route {
|
#社区版需要启用下面一段,专业版不能用
|
||||||
|
location /im {
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-real-ip $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_pass http://imserver;
|
proxy_pass http://imserver;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /api {
|
location /api {
|
||||||
proxy_pass http://imserver;
|
proxy_pass http://imserver;
|
||||||
}
|
}
|
||||||
location / {
|
|
||||||
proxy_pass https://wildfirechat.github.io/docs/;
|
location /fs {
|
||||||
|
proxy_pass http://imserver;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /robot {
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-real-ip $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://imserver;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /channel {
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-real-ip $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_pass http://imserver;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -5,7 +5,7 @@
|
|||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.32</version>
|
<version>0.39</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>log4j</groupId>
|
<groupId>log4j</groupId>
|
||||||
<artifactId>log4j</artifactId>
|
<artifactId>log4j</artifactId>
|
||||||
<version>1.2.14</version>
|
<version>1.2.17</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||||
|
|||||||
@@ -46,4 +46,13 @@ public class PushMessage {
|
|||||||
this.isHiddenDetail = isHiddenDetail;
|
this.isHiddenDetail = isHiddenDetail;
|
||||||
this.language = language;
|
this.language = language;
|
||||||
}
|
}
|
||||||
|
public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) {
|
||||||
|
this.sender = sender;
|
||||||
|
this.target = target;
|
||||||
|
this.senderName = senderName;
|
||||||
|
this.serverTime = serverTime;
|
||||||
|
this.unReceivedMsg = unReceivedMsg;
|
||||||
|
this.pushMessageType = pushMessageType;
|
||||||
|
this.language = language;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class PushServer {
|
|||||||
int PUSH_MESSAGE_TYPE_NORMAL = 0;
|
int PUSH_MESSAGE_TYPE_NORMAL = 0;
|
||||||
int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1;
|
int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1;
|
||||||
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
|
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
|
||||||
|
int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PushServer INSTANCE = new PushServer();
|
private static PushServer INSTANCE = new PushServer();
|
||||||
@@ -57,7 +58,7 @@ public class PushServer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
|
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
|
||||||
LOG.info("try to delivery push diviceId = {}, pushContent", deviceId, pushContent);
|
LOG.info("try to delivery push diviceId = {}, conversationType = {}, pushContent = {}", deviceId, pushMessage.convType, pushContent);
|
||||||
executorService.execute(() ->{
|
executorService.execute(() ->{
|
||||||
try {
|
try {
|
||||||
pushMessageInternel(pushMessage, deviceId, pushContent);
|
pushMessageInternel(pushMessage, deviceId, pushContent);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import io.netty.handler.codec.http.HttpResponseEncoder;
|
|||||||
import io.netty.handler.stream.ChunkedWriteHandler;
|
import io.netty.handler.stream.ChunkedWriteHandler;
|
||||||
import com.xiaoleilu.loServer.action.ClassUtil;
|
import com.xiaoleilu.loServer.action.ClassUtil;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -141,6 +142,7 @@ public class LoServer {
|
|||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(Logger, e);
|
||||||
} catch (ClassNotFoundException e) {
|
} catch (ClassNotFoundException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* 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;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.persistence.MemorySessionStore;
|
||||||
|
import io.moquette.spi.security.Tokenor;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import win.liyufan.im.GitRepositoryState;
|
||||||
|
import win.liyufan.im.RateLimiter;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@Route("/api/verify_token")
|
||||||
|
@HttpMethod("GET")
|
||||||
|
public class CheckTokenAction extends Action {
|
||||||
|
private final RateLimiter mLimitCounter = new RateLimiter(10, 1);
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
String userId = request.getParam("userId");
|
||||||
|
String clientId = request.getParam("clientId");
|
||||||
|
String token = request.getParam("token");
|
||||||
|
|
||||||
|
String result = "这是个检查token有效性的接口,如果客户端无法连接成功,可以使用这个接口检查token是否正确。\n";
|
||||||
|
result += "使用方法是在浏览器中输入http://imserverip/api/verify_token?userId=${userId}&clientId=${clientId}&token=${token}。\n";
|
||||||
|
result += "例如:http://localhost/api/verify_token?userId=123&clientId=456&token=789。\n";
|
||||||
|
result += "特别注意的是:必须使用正确的clientId,clientId必须是在测试手机上调用im接口获取。不用手机上获取到的clientId也都是不同的,一定不能用错!!!\n\n\n";
|
||||||
|
|
||||||
|
if (StringUtil.isNullOrEmpty(userId)) {
|
||||||
|
result += "错误,userId为空";
|
||||||
|
} else if (StringUtil.isNullOrEmpty(clientId)) {
|
||||||
|
result += "错误,clientId为空";
|
||||||
|
} else if (StringUtil.isNullOrEmpty(token)) {
|
||||||
|
result += "错误,token为空";
|
||||||
|
} else if(!mLimitCounter.isGranted("verify_token")) {
|
||||||
|
result += "接口请求超频!接口限制每10秒只能验证一次!";
|
||||||
|
} else {
|
||||||
|
MemorySessionStore.Session session = sessionsStore.getSession(clientId);
|
||||||
|
if (session == null) {
|
||||||
|
result += "错误,session不存在。请确认token是从本服务通过getToken接口获取的,另外请确认clientId是否正确";
|
||||||
|
} else if (session.getDeleted() == 1) {
|
||||||
|
result += "错误,session已经被清除,请确认当前客户没有多端登录或者主动退出";
|
||||||
|
} else if(!session.getUsername().equals(userId)) {
|
||||||
|
result += "错误,当前客户端的登录用户不是" + userId + "。这一般发生在当前clientId又为其它用户获取过token";
|
||||||
|
} else {
|
||||||
|
String id = Tokenor.getUserId(token.getBytes());
|
||||||
|
if (id == null) {
|
||||||
|
result += "错误,无效的token";
|
||||||
|
} else if(!id.equals(userId)) {
|
||||||
|
result += "错误,改token是用户" + id + "的";
|
||||||
|
} else {
|
||||||
|
result += "恭喜,您的信息是正确的";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response.setContent(result);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,6 +35,7 @@ public class FileAction extends Action {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
|
response.setHeader("Access-Control-Allow-Origin", "*");
|
||||||
if (false == Request.METHOD_GET.equalsIgnoreCase(request.getMethod())) {
|
if (false == Request.METHOD_GET.equalsIgnoreCase(request.getMethod())) {
|
||||||
response.sendError(HttpResponseStatus.METHOD_NOT_ALLOWED, "Please use GET method to request file!");
|
response.sendError(HttpResponseStatus.METHOD_NOT_ALLOWED, "Please use GET method to request file!");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public class RouteAction extends Action {
|
|||||||
try {
|
try {
|
||||||
bytes = Base64.getDecoder().decode(str);
|
bytes = Base64.getDecoder().decode(str);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ public class RouteAction extends Action {
|
|||||||
byte[] cbytes = Base64.getDecoder().decode(cid);
|
byte[] cbytes = Base64.getDecoder().decode(cid);
|
||||||
cbytes = AES.AESDecrypt(cbytes, "", true);
|
cbytes = AES.AESDecrypt(cbytes, "", true);
|
||||||
if (cbytes == null) {
|
if (cbytes == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
cid = new String(cbytes);
|
cid = new String(cbytes);
|
||||||
@@ -74,7 +74,7 @@ public class RouteAction extends Action {
|
|||||||
byte[] ubytes = Base64.getDecoder().decode(uid);
|
byte[] ubytes = Base64.getDecoder().decode(uid);
|
||||||
ubytes = AES.AESDecrypt(ubytes, "", true);
|
ubytes = AES.AESDecrypt(ubytes, "", true);
|
||||||
if (ubytes == null) {
|
if (ubytes == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
uid = new String(ubytes);
|
uid = new String(ubytes);
|
||||||
@@ -82,7 +82,7 @@ public class RouteAction extends Action {
|
|||||||
|
|
||||||
MemorySessionStore.Session session = sessionsStore.sessionForClientAndUser(uid, cid);
|
MemorySessionStore.Session session = sessionsStore.sessionForClientAndUser(uid, cid);
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
ErrorCode errorCode = sessionsStore.createNewSession(uid, cid, true, false, 0);
|
ErrorCode errorCode = sessionsStore.loadActiveSession(uid, cid);
|
||||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
sendResponse(response, errorCode, null, base64Response);
|
sendResponse(response, errorCode, null, base64Response);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ public class UnknownErrorAction extends Action{
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
response.setStatus(HttpResponseStatus.NOT_FOUND);
|
response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ public class UploadFileAction extends Action {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
String filePath = dir + "/" + requestId;
|
String filePath = dir + "/" + (StringUtil.isNullOrEmpty(remoteFileName) ? requestId : remoteFileName);
|
||||||
logger.info("the file path is " + filePath);
|
logger.info("the file path is " + filePath);
|
||||||
|
|
||||||
File tmpFile = new File(filePath);
|
File tmpFile = new File(filePath);
|
||||||
@@ -279,7 +279,7 @@ public class UploadFileAction extends Action {
|
|||||||
fileUpload.release();
|
fileUpload.release();
|
||||||
|
|
||||||
response.setStatus(HttpResponseStatus.OK);
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
String relativePath = datePath + "/" + requestId;
|
String relativePath = datePath + "/" + (StringUtil.isNullOrEmpty(remoteFileName) ? requestId : remoteFileName);
|
||||||
response.setContent("{\"key\":\"" + relativePath + "\"}");
|
response.setContent("{\"key\":\"" + relativePath + "\"}");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.xiaoleilu.loServer.action.admin;
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.LoServer;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.action.Action;
|
import com.xiaoleilu.loServer.action.Action;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
@@ -17,9 +18,12 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
|||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import win.liyufan.im.RateLimiter;
|
import win.liyufan.im.RateLimiter;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
abstract public class AdminAction extends Action {
|
abstract public class AdminAction extends Action {
|
||||||
|
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(AdminAction.class);
|
||||||
private static String SECRET_KEY = "123456";
|
private static String SECRET_KEY = "123456";
|
||||||
private static boolean NO_CHECK_TIME = false;
|
private static boolean NO_CHECK_TIME = false;
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 500);
|
private final RateLimiter mLimitCounter = new RateLimiter(10, 500);
|
||||||
@@ -50,8 +54,9 @@ abstract public class AdminAction extends Action {
|
|||||||
Long ts;
|
Long ts;
|
||||||
try {
|
try {
|
||||||
ts = Long.parseLong(timestamp);
|
ts = Long.parseLong(timestamp);
|
||||||
} catch (NumberFormatException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
return ErrorCode.INVALID_PARAMETER;
|
return ErrorCode.INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+58
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <[email protected]>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.InputGetAlias;
|
||||||
|
import cn.wildfirechat.pojos.InputGetFriendList;
|
||||||
|
import cn.wildfirechat.pojos.OutputGetAlias;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Friend_Get_Alias)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class AliasGetAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputGetAlias input = getRequestBody(request.getNettyRequest(), InputGetAlias.class);
|
||||||
|
List<FriendData> dataList = messagesStore.getFriendList(input.getOperator(), null, 0);
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
OutputGetAlias out = new OutputGetAlias(input.getOperator(), input.getTargetId());
|
||||||
|
|
||||||
|
for (FriendData data : dataList) {
|
||||||
|
if (data.getFriendUid().equals(input.getTargetId())) {
|
||||||
|
out.setAlias(data.getAlias());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.ok(out);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputGetFriendList;
|
||||||
|
import cn.wildfirechat.pojos.InputUpdateAlias;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Friend_Set_Alias)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class AliasPutAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputUpdateAlias input = getRequestBody(request.getNettyRequest(), InputUpdateAlias.class);
|
||||||
|
ErrorCode errorCode = messagesStore.setFriendAliasRequest(input.getOperator(), input.getTargetId(), input.getAlias(), new long[1]);
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(errorCode);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+88
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputBlacklistRequest;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.persistence.RPCCenter;
|
||||||
|
import io.moquette.persistence.TargetEntry;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import io.netty.buffer.Unpooled;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
@Route(APIPath.Blacklist_Update_Status)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class BlacklistAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputBlacklistRequest inputData = getRequestBody(request.getNettyRequest(), InputBlacklistRequest.class);
|
||||||
|
if (inputData != null
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputData.getUserId())
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputData.getTargetUid())
|
||||||
|
) {
|
||||||
|
WFCMessage.BlackUserRequest friendRequest = WFCMessage.BlackUserRequest.newBuilder().setUid(inputData.getTargetUid()).setStatus(inputData.getStatus()).build();
|
||||||
|
RPCCenter.getInstance().sendRequest(inputData.getUserId(), null, IMTopic.BlackListUserTopic, friendRequest.toByteArray(), inputData.getUserId(), 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+54
@@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <[email protected]>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.InputGetFriendList;
|
||||||
|
import cn.wildfirechat.pojos.InputUserId;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Blacklist_Get_List)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class BlacklistGetAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputUserId inputGetFriendList = getRequestBody(request.getNettyRequest(), InputUserId.class);
|
||||||
|
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
for (FriendData data : dataList) {
|
||||||
|
if (data.getBlacked() > 0) {
|
||||||
|
list.add(data.getFriendUid());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.ok(new OutputStringList(list));
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+34
-3
@@ -9,6 +9,10 @@
|
|||||||
package com.xiaoleilu.loServer.action.admin;
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
import cn.wildfirechat.common.APIPath;
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.BroadMessageResult;
|
||||||
|
import cn.wildfirechat.pojos.OutputCheckUserOnline;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
import com.xiaoleilu.loServer.annotation.Route;
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
@@ -16,10 +20,15 @@ import com.xiaoleilu.loServer.handler.Response;
|
|||||||
import cn.wildfirechat.pojos.InputGetUserInfo;
|
import cn.wildfirechat.pojos.InputGetUserInfo;
|
||||||
import io.moquette.persistence.RPCCenter;
|
import io.moquette.persistence.RPCCenter;
|
||||||
import io.moquette.persistence.TargetEntry;
|
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.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
@Route(APIPath.User_Get_Online_Status)
|
@Route(APIPath.User_Get_Online_Status)
|
||||||
@HttpMethod("POST")
|
@HttpMethod("POST")
|
||||||
public class CheckUserOnlineAction extends AdminAction {
|
public class CheckUserOnlineAction extends AdminAction {
|
||||||
@@ -34,12 +43,34 @@ public class CheckUserOnlineAction extends AdminAction {
|
|||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
|
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
|
||||||
if (inputUserId == null || !StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
|
if (inputUserId == null || !StringUtil.isNullOrEmpty(inputUserId.getUserId())) {
|
||||||
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true);
|
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||||
return true;
|
@Override
|
||||||
|
public void onSuccess(byte[] res) {
|
||||||
|
OutputCheckUserOnline out = new Gson().fromJson(new String(res), OutputCheckUserOnline.class);
|
||||||
|
sendResponse(response, null, out);
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 {
|
} else {
|
||||||
sendResponse(response, ErrorCode.INVALID_PARAMETER, null);
|
sendResponse(response, ErrorCode.INVALID_PARAMETER, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ public class CreateChannelAction extends AdminAction {
|
|||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
InputCreateChannel inputCreateChannel = getRequestBody(request.getNettyRequest(), InputCreateChannel.class);
|
InputCreateChannel inputCreateChannel = getRequestBody(request.getNettyRequest(), InputCreateChannel.class);
|
||||||
if (inputCreateChannel != null
|
if (inputCreateChannel != null
|
||||||
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getName())) {
|
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getName())
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getOwner())) {
|
||||||
|
|
||||||
|
|
||||||
if(StringUtil.isNullOrEmpty(inputCreateChannel.getTargetId())) {
|
if(StringUtil.isNullOrEmpty(inputCreateChannel.getTargetId())) {
|
||||||
@@ -58,7 +59,10 @@ public class CreateChannelAction extends AdminAction {
|
|||||||
byteBuf.writeBytes(result);
|
byteBuf.writeBytes(result);
|
||||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
sendResponse(response, null, new OutputCreateChannel(inputCreateChannel.getTargetId()));
|
byte[] data = new byte[byteBuf.readableBytes()];
|
||||||
|
byteBuf.readBytes(data);
|
||||||
|
String secret = new String(data);
|
||||||
|
sendResponse(response, null, new OutputCreateChannel(inputCreateChannel.getTargetId(), secret));
|
||||||
} else {
|
} else {
|
||||||
sendResponse(response, errorCode, null);
|
sendResponse(response, errorCode, null);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,11 +22,15 @@ import io.netty.handler.codec.http.FullHttpRequest;
|
|||||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import win.liyufan.im.UUIDGenerator;
|
import win.liyufan.im.UUIDGenerator;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
@Route(APIPath.Create_Robot)
|
@Route(APIPath.Create_Robot)
|
||||||
@HttpMethod("POST")
|
@HttpMethod("POST")
|
||||||
public class CreateRobotAction extends AdminAction {
|
public class CreateRobotAction extends AdminAction {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CreateRobotAction.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isTransactionAction() {
|
public boolean isTransactionAction() {
|
||||||
@@ -55,7 +59,16 @@ public class CreateRobotAction extends AdminAction {
|
|||||||
WFCMessage.User newUser = inputCreateRobot.toUser();
|
WFCMessage.User newUser = inputCreateRobot.toUser();
|
||||||
|
|
||||||
|
|
||||||
messagesStore.addUserInfo(newUser, inputCreateRobot.getPassword());
|
try {
|
||||||
|
messagesStore.addUserInfo(newUser, inputCreateRobot.getPassword());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(ErrorCode.ERROR_CODE_SERVER_ERROR, e.getMessage());
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (StringUtil.isNullOrEmpty(inputCreateRobot.getOwner())) {
|
if (StringUtil.isNullOrEmpty(inputCreateRobot.getOwner())) {
|
||||||
inputCreateRobot.setOwner(inputCreateRobot.getUserId());
|
inputCreateRobot.setOwner(inputCreateRobot.getUserId());
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
package com.xiaoleilu.loServer.action.admin;
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
import cn.wildfirechat.common.APIPath;
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
@@ -22,11 +23,16 @@ import io.netty.handler.codec.http.FullHttpRequest;
|
|||||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
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.UUIDGenerator;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
@Route(APIPath.Create_User)
|
@Route(APIPath.Create_User)
|
||||||
@HttpMethod("POST")
|
@HttpMethod("POST")
|
||||||
public class CreateUserAction extends AdminAction {
|
public class CreateUserAction extends AdminAction {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CreateUserAction.class);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isTransactionAction() {
|
public boolean isTransactionAction() {
|
||||||
@@ -38,7 +44,8 @@ public class CreateUserAction extends AdminAction {
|
|||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
InputOutputUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputOutputUserInfo.class);
|
InputOutputUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputOutputUserInfo.class);
|
||||||
if (inputCreateUser != null
|
if (inputCreateUser != null
|
||||||
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())) {
|
&& !StringUtil.isNullOrEmpty(inputCreateUser.getName())
|
||||||
|
&& (inputCreateUser.getType() == ProtoConstants.UserType.UserType_Normal || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Admin || inputCreateUser.getType() == ProtoConstants.UserType.UserType_Super_Admin)) {
|
||||||
|
|
||||||
if(StringUtil.isNullOrEmpty(inputCreateUser.getPassword())) {
|
if(StringUtil.isNullOrEmpty(inputCreateUser.getPassword())) {
|
||||||
inputCreateUser.setPassword(UUIDGenerator.getUUID());
|
inputCreateUser.setPassword(UUIDGenerator.getUUID());
|
||||||
@@ -73,9 +80,20 @@ public class CreateUserAction extends AdminAction {
|
|||||||
if (inputCreateUser.getExtra() != null)
|
if (inputCreateUser.getExtra() != null)
|
||||||
newUserBuilder.setExtra(inputCreateUser.getExtra());
|
newUserBuilder.setExtra(inputCreateUser.getExtra());
|
||||||
|
|
||||||
|
newUserBuilder.setType(inputCreateUser.getType());
|
||||||
newUserBuilder.setUpdateDt(System.currentTimeMillis());
|
newUserBuilder.setUpdateDt(System.currentTimeMillis());
|
||||||
|
|
||||||
messagesStore.addUserInfo(newUserBuilder.build(), inputCreateUser.getPassword());
|
|
||||||
|
try {
|
||||||
|
messagesStore.addUserInfo(newUserBuilder.build(), inputCreateUser.getPassword());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(ErrorCode.ERROR_CODE_SERVER_ERROR, e.getMessage());
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
response.setStatus(HttpResponseStatus.OK);
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
RestResult result = RestResult.ok(new OutputCreateUser(inputCreateUser.getUserId(), inputCreateUser.getName()));
|
RestResult result = RestResult.ok(new OutputCreateUser(inputCreateUser.getUserId(), inputCreateUser.getName()));
|
||||||
|
|||||||
+97
@@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputDestroyUser;
|
||||||
|
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||||
|
import cn.wildfirechat.pojos.OutputCreateUser;
|
||||||
|
import cn.wildfirechat.pojos.OutputGetIMTokenData;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.persistence.RPCCenter;
|
||||||
|
import io.moquette.persistence.TargetEntry;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
import win.liyufan.im.UUIDGenerator;
|
||||||
|
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.concurrent.Executor;
|
||||||
|
|
||||||
|
@Route(APIPath.Destroy_User)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class DestroyUserAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputDestroyUser inputDestroyUser = getRequestBody(request.getNettyRequest(), InputDestroyUser.class);
|
||||||
|
if (inputDestroyUser != null
|
||||||
|
&& !StringUtil.isNullOrEmpty(inputDestroyUser.getUserId())) {
|
||||||
|
|
||||||
|
WFCMessage.IDBuf idBuf = WFCMessage.IDBuf.newBuilder().setId(inputDestroyUser.getUserId()).build();
|
||||||
|
RPCCenter.getInstance().sendRequest(inputDestroyUser.getUserId(), null, IMTopic.DestroyUserTopic, idBuf.toByteArray(), inputDestroyUser.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||||
|
@Override
|
||||||
|
public void onSuccess(byte[] result) {
|
||||||
|
ErrorCode errorCode1 = ErrorCode.fromCode(result[0]);
|
||||||
|
if (errorCode1 == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
//ba errorcode qudiao
|
||||||
|
byte[] data = new byte[result.length -1];
|
||||||
|
for (int i = 0; i < data.length; i++) {
|
||||||
|
data[i] = result[i+1];
|
||||||
|
}
|
||||||
|
String token = Base64.getEncoder().encodeToString(data);
|
||||||
|
|
||||||
|
sendResponse(response, null, null);
|
||||||
|
} else {
|
||||||
|
sendResponse(response, errorCode1, 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -46,8 +46,11 @@ public class FriendRelationAction extends AdminAction {
|
|||||||
&& !StringUtil.isNullOrEmpty(friendAdd.getUserId())
|
&& !StringUtil.isNullOrEmpty(friendAdd.getUserId())
|
||||||
&& !StringUtil.isNullOrEmpty(friendAdd.getFriendUid())
|
&& !StringUtil.isNullOrEmpty(friendAdd.getFriendUid())
|
||||||
) {
|
) {
|
||||||
WFCMessage.HandleFriendRequest friendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus()).build();
|
WFCMessage.HandleFriendRequest.Builder friendRequestBuilder = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus());
|
||||||
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequest.toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
if (!StringUtil.isNullOrEmpty(friendAdd.getExtra())) {
|
||||||
|
friendRequestBuilder = friendRequestBuilder.setExtra(friendAdd.getExtra());
|
||||||
|
}
|
||||||
|
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequestBuilder.build().toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(byte[] result) {
|
public void onSuccess(byte[] result) {
|
||||||
ByteBuf byteBuf = Unpooled.buffer();
|
ByteBuf byteBuf = Unpooled.buffer();
|
||||||
|
|||||||
+5
-3
@@ -9,6 +9,8 @@
|
|||||||
package com.xiaoleilu.loServer.action.admin;
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
import cn.wildfirechat.common.APIPath;
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.InputUserId;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
@@ -35,16 +37,16 @@ public class FriendRelationGetAction extends AdminAction {
|
|||||||
@Override
|
@Override
|
||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class);
|
InputUserId inputGetFriendList = getRequestBody(request.getNettyRequest(), InputUserId.class);
|
||||||
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
|
List<FriendData> dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0);
|
||||||
List<String> list = new ArrayList<>();
|
List<String> list = new ArrayList<>();
|
||||||
for (FriendData data : dataList) {
|
for (FriendData data : dataList) {
|
||||||
if (data.getState() == inputGetFriendList.getStatus()) {
|
if (data.getState() == 0) {
|
||||||
list.add(data.getFriendUid());
|
list.add(data.getFriendUid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
response.setStatus(HttpResponseStatus.OK);
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
RestResult result = RestResult.ok(list);
|
RestResult result = RestResult.ok(new OutputStringList(list));
|
||||||
response.setContent(new Gson().toJson(result));
|
response.setContent(new Gson().toJson(result));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+74
@@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputGetChatroomInfo;
|
||||||
|
import cn.wildfirechat.pojos.OutputGetChatroomInfo;
|
||||||
|
import cn.wildfirechat.pojos.OutputStringList;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.persistence.UserClientEntry;
|
||||||
|
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.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Chatroom_GetMembers)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetChatroomMembersAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputGetChatroomInfo getChatroomInfo = getRequestBody(request.getNettyRequest(), InputGetChatroomInfo.class);
|
||||||
|
String chatroomid = getChatroomInfo.getChatroomId();
|
||||||
|
if (!StringUtil.isNullOrEmpty(chatroomid)) {
|
||||||
|
|
||||||
|
Collection<UserClientEntry> members = messagesStore.getChatroomMembers(chatroomid);
|
||||||
|
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
for (UserClientEntry entry : members) {
|
||||||
|
list.add(entry.userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
RestResult result;
|
||||||
|
if (!list.isEmpty()) {
|
||||||
|
result = RestResult.ok(new OutputStringList(list));
|
||||||
|
} else {
|
||||||
|
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
|
||||||
|
}
|
||||||
|
response.setStatus(HttpResponseStatus.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputGetGroup;
|
||||||
|
import cn.wildfirechat.pojos.InputUserId;
|
||||||
|
import cn.wildfirechat.pojos.OutputGroupIds;
|
||||||
|
import cn.wildfirechat.pojos.PojoGroupInfo;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Route(APIPath.Get_User_Groups)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetUserGroupsAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputUserId inputUserId = getRequestBody(request.getNettyRequest(), InputUserId.class);
|
||||||
|
if (inputUserId != null
|
||||||
|
&& (!StringUtil.isNullOrEmpty(inputUserId.getUserId()))) {
|
||||||
|
|
||||||
|
Set<String> groupIds = messagesStore.getUserGroupIds(inputUserId.getUserId());
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
OutputGroupIds outputGroupIds = new OutputGroupIds();
|
||||||
|
outputGroupIds.setGroupIds(new ArrayList<>(groupIds));
|
||||||
|
RestResult result = RestResult.ok(outputGroupIds);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
+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.InputQuitGroup;
|
||||||
|
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_Member_Quit)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class QuitGroupMemberAction extends AdminAction {
|
||||||
|
|
||||||
|
@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);
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}, true);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
|
RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER);
|
||||||
|
response.setContent(new Gson().toJson(result));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,6 +12,7 @@ import cn.wildfirechat.proto.WFCMessage;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.action.Action;
|
import com.xiaoleilu.loServer.action.Action;
|
||||||
|
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
import com.xiaoleilu.loServer.handler.Response;
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
import io.moquette.spi.impl.Utils;
|
import io.moquette.spi.impl.Utils;
|
||||||
@@ -21,9 +22,12 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
|||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import win.liyufan.im.RateLimiter;
|
import win.liyufan.im.RateLimiter;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
abstract public class ChannelAction extends Action {
|
abstract public class ChannelAction extends Action {
|
||||||
|
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(ChannelAction.class);
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 200);
|
private final RateLimiter mLimitCounter = new RateLimiter(10, 200);
|
||||||
protected WFCMessage.ChannelInfo channelInfo;
|
protected WFCMessage.ChannelInfo channelInfo;
|
||||||
|
|
||||||
@@ -45,8 +49,9 @@ abstract public class ChannelAction extends Action {
|
|||||||
Long ts;
|
Long ts;
|
||||||
try {
|
try {
|
||||||
ts = Long.parseLong(timestamp);
|
ts = Long.parseLong(timestamp);
|
||||||
} catch (NumberFormatException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
return ErrorCode.INVALID_PARAMETER;
|
return ErrorCode.INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ package com.xiaoleilu.loServer.action.channel;
|
|||||||
|
|
||||||
|
|
||||||
import cn.wildfirechat.common.APIPath;
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.pojos.SendChannelMessageData;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.xiaoleilu.loServer.RestResult;
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
@@ -44,11 +45,15 @@ public class SendMessageAction extends ChannelAction {
|
|||||||
@Override
|
@Override
|
||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class);
|
SendChannelMessageData sendChannelMessageData = getRequestBody(request.getNettyRequest(), SendChannelMessageData.class);
|
||||||
|
SendMessageData sendMessageData = new SendMessageData();
|
||||||
sendMessageData.setConv(new Conversation());
|
sendMessageData.setConv(new Conversation());
|
||||||
sendMessageData.getConv().setType(ConversationType_Channel);
|
sendMessageData.getConv().setType(ConversationType_Channel);
|
||||||
sendMessageData.getConv().setTarget(channelInfo.getTargetId());
|
sendMessageData.getConv().setTarget(channelInfo.getTargetId());
|
||||||
|
sendMessageData.getConv().setLine(sendChannelMessageData.getLine());
|
||||||
sendMessageData.setSender(channelInfo.getOwner());
|
sendMessageData.setSender(channelInfo.getOwner());
|
||||||
|
sendMessageData.setPayload(sendChannelMessageData.getPayload());
|
||||||
|
sendMessageData.setToUsers(sendChannelMessageData.getTargets());
|
||||||
if (SendMessageData.isValide(sendMessageData)) {
|
if (SendMessageData.isValide(sendMessageData)) {
|
||||||
RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.SendMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.SendMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import com.xiaoleilu.loServer.RestResult;
|
|||||||
import com.xiaoleilu.loServer.action.Action;
|
import com.xiaoleilu.loServer.action.Action;
|
||||||
import com.xiaoleilu.loServer.handler.Request;
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
import com.xiaoleilu.loServer.handler.Response;
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.moquette.imhandler.IMHandler;
|
||||||
import io.moquette.spi.impl.Utils;
|
import io.moquette.spi.impl.Utils;
|
||||||
import io.netty.handler.codec.http.FullHttpRequest;
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
import io.netty.handler.codec.http.HttpRequest;
|
import io.netty.handler.codec.http.HttpRequest;
|
||||||
@@ -21,11 +22,15 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
|||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import win.liyufan.im.RateLimiter;
|
import win.liyufan.im.RateLimiter;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
|
|
||||||
abstract public class RobotAction extends Action {
|
abstract public class RobotAction extends Action {
|
||||||
|
protected static final Logger LOG = LoggerFactory.getLogger(RobotAction.class);
|
||||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 1000);
|
private final RateLimiter mLimitCounter = new RateLimiter(10, 1000);
|
||||||
|
|
||||||
protected WFCMessage.Robot robot;
|
protected WFCMessage.Robot robot;
|
||||||
@@ -47,8 +52,9 @@ abstract public class RobotAction extends Action {
|
|||||||
Long ts;
|
Long ts;
|
||||||
try {
|
try {
|
||||||
ts = Long.parseLong(timestamp);
|
ts = Long.parseLong(timestamp);
|
||||||
} catch (NumberFormatException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
return ErrorCode.INVALID_PARAMETER;
|
return ErrorCode.INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,6 +95,7 @@ abstract public class RobotAction extends Action {
|
|||||||
return t;
|
return t;
|
||||||
} catch (UnsupportedEncodingException e) {
|
} catch (UnsupportedEncodingException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import io.netty.handler.codec.http.FullHttpRequest;
|
|||||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action处理单元
|
* Action处理单元
|
||||||
@@ -51,6 +52,8 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
|
|||||||
this.doAction(ctx, request, response);
|
this.doAction(ctx, request, response);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(Logger, e);
|
||||||
Action errorAction = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
|
Action errorAction = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
|
||||||
request.putParam(UnknownErrorAction.ERROR_PARAM_NAME, e);
|
request.putParam(UnknownErrorAction.ERROR_PARAM_NAME, e);
|
||||||
response.setContent(e.toString());
|
response.setContent(e.toString());
|
||||||
@@ -110,7 +113,8 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
|
|||||||
* @param response 响应对象
|
* @param response 响应对象
|
||||||
*/
|
*/
|
||||||
private void doAction(ChannelHandlerContext ctx, Request request, Response response){
|
private void doAction(ChannelHandlerContext ctx, Request request, Response response){
|
||||||
if( "/route".equalsIgnoreCase(request.getPath()) && "OPTIONS".equalsIgnoreCase(request.getMethod())){
|
if(("/route".equalsIgnoreCase(request.getPath()) || request.getPath().startsWith("/fs/"))
|
||||||
|
&& "OPTIONS".equalsIgnoreCase(request.getMethod())){
|
||||||
handleOptions(ctx, request, response);
|
handleOptions(ctx, request, response);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import io.netty.channel.Channel;
|
|||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.SimpleChannelInboundHandler;
|
import io.netty.channel.SimpleChannelInboundHandler;
|
||||||
import io.netty.handler.codec.http.FullHttpRequest;
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@@ -37,7 +38,7 @@ public class IMActionHandler extends ActionHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean isValidePath(String path) {
|
boolean isValidePath(String path) {
|
||||||
if (!path.startsWith("/admin")) {
|
if (!StringUtil.isNullOrEmpty(path) && !path.startsWith("/admin")) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -14,15 +14,17 @@ public class FriendData implements Serializable {
|
|||||||
private String userId;
|
private String userId;
|
||||||
private String friendUid;
|
private String friendUid;
|
||||||
private String alias;
|
private String alias;
|
||||||
|
private String extra;
|
||||||
private int state;
|
private int state;
|
||||||
private int blacked;
|
private int blacked;
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
|
|
||||||
|
|
||||||
public FriendData(String userId, String friendUid, String alias, int state, int blacked, long timestamp) {
|
public FriendData(String userId, String friendUid, String alias, String extra, int state, int blacked, long timestamp) {
|
||||||
this.userId = userId;
|
this.userId = userId;
|
||||||
this.friendUid = friendUid;
|
this.friendUid = friendUid;
|
||||||
this.alias = alias;
|
this.alias = alias;
|
||||||
|
this.extra = extra;
|
||||||
this.state = state;
|
this.state = state;
|
||||||
this.blacked = blacked;
|
this.blacked = blacked;
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
@@ -55,6 +57,14 @@ public class FriendData implements Serializable {
|
|||||||
this.alias = alias;
|
this.alias = alias;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getExtra() {
|
||||||
|
return extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExtra(String extra) {
|
||||||
|
this.extra = extra;
|
||||||
|
}
|
||||||
|
|
||||||
public int getState() {
|
public int getState() {
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,8 @@ public final class BrokerConstants {
|
|||||||
public static final String PUSH_ANDROID_SERVER_ADDRESS = "push.android.server.address";
|
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 PUSH_IOS_SERVER_ADDRESS = "push.ios.server.address";
|
||||||
|
|
||||||
|
public static final String USER_ONLINE_STATUS_CALLBACK = "user.online_status_callback";
|
||||||
|
|
||||||
public static final String HZ_Cluster_Node_External_IP = "node_external_ip";
|
public static final String HZ_Cluster_Node_External_IP = "node_external_ip";
|
||||||
public static final String HZ_Cluster_Node_External_Long_Port = "node_external_long_port";
|
public static final String HZ_Cluster_Node_External_Long_Port = "node_external_long_port";
|
||||||
public static final String HZ_Cluster_Node_External_Short_Port = "node_external_short_port";
|
public static final String HZ_Cluster_Node_External_Short_Port = "node_external_short_port";
|
||||||
@@ -97,6 +99,7 @@ public final class BrokerConstants {
|
|||||||
|
|
||||||
public static final String CLIENT_PROTO_SECRET_KEY = "client.proto.secret_key";
|
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_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 EMBED_DB_PROPERTY_NAME = "embed.db";
|
||||||
|
|
||||||
@@ -115,6 +118,18 @@ public final class BrokerConstants {
|
|||||||
public static final String MESSAGE_ROAMING = "message.roaming";
|
public static final String MESSAGE_ROAMING = "message.roaming";
|
||||||
public static final String MESSAGE_Remote_History_Message = "message.remote_history_message";
|
public static final String MESSAGE_Remote_History_Message = "message.remote_history_message";
|
||||||
|
|
||||||
|
public static final String MESSAGE_Max_Queue = "message.max_queue";
|
||||||
|
|
||||||
|
public static final String MESSAGE_Disable_Stranger_Chat = "message.disable_stranger_chat";
|
||||||
|
|
||||||
|
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
|
||||||
|
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
|
||||||
|
public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration";
|
||||||
|
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
|
||||||
|
|
||||||
|
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
|
||||||
|
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
|
||||||
|
|
||||||
|
|
||||||
private BrokerConstants() {
|
private BrokerConstants() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
|
|||||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||||
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
||||||
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
||||||
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0]);
|
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0], fromUser, request.getReason());
|
||||||
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
|
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
|
||||||
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
|
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
|
||||||
mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, false);
|
mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, false);
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <[email protected]>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.moquette.imhandler;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import io.moquette.persistence.MemorySessionStore;
|
||||||
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
|
import io.moquette.spi.impl.security.TokenAuthenticator;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
@Handler(IMTopic.DestroyUserTopic)
|
||||||
|
public class DestroyUserHandler extends IMHandler<WFCMessage.IDBuf> {
|
||||||
|
@Override
|
||||||
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.IDBuf request, Qos1PublishHandler.IMCallback callback) {
|
||||||
|
if (isAdmin) {
|
||||||
|
mServer.getImBusinessScheduler().execute(()-> {
|
||||||
|
m_sessionsStore.clearUserSession(fromUser);
|
||||||
|
m_messagesStore.clearUserMessages(fromUser);
|
||||||
|
m_messagesStore.clearUserSettings(fromUser);
|
||||||
|
m_messagesStore.clearUserFriend(fromUser);
|
||||||
|
m_messagesStore.clearUserGroups(fromUser);
|
||||||
|
m_messagesStore.clearUserChannels(fromUser);
|
||||||
|
m_messagesStore.destoryUser(fromUser);
|
||||||
|
});
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
} else {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,9 @@ public class FriendPullHandler extends IMHandler<WFCMessage.Version> {
|
|||||||
if (!StringUtil.isNullOrEmpty(data.getAlias())) {
|
if (!StringUtil.isNullOrEmpty(data.getAlias())) {
|
||||||
builder1.setAlias(data.getAlias());
|
builder1.setAlias(data.getAlias());
|
||||||
}
|
}
|
||||||
|
if (!StringUtil.isNullOrEmpty(data.getExtra())) {
|
||||||
|
builder1.setExtra(data.getExtra());
|
||||||
|
}
|
||||||
builder.addEntry(builder1.build());
|
builder.addEntry(builder1.build());
|
||||||
}
|
}
|
||||||
byte[] data = builder.build().toByteArray();
|
byte[] data = builder.build().toByteArray();
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import win.liyufan.im.IMTopic;
|
|||||||
public class GetTokenHandler extends IMHandler<WFCMessage.GetTokenRequest> {
|
public class GetTokenHandler extends IMHandler<WFCMessage.GetTokenRequest> {
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.GetTokenRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||||
MemorySessionStore.Session session = m_sessionsStore.createUserSession(fromUser, clientID, request.getPlatform());
|
MemorySessionStore.Session session = m_sessionsStore.updateOrCreateUserSession(fromUser, clientID, request.getPlatform());
|
||||||
TokenAuthenticator authenticator = new TokenAuthenticator();
|
TokenAuthenticator authenticator = new TokenAuthenticator();
|
||||||
String strToken = authenticator.generateToken(fromUser);
|
String strToken = authenticator.generateToken(fromUser);
|
||||||
String result = strToken + "|" + session.getSecret() + "|" + session.getDbSecret();
|
String result = strToken + "|" + session.getSecret() + "|" + session.getDbSecret();
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
|||||||
builder.setFromUser(fromUser);
|
builder.setFromUser(fromUser);
|
||||||
long messageId = MessageShardingUtil.generateId();
|
long messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
saveAndPublish(fromUser, null, builder.build());
|
saveAndPublish(fromUser, null, builder.build(), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ package io.moquette.imhandler;
|
|||||||
|
|
||||||
import cn.wildfirechat.proto.ProtoConstants;
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import io.moquette.persistence.MemorySessionStore;
|
||||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
import win.liyufan.im.I18n;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
import win.liyufan.im.MessageShardingUtil;
|
import win.liyufan.im.MessageShardingUtil;
|
||||||
|
|
||||||
@@ -27,33 +30,41 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
|||||||
long[] heads = new long[2];
|
long[] heads = new long[2];
|
||||||
ErrorCode errorCode = m_messagesStore.handleFriendRequest(fromUser, request, builder, heads, isAdmin);
|
ErrorCode errorCode = m_messagesStore.handleFriendRequest(fromUser, request, builder, heads, isAdmin);
|
||||||
|
|
||||||
if (errorCode == ERROR_CODE_SUCCESS && !isAdmin) {
|
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||||
long messageId = MessageShardingUtil.generateId();
|
if (!isAdmin && builder.getConversation() != null) {
|
||||||
long timestamp = System.currentTimeMillis();
|
long messageId = MessageShardingUtil.generateId();
|
||||||
builder.setMessageId(messageId);
|
long timestamp = System.currentTimeMillis();
|
||||||
builder.setServerTimestamp(timestamp);
|
builder.setMessageId(messageId);
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
builder.setServerTimestamp(timestamp);
|
||||||
|
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||||
|
|
||||||
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent("以上是打招呼信息");
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||||
builder = WFCMessage.Message.newBuilder();
|
String language = "zh_CN";
|
||||||
builder.setFromUser(request.getTargetUid());
|
if (session != null && !StringUtil.isNullOrEmpty(session.getLanguage())) {
|
||||||
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
language = session.getLanguage();
|
||||||
builder.setContent(contentBuilder);
|
}
|
||||||
timestamp = System.currentTimeMillis();
|
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent(I18n.getString(language, "Above_Greeting_Message"));
|
||||||
builder.setServerTimestamp(timestamp);
|
|
||||||
|
|
||||||
messageId = MessageShardingUtil.generateId();
|
builder = WFCMessage.Message.newBuilder();
|
||||||
builder.setMessageId(messageId);
|
builder.setFromUser(request.getTargetUid());
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||||
|
builder.setContent(contentBuilder);
|
||||||
|
timestamp = System.currentTimeMillis();
|
||||||
|
builder.setServerTimestamp(timestamp);
|
||||||
|
|
||||||
contentBuilder.setContent("你们已经成为好友了,现在可以开始聊天了");
|
messageId = MessageShardingUtil.generateId();
|
||||||
builder.setContent(contentBuilder);
|
builder.setMessageId(messageId);
|
||||||
messageId = MessageShardingUtil.generateId();
|
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||||
builder.setMessageId(messageId);
|
|
||||||
timestamp = System.currentTimeMillis();
|
|
||||||
builder.setServerTimestamp(timestamp);
|
|
||||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
|
||||||
|
|
||||||
|
contentBuilder.setContent(I18n.getString(language, "Friend_Can_Start_Chat"));
|
||||||
|
builder.setContent(contentBuilder);
|
||||||
|
messageId = MessageShardingUtil.generateId();
|
||||||
|
builder.setMessageId(messageId);
|
||||||
|
timestamp = System.currentTimeMillis();
|
||||||
|
builder.setServerTimestamp(timestamp);
|
||||||
|
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||||
|
|
||||||
|
}
|
||||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
|
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
|
||||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ import java.lang.annotation.Retention;
|
|||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
@@ -83,16 +85,11 @@ abstract public class IMHandler<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Type t = getClass().getGenericSuperclass();
|
||||||
for (Method method : getClass().getDeclaredMethods()
|
ParameterizedType p = (ParameterizedType) t ;
|
||||||
) {
|
Class<T> c = (Class<T>) p.getActualTypeArguments()[0];
|
||||||
|
dataCls = c;
|
||||||
if (method.getName() == actionName && method.getParameterCount() == 6) {
|
|
||||||
dataCls = method.getParameterTypes()[4];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dataCls.getSuperclass().equals(GeneratedMessage.class)) {
|
if (dataCls.getSuperclass().equals(GeneratedMessage.class)) {
|
||||||
parseDataMethod = dataCls.getMethod("parseFrom", byte[].class);
|
parseDataMethod = dataCls.getMethod("parseFrom", byte[].class);
|
||||||
} else if (dataCls.isPrimitive()) {
|
} else if (dataCls.isPrimitive()) {
|
||||||
@@ -239,18 +236,18 @@ abstract public class IMHandler<T> {
|
|||||||
Set<String> notifyReceivers = new LinkedHashSet<>();
|
Set<String> notifyReceivers = new LinkedHashSet<>();
|
||||||
|
|
||||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, false);
|
||||||
this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType);
|
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||||
return notifyReceivers.size();
|
return notifyReceivers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message) {
|
protected long saveAndPublish(String username, String clientID, WFCMessage.Message message, boolean ignoreMsg) {
|
||||||
Set<String> notifyReceivers = new LinkedHashSet<>();
|
Set<String> notifyReceivers = new LinkedHashSet<>();
|
||||||
|
|
||||||
message = m_messagesStore.storeMessage(username, clientID, message);
|
message = m_messagesStore.storeMessage(username, clientID, message);
|
||||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, ignoreMsg);
|
||||||
this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType);
|
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||||
return notifyReceivers.size();
|
return notifyReceivers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
package io.moquette.imhandler;
|
package io.moquette.imhandler;
|
||||||
|
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -24,6 +25,19 @@ public class LoadRemoteMessagesHandler extends IMHandler<WFCMessage.LoadRemoteMe
|
|||||||
if (beforeUid == 0) {
|
if (beforeUid == 0) {
|
||||||
beforeUid = Long.MAX_VALUE;
|
beforeUid = Long.MAX_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (request.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||||
|
if (!m_messagesStore.isMemberInGroup(fromUser, request.getConversation().getTarget())) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||||
|
if (!m_messagesStore.checkUserInChannel(fromUser, request.getConversation().getTarget())) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
WFCMessage.PullMessageResult result = m_messagesStore.loadRemoteMessages(fromUser, request.getConversation(), beforeUid, request.getCount());
|
WFCMessage.PullMessageResult result = m_messagesStore.loadRemoteMessages(fromUser, request.getConversation(), beforeUid, request.getCount());
|
||||||
byte[] data = result.toByteArray();
|
byte[] data = result.toByteArray();
|
||||||
LOG.info("User {} load message with count({}), payload size({})", fromUser, result.getMessageCount(), data.length);
|
LOG.info("User {} load message with count({}), payload size({})", fromUser, result.getMessageCount(), data.length);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class ModifyGroupInfoHandler extends GroupHandler<WFCMessage.ModifyGroupI
|
|||||||
if (request.getType() == Modify_Group_Name) {
|
if (request.getType() == Modify_Group_Name) {
|
||||||
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupNameNotifyContent();
|
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupNameNotifyContent();
|
||||||
} else if(request.getType() == Modify_Group_Portrait) {
|
} else if(request.getType() == Modify_Group_Portrait) {
|
||||||
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getChangeGroupPortraitNotifyContent();
|
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupPortraitNotifyContent();
|
||||||
} else if(request.getType() == Modify_Group_Mute) {
|
} else if(request.getType() == Modify_Group_Mute) {
|
||||||
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupMuteNotifyContent();
|
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupMuteNotifyContent();
|
||||||
} else if(request.getType() == Modify_Group_JoinType) {
|
} else if(request.getType() == Modify_Group_JoinType) {
|
||||||
|
|||||||
@@ -13,11 +13,18 @@ import io.moquette.spi.impl.Qos1PublishHandler;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
@Handler(IMTopic.ModifyMyInfoTopic)
|
@Handler(IMTopic.ModifyMyInfoTopic)
|
||||||
public class ModifyMyInfoHandler extends IMHandler<WFCMessage.ModifyMyInfoRequest> {
|
public class ModifyMyInfoHandler extends IMHandler<WFCMessage.ModifyMyInfoRequest> {
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyMyInfoRequest request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyMyInfoRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||||
|
try {
|
||||||
return m_messagesStore.modifyUserInfo(fromUser, request);
|
return m_messagesStore.modifyUserInfo(fromUser, request);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
|
|||||||
|
|
||||||
|
|
||||||
//等待客户端实现根据撤回消息更新内容,之后可以删掉这段代码
|
//等待客户端实现根据撤回消息更新内容,之后可以删掉这段代码
|
||||||
m_messagesStore.getNotifyReceivers(fromUser, message.toBuilder(), notifyReceivers);
|
m_messagesStore.getNotifyReceivers(fromUser, message.toBuilder(), notifyReceivers, false);
|
||||||
this.publisher.publishRecall2Receivers(int64Buf.getId(), fromUser, notifyReceivers, clientID);
|
this.publisher.publishRecall2Receivers(int64Buf.getId(), fromUser, notifyReceivers, clientID);
|
||||||
|
|
||||||
return errorCode;
|
return errorCode;
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class RouteHandler extends IMHandler<WFCMessage.RouteRequest> {
|
|||||||
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
|
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
|
||||||
boolean isSessionAlreadyStored = clientSession != null;
|
boolean isSessionAlreadyStored = clientSession != null;
|
||||||
if (!isSessionAlreadyStored) {
|
if (!isSessionAlreadyStored) {
|
||||||
m_sessionsStore.createNewSession(fromUser, clientID, true, false, request.getPlatform());
|
m_sessionsStore.loadActiveSession(fromUser, clientID);
|
||||||
} else {
|
} else {
|
||||||
m_sessionsStore.updateExistSession(fromUser, clientID, request, true);
|
m_sessionsStore.updateExistSession(fromUser, clientID, request, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import io.netty.buffer.ByteBuf;
|
|||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
import win.liyufan.im.MessageShardingUtil;
|
import win.liyufan.im.MessageShardingUtil;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -26,6 +27,7 @@ import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text;
|
|||||||
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||||
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
|
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
|
||||||
private String mForwardUrl = null;
|
private String mForwardUrl = null;
|
||||||
|
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
||||||
public SendMessageHandler() {
|
public SendMessageHandler() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@@ -38,6 +40,14 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
mSensitiveType = Integer.parseInt(mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Filter_Type));
|
mSensitiveType = Integer.parseInt(mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Filter_Type));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mBlacklistStrategy = Integer.parseInt(mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Blacklist_Strategy));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,23 +55,34 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Message message, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.Message message, Qos1PublishHandler.IMCallback callback) {
|
||||||
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
|
boolean ignoreMsg = false;
|
||||||
if (!isAdmin) { //admin do not check the right
|
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() >= 100 && message.getContent().getType() < 200)) {
|
||||||
return ErrorCode.INVALID_PARAMETER;
|
return ErrorCode.INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
int userStatus = m_messagesStore.getUserStatus(fromUser);
|
int userStatus = m_messagesStore.getUserStatus(fromUser);
|
||||||
if (userStatus == 1 || userStatus == 2) {
|
if (userStatus == ProtoConstants.UserStatus.Muted || userStatus == ProtoConstants.UserStatus.Forbidden) {
|
||||||
return ErrorCode.ERROR_CODE_FORBIDDEN_SEND_MSG;
|
return ErrorCode.ERROR_CODE_FORBIDDEN_SEND_MSG;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
if (m_messagesStore.isBlacked(message.getConversation().getTarget(), fromUser)) {
|
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
|
||||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
|
||||||
|
ignoreMsg = true;
|
||||||
|
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
} else {
|
||||||
|
return errorCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
userStatus = m_messagesStore.getUserStatus(message.getConversation().getTarget());
|
||||||
|
if (userStatus == ProtoConstants.UserStatus.Forbidden) {
|
||||||
|
return ErrorCode.ERROR_CODE_USER_FORBIDDEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group ) {
|
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group ) {
|
||||||
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
|
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
|
||||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
@@ -86,8 +107,8 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
publisher.forwardMessage(message, mForwardUrl);
|
publisher.forwardMessage(message, mForwardUrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean ignoreMsg = false;
|
|
||||||
if (!isAdmin && message.getContent().getType() == Text) {
|
if (!isAdmin) {
|
||||||
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
|
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
|
||||||
if (matched != null && !matched.isEmpty()) {
|
if (matched != null && !matched.isEmpty()) {
|
||||||
m_messagesStore.storeSensitiveMessage(message);
|
m_messagesStore.storeSensitiveMessage(message);
|
||||||
@@ -109,9 +130,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
if (!ignoreMsg) {
|
saveAndPublish(fromUser, clientID, message, ignoreMsg);
|
||||||
saveAndPublish(fromUser, clientID, message);
|
|
||||||
}
|
|
||||||
ackPayload = ackPayload.capacity(20);
|
ackPayload = ackPayload.capacity(20);
|
||||||
ackPayload.writeLong(messageId);
|
ackPayload.writeLong(messageId);
|
||||||
ackPayload.writeLong(timestamp);
|
ackPayload.writeLong(timestamp);
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ public class UploadDeviceTokenHandler extends IMHandler<WFCMessage.UploadDeviceT
|
|||||||
session.setDeviceToken(request.getDeviceToken());
|
session.setDeviceToken(request.getDeviceToken());
|
||||||
session.setPushType(request.getPushType());
|
session.setPushType(request.getPushType());
|
||||||
m_sessionsStore.updateSessionToken(session, false);
|
m_sessionsStore.updateSessionToken(session, false);
|
||||||
m_sessionsStore.cleanDuplatedToken(session.getClientID(), session.getPushType(), session.getDeviceToken(), false);
|
m_sessionsStore.cleanDuplatedToken(session.getClientID(), session.getPushType(), session.getDeviceToken(), false, session.getAppName());
|
||||||
}
|
}
|
||||||
|
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import java.util.List;
|
|||||||
public class UserSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> {
|
public class UserSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> {
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||||
List<WFCMessage.User> users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy() > 0, request.getPage());
|
List<WFCMessage.User> users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy(), request.getPage());
|
||||||
WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder();
|
WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder();
|
||||||
builder.addAllEntry(users);
|
builder.addAllEntry(users);
|
||||||
byte[] data = builder.build().toByteArray();
|
byte[] data = builder.build().toByteArray();
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import com.hazelcast.core.HazelcastInstance;
|
|||||||
import com.hazelcast.core.MultiMap;
|
import com.hazelcast.core.MultiMap;
|
||||||
import com.hazelcast.util.StringUtil;
|
import com.hazelcast.util.StringUtil;
|
||||||
import com.xiaoleilu.loServer.model.FriendData;
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
|
import io.moquette.server.Server;
|
||||||
import io.moquette.spi.ClientSession;
|
import io.moquette.spi.ClientSession;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -30,9 +31,11 @@ import java.sql.*;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||||
import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS;
|
import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS;
|
||||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||||
|
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
|
||||||
|
|
||||||
public class DatabaseStore {
|
public class DatabaseStore {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
|
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
|
||||||
@@ -146,8 +149,12 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
//searchType
|
||||||
List<WFCMessage.User> searchUserFromDB(String keyword, boolean buzzy, int page) {
|
// 0 模糊匹配displayName, 精确匹配账户名和电话号码
|
||||||
|
// 1 精确匹配账户名和电话号码
|
||||||
|
// 2 精确匹配账户名
|
||||||
|
// 3 精确匹配电话号码
|
||||||
|
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
@@ -167,18 +174,29 @@ public class DatabaseStore {
|
|||||||
", `_social`" +
|
", `_social`" +
|
||||||
", `_extra`" +
|
", `_extra`" +
|
||||||
", `_dt` from t_user";
|
", `_dt` from t_user";
|
||||||
if (buzzy) {
|
switch (searchType) {
|
||||||
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
|
case SearchUserType_Name_Mobile:
|
||||||
} else {
|
sql += " where (`_name` = ? or `_mobile` = ?) ";
|
||||||
sql += " where (`_name` = ? or `_mobile` = ?) ";
|
break;
|
||||||
|
case SearchUserType_Name:
|
||||||
|
sql += " where `_name` = ? ";
|
||||||
|
break;
|
||||||
|
case SearchUserType_Mobile:
|
||||||
|
sql += " where `_mobile` = ? ";
|
||||||
|
break;
|
||||||
|
case SearchUserType_General:
|
||||||
|
default:
|
||||||
|
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sql += " and _type <> 2"; //can search normal user(0) and robot(1), can not search things
|
|
||||||
|
|
||||||
if (buzzy) {
|
sql += " and _type <> 2"; //can search normal user(0) and robot(1) and admin(100), can not search things
|
||||||
sql += " limit 20";
|
|
||||||
} else {
|
if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
|
||||||
sql += " limit 1";
|
sql += " limit 1";
|
||||||
|
} else {
|
||||||
|
sql += " limit 20";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page > 0) {
|
if (page > 0) {
|
||||||
@@ -188,12 +206,24 @@ public class DatabaseStore {
|
|||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
int index = 1;
|
int index = 1;
|
||||||
if (buzzy) {
|
|
||||||
statement.setString(index++, "%" + keyword + "%");
|
switch (searchType) {
|
||||||
|
case SearchUserType_Name_Mobile:
|
||||||
|
statement.setString(index++, keyword);
|
||||||
|
statement.setString(index++, keyword);
|
||||||
|
break;
|
||||||
|
case SearchUserType_Name:
|
||||||
|
case SearchUserType_Mobile:
|
||||||
|
statement.setString(index++, keyword);
|
||||||
|
break;
|
||||||
|
case SearchUserType_General:
|
||||||
|
default:
|
||||||
|
statement.setString(index++, "%" + keyword + "%");
|
||||||
|
statement.setString(index++, keyword);
|
||||||
|
statement.setString(index++, keyword);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
statement.setString(index++, keyword);
|
|
||||||
statement.setString(index++, keyword);
|
|
||||||
|
|
||||||
rs = statement.executeQuery();
|
rs = statement.executeQuery();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
@@ -350,7 +380,7 @@ public class DatabaseStore {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend";
|
String sql = "select `_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra` from t_friend";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
@@ -381,6 +411,8 @@ public class DatabaseStore {
|
|||||||
long longvalue = rs.getLong(index++);
|
long longvalue = rs.getLong(index++);
|
||||||
builder.setTimestamp(longvalue);
|
builder.setTimestamp(longvalue);
|
||||||
|
|
||||||
|
builder.setExtra(rs.getString(index++));
|
||||||
|
|
||||||
friendsMap.put(builder.getUserId(), builder);
|
friendsMap.put(builder.getUserId(), builder);
|
||||||
}
|
}
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
@@ -463,7 +495,7 @@ public class DatabaseStore {
|
|||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "insert into " + MessageShardingUtil.getMessageTable(message.getMessageId()) +
|
String sql = "insert into " + MessageShardingUtil.getMessageTable(message.getMessageId()) +
|
||||||
" (`_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`) values(?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
" (`_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_searchable_key`, `_dt`, `_content_type`, `_to`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||||
" ON DUPLICATE KEY UPDATE " +
|
" ON DUPLICATE KEY UPDATE " +
|
||||||
"`_data` = ?," +
|
"`_data` = ?," +
|
||||||
"`_searchable_key` = ?," +
|
"`_searchable_key` = ?," +
|
||||||
@@ -485,6 +517,13 @@ public class DatabaseStore {
|
|||||||
statement.setString(index++, searchableContent);
|
statement.setString(index++, searchableContent);
|
||||||
statement.setTimestamp(index++, new Timestamp(message.getServerTimestamp()));
|
statement.setTimestamp(index++, new Timestamp(message.getServerTimestamp()));
|
||||||
statement.setInt(index++, message.getContent().getType());
|
statement.setInt(index++, message.getContent().getType());
|
||||||
|
String to = message.getToUser();
|
||||||
|
if (StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||||
|
if (message.getToList()!= null && message.getToList().size() == 1) {
|
||||||
|
to = message.getToList().get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
statement.setString(index++, to);
|
||||||
|
|
||||||
statement.setBlob(index++, blob);
|
statement.setBlob(index++, blob);
|
||||||
statement.setString(index++, searchableContent);
|
statement.setString(index++, searchableContent);
|
||||||
@@ -638,11 +677,12 @@ public class DatabaseStore {
|
|||||||
String sql = "select `_from`, `_type`, `_target`, `_line`, `_data`, `_dt` from " + MessageShardingUtil.getMessageTable(messageId) +" where _mid = ? limit 1";
|
String sql = "select `_from`, `_type`, `_target`, `_line`, `_data`, `_dt` from " + MessageShardingUtil.getMessageTable(messageId) +" where _mid = ? limit 1";
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
statement.setLong(1, messageId);
|
statement.setLong(1, messageId);
|
||||||
ResultSet resultSet = statement.executeQuery();
|
resultSet = statement.executeQuery();
|
||||||
if (resultSet.next()) {
|
if (resultSet.next()) {
|
||||||
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
|
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
|
||||||
builder.setMessageId(messageId);
|
builder.setMessageId(messageId);
|
||||||
@@ -661,12 +701,11 @@ public class DatabaseStore {
|
|||||||
WFCMessage.Message message = builder.build();
|
WFCMessage.Message message = builder.build();
|
||||||
return new MessageBundle(messageId, message.getFromUser(), null, message);
|
return new MessageBundle(messageId, message.getFromUser(), null, message);
|
||||||
}
|
}
|
||||||
resultSet.close();
|
|
||||||
} catch (SQLException | IOException e) {
|
} catch (SQLException | IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e);
|
Utility.printExecption(LOG, e);
|
||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement);
|
DBUtil.closeDB(connection, statement, resultSet);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -691,21 +730,27 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
List<WFCMessage.Message> loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count) {
|
List<WFCMessage.Message> loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count) {
|
||||||
List<WFCMessage.Message> messages = loadRemoteMessagesFromTable(user, conversation, beforeUid, count, MessageShardingUtil.getMessageTable(beforeUid));
|
List<WFCMessage.Message> messages = new ArrayList<>();
|
||||||
if (messages != null && messages.size() < count) {
|
long[] before = new long[1];
|
||||||
String nexTable = MessageShardingUtil.getPreviousMessageTable(beforeUid);
|
before[0] = beforeUid;
|
||||||
if (!StringUtil.isNullOrEmpty(nexTable)) {
|
boolean hasMore = loadRemoteMessagesFromTable(user, conversation, before, count, MessageShardingUtil.getMessageTable(beforeUid), messages);
|
||||||
List<WFCMessage.Message> nextMessages = loadRemoteMessagesFromTable(user, conversation, beforeUid, count - messages.size(), nexTable);
|
if (messages.size() < count) {
|
||||||
if (nextMessages != null) {
|
if (hasMore) {
|
||||||
messages.addAll(nextMessages);
|
loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), MessageShardingUtil.getMessageTable(beforeUid), messages);
|
||||||
|
} else {
|
||||||
|
String nexTable = MessageShardingUtil.getPreviousMessageTable(before[0]);
|
||||||
|
if (!StringUtil.isNullOrEmpty(nexTable)) {
|
||||||
|
loadRemoteMessagesFromTable(user, conversation, before, count - messages.size(), nexTable, messages);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return messages;
|
return messages;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<WFCMessage.Message> loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long beforeUid, int count, String table) {
|
boolean loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long[] before, int count, String table, List<WFCMessage.Message> messages) {
|
||||||
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt` from " + table +" where";
|
long beforeUid = before[0];
|
||||||
|
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt`, `_to` from " + table +" where";
|
||||||
if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (conversation.getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
|
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
|
||||||
} else {
|
} else {
|
||||||
@@ -717,7 +762,6 @@ public class DatabaseStore {
|
|||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet resultSet = null;
|
ResultSet resultSet = null;
|
||||||
List<WFCMessage.Message> out = new ArrayList<>();
|
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
@@ -734,9 +778,12 @@ public class DatabaseStore {
|
|||||||
statement.setInt(index++, count);
|
statement.setInt(index++, count);
|
||||||
resultSet = statement.executeQuery();
|
resultSet = statement.executeQuery();
|
||||||
while (resultSet.next()) {
|
while (resultSet.next()) {
|
||||||
|
count--;
|
||||||
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
|
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
|
||||||
index = 1;
|
index = 1;
|
||||||
builder.setMessageId(resultSet.getLong(index++));
|
builder.setMessageId(resultSet.getLong(index++));
|
||||||
|
before[0] = builder.getMessageId();
|
||||||
|
|
||||||
builder.setFromUser(resultSet.getString(index++));
|
builder.setFromUser(resultSet.getString(index++));
|
||||||
WFCMessage.Conversation.Builder cb = WFCMessage.Conversation.newBuilder();
|
WFCMessage.Conversation.Builder cb = WFCMessage.Conversation.newBuilder();
|
||||||
cb.setType(resultSet.getInt(index++));
|
cb.setType(resultSet.getInt(index++));
|
||||||
@@ -747,9 +794,22 @@ public class DatabaseStore {
|
|||||||
|
|
||||||
WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(blob.getBinaryStream());
|
WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(blob.getBinaryStream());
|
||||||
builder.setContent(messageContent);
|
builder.setContent(messageContent);
|
||||||
|
|
||||||
builder.setServerTimestamp(resultSet.getTimestamp(index++).getTime());
|
builder.setServerTimestamp(resultSet.getTimestamp(index++).getTime());
|
||||||
|
String to = resultSet.getString(index++);
|
||||||
|
if (!StringUtil.isNullOrEmpty(to)) {
|
||||||
|
if (to.equals(user) || builder.getFromUser().equals(user)) {
|
||||||
|
builder.setToUser(to);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
WFCMessage.Message message = builder.build();
|
WFCMessage.Message message = builder.build();
|
||||||
out.add(message);
|
messages.add(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count == 0) {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
} catch (SQLException | IOException e) {
|
} catch (SQLException | IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -757,7 +817,7 @@ public class DatabaseStore {
|
|||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement, resultSet);
|
DBUtil.closeDB(connection, statement, resultSet);
|
||||||
}
|
}
|
||||||
return out;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void persistUserMessage(final String userId, final long messageId, final long messageSeq) {
|
void persistUserMessage(final String userId, final long messageId, final long messageSeq) {
|
||||||
@@ -786,6 +846,40 @@ public class DatabaseStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clearUserMessage(final String userId) {
|
||||||
|
mScheduler.execute(()->{
|
||||||
|
String tableName = getUserMessageTable(userId);
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
|
String sql = "delete from " + tableName + " where _uid = ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, userId);
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (statement!=null) {
|
||||||
|
statement.close();
|
||||||
|
}
|
||||||
|
statement = null;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void removeFavGroup(final String groupId, final List<String> memberIds) {
|
void removeFavGroup(final String groupId, final List<String> memberIds) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -861,6 +955,31 @@ public class DatabaseStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clearUserSetting(final String userId) {
|
||||||
|
mScheduler.execute(()->{
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
|
String sql = "delete from t_user_setting where `_uid` = ?";
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
int index = 1;
|
||||||
|
statement.setString(index++, userId);
|
||||||
|
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
List<WFCMessage.UserSettingEntry> getPersistUserSetting(final String userId) {
|
List<WFCMessage.UserSettingEntry> getPersistUserSetting(final String userId) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -950,90 +1069,154 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void persistGroupInfo(final WFCMessage.GroupInfo groupInfo) {
|
void persistGroupInfo(final WFCMessage.GroupInfo groupInfo) {
|
||||||
mScheduler.execute(()->{
|
Connection connection = null;
|
||||||
Connection connection = null;
|
PreparedStatement statement = null;
|
||||||
PreparedStatement statement = null;
|
try {
|
||||||
try {
|
connection = DBUtil.getConnection();
|
||||||
connection = DBUtil.getConnection();
|
String sql = "insert into t_group (`_gid`" +
|
||||||
String sql = "insert into t_group (`_gid`" +
|
", `_name`" +
|
||||||
", `_name`" +
|
", `_portrait`" +
|
||||||
", `_portrait`" +
|
", `_owner`" +
|
||||||
", `_owner`" +
|
", `_type`" +
|
||||||
", `_type`" +
|
", `_extra`" +
|
||||||
", `_extra`" +
|
", `_dt`" +
|
||||||
", `_dt`" +
|
", `_member_count`" +
|
||||||
", `_member_count`" +
|
", `_mute`" +
|
||||||
", `_mute`" +
|
", `_join_type`" +
|
||||||
", `_join_type`" +
|
", `_private_chat`" +
|
||||||
", `_private_chat`" +
|
", `_searchable`" +
|
||||||
", `_searchable`" +
|
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||||
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
" ON DUPLICATE KEY UPDATE " +
|
||||||
" ON DUPLICATE KEY UPDATE " +
|
"`_name` = ?," +
|
||||||
"`_name` = ?," +
|
"`_portrait` = ?," +
|
||||||
"`_portrait` = ?," +
|
"`_owner` = ?," +
|
||||||
"`_owner` = ?," +
|
"`_type` = ?," +
|
||||||
"`_type` = ?," +
|
"`_extra` = ?," +
|
||||||
"`_extra` = ?," +
|
"`_dt` = ?," +
|
||||||
"`_dt` = ?," +
|
"`_member_count` = ?," +
|
||||||
"`_member_count` = ?," +
|
"`_mute` = ?" +
|
||||||
"`_mute` = ?" +
|
", `_join_type` = ?" +
|
||||||
", `_join_type` = ?" +
|
", `_private_chat` = ?" +
|
||||||
", `_private_chat` = ?" +
|
", `_searchable` = ?, " +
|
||||||
", `_searchable` = ?, " +
|
"`_member_dt` = ?";
|
||||||
"`_member_dt` = ?";
|
|
||||||
|
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
statement.setString(index++, groupInfo.getTargetId());
|
||||||
|
statement.setString(index++, groupInfo.getName());
|
||||||
|
statement.setString(index++, groupInfo.getPortrait());
|
||||||
|
statement.setString(index++, groupInfo.getOwner());
|
||||||
|
statement.setInt(index++, groupInfo.getType());
|
||||||
|
statement.setString(index++, groupInfo.getExtra());
|
||||||
|
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
||||||
|
statement.setInt(index++, groupInfo.getMemberCount());
|
||||||
|
statement.setInt(index++, groupInfo.getMute());
|
||||||
|
statement.setInt(index++, groupInfo.getJoinType());
|
||||||
|
statement.setInt(index++, groupInfo.getPrivateChat());
|
||||||
|
statement.setInt(index++, groupInfo.getSearchable());
|
||||||
|
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
||||||
|
|
||||||
|
statement.setString(index++, groupInfo.getName());
|
||||||
|
statement.setString(index++, groupInfo.getPortrait());
|
||||||
|
statement.setString(index++, groupInfo.getOwner());
|
||||||
|
statement.setInt(index++, groupInfo.getType());
|
||||||
|
statement.setString(index++, groupInfo.getExtra());
|
||||||
|
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
||||||
|
statement.setInt(index++, groupInfo.getMemberCount());
|
||||||
|
statement.setInt(index++, groupInfo.getMute());
|
||||||
|
statement.setInt(index++, groupInfo.getJoinType());
|
||||||
|
statement.setInt(index++, groupInfo.getPrivateChat());
|
||||||
|
statement.setInt(index++, groupInfo.getSearchable());
|
||||||
|
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List<MemorySessionStore.Session> getUserActivedSessions(String uid) {
|
||||||
|
String sql = "select `_cid`, `_package_name`,`_token`,`_voip_token`,`_secret`,`_db_secret`,`_platform`,`_push_type`,`_device_name`,`_device_version`,`_phone_name`,`_language`,`_carrier_name`, `_dt` from t_user_session where `_uid` = ? and `_deleted` = 0";
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
List<MemorySessionStore.Session> result = new ArrayList<>();
|
||||||
|
ResultSet resultSet = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, uid);
|
||||||
|
|
||||||
|
resultSet = statement.executeQuery();
|
||||||
|
while (resultSet.next()) {
|
||||||
int index = 1;
|
int index = 1;
|
||||||
statement.setString(index++, groupInfo.getTargetId());
|
String cid = resultSet.getString(index++);
|
||||||
statement.setString(index++, groupInfo.getName());
|
|
||||||
statement.setString(index++, groupInfo.getPortrait());
|
|
||||||
statement.setString(index++, groupInfo.getOwner());
|
|
||||||
statement.setInt(index++, groupInfo.getType());
|
|
||||||
statement.setString(index++, groupInfo.getExtra());
|
|
||||||
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
|
||||||
statement.setInt(index++, groupInfo.getMemberCount());
|
|
||||||
statement.setInt(index++, groupInfo.getMute());
|
|
||||||
statement.setInt(index++, groupInfo.getJoinType());
|
|
||||||
statement.setInt(index++, groupInfo.getPrivateChat());
|
|
||||||
statement.setInt(index++, groupInfo.getSearchable());
|
|
||||||
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
|
||||||
|
|
||||||
statement.setString(index++, groupInfo.getName());
|
ClientSession clientSession = new ClientSession(cid, Server.getServer().getStore().sessionsStore());
|
||||||
statement.setString(index++, groupInfo.getPortrait());
|
MemorySessionStore.Session session = new MemorySessionStore.Session(uid, cid, clientSession);
|
||||||
statement.setString(index++, groupInfo.getOwner());
|
|
||||||
statement.setInt(index++, groupInfo.getType());
|
session.setAppName(resultSet.getString(index++));
|
||||||
statement.setString(index++, groupInfo.getExtra());
|
session.setDeviceToken(resultSet.getString(index++));
|
||||||
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
session.setVoipDeviceToken(resultSet.getString(index++));
|
||||||
statement.setInt(index++, groupInfo.getMemberCount());
|
session.setSecret(resultSet.getString(index++));
|
||||||
statement.setInt(index++, groupInfo.getMute());
|
session.setDbSecret(resultSet.getString(index++));
|
||||||
statement.setInt(index++, groupInfo.getJoinType());
|
session.setPlatform(resultSet.getInt(index++));
|
||||||
statement.setInt(index++, groupInfo.getPrivateChat());
|
session.setPushType(resultSet.getInt(index++));
|
||||||
statement.setInt(index++, groupInfo.getSearchable());
|
|
||||||
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
|
session.setDeviceName(resultSet.getString(index++));
|
||||||
int count = statement.executeUpdate();
|
session.setDeviceVersion(resultSet.getString(index++));
|
||||||
LOG.info("Update rows {}", count);
|
session.setPhoneName(resultSet.getString(index++));
|
||||||
} catch (SQLException e) {
|
session.setLanguage(resultSet.getString(index++));
|
||||||
// TODO Auto-generated catch block
|
session.setCarrierName(resultSet.getString(index++));
|
||||||
e.printStackTrace();
|
session.setUpdateDt(resultSet.getLong(index++));
|
||||||
Utility.printExecption(LOG, e);
|
result.add(session);
|
||||||
} finally {
|
|
||||||
DBUtil.closeDB(connection, statement);
|
|
||||||
}
|
}
|
||||||
});
|
} catch (SQLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement, resultSet);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearUserSessions(String uid) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "delete from t_user_session where `_uid`=?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
int index = 1;
|
||||||
|
statement.setString(index++, uid);
|
||||||
|
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MemorySessionStore.Session getSession(String uid, String clientId, ClientSession clientSession) {
|
MemorySessionStore.Session getSession(String uid, String clientId, ClientSession clientSession) {
|
||||||
String sql = "select `_package_name`,`_token`,`_voip_token`,`_secret`,`_db_secret`,`_platform`,`_push_type`,`_device_name`,`_device_version`,`_phone_name`,`_language`,`_carrier_name`, `_dt` from t_user_session where `_uid` = ? and `_cid` = ? limit 1";
|
String sql = "select `_package_name`,`_token`,`_voip_token`,`_secret`,`_db_secret`,`_platform`,`_push_type`,`_device_name`,`_device_version`,`_phone_name`,`_language`,`_carrier_name`, `_dt`, `_deleted` from t_user_session where `_uid` = ? and `_cid` = ? limit 1";
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
|
ResultSet resultSet = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
statement.setString(1, uid);
|
statement.setString(1, uid);
|
||||||
statement.setString(2, clientId);
|
statement.setString(2, clientId);
|
||||||
ResultSet resultSet = statement.executeQuery();
|
resultSet = statement.executeQuery();
|
||||||
if (resultSet.next()) {
|
if (resultSet.next()) {
|
||||||
MemorySessionStore.Session session = new MemorySessionStore.Session(uid, clientId, clientSession);
|
MemorySessionStore.Session session = new MemorySessionStore.Session(uid, clientId, clientSession);
|
||||||
|
|
||||||
@@ -1051,15 +1234,15 @@ public class DatabaseStore {
|
|||||||
session.setPhoneName(resultSet.getString(index++));
|
session.setPhoneName(resultSet.getString(index++));
|
||||||
session.setLanguage(resultSet.getString(index++));
|
session.setLanguage(resultSet.getString(index++));
|
||||||
session.setCarrierName(resultSet.getString(index++));
|
session.setCarrierName(resultSet.getString(index++));
|
||||||
session.setUpdateDt(resultSet.getLong(index));
|
session.setUpdateDt(resultSet.getLong(index++));
|
||||||
|
session.setDeleted(resultSet.getInt(index));
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
resultSet.close();
|
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e);
|
Utility.printExecption(LOG, e);
|
||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement);
|
DBUtil.closeDB(connection, statement, resultSet);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -1136,6 +1319,35 @@ public class DatabaseStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateSessionDeleted(String uid, String cid, int deleted) {
|
||||||
|
mScheduler.execute(()->{
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
|
String sql = "update t_user_session set `_deleted` = ? where `_uid` = ? and `_cid` = ?";
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
statement.setInt(index++, deleted);
|
||||||
|
statement.setString(index++, uid);
|
||||||
|
statement.setString(index++, cid);
|
||||||
|
|
||||||
|
int c = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", c);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void updateSessionPlatform(String uid, String cid, int platform) {
|
void updateSessionPlatform(String uid, String cid, int platform) {
|
||||||
mScheduler.execute(()->{
|
mScheduler.execute(()->{
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
@@ -1264,20 +1476,28 @@ public class DatabaseStore {
|
|||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql;
|
String sql;
|
||||||
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX
|
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||||
|| platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
|
||||||
sql = "delete from t_user_session where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ?";
|
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
||||||
|
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
|
||||||
} else {
|
} else {
|
||||||
sql = "delete from t_user_session where `_uid`=? and `_platform` = ? and `_cid` <> ?";
|
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and `_platform` = ? and `_cid` <> ? and `_deleted` = 0";
|
||||||
}
|
}
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
int index = 1;
|
int index = 1;
|
||||||
|
|
||||||
|
statement.setInt(index++, 1);
|
||||||
|
statement.setString(index++, "");
|
||||||
|
statement.setString(index++, "");
|
||||||
|
statement.setLong(index++, System.currentTimeMillis());
|
||||||
|
|
||||||
statement.setString(index++, uid);
|
statement.setString(index++, uid);
|
||||||
|
|
||||||
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX) {
|
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||||
statement.setInt(index++, ProtoConstants.Platform.Platform_Windows);
|
statement.setInt(index++, ProtoConstants.Platform.Platform_Windows);
|
||||||
statement.setInt(index++, ProtoConstants.Platform.Platform_OSX);
|
statement.setInt(index++, ProtoConstants.Platform.Platform_OSX);
|
||||||
|
statement.setInt(index++, ProtoConstants.Platform.Platform_Linux);
|
||||||
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
||||||
statement.setInt(index++, ProtoConstants.Platform.Platform_iOS);
|
statement.setInt(index++, ProtoConstants.Platform.Platform_iOS);
|
||||||
statement.setInt(index++, ProtoConstants.Platform.Platform_Android);
|
statement.setInt(index++, ProtoConstants.Platform.Platform_Android);
|
||||||
@@ -1340,40 +1560,67 @@ public class DatabaseStore {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateGroupMemberCountDt(final String groupId, final int count, final long dt) {
|
Set<String> getUserGroupIds(String userId) {
|
||||||
mScheduler.execute(()->{
|
Connection connection = null;
|
||||||
Connection connection = null;
|
PreparedStatement statement = null;
|
||||||
PreparedStatement statement = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "select `_gid` from t_group_member where `_mid` = ? and `_type` <> ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
String sql ;
|
statement.setString(1, userId);
|
||||||
|
statement.setInt(2, ProtoConstants.GroupMemberType.GroupMemberType_Removed);
|
||||||
|
|
||||||
if (count >= 0) {
|
|
||||||
sql = "update t_group set `_member_count` = ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
|
|
||||||
} else {
|
|
||||||
sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
|
|
||||||
}
|
|
||||||
statement = connection.prepareStatement(sql);
|
|
||||||
|
|
||||||
int index = 1;
|
rs = statement.executeQuery();
|
||||||
if (count >=0) {
|
Set<String> out = new HashSet<>();
|
||||||
statement.setInt(index++, count);
|
while (rs.next()) {
|
||||||
}
|
String uid = rs.getString(1);
|
||||||
statement.setLong(index++, dt);
|
out.add(uid);
|
||||||
statement.setLong(index++, dt);
|
|
||||||
statement.setString(index++, groupId);
|
|
||||||
|
|
||||||
int c = statement.executeUpdate();
|
|
||||||
LOG.info("Update rows {}", c);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
Utility.printExecption(LOG, e);
|
|
||||||
} finally {
|
|
||||||
DBUtil.closeDB(connection, statement);
|
|
||||||
}
|
}
|
||||||
});
|
return out;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement, rs);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
void updateGroupMemberCountDt(final String groupId, final int count, final long dt) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
|
||||||
|
String sql ;
|
||||||
|
|
||||||
|
if (count >= 0) {
|
||||||
|
sql = "update t_group set `_member_count` = ?, `_member_dt` = ? , `_dt` = ? where `_gid` = ?";
|
||||||
|
} else {
|
||||||
|
sql = "update t_group set `_member_dt` = ?, `_dt` = ? where `_gid` = ?";
|
||||||
|
}
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
if (count >=0) {
|
||||||
|
statement.setInt(index++, count);
|
||||||
|
}
|
||||||
|
statement.setLong(index++, dt);
|
||||||
|
statement.setLong(index++, dt);
|
||||||
|
statement.setString(index++, groupId);
|
||||||
|
|
||||||
|
int c = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", c);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList) {
|
void persistGroupMember(final String groupId, final List<WFCMessage.GroupMember> memberList) {
|
||||||
@@ -1913,7 +2160,7 @@ public class DatabaseStore {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateUser(final WFCMessage.User user) {
|
void updateUser(final WFCMessage.User user) throws Exception {
|
||||||
LOG.info("Database update user info {} {}", user.getUid(), user.getUpdateDt());
|
LOG.info("Database update user info {} {}", user.getUid(), user.getUpdateDt());
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -1944,6 +2191,7 @@ public class DatabaseStore {
|
|||||||
", `_social`=?" +
|
", `_social`=?" +
|
||||||
", `_extra`=?" +
|
", `_extra`=?" +
|
||||||
", `_type`=?" +
|
", `_type`=?" +
|
||||||
|
", `_deleted`=?" +
|
||||||
", `_dt`=?";
|
", `_dt`=?";
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
@@ -1977,6 +2225,7 @@ public class DatabaseStore {
|
|||||||
|
|
||||||
statement.setString(index++, user.getExtra());
|
statement.setString(index++, user.getExtra());
|
||||||
statement.setInt(index++, user.getType());
|
statement.setInt(index++, user.getType());
|
||||||
|
statement.setInt(index++, user.getDeleted());
|
||||||
statement.setLong(index++, user.getUpdateDt() == 0 ? System.currentTimeMillis() : user.getUpdateDt());
|
statement.setLong(index++, user.getUpdateDt() == 0 ? System.currentTimeMillis() : user.getUpdateDt());
|
||||||
|
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
@@ -1985,6 +2234,7 @@ public class DatabaseStore {
|
|||||||
// TODO Auto-generated catch block
|
// TODO Auto-generated catch block
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e);
|
Utility.printExecption(LOG, e);
|
||||||
|
throw new Exception(e.getMessage());
|
||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement);
|
DBUtil.closeDB(connection, statement);
|
||||||
}
|
}
|
||||||
@@ -2103,6 +2353,7 @@ public class DatabaseStore {
|
|||||||
", `_social`" +
|
", `_social`" +
|
||||||
", `_extra`" +
|
", `_extra`" +
|
||||||
", `_type`" +
|
", `_type`" +
|
||||||
|
", `_deleted`" +
|
||||||
", `_dt` from t_user where `_uid` = ?";
|
", `_dt` from t_user where `_uid` = ?";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
@@ -2157,6 +2408,9 @@ public class DatabaseStore {
|
|||||||
int type = rs.getInt(index++);
|
int type = rs.getInt(index++);
|
||||||
builder.setType(type);
|
builder.setType(type);
|
||||||
|
|
||||||
|
int deleted = rs.getInt(index++);
|
||||||
|
builder.setDeleted(deleted);
|
||||||
|
|
||||||
long longValue = rs.getLong(index++);
|
long longValue = rs.getLong(index++);
|
||||||
builder.setUpdateDt(longValue);
|
builder.setUpdateDt(longValue);
|
||||||
|
|
||||||
@@ -2224,7 +2478,7 @@ public class DatabaseStore {
|
|||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "select distinct(`_uid`) from t_user_session";
|
String sql = "select distinct(`_uid`) from t_user_session where `_deleted` = 0";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
|
||||||
@@ -2251,7 +2505,7 @@ public class DatabaseStore {
|
|||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "select `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt` from t_friend where `_uid` = ?";
|
String sql = "select `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra` from t_friend where `_uid` = ?";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
|
||||||
@@ -2267,8 +2521,9 @@ public class DatabaseStore {
|
|||||||
int state = rs.getInt(3);
|
int state = rs.getInt(3);
|
||||||
int blacked = rs.getInt(4);
|
int blacked = rs.getInt(4);
|
||||||
long timestamp = rs.getLong(5);
|
long timestamp = rs.getLong(5);
|
||||||
|
String extra = rs.getString(6);
|
||||||
|
|
||||||
FriendData data = new FriendData(userId, uid, alias, state, blacked, timestamp);
|
FriendData data = new FriendData(userId, uid, alias, extra, state, blacked, timestamp);
|
||||||
out.add(data);
|
out.add(data);
|
||||||
}
|
}
|
||||||
return out;
|
return out;
|
||||||
@@ -2282,6 +2537,52 @@ public class DatabaseStore {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void removeUserFriend(String userId) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "update t_friend set `_alias` = '', `_state` = 1, `_blacked` = 0, `_dt` = ?, `_extra` = 0 where `_uid` = ? or `_friend_uid` = ?";
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
int index = 1;
|
||||||
|
statement.setLong(index++, System.currentTimeMillis());
|
||||||
|
statement.setString(index++, userId);
|
||||||
|
statement.setString(index++, userId);
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void removeUserFriendRequest(String userId) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "delete from t_friend_request where _uid = ? or _friend_uid = ?";
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
int index = 1;
|
||||||
|
statement.setString(index++, userId);
|
||||||
|
statement.setString(index++, userId);
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
List<WFCMessage.FriendRequest> getPersistFriendRequests(String userId) {
|
List<WFCMessage.FriendRequest> getPersistFriendRequests(String userId) {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -2425,12 +2726,13 @@ public class DatabaseStore {
|
|||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`) values(?, ?, ?, ?, ?, ?)" +
|
String sql = "insert into t_friend (`_uid`, `_friend_uid`, `_alias`, `_state`, `_blacked`, `_dt`, `_extra`) values(?, ?, ?, ?, ?, ?, ?)" +
|
||||||
" ON DUPLICATE KEY UPDATE " +
|
" ON DUPLICATE KEY UPDATE " +
|
||||||
"`_alias` = ?," +
|
"`_alias` = ?," +
|
||||||
"`_state` = ?," +
|
"`_state` = ?," +
|
||||||
"`_blacked` = ?," +
|
"`_blacked` = ?," +
|
||||||
"`_dt` = ?";
|
"`_dt` = ?," +
|
||||||
|
"`_extra` = ?";
|
||||||
|
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
@@ -2441,10 +2743,12 @@ public class DatabaseStore {
|
|||||||
statement.setInt(index++, request.getState());
|
statement.setInt(index++, request.getState());
|
||||||
statement.setInt(index++, request.getBlacked());
|
statement.setInt(index++, request.getBlacked());
|
||||||
statement.setLong(index++, request.getTimestamp());
|
statement.setLong(index++, request.getTimestamp());
|
||||||
|
statement.setString(index++, request.getExtra());
|
||||||
statement.setString(index++, request.getAlias());
|
statement.setString(index++, request.getAlias());
|
||||||
statement.setInt(index++, request.getState());
|
statement.setInt(index++, request.getState());
|
||||||
statement.setInt(index++, request.getBlacked());
|
statement.setInt(index++, request.getBlacked());
|
||||||
statement.setLong(index++, request.getTimestamp());
|
statement.setLong(index++, request.getTimestamp());
|
||||||
|
statement.setString(index++, request.getExtra());
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
@@ -2733,7 +3037,7 @@ public class DatabaseStore {
|
|||||||
rs = statement.executeQuery();
|
rs = statement.executeQuery();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
|
|
||||||
String value = rs.getString(index++);
|
String value = rs.getString(1);
|
||||||
if (!StringUtil.isNullOrEmpty(value)) {
|
if (!StringUtil.isNullOrEmpty(value)) {
|
||||||
out.add(value);
|
out.add(value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ import com.hazelcast.util.StringUtil;
|
|||||||
import com.xiaoleilu.loServer.model.FriendData;
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import io.moquette.BrokerConstants;
|
||||||
|
import io.moquette.server.Constants;
|
||||||
import io.moquette.server.Server;
|
import io.moquette.server.Server;
|
||||||
import io.moquette.spi.IMatchingCondition;
|
import io.moquette.spi.IMatchingCondition;
|
||||||
import io.moquette.spi.IMessagesStore;
|
import io.moquette.spi.IMessagesStore;
|
||||||
@@ -48,8 +50,7 @@ import java.util.concurrent.locks.ReadWriteLock;
|
|||||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
import static cn.wildfirechat.proto.ProtoConstants.ChannelState.Channel_State_Mask_Deleted;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.ChannelStatus.Channel_Status_Destoryed;
|
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.GroupMemberType.*;
|
import static cn.wildfirechat.proto.ProtoConstants.GroupMemberType.*;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
|
import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
|
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
|
||||||
@@ -117,11 +118,63 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private ConcurrentHashMap<String, Boolean> userPushHiddenDetail = new ConcurrentHashMap<>();
|
private ConcurrentHashMap<String, Boolean> userPushHiddenDetail = new ConcurrentHashMap<>();
|
||||||
private ConcurrentHashMap<String, Boolean> userConvSlientMap = new ConcurrentHashMap<>();
|
private ConcurrentHashMap<String, Boolean> userConvSlientMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
||||||
|
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
||||||
|
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
||||||
|
|
||||||
|
private boolean mDisableStrangerChat = false;
|
||||||
|
|
||||||
|
private long mChatroomParticipantIdleTime = 900000;
|
||||||
|
private boolean mChatroomRejoinWhenActive = true;
|
||||||
|
|
||||||
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
|
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
|
||||||
m_Server = server;
|
m_Server = server;
|
||||||
this.databaseStore = databaseStore;
|
this.databaseStore = databaseStore;
|
||||||
IS_MESSAGE_ROAMING = "1".equals(m_Server.getConfig().getProperty(MESSAGE_ROAMING));
|
IS_MESSAGE_ROAMING = "1".equals(m_Server.getConfig().getProperty(MESSAGE_ROAMING));
|
||||||
IS_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_History_Message));
|
IS_MESSAGE_REMOTE_HISTORY_MESSAGE = "1".equals(m_Server.getConfig().getProperty(MESSAGE_Remote_History_Message));
|
||||||
|
Constants.MAX_MESSAGE_QUEUE = Integer.parseInt(m_Server.getConfig().getProperty(MESSAGE_Max_Queue));
|
||||||
|
|
||||||
|
try {
|
||||||
|
mDisableStrangerChat = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Disable_Stranger_Chat));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mFriendRequestDuration = Long.parseLong(m_Server.getConfig().getProperty(FRIEND_Repeat_Request_Duration));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mFriendRejectDuration = Long.parseLong(m_Server.getConfig().getProperty(FRIEND_Reject_Request_Duration));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mFriendRequestExpiration = Long.parseLong(m_Server.getConfig().getProperty(FRIEND_Request_Expiration_Duration));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mChatroomRejoinWhenActive = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.CHATROOM_Rejoin_When_Active));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mChatroomParticipantIdleTime = Long.parseLong(m_Server.getConfig().getProperty(CHATROOM_Participant_Idle_Time, "900000"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -177,12 +230,24 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers) {
|
public int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder messageBuilder, Set<String> notifyReceivers, boolean ignoreMsg) {
|
||||||
WFCMessage.Message message = messageBuilder.build();
|
WFCMessage.Message message = messageBuilder.build();
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
int type = message.getConversation().getType();
|
int type = message.getConversation().getType();
|
||||||
|
int pullType = ProtoConstants.PullType.Pull_Normal;
|
||||||
|
|
||||||
|
if (ignoreMsg) {
|
||||||
|
if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
|
||||||
|
pullType = ProtoConstants.PullType.Pull_ChatRoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (message.getContent().getPersistFlag() != Transparent) {
|
||||||
|
notifyReceivers.add(fromUser);
|
||||||
|
}
|
||||||
|
return pullType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int pullType = 0;
|
|
||||||
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
notifyReceivers.add(fromUser);
|
notifyReceivers.add(fromUser);
|
||||||
notifyReceivers.add(message.getConversation().getTarget());
|
notifyReceivers.add(message.getConversation().getTarget());
|
||||||
@@ -192,8 +257,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
|
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||||
notifyReceivers.add(message.getToUser());
|
notifyReceivers.add(message.getToUser());
|
||||||
} else if(!message.getToList().isEmpty()) {
|
} else if(message.getToList()!=null && !message.getToList().isEmpty()) {
|
||||||
notifyReceivers.addAll(message.getToList());
|
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||||
|
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
||||||
|
if (members == null || members.size() == 0) {
|
||||||
|
members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget());
|
||||||
|
}
|
||||||
|
for (WFCMessage.GroupMember member : members) {
|
||||||
|
if (member.getType() != GroupMemberType_Removed && message.getToList().contains(member.getMemberId())) {
|
||||||
|
notifyReceivers.add(member.getMemberId());
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
||||||
@@ -230,14 +304,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (channelInfo != null) {
|
if (channelInfo != null) {
|
||||||
notifyReceivers.add(fromUser);
|
notifyReceivers.add(fromUser);
|
||||||
if (channelInfo.getOwner().equals(fromUser)) {
|
if (channelInfo.getOwner().equals(fromUser)) {
|
||||||
if (StringUtil.isNullOrEmpty(message.getToUser())) {
|
Collection<String> listeners = getChannelListener(message.getConversation().getTarget());
|
||||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||||
notifyReceivers.addAll(listeners.get(message.getConversation().getTarget()));
|
if (listeners.contains(message.getToUser())) {
|
||||||
} else {
|
|
||||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
|
||||||
if (listeners.values().contains(message.getToUser())) {
|
|
||||||
notifyReceivers.add(message.getToUser());
|
notifyReceivers.add(message.getToUser());
|
||||||
}
|
}
|
||||||
|
} else if(message.getToList() != null && !message.getToList().isEmpty()) {
|
||||||
|
for (String to:message.getToList()) {
|
||||||
|
if (listeners.contains(to)) {
|
||||||
|
notifyReceivers.add(to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
notifyReceivers.addAll(listeners);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
|
if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
|
||||||
@@ -348,8 +427,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||||
|
if (System.currentTimeMillis() < bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
size += bundle.getMessage().getSerializedSize();
|
size += bundle.getMessage().getSerializedSize();
|
||||||
if (size >= 512 * 1024) { //3M
|
if (size >= 512 * 1024) { //3M
|
||||||
|
if(builder.getMessageCount() == 0){
|
||||||
|
builder.addMessage(bundle.getMessage());
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
builder.addMessage(bundle.getMessage());
|
builder.addMessage(bundle.getMessage());
|
||||||
@@ -528,13 +616,29 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
@Override
|
@Override
|
||||||
public boolean checkUserClientInChatroom(String user, String clientId, String chatroomId) {
|
public boolean checkUserClientInChatroom(String user, String clientId, String chatroomId) {
|
||||||
MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(clientId);
|
MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(clientId);
|
||||||
if (session == null || System.currentTimeMillis() - session.getLastChatroomActiveTime() > 5 * 60 * 1000) {
|
|
||||||
handleQuitChatroom(user, clientId, chatroomId);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
String existChatroomId = (String)m_Server.getHazelcastInstance().getMap(USER_CHATROOM).get(user);
|
String existChatroomId = (String)m_Server.getHazelcastInstance().getMap(USER_CHATROOM).get(user);
|
||||||
if (StringUtil.isNullOrEmpty(existChatroomId) && (chatroomId == null || !existChatroomId.equals(chatroomId))) {
|
if (chatroomId == null) {
|
||||||
|
if (existChatroomId == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
chatroomId = existChatroomId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtil.isNullOrEmpty(existChatroomId) || !existChatroomId.equals(chatroomId)) {
|
||||||
|
if (mChatroomRejoinWhenActive) {
|
||||||
|
if (!StringUtil.isNullOrEmpty(existChatroomId)) {
|
||||||
|
handleQuitChatroom(user, clientId, existChatroomId);
|
||||||
|
}
|
||||||
|
handleJoinChatroom(user, clientId, chatroomId);
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mChatroomRejoinWhenActive && !checkChatroomParticipantIdelTime(session)) {
|
||||||
|
handleQuitChatroom(user, clientId, chatroomId);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -684,7 +788,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
List<WFCMessage.GroupMember> tmp = new ArrayList<>();
|
List<WFCMessage.GroupMember> tmp = new ArrayList<>();
|
||||||
ArrayList<String> newInviteUsers = new ArrayList<>();
|
ArrayList<String> newInviteUsers = new ArrayList<>();
|
||||||
for (WFCMessage.GroupMember member : memberList) {
|
for (WFCMessage.GroupMember member : memberList) {
|
||||||
member = member.toBuilder().setType(ProtoConstants.GroupMemberType.GroupMemberType_Normal).setUpdateDt(updateDt).setAlias("").build();
|
if (member.getMemberId().equals(groupInfo.getOwner())) {
|
||||||
|
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).setAlias("").build();
|
||||||
|
} else {
|
||||||
|
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).setAlias("").build();
|
||||||
|
}
|
||||||
tmp.add(member);
|
tmp.add(member);
|
||||||
newInviteUsers.add(member.getMemberId());
|
newInviteUsers.add(member.getMemberId());
|
||||||
}
|
}
|
||||||
@@ -772,7 +880,31 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (groupInfo.getType() != ProtoConstants.GroupType.GroupType_Free && groupInfo.getOwner() != null && groupInfo.getOwner().equals(operator)) {
|
if (groupInfo.getType() != ProtoConstants.GroupType.GroupType_Free && groupInfo.getOwner() != null && groupInfo.getOwner().equals(operator)) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
WFCMessage.GroupMember newOwner = null;
|
||||||
|
for (WFCMessage.GroupMember member :members) {
|
||||||
|
if (!member.getMemberId().equals(operator) && member.getType() != GroupMemberType_Removed) {
|
||||||
|
newOwner = member;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newOwner == null) {
|
||||||
|
return dismissGroup(operator, groupId, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
transferGroup(operator, groupId, newOwner.getMemberId(), false);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Thread.sleep(500);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
removeGroupMember(groupId, Arrays.asList(operator));
|
removeGroupMember(groupId, Arrays.asList(operator));
|
||||||
@@ -781,6 +913,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearUserGroups(String userId) {
|
||||||
|
Set<String> groupIds = databaseStore.getUserGroupIds(userId);
|
||||||
|
int[] removedCount = new int[1];
|
||||||
|
for (String groupId : groupIds) {
|
||||||
|
removedCount[0] = 0;
|
||||||
|
ErrorCode errorCode = quitGroup(userId, groupId);
|
||||||
|
LOG.info("clear user {} group {} result {}", userId, groupId, errorCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private void removeGroupUserSettings(String groupId, List<String> users) {
|
private void removeGroupUserSettings(String groupId, List<String> users) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
MultiMap<String, WFCMessage.UserSettingEntry> userSettingMap = hzInstance.getMultiMap(USER_SETTING);
|
MultiMap<String, WFCMessage.UserSettingEntry> userSettingMap = hzInstance.getMultiMap(USER_SETTING);
|
||||||
@@ -971,6 +1115,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return groupInfo;
|
return groupInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Set<String> getUserGroupIds(String userId) {
|
||||||
|
return databaseStore.getUserGroupIds(userId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members) {
|
public ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -1144,8 +1293,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (members == null || members.size() == 0) {
|
if (members == null || members.size() == 0) {
|
||||||
members = loadGroupMemberFromDB(hzInstance, groupId);
|
members = loadGroupMemberFromDB(hzInstance, groupId);
|
||||||
}
|
}
|
||||||
for (WFCMessage.GroupMember member : members
|
|
||||||
) {
|
boolean isInGroup = false;
|
||||||
|
for (WFCMessage.GroupMember member : members) {
|
||||||
if (member.getMemberId().equals(memberId)) {
|
if (member.getMemberId().equals(memberId)) {
|
||||||
if (member.getType() == GroupMemberType_Silent) {
|
if (member.getType() == GroupMemberType_Silent) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
@@ -1158,11 +1308,16 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (member.getMemberId().equals(memberId) && member.getType() == GroupMemberType_Removed) {
|
if (member.getMemberId().equals(memberId) && member.getType() == GroupMemberType_Removed) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
}
|
}
|
||||||
|
isInGroup = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isInGroup) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
|
}
|
||||||
|
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1230,6 +1385,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearUserMessages(String userId) {
|
||||||
|
mWriteLock.lock();
|
||||||
|
try {
|
||||||
|
userMessages.remove(userId);
|
||||||
|
} finally {
|
||||||
|
mWriteLock.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
databaseStore.clearUserMessage(userId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WFCMessage.Robot getRobot(String robotId) {
|
public WFCMessage.Robot getRobot(String robotId) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -1284,7 +1451,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) {
|
public ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||||
|
|
||||||
@@ -1333,7 +1500,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
modified = true;
|
modified = true;
|
||||||
break;
|
break;
|
||||||
case Modify_Social:
|
case Modify_Social:
|
||||||
|
builder.setSocial(entry.getValue());
|
||||||
|
modified = true;
|
||||||
break;
|
break;
|
||||||
case Modify_Extra:
|
case Modify_Extra:
|
||||||
builder.setExtra(entry.getValue());
|
builder.setExtra(entry.getValue());
|
||||||
@@ -1347,8 +1515,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (modified) {
|
if (modified) {
|
||||||
builder.setUpdateDt(System.currentTimeMillis());
|
builder.setUpdateDt(System.currentTimeMillis());
|
||||||
user = builder.build();
|
user = builder.build();
|
||||||
|
databaseStore.updateUser(user);
|
||||||
mUserMap.set(userId, user);
|
mUserMap.set(userId, user);
|
||||||
// databaseStore.updateUser(user);
|
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return ErrorCode.ERROR_CODE_NOT_MODIFIED;
|
return ErrorCode.ERROR_CODE_NOT_MODIFIED;
|
||||||
@@ -1393,13 +1561,32 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addUserInfo(WFCMessage.User user, String password) {
|
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||||
|
databaseStore.updateUser(user);
|
||||||
mUserMap.put(user.getUid(), user);
|
mUserMap.put(user.getUid(), user);
|
||||||
databaseStore.updateUserPassword(user.getUid(), password);
|
databaseStore.updateUserPassword(user.getUid(), password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destoryUser(String userId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||||
|
WFCMessage.User us = mUserMap.get(userId);
|
||||||
|
if (us != null) {
|
||||||
|
us = WFCMessage.User.newBuilder().setUid(userId).setUpdateDt(System.currentTimeMillis()).setDisplayName("").setName(userId).setDeleted(1).build();
|
||||||
|
try {
|
||||||
|
databaseStore.updateUser(us);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
|
}
|
||||||
|
mUserMap.put(userId, us);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WFCMessage.User getUserInfo(String userId) {
|
public WFCMessage.User getUserInfo(String userId) {
|
||||||
if (StringUtil.isNullOrEmpty(userId)) {
|
if (StringUtil.isNullOrEmpty(userId)) {
|
||||||
@@ -1424,8 +1611,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return getUserInfo(userId);
|
return getUserInfo(userId);
|
||||||
}
|
}
|
||||||
@Override
|
@Override
|
||||||
public List<WFCMessage.User> searchUser(String keyword, boolean buzzy, int page) {
|
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
|
||||||
return databaseStore.searchUserFromDB(keyword, buzzy, page);
|
return databaseStore.searchUserFromDB(keyword, searchType, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1550,27 +1737,49 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isBlacked(String fromUser, String userId) {
|
public ErrorCode isAllowUserMessage(String targetUser, String fromUser) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
Collection<FriendData> friendDatas = friendsMap.get(fromUser);
|
Collection<FriendData> friendDatas = friendsMap.get(targetUser);
|
||||||
|
|
||||||
if (friendDatas == null || friendDatas.size() == 0) {
|
if (friendDatas == null || friendDatas.size() == 0) {
|
||||||
friendDatas = loadFriend(friendsMap, fromUser);
|
friendDatas = loadFriend(friendsMap, targetUser);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (FriendData friendData : friendDatas) {
|
for (FriendData friendData : friendDatas) {
|
||||||
if (friendData.getFriendUid().equals(userId)) {
|
if (friendData.getFriendUid().equals(fromUser)) {
|
||||||
if (friendData.getBlacked() == 1) {
|
if (friendData.getBlacked() == 1) {
|
||||||
return true;
|
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
if (friendData.getState() == 0) {
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
if (mDisableStrangerChat) {
|
||||||
|
//在禁止私聊时,允许机器人,物联网设备及管理员进行私聊。
|
||||||
|
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||||
|
WFCMessage.User target = mUserMap.get(targetUser);
|
||||||
|
if (target != null && target.getType() != ProtoConstants.UserType.UserType_Normal) {
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
target = mUserMap.get(fromUser);
|
||||||
|
if (target != null && target.getType() != ProtoConstants.UserType.UserType_Normal) {
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
//admin的usertype为3,所以不需要hardcode为admin添加例外
|
||||||
|
// if (targetUser.equals("admin") || fromUser.equals("admin")) {
|
||||||
|
// return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
// }
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1689,6 +1898,31 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearUserFriend(String userId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
|
Collection<FriendData> friendDatas = friendsMap.get(userId);
|
||||||
|
if (friendDatas == null || friendDatas.size() == 0) {
|
||||||
|
friendDatas = loadFriend(friendsMap, userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
databaseStore.removeUserFriend(userId);
|
||||||
|
databaseStore.removeUserFriendRequest(userId);
|
||||||
|
|
||||||
|
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
|
||||||
|
requestMap.remove(userId);
|
||||||
|
|
||||||
|
|
||||||
|
if (friendDatas != null) {
|
||||||
|
for (FriendData fd : friendDatas) {
|
||||||
|
friendsMap.remove(fd.getFriendUid());
|
||||||
|
}
|
||||||
|
friendsMap.remove(userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version) {
|
public List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version) {
|
||||||
List<WFCMessage.FriendRequest> out = new ArrayList<>();
|
List<WFCMessage.FriendRequest> out = new ArrayList<>();
|
||||||
@@ -1728,9 +1962,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||||
if (System.currentTimeMillis() - existRequest.getUpdateDt() > 7 * 24 * 60 * 60 * 1000) {
|
if (mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) {
|
||||||
if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected
|
if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected
|
||||||
&& System.currentTimeMillis() - existRequest.getUpdateDt() < 30 * 24 * 60 * 60 * 1000) {
|
&& System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) {
|
||||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
|
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1806,9 +2040,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (friendData1 == null) {
|
if (friendData1 == null) {
|
||||||
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getStatus(), 0, System.currentTimeMillis());
|
friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), request.getStatus(), 0, System.currentTimeMillis());
|
||||||
} else {
|
} else {
|
||||||
friendData1.setState(request.getStatus());
|
friendData1.setState(request.getStatus());
|
||||||
|
friendData1.setExtra(request.getExtra());
|
||||||
friendData1.setTimestamp(System.currentTimeMillis());
|
friendData1.setTimestamp(System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1828,7 +2063,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (friendData2 == null) {
|
if (friendData2 == null) {
|
||||||
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getStatus(), 0, friendData1.getTimestamp());
|
friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getExtra(), request.getStatus(), 0, friendData1.getTimestamp());
|
||||||
} else {
|
} else {
|
||||||
friendsMap.remove(request.getTargetUid(), friendData2);
|
friendsMap.remove(request.getTargetUid(), friendData2);
|
||||||
friendData2.setState(request.getStatus());
|
friendData2.setState(request.getStatus());
|
||||||
@@ -1862,29 +2097,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (existRequest != null) {
|
if (existRequest != null) {
|
||||||
if (System.currentTimeMillis() - existRequest.getUpdateDt() > 7 * 24 * 60 * 60 * 1000) {
|
if (mFriendRequestExpiration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestExpiration) {
|
||||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_OVERTIME;
|
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_EXPIRED;
|
||||||
} else {
|
} else {
|
||||||
existRequest = existRequest.toBuilder().setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).setUpdateDt(System.currentTimeMillis()).build();
|
existRequest = existRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(System.currentTimeMillis()).build();
|
||||||
databaseStore.persistOrUpdateFriendRequest(existRequest);
|
databaseStore.persistOrUpdateFriendRequest(existRequest);
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
if(request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted){
|
||||||
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), 0, 0, System.currentTimeMillis());
|
||||||
|
databaseStore.persistOrUpdateFriendData(friendData1);
|
||||||
|
|
||||||
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", 0, 0, System.currentTimeMillis());
|
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getExtra(), 0, 0, friendData1.getTimestamp());
|
||||||
databaseStore.persistOrUpdateFriendData(friendData1);
|
databaseStore.persistOrUpdateFriendData(friendData2);
|
||||||
|
|
||||||
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", 0, 0, friendData1.getTimestamp());
|
requestMap.remove(userId);
|
||||||
databaseStore.persistOrUpdateFriendData(friendData2);
|
requestMap.remove(request.getTargetUid());
|
||||||
|
friendsMap.remove(userId);
|
||||||
|
friendsMap.remove(request.getTargetUid());
|
||||||
|
|
||||||
requestMap.remove(userId);
|
heads[0] = friendData2.getTimestamp();
|
||||||
requestMap.remove(request.getTargetUid());
|
heads[1] = friendData1.getTimestamp();
|
||||||
friendsMap.remove(userId);
|
|
||||||
friendsMap.remove(request.getTargetUid());
|
|
||||||
|
|
||||||
heads[0] = friendData2.getTimestamp();
|
msgBuilder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(userId).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||||
heads[1] = friendData1.getTimestamp();
|
msgBuilder.setContent(WFCMessage.MessageContent.newBuilder().setType(1).setSearchableContent(existRequest.getReason()).build());
|
||||||
|
}
|
||||||
msgBuilder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(userId).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
|
||||||
msgBuilder.setContent(WFCMessage.MessageContent.newBuilder().setType(1).setSearchableContent(existRequest.getReason()).build());
|
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1899,7 +2135,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
} else {
|
} else {
|
||||||
state = 0;
|
state = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
@@ -1917,7 +2153,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (friendData == null) {
|
if (friendData == null) {
|
||||||
friendData = new FriendData(fromUser, targetUserId, "", 1, state, System.currentTimeMillis());
|
friendData = new FriendData(fromUser, targetUserId, "", "", 1, state, System.currentTimeMillis());
|
||||||
}
|
}
|
||||||
friendData.setBlacked(state);
|
friendData.setBlacked(state);
|
||||||
friendData.setTimestamp(System.currentTimeMillis());
|
friendData.setTimestamp(System.currentTimeMillis());
|
||||||
@@ -1931,6 +2167,25 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FriendData getFriendData(String fromUser, String targetUserId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
|
Collection<FriendData> friends = friendsMap.get(fromUser);
|
||||||
|
if (friends == null || friends.size() == 0) {
|
||||||
|
friends = loadFriend(friendsMap, fromUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (FriendData fd:friends) {
|
||||||
|
if (fd.getFriendUid().equals(targetUserId)) {
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] heads){
|
public ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] heads){
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -1995,6 +2250,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean checkChatroomParticipantIdelTime(MemorySessionStore.Session session) {
|
||||||
|
if (session == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(mChatroomParticipantIdleTime > 0 && System.currentTimeMillis() - session.getLastChatroomActiveTime() > mChatroomParticipantIdleTime) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode deleteFriend(String userId, String friendUid, long[] head) {
|
public ErrorCode deleteFriend(String userId, String friendUid, long[] head) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -2086,6 +2353,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2189,6 +2457,14 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return updateDt;
|
return updateDt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearUserSettings(String userId) {
|
||||||
|
databaseStore.clearUserSetting(userId);
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
MultiMap<String, WFCMessage.UserSettingEntry> userSettingMap = hzInstance.getMultiMap(USER_SETTING);
|
||||||
|
userSettingMap.remove(userId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getUserGlobalSlient(String userId) {
|
public boolean getUserGlobalSlient(String userId) {
|
||||||
Boolean slient = userGlobalSlientMap.get(userId);
|
Boolean slient = userGlobalSlientMap.get(userId);
|
||||||
@@ -2246,6 +2522,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearUserChannels(String userId) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value) {
|
public ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -2280,8 +2562,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
else if(modifyType == Modify_Channel_OnlyCallback) {
|
else if(modifyType == Modify_Channel_OnlyCallback) {
|
||||||
try {
|
try {
|
||||||
newInfoBuilder.setAutomatic(Integer.parseInt(value));
|
newInfoBuilder.setAutomatic(Integer.parseInt(value));
|
||||||
} catch (NumberFormatException e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2335,7 +2618,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
WFCMessage.ChannelInfo.Builder newInfoBuilder = oldInfo.toBuilder();
|
WFCMessage.ChannelInfo.Builder newInfoBuilder = oldInfo.toBuilder();
|
||||||
|
|
||||||
newInfoBuilder.setStatus(Channel_Status_Destoryed);
|
newInfoBuilder.setStatus(oldInfo.getStatus() | Channel_State_Mask_Deleted);
|
||||||
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
|
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
|
||||||
mIMap.put(channelId, newInfoBuilder.build());
|
mIMap.put(channelId, newInfoBuilder.build());
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
@@ -2351,6 +2634,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
||||||
|
|
||||||
|
getChannelListener(channelId);
|
||||||
|
|
||||||
if (listen) {
|
if (listen) {
|
||||||
listeners.put(channelId, operator);
|
listeners.put(channelId, operator);
|
||||||
} else {
|
} else {
|
||||||
@@ -2361,6 +2646,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Collection<String> getChannelListener(String channelId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
||||||
|
Collection<String> result = listeners.get(channelId);
|
||||||
|
if (result.isEmpty()) {
|
||||||
|
result = databaseStore.getChannelListener(channelId);
|
||||||
|
for (String userId : result) {
|
||||||
|
listeners.put(channelId, userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WFCMessage.ChannelInfo getChannelInfo(String channelId) {
|
public WFCMessage.ChannelInfo getChannelInfo(String channelId) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -2370,12 +2668,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean checkUserInChannel(String user, String channelId) {
|
public boolean checkUserInChannel(String user, String channelId) {
|
||||||
MultiMap<String, String> chatroomMembers = m_Server.getHazelcastInstance().getMultiMap(CHANNEL_LISTENERS);
|
Collection<String> chatroomMembers = getChannelListener(channelId);
|
||||||
if (chatroomMembers == null) {
|
if (chatroomMembers == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!chatroomMembers.containsEntry(channelId, user)) {
|
if(!chatroomMembers.contains(user)) {
|
||||||
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
|
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
|
||||||
WFCMessage.ChannelInfo info = mIMap.get(channelId);
|
WFCMessage.ChannelInfo info = mIMap.get(channelId);
|
||||||
if (info == null || !info.getOwner().equals(user)) {
|
if (info == null || !info.getOwner().equals(user)) {
|
||||||
@@ -2385,6 +2683,16 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<String> getChannelSubscriber(String channelId) {
|
||||||
|
MultiMap<String, String> channelMembers = m_Server.getHazelcastInstance().getMultiMap(CHANNEL_LISTENERS);
|
||||||
|
if (channelMembers == null) {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
return channelMembers.get(channelId);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> handleSensitiveWord(String message) {
|
public Set<String> handleSensitiveWord(String message) {
|
||||||
updateSensitiveWord();
|
updateSensitiveWord();
|
||||||
@@ -2531,7 +2839,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
return UUIDGenerator.getUUID();
|
return UUIDGenerator.getUUID();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void storeRetained(Topic topic, StoredMessage storedMessage) {
|
public void storeRetained(Topic topic, StoredMessage storedMessage) {
|
||||||
LOG.debug("Store retained message for topic={}, CId={}", topic, storedMessage.getClientID());
|
LOG.debug("Store retained message for topic={}, CId={}", topic, storedMessage.getClientID());
|
||||||
|
|||||||
@@ -24,12 +24,12 @@ import io.moquette.BrokerConstants;
|
|||||||
import io.moquette.server.Constants;
|
import io.moquette.server.Constants;
|
||||||
import io.moquette.server.Server;
|
import io.moquette.server.Server;
|
||||||
import io.moquette.spi.ClientSession;
|
import io.moquette.spi.ClientSession;
|
||||||
import io.moquette.spi.IMessagesStore.StoredMessage;
|
|
||||||
import io.moquette.spi.ISessionsStore;
|
import io.moquette.spi.ISessionsStore;
|
||||||
|
import io.moquette.spi.IMessagesStore.StoredMessage;
|
||||||
import io.netty.handler.codec.mqtt.MqttVersion;
|
import io.netty.handler.codec.mqtt.MqttVersion;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.*;
|
import java.util.concurrent.*;
|
||||||
@@ -55,6 +55,16 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
|
|
||||||
private volatile int unReceivedMsgs;
|
private volatile int unReceivedMsgs;
|
||||||
|
|
||||||
|
private int deleted;
|
||||||
|
|
||||||
|
public int getDeleted() {
|
||||||
|
return deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDeleted(int deleted) {
|
||||||
|
this.deleted = deleted;
|
||||||
|
}
|
||||||
|
|
||||||
private MqttVersion mqttVersion = MqttVersion.MQTT_3_1_1;
|
private MqttVersion mqttVersion = MqttVersion.MQTT_3_1_1;
|
||||||
|
|
||||||
public long getLastActiveTime() {
|
public long getLastActiveTime() {
|
||||||
@@ -135,6 +145,9 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
|
|
||||||
public void setUpdateDt(long updateDt) {
|
public void setUpdateDt(long updateDt) {
|
||||||
this.updateDt = updateDt;
|
this.updateDt = updateDt;
|
||||||
|
if (this.lastActiveTime == 0) {
|
||||||
|
this.lastActiveTime = updateDt;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int pushType;
|
private int pushType;
|
||||||
@@ -260,11 +273,15 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
supportMultiEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_ENDPOINT));
|
supportMultiEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_ENDPOINT));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Session getSession(String clientID) {
|
public Session getSession(String clientID) {
|
||||||
|
if (StringUtil.isNullOrEmpty(clientID)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
Session session = sessions.get(clientID);
|
Session session = sessions.get(clientID);
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
LOG.error("Can't find the session for client <{}>", clientID);
|
LOG.error("Can't find the session for client <{}>", clientID);
|
||||||
@@ -273,7 +290,7 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void cleanDuplatedToken(String cid, int pushType, String token, boolean isVoip) {
|
public void cleanDuplatedToken(String cid, int pushType, String token, boolean isVoip, String packageName) {
|
||||||
if (StringUtil.isNullOrEmpty(token) || isVoip) {
|
if (StringUtil.isNullOrEmpty(token) || isVoip) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -281,8 +298,8 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
Iterator<Map.Entry<String, Session>> it = sessions.entrySet().iterator();
|
Iterator<Map.Entry<String, Session>> it = sessions.entrySet().iterator();
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Session session = it.next().getValue();
|
Session session = it.next().getValue();
|
||||||
if (!session.getClientID().equals(cid) && (session.pushType == pushType && token.equals(session.deviceToken))) {
|
if (!session.getClientID().equals(cid) && (session.pushType == pushType && token.equals(session.deviceToken)) && (!StringUtil.isNullOrEmpty(packageName) && packageName.equals(session.getAppName()))) {
|
||||||
session.deviceToken = token;
|
session.deviceToken = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,15 +319,43 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Session createUserSession(String username, String clientID, int platform) {
|
public void clearUserSession(String username) {
|
||||||
|
LOG.info("Fooooooooo <{}>", username);
|
||||||
|
|
||||||
|
databaseStore.clearUserSessions(username);
|
||||||
|
|
||||||
|
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||||
|
for (String clientID : sessionSet) {
|
||||||
|
Session s = sessions.remove(clientID);
|
||||||
|
mServer.getProcessor().kickoffSession(s);
|
||||||
|
}
|
||||||
|
userSessions.remove(username);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Session updateOrCreateUserSession(String username, String clientID, int platform) {
|
||||||
LOG.debug("createUserSession for client <{}>, user <{}>", clientID, username);
|
LOG.debug("createUserSession for client <{}>, user <{}>", clientID, username);
|
||||||
|
|
||||||
|
Session session = sessions.get(clientID);
|
||||||
|
|
||||||
|
if (session != null && !session.username.equals(username)) {
|
||||||
|
if (userSessions.get(username) != null) {
|
||||||
|
userSessions.get(username).remove(clientID);
|
||||||
|
}
|
||||||
|
}
|
||||||
ClientSession clientSession = new ClientSession(clientID, this);
|
ClientSession clientSession = new ClientSession(clientID, this);
|
||||||
Session session = databaseStore.getSession(username, clientID, clientSession);
|
session = databaseStore.getSession(username, clientID, clientSession);
|
||||||
|
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
||||||
}
|
}
|
||||||
|
sessions.put(clientID, session);
|
||||||
|
|
||||||
|
|
||||||
|
if (session.getDeleted() > 0) {
|
||||||
|
session.setDeleted(0);
|
||||||
|
databaseStore.updateSessionDeleted(username, clientID, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (session.getPlatform() != platform) {
|
if (session.getPlatform() != platform) {
|
||||||
session.setPlatform(platform);
|
session.setPlatform(platform);
|
||||||
@@ -326,14 +371,18 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
String c = it.next();
|
String c = it.next();
|
||||||
if (!clientID.equals(c)) {
|
if (!clientID.equals(c)) {
|
||||||
Session s = sessions.get(c);
|
Session s = sessions.get(c);
|
||||||
|
if (s == null) {
|
||||||
|
it.remove();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
boolean remove = false;
|
boolean remove = false;
|
||||||
if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS) {
|
if (platform == ProtoConstants.Platform.Platform_Android || platform == ProtoConstants.Platform.Platform_iOS) {
|
||||||
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
|
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows) {
|
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||||
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows) {
|
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -358,34 +407,29 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode createNewSession(String username, String clientID, boolean cleanSession, boolean createWhenNoExist, int platform) {
|
public ErrorCode loadActiveSession(String username, String clientID) {
|
||||||
LOG.debug("createNewSession for client <{}>", clientID);
|
LOG.debug("createNewSession for client <{}>", clientID);
|
||||||
|
|
||||||
Session session = sessions.get(clientID);
|
Session session = sessions.get(clientID);
|
||||||
if (session != null) {
|
|
||||||
|
if (session != null && session.getDeleted() == 0) {
|
||||||
LOG.error("already exists a session for client <{}>, bad condition", clientID);
|
LOG.error("already exists a session for client <{}>, bad condition", clientID);
|
||||||
throw new IllegalArgumentException("Can't create a session with the ID of an already existing" + clientID);
|
throw new IllegalArgumentException("Can't create a session with the ID of an already existing" + clientID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (session != null && session.getDeleted() > 0) {
|
||||||
|
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
||||||
|
}
|
||||||
|
|
||||||
ClientSession clientSession = new ClientSession(clientID, this);
|
ClientSession clientSession = new ClientSession(clientID, this);
|
||||||
session = databaseStore.getSession(username, clientID, clientSession);
|
session = databaseStore.getSession(username, clientID, clientSession);
|
||||||
|
|
||||||
if (session == null) {
|
if (session == null || session.getDeleted() > 0) {
|
||||||
if (!createWhenNoExist) {
|
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
||||||
return ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH;
|
|
||||||
}
|
|
||||||
|
|
||||||
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sessions.put(clientID, session);
|
sessions.put(clientID, session);
|
||||||
ConcurrentSkipListSet<String> sessionSet = userSessions.get(username);
|
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||||
if (sessionSet == null) {
|
|
||||||
sessionSet = new ConcurrentSkipListSet<>();
|
|
||||||
userSessions.put(username, sessionSet);
|
|
||||||
}
|
|
||||||
sessionSet = userSessions.get(username);
|
|
||||||
sessionSet.add(clientID);
|
sessionSet.add(clientID);
|
||||||
|
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
@@ -409,12 +453,7 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
session.setUsername(username);
|
session.setUsername(username);
|
||||||
sessions.put(clientID, session);
|
sessions.put(clientID, session);
|
||||||
|
|
||||||
ConcurrentSkipListSet<String> sessionSet = userSessions.get(username);
|
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||||
if (sessionSet == null) {
|
|
||||||
sessionSet = new ConcurrentSkipListSet<>();
|
|
||||||
userSessions.put(username, sessionSet);
|
|
||||||
}
|
|
||||||
sessionSet = userSessions.get(username);
|
|
||||||
sessionSet.add(clientID);
|
sessionSet.add(clientID);
|
||||||
|
|
||||||
if (endpoint != null) {
|
if (endpoint != null) {
|
||||||
@@ -460,14 +499,26 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ConcurrentSkipListSet<String> getUserSessionSet(String username) {
|
||||||
|
ConcurrentSkipListSet<String> sessionSet = userSessions.get(username);
|
||||||
|
if (sessionSet == null) {
|
||||||
|
sessionSet = new ConcurrentSkipListSet<String>();
|
||||||
|
List<Session> ss = databaseStore.getUserActivedSessions(username);
|
||||||
|
for (Session s : ss) {
|
||||||
|
sessionSet.add(s.getClientID());
|
||||||
|
sessions.put(s.getClientID(), s);
|
||||||
|
}
|
||||||
|
userSessions.put(username, sessionSet);
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionSet = userSessions.get(username);
|
||||||
|
return sessionSet;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Session> sessionForUser(String username) {
|
public Collection<Session> sessionForUser(String username) {
|
||||||
ConcurrentSkipListSet<String> sessionSet = userSessions.get(username);
|
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(username);
|
||||||
if (sessionSet == null) {
|
|
||||||
sessionSet = new ConcurrentSkipListSet<String>();
|
|
||||||
userSessions.put(username, sessionSet);
|
|
||||||
}
|
|
||||||
sessionSet = userSessions.get(username);
|
|
||||||
ArrayList<Session> out = new ArrayList<>();
|
ArrayList<Session> out = new ArrayList<>();
|
||||||
for (String clientId : sessionSet
|
for (String clientId : sessionSet
|
||||||
) {
|
) {
|
||||||
@@ -611,12 +662,7 @@ public class MemorySessionStore implements ISessionsStore {
|
|||||||
LOG.error("Can't find the session for client <{}>", clientID);
|
LOG.error("Can't find the session for client <{}>", clientID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ConcurrentSkipListSet<String> sessionSet = userSessions.get(session.username);
|
ConcurrentSkipListSet<String> sessionSet = getUserSessionSet(session.username);
|
||||||
if (sessionSet == null) {
|
|
||||||
sessionSet = new ConcurrentSkipListSet<>();
|
|
||||||
userSessions.put(session.username, sessionSet);
|
|
||||||
}
|
|
||||||
sessionSet = userSessions.get(session.username);
|
|
||||||
sessionSet.remove(clientID);
|
sessionSet.remove(clientID);
|
||||||
|
|
||||||
// remove also the messages stored of type QoS1/2
|
// remove also the messages stored of type QoS1/2
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.Map;
|
|||||||
public class UserLoader implements MapStore<String, WFCMessage.User> {
|
public class UserLoader implements MapStore<String, WFCMessage.User> {
|
||||||
@Override
|
@Override
|
||||||
public void store(String s, WFCMessage.User user) {
|
public void store(String s, WFCMessage.User user) {
|
||||||
getDatabaseStore().updateUser(user);
|
// getDatabaseStore().updateUser(user);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ public final class Constants {
|
|||||||
public static final String ATTR_CLIENTID = "ClientID";
|
public static final String ATTR_CLIENTID = "ClientID";
|
||||||
public static final String CLEAN_SESSION = "cleanSession";
|
public static final String CLEAN_SESSION = "cleanSession";
|
||||||
public static final String KEEP_ALIVE = "keepAlive";
|
public static final String KEEP_ALIVE = "keepAlive";
|
||||||
public static final int MAX_MESSAGE_QUEUE = 1024; // number of messages
|
|
||||||
public static final int MAX_CHATROOM_MESSAGE_QUEUE = 256; // number of chatroom messages
|
|
||||||
|
public static int MAX_MESSAGE_QUEUE = 1024; // number of messages
|
||||||
|
public static int MAX_CHATROOM_MESSAGE_QUEUE = 256; // number of chatroom messages
|
||||||
|
|
||||||
private Constants() {
|
private Constants() {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,11 +35,13 @@ import io.moquette.spi.IStore;
|
|||||||
import io.moquette.spi.impl.ProtocolProcessor;
|
import io.moquette.spi.impl.ProtocolProcessor;
|
||||||
import io.moquette.spi.impl.ProtocolProcessorBootstrapper;
|
import io.moquette.spi.impl.ProtocolProcessorBootstrapper;
|
||||||
import io.moquette.spi.impl.security.AES;
|
import io.moquette.spi.impl.security.AES;
|
||||||
|
import io.moquette.spi.impl.subscriptions.Token;
|
||||||
import io.moquette.spi.security.IAuthenticator;
|
import io.moquette.spi.security.IAuthenticator;
|
||||||
import io.moquette.spi.security.IAuthorizator;
|
import io.moquette.spi.security.IAuthorizator;
|
||||||
import io.moquette.spi.security.ISslContextCreator;
|
import io.moquette.spi.security.ISslContextCreator;
|
||||||
import io.moquette.spi.security.Tokenor;
|
import io.moquette.spi.security.Tokenor;
|
||||||
import io.netty.util.ResourceLeakDetector;
|
import io.netty.util.ResourceLeakDetector;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
import win.liyufan.im.DBUtil;
|
import win.liyufan.im.DBUtil;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@@ -387,6 +389,14 @@ public class Server {
|
|||||||
hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId);
|
hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId);
|
||||||
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp);
|
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp);
|
||||||
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
||||||
|
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
|
||||||
|
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
|
||||||
|
try {
|
||||||
|
Tokenor.setExpiredTime(Long.parseLong(expirTimeStr));
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
RPCCenter.getInstance().init(this);
|
RPCCenter.getInstance().init(this);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ public class NettyMQTTHandler extends ChannelInboundHandlerAdapter {
|
|||||||
String clientID = NettyUtils.clientID(ctx.channel());
|
String clientID = NettyUtils.clientID(ctx.channel());
|
||||||
if (clientID != null && !clientID.isEmpty()) {
|
if (clientID != null && !clientID.isEmpty()) {
|
||||||
LOG.info("Notifying connection lost event. MqttClientId = {}.", clientID);
|
LOG.info("Notifying connection lost event. MqttClientId = {}.", clientID);
|
||||||
m_processor.processConnectionLost(clientID, ctx.channel());
|
m_processor.processConnectionLost(clientID, ctx.channel(), false);
|
||||||
}
|
}
|
||||||
ctx.close();
|
ctx.close();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import cn.wildfirechat.proto.WFCMessage;
|
|||||||
import com.xiaoleilu.loServer.model.FriendData;
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
||||||
import io.moquette.persistence.DatabaseStore;
|
import io.moquette.persistence.DatabaseStore;
|
||||||
|
import io.moquette.persistence.MemorySessionStore;
|
||||||
import io.moquette.persistence.UserClientEntry;
|
import io.moquette.persistence.UserClientEntry;
|
||||||
import io.moquette.spi.impl.subscriptions.Topic;
|
import io.moquette.spi.impl.subscriptions.Topic;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
@@ -98,7 +99,7 @@ public interface IMessagesStore {
|
|||||||
DatabaseStore getDatabaseStore();
|
DatabaseStore getDatabaseStore();
|
||||||
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
|
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
|
||||||
void storeSensitiveMessage(WFCMessage.Message message);
|
void storeSensitiveMessage(WFCMessage.Message message);
|
||||||
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
|
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers, boolean ignoreMsg);
|
||||||
Set<String> getAllEnds();
|
Set<String> getAllEnds();
|
||||||
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
||||||
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
|
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
|
||||||
@@ -107,11 +108,13 @@ public interface IMessagesStore {
|
|||||||
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList);
|
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList);
|
||||||
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
|
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
|
||||||
ErrorCode quitGroup(String operator, String groupId);
|
ErrorCode quitGroup(String operator, String groupId);
|
||||||
|
void clearUserGroups(String userId);
|
||||||
ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin);
|
ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin);
|
||||||
ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin);
|
ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin);
|
||||||
ErrorCode modifyGroupAlias(String operator, String groupId, String alias);
|
ErrorCode modifyGroupAlias(String operator, String groupId, String alias);
|
||||||
List<WFCMessage.GroupInfo> getGroupInfos(List<WFCMessage.UserRequest> requests);
|
List<WFCMessage.GroupInfo> getGroupInfos(List<WFCMessage.UserRequest> requests);
|
||||||
WFCMessage.GroupInfo getGroupInfo(String groupId);
|
WFCMessage.GroupInfo getGroupInfo(String groupId);
|
||||||
|
Set<String> getUserGroupIds(String userId);
|
||||||
ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members);
|
ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members);
|
||||||
WFCMessage.GroupMember getGroupMember(String groupId, String memberId);
|
WFCMessage.GroupMember getGroupMember(String groupId, String memberId);
|
||||||
ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin);
|
ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin);
|
||||||
@@ -121,20 +124,23 @@ public interface IMessagesStore {
|
|||||||
|
|
||||||
ErrorCode recallMessage(long messageUid, String operatorId, boolean isAdmin);
|
ErrorCode recallMessage(long messageUid, String operatorId, boolean isAdmin);
|
||||||
|
|
||||||
|
void clearUserMessages(String userId);
|
||||||
|
|
||||||
WFCMessage.Robot getRobot(String robotId);
|
WFCMessage.Robot getRobot(String robotId);
|
||||||
void addRobot(WFCMessage.Robot robot);
|
void addRobot(WFCMessage.Robot robot);
|
||||||
ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
ErrorCode getUserInfo(List<WFCMessage.UserRequest> requestList, WFCMessage.PullUserResult.Builder builder);
|
||||||
ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request);
|
ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception;
|
||||||
|
|
||||||
ErrorCode modifyUserStatus(String userId, int status);
|
ErrorCode modifyUserStatus(String userId, int status);
|
||||||
int getUserStatus(String userId);
|
int getUserStatus(String userId);
|
||||||
List<InputOutputUserBlockStatus> getUserStatusList();
|
List<InputOutputUserBlockStatus> getUserStatusList();
|
||||||
|
|
||||||
void addUserInfo(WFCMessage.User user, String password);
|
void addUserInfo(WFCMessage.User user, String password) throws Exception;
|
||||||
|
void destoryUser(String userId);
|
||||||
WFCMessage.User getUserInfo(String userId);
|
WFCMessage.User getUserInfo(String userId);
|
||||||
WFCMessage.User getUserInfoByName(String name);
|
WFCMessage.User getUserInfoByName(String name);
|
||||||
WFCMessage.User getUserInfoByMobile(String mobile);
|
WFCMessage.User getUserInfoByMobile(String mobile);
|
||||||
List<WFCMessage.User> searchUser(String keyword, boolean buzzy, int page);
|
List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
|
||||||
|
|
||||||
boolean updateSystemSetting(int id, String value, String desc);
|
boolean updateSystemSetting(int id, String value, String desc);
|
||||||
SystemSettingPojo getSystemSetting(int id);
|
SystemSettingPojo getSystemSetting(int id);
|
||||||
@@ -154,29 +160,35 @@ public interface IMessagesStore {
|
|||||||
ErrorCode login(String name, String password, List<String> userIdRet);
|
ErrorCode login(String name, String password, List<String> userIdRet);
|
||||||
|
|
||||||
List<FriendData> getFriendList(String userId, String clientId, long version);
|
List<FriendData> getFriendList(String userId, String clientId, long version);
|
||||||
|
void clearUserFriend(String userId);
|
||||||
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
|
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
|
||||||
|
|
||||||
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head);
|
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head);
|
||||||
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
|
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
|
||||||
ErrorCode deleteFriend(String userId, String friendUid, long[] head);
|
ErrorCode deleteFriend(String userId, String friendUid, long[] head);
|
||||||
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
|
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
|
||||||
|
FriendData getFriendData(String fromUser, String targetUserId);
|
||||||
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
|
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
|
||||||
boolean isBlacked(String fromUser, String userId);
|
ErrorCode isAllowUserMessage(String fromUser, String userId);
|
||||||
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
||||||
|
|
||||||
ErrorCode handleJoinChatroom(String userId, String clientId, String chatroomId);
|
ErrorCode handleJoinChatroom(String userId, String clientId, String chatroomId);
|
||||||
ErrorCode handleQuitChatroom(String userId, String clientId, String chatroomId);
|
ErrorCode handleQuitChatroom(String userId, String clientId, String chatroomId);
|
||||||
|
|
||||||
|
boolean checkChatroomParticipantIdelTime(MemorySessionStore.Session session);
|
||||||
|
|
||||||
ErrorCode getUserSettings(String userId, long version, WFCMessage.GetUserSettingResult.Builder builder);
|
ErrorCode getUserSettings(String userId, long version, WFCMessage.GetUserSettingResult.Builder builder);
|
||||||
WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key);
|
WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key);
|
||||||
List<WFCMessage.UserSettingEntry> getUserSetting(String userId, int scope);
|
List<WFCMessage.UserSettingEntry> getUserSetting(String userId, int scope);
|
||||||
long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request);
|
long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request);
|
||||||
|
void clearUserSettings(String userId);
|
||||||
|
|
||||||
boolean getUserGlobalSlient(String userId);
|
boolean getUserGlobalSlient(String userId);
|
||||||
boolean getUserPushHiddenDetail(String userId);
|
boolean getUserPushHiddenDetail(String userId);
|
||||||
boolean getUserConversationSlient(String userId, WFCMessage.Conversation conversation);
|
boolean getUserConversationSlient(String userId, WFCMessage.Conversation conversation);
|
||||||
|
|
||||||
ErrorCode createChannel(String operator, WFCMessage.ChannelInfo channelInfo);
|
ErrorCode createChannel(String operator, WFCMessage.ChannelInfo channelInfo);
|
||||||
|
void clearUserChannels(String userId);
|
||||||
ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value);
|
ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value);
|
||||||
ErrorCode transferChannel(String operator, String channelId, String newOwner);
|
ErrorCode transferChannel(String operator, String channelId, String newOwner);
|
||||||
ErrorCode distoryChannel(String operator, String channelId);
|
ErrorCode distoryChannel(String operator, String channelId);
|
||||||
@@ -184,6 +196,7 @@ public interface IMessagesStore {
|
|||||||
ErrorCode listenChannel(String operator, String channelId, boolean listen);
|
ErrorCode listenChannel(String operator, String channelId, boolean listen);
|
||||||
WFCMessage.ChannelInfo getChannelInfo(String channelId);
|
WFCMessage.ChannelInfo getChannelInfo(String channelId);
|
||||||
boolean checkUserInChannel(String user, String channelId);
|
boolean checkUserInChannel(String user, String channelId);
|
||||||
|
Collection<String> getChannelSubscriber(String channelId);
|
||||||
|
|
||||||
Set<String> handleSensitiveWord(String message);
|
Set<String> handleSensitiveWord(String message);
|
||||||
boolean addSensitiveWords(List<String> words);
|
boolean addSensitiveWords(List<String> words);
|
||||||
|
|||||||
@@ -38,17 +38,19 @@ public interface ISessionsStore {
|
|||||||
*/
|
*/
|
||||||
boolean contains(String clientID);
|
boolean contains(String clientID);
|
||||||
|
|
||||||
Session createUserSession(String username, String clientID, int platform);
|
Session updateOrCreateUserSession(String username, String clientID, int platform);
|
||||||
|
|
||||||
ErrorCode createNewSession(String username, String clientID, boolean cleanSession, boolean createNoExist, int platform);
|
ErrorCode loadActiveSession(String username, String clientID);
|
||||||
|
|
||||||
ClientSession updateExistSession(String username, String clientID, WFCMessage.RouteRequest endpoint, boolean cleanSession);
|
ClientSession updateExistSession(String username, String clientID, WFCMessage.RouteRequest endpoint, boolean cleanSession);
|
||||||
|
|
||||||
Session getSession(String clientID);
|
Session getSession(String clientID);
|
||||||
|
|
||||||
void cleanDuplatedToken(String cid, int pushType, String token, boolean isVoip);
|
void cleanDuplatedToken(String cid, int pushType, String token, boolean isVoip, String packageName);
|
||||||
|
|
||||||
void updateSessionToken(Session session, boolean voip);
|
void updateSessionToken(Session session, boolean voip);
|
||||||
|
|
||||||
|
void clearUserSession(String username);
|
||||||
/**
|
/**
|
||||||
* @param clientID
|
* @param clientID
|
||||||
* the client owning the session.
|
* the client owning the session.
|
||||||
|
|||||||
@@ -18,11 +18,14 @@ package io.moquette.spi.impl;
|
|||||||
|
|
||||||
import cn.wildfirechat.proto.ProtoConstants;
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import cn.wildfirechat.push.PushServer;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.hazelcast.core.HazelcastInstance;
|
import com.hazelcast.core.HazelcastInstance;
|
||||||
import com.hazelcast.util.StringUtil;
|
import com.hazelcast.util.StringUtil;
|
||||||
import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus;
|
import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus;
|
||||||
import cn.wildfirechat.pojos.SendMessageData;
|
import cn.wildfirechat.pojos.SendMessageData;
|
||||||
|
import com.xiaoleilu.hutool.system.UserInfo;
|
||||||
|
import com.xiaoleilu.loServer.model.FriendData;
|
||||||
import io.moquette.persistence.*;
|
import io.moquette.persistence.*;
|
||||||
import io.moquette.persistence.MemorySessionStore.Session;
|
import io.moquette.persistence.MemorySessionStore.Session;
|
||||||
import io.moquette.server.ConnectionDescriptorStore;
|
import io.moquette.server.ConnectionDescriptorStore;
|
||||||
@@ -87,6 +90,7 @@ public class MessagesPublisher {
|
|||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
chatroomScheduler.shutdown();
|
chatroomScheduler.shutdown();
|
||||||
}
|
}
|
||||||
@@ -216,7 +220,7 @@ public class MessagesPublisher {
|
|||||||
targetSession.refreshLastChatroomActiveTime();
|
targetSession.refreshLastChatroomActiveTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(System.currentTimeMillis() - targetSession.getLastChatroomActiveTime() > 5*60*1000) {
|
if (!m_messagesStore.checkChatroomParticipantIdelTime(targetSession)) {
|
||||||
m_messagesStore.handleQuitChatroom(user, targetSession.getClientID(), target);
|
m_messagesStore.handleQuitChatroom(user, targetSession.getClientID(), target);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -315,11 +319,19 @@ public class MessagesPublisher {
|
|||||||
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
||||||
|
|
||||||
if(!nameLoaded) {
|
if(!nameLoaded) {
|
||||||
senderName = getUserDisplayName(sender);
|
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
|
||||||
targetName = getTargetName(target, conversationType);
|
targetName = getTargetName(target, conversationType);
|
||||||
nameLoaded = true;
|
nameLoaded = true;
|
||||||
}
|
}
|
||||||
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, messageContentType, serverTime, senderName, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
|
||||||
|
String name = senderName;
|
||||||
|
if (!sender.equals(user)) {
|
||||||
|
FriendData fd = m_messagesStore.getFriendData(user, sender);
|
||||||
|
if (fd != null && !StringUtil.isNullOrEmpty(fd.getAlias())) {
|
||||||
|
name = fd.getAlias();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -334,6 +346,10 @@ public class MessagesPublisher {
|
|||||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
||||||
|
|
||||||
for (Session targetSession : sessions) {
|
for (Session targetSession : sessions) {
|
||||||
|
if(System.currentTimeMillis() - targetSession.getLastActiveTime() > 60 * 60 * 1000) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (targetSession.getClientID() == null) {
|
if (targetSession.getClientID() == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -355,33 +371,51 @@ public class MessagesPublisher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getUserDisplayName(String userId) {
|
String getUserDisplayName(String userId, String groupId) {
|
||||||
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
|
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
|
||||||
|
String userName = null;
|
||||||
if(user != null) {
|
if(user != null) {
|
||||||
return user.getDisplayName();
|
userName = user.getDisplayName();
|
||||||
}
|
}
|
||||||
return null;
|
if (!StringUtil.isNullOrEmpty(groupId)) {
|
||||||
|
WFCMessage.GroupMember member = m_messagesStore.getGroupMember(groupId, userId);
|
||||||
|
if (member != null && !StringUtil.isNullOrEmpty(member.getAlias())) {
|
||||||
|
userName = member.getAlias();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return userName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTargetName(String targetId, int cnvType) {
|
String getTargetName(String targetId, int cnvType) {
|
||||||
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
return getUserDisplayName(targetId);
|
return getUserDisplayName(targetId, null);
|
||||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||||
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
||||||
if(group != null) {
|
if(group != null) {
|
||||||
return group.getName();
|
return group.getName();
|
||||||
}
|
}
|
||||||
|
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||||
|
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
|
||||||
|
if (channelInfo != null) {
|
||||||
|
return channelInfo.getName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void publishNotification(String topic, String receiver, long head) {
|
public void publishNotification(String topic, String receiver, long head) {
|
||||||
publishNotificationLocal(topic, receiver, head);
|
publishNotification(topic, receiver, head, null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
void publishNotificationLocal(String topic, String receiver, long head) {
|
public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) {
|
||||||
|
publishNotificationLocal(topic, receiver, head, fromUser, pushContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void publishNotificationLocal(String topic, String receiver, long head, String fromUser, String pushContent) {
|
||||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(receiver);
|
Collection<Session> sessions = m_sessionsStore.sessionForUser(receiver);
|
||||||
|
String fromUserName = null;
|
||||||
for (Session targetSession : sessions) {
|
for (Session targetSession : sessions) {
|
||||||
|
boolean needPush = !StringUtil.isNullOrEmpty(pushContent);
|
||||||
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
|
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
|
||||||
if (targetIsActive) {
|
if (targetIsActive) {
|
||||||
ByteBuf payload = Unpooled.buffer();
|
ByteBuf payload = Unpooled.buffer();
|
||||||
@@ -392,9 +426,24 @@ public class MessagesPublisher {
|
|||||||
boolean result = this.messageSender.sendPublish(targetSession.getClientSession(), publishMsg);
|
boolean result = this.messageSender.sendPublish(targetSession.getClientSession(), publishMsg);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
LOG.warn("Publish friend request failure");
|
LOG.warn("Publish friend request failure");
|
||||||
|
} else {
|
||||||
|
needPush = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (needPush) {
|
||||||
|
if (fromUserName == null) {
|
||||||
|
WFCMessage.User userInfo = m_messagesStore.getUserInfo(fromUser);
|
||||||
|
if (userInfo == null) {
|
||||||
|
fromUserName = "";
|
||||||
|
} else {
|
||||||
|
fromUserName = userInfo.getDisplayName();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IMTopic.NotifyFriendRequestTopic.equals(topic)) {
|
||||||
|
messageSender.sendPush(fromUser, receiver, targetSession.getClientID(), pushContent, PushServer.PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST, System.currentTimeMillis(), fromUserName, targetSession.getUnReceivedMsgs() + 1, targetSession.getLanguage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,14 @@ class PersistentQueueMessageSender {
|
|||||||
void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||||
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
||||||
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
|
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
|
||||||
|
pushMessage.pushContent = pushContent;
|
||||||
|
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendPush(String sender, String target, String deviceId, String pushContent, int pushContentType, long serverTime, String senderName, int unReceivedMsg, String language) {
|
||||||
|
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
||||||
|
PushMessage pushMessage = new PushMessage(sender, target, serverTime, senderName, unReceivedMsg, language, pushContentType);
|
||||||
|
pushMessage.pushContent = pushContent;
|
||||||
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
|
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,15 @@
|
|||||||
|
|
||||||
package io.moquette.spi.impl;
|
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;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.hazelcast.core.Member;
|
||||||
|
import com.hazelcast.util.StringUtil;
|
||||||
|
import io.moquette.BrokerConstants;
|
||||||
import io.moquette.persistence.RPCCenter;
|
import io.moquette.persistence.RPCCenter;
|
||||||
import io.moquette.interception.InterceptHandler;
|
import io.moquette.interception.InterceptHandler;
|
||||||
import io.moquette.interception.messages.InterceptAcknowledgedMessage;
|
import io.moquette.interception.messages.InterceptAcknowledgedMessage;
|
||||||
@@ -38,9 +46,12 @@ import io.netty.handler.codec.mqtt.*;
|
|||||||
import io.netty.handler.timeout.IdleStateHandler;
|
import io.netty.handler.timeout.IdleStateHandler;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
import win.liyufan.im.HttpUtils;
|
||||||
import win.liyufan.im.Utility;
|
import win.liyufan.im.Utility;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
import static io.moquette.spi.impl.InternalRepublisher.createPublishForQos;
|
import static io.moquette.spi.impl.InternalRepublisher.createPublishForQos;
|
||||||
import static io.moquette.spi.impl.Utils.readBytesAndRewind;
|
import static io.moquette.spi.impl.Utils.readBytesAndRewind;
|
||||||
@@ -57,7 +68,7 @@ import static io.moquette.server.ConnectionDescriptor.ConnectionState.*;
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
public class ProtocolProcessor {
|
public class ProtocolProcessor {
|
||||||
|
private static ExecutorService executorCallback = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||||
|
|
||||||
public void kickoffSession(final MemorySessionStore.Session session) {
|
public void kickoffSession(final MemorySessionStore.Session session) {
|
||||||
mServer.getImBusinessScheduler().execute(()->{
|
mServer.getImBusinessScheduler().execute(()->{
|
||||||
@@ -98,8 +109,6 @@ public class ProtocolProcessor {
|
|||||||
|
|
||||||
protected ConnectionDescriptorStore connectionDescriptors;
|
protected ConnectionDescriptorStore connectionDescriptors;
|
||||||
|
|
||||||
private boolean allowAnonymous;
|
|
||||||
private boolean allowZeroByteClientId;
|
|
||||||
private IAuthorizator m_authorizator;
|
private IAuthorizator m_authorizator;
|
||||||
|
|
||||||
private IMessagesStore m_messagesStore;
|
private IMessagesStore m_messagesStore;
|
||||||
@@ -136,8 +145,6 @@ public class ProtocolProcessor {
|
|||||||
LOG.info("Initializing MQTT protocol processor...");
|
LOG.info("Initializing MQTT protocol processor...");
|
||||||
this.connectionDescriptors = connectionDescriptors;
|
this.connectionDescriptors = connectionDescriptors;
|
||||||
this.m_interceptor = interceptor;
|
this.m_interceptor = interceptor;
|
||||||
this.allowAnonymous = false;
|
|
||||||
this.allowZeroByteClientId = false;
|
|
||||||
m_authorizator = authorizator;
|
m_authorizator = authorizator;
|
||||||
m_authenticator = authenticator;
|
m_authenticator = authenticator;
|
||||||
m_messagesStore = storageService;
|
m_messagesStore = storageService;
|
||||||
@@ -152,8 +159,15 @@ public class ProtocolProcessor {
|
|||||||
this.connectionDescriptors, this.messagesPublisher, sessionsStore, server.getImBusinessScheduler(), server);
|
this.connectionDescriptors, this.messagesPublisher, sessionsStore, server.getImBusinessScheduler(), server);
|
||||||
|
|
||||||
mServer = server;
|
mServer = server;
|
||||||
|
|
||||||
|
String onlineStatusCallback = server.getConfig().getProperty(BrokerConstants.USER_ONLINE_STATUS_CALLBACK);
|
||||||
|
if (!com.hazelcast.util.StringUtil.isNullOrEmpty(onlineStatusCallback)) {
|
||||||
|
mUserOnlineStatusCallback = onlineStatusCallback;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String mUserOnlineStatusCallback;
|
||||||
|
|
||||||
public void processConnect(Channel channel, MqttConnectMessage msg) {
|
public void processConnect(Channel channel, MqttConnectMessage msg) {
|
||||||
MqttConnectPayload payload = msg.payload();
|
MqttConnectPayload payload = msg.payload();
|
||||||
String clientId = payload.clientIdentifier();
|
String clientId = payload.clientIdentifier();
|
||||||
@@ -181,7 +195,9 @@ public class ProtocolProcessor {
|
|||||||
|
|
||||||
MqttVersion mqttVersion = MqttVersion.fromProtocolLevel(msg.variableHeader().version());
|
MqttVersion mqttVersion = MqttVersion.fromProtocolLevel(msg.variableHeader().version());
|
||||||
if (!login(channel, msg, clientId, mqttVersion)) {
|
if (!login(channel, msg, clientId, mqttVersion)) {
|
||||||
|
channel.flush();
|
||||||
channel.close();
|
channel.close();
|
||||||
|
LOG.error("The MQTT login failure. Username={}", payload.userName());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!mServer.m_initialized) {
|
if (!mServer.m_initialized) {
|
||||||
@@ -227,11 +243,20 @@ public class ProtocolProcessor {
|
|||||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
||||||
if(session != null) {
|
if(session != null) {
|
||||||
session.refreshLastActiveTime();
|
session.refreshLastActiveTime();
|
||||||
|
forwardOnlineStatusEvent(payload.userName(), clientId, session.getPlatform(), UserOnlineStatus.ONLINE);
|
||||||
|
} else {
|
||||||
|
forwardOnlineStatusEvent(payload.userName(), clientId, ProtoConstants.Platform.Platform_UNSET, UserOnlineStatus.ONLINE);
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG.info("The CONNECT message has been processed. CId={}, username={}", clientId, payload.userName());
|
LOG.info("The CONNECT message has been processed. CId={}, username={}", clientId, payload.userName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void forwardOnlineStatusEvent(String userId, String clientId, int platform, int status) {
|
||||||
|
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
|
||||||
|
executorCallback.execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private MqttConnAckMessage connAck(MqttConnectReturnCode returnCode) {
|
private MqttConnAckMessage connAck(MqttConnectReturnCode returnCode) {
|
||||||
return connAck(returnCode, false);
|
return connAck(returnCode, false);
|
||||||
}
|
}
|
||||||
@@ -260,7 +285,7 @@ public class ProtocolProcessor {
|
|||||||
// handle user authentication
|
// handle user authentication
|
||||||
if (msg.variableHeader().hasUserName()) {
|
if (msg.variableHeader().hasUserName()) {
|
||||||
int status = m_messagesStore.getUserStatus(msg.payload().userName());
|
int status = m_messagesStore.getUserStatus(msg.payload().userName());
|
||||||
if (status == 2) {
|
if (status == ProtoConstants.UserStatus.Forbidden) {
|
||||||
failedBlocked(channel);
|
failedBlocked(channel);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -270,9 +295,19 @@ public class ProtocolProcessor {
|
|||||||
|
|
||||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
m_sessionsStore.createNewSession(msg.payload().userName(), clientId, true, false, 0);
|
ErrorCode errorCode = m_sessionsStore.loadActiveSession(msg.payload().userName(), clientId);
|
||||||
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
failedNoSession(channel);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
session = m_sessionsStore.getSession(clientId);
|
session = m_sessionsStore.getSession(clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (session.getDeleted() != 0) {
|
||||||
|
LOG.error("user {} session {} is deleted. login failure", msg.payload().userName(), clientId);
|
||||||
|
failedNoSession(channel);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (session != null && session.getUsername().equals(msg.payload().userName())) {
|
if (session != null && session.getUsername().equals(msg.payload().userName())) {
|
||||||
pwd = AES.AESDecrypt(pwd, session.getSecret(), true);
|
pwd = AES.AESDecrypt(pwd, session.getSecret(), true);
|
||||||
@@ -288,7 +323,7 @@ public class ProtocolProcessor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
session.setMqttVersion(mqttVersion);
|
session.setMqttVersion(mqttVersion);
|
||||||
} else if (!this.allowAnonymous) {
|
} else {
|
||||||
LOG.error("Client didn't supply any password and MQTT anonymous mode is disabled CId={}", clientId);
|
LOG.error("Client didn't supply any password and MQTT anonymous mode is disabled CId={}", clientId);
|
||||||
failedCredentials(channel);
|
failedCredentials(channel);
|
||||||
return false;
|
return false;
|
||||||
@@ -300,12 +335,12 @@ public class ProtocolProcessor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
NettyUtils.userName(channel, msg.payload().userName());
|
NettyUtils.userName(channel, msg.payload().userName());
|
||||||
} else if (!this.allowAnonymous) {
|
return true;
|
||||||
|
} else {
|
||||||
LOG.error("Client didn't supply any credentials and MQTT anonymous mode is disabled. CId={}", clientId);
|
LOG.error("Client didn't supply any credentials and MQTT anonymous mode is disabled. CId={}", clientId);
|
||||||
failedCredentials(channel);
|
failedCredentials(channel);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean sendAck(ConnectionDescriptor descriptor, MqttConnectMessage msg, final String clientId) {
|
private boolean sendAck(ConnectionDescriptor descriptor, MqttConnectMessage msg, final String clientId) {
|
||||||
@@ -481,7 +516,7 @@ public class ProtocolProcessor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!clearSession) {
|
if (!clearSession) {
|
||||||
processConnectionLost(clientID, channel);
|
processConnectionLost(clientID, channel, clearSession);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -522,9 +557,16 @@ public class ProtocolProcessor {
|
|||||||
|
|
||||||
LOG.info("The DISCONNECT message has been processed. CId={}", clientID);
|
LOG.info("The DISCONNECT message has been processed. CId={}", clientID);
|
||||||
|
|
||||||
|
String username = NettyUtils.userName(channel);
|
||||||
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||||
|
if(session != null) {
|
||||||
|
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), UserOnlineStatus.LOGOUT);
|
||||||
|
}
|
||||||
|
|
||||||
channel.closeFuture();
|
channel.closeFuture();
|
||||||
|
|
||||||
//disconnect the session
|
//disconnect the session
|
||||||
|
|
||||||
m_sessionsStore.sessionForClient(clientID).disconnect(clearSession);
|
m_sessionsStore.sessionForClient(clientID).disconnect(clearSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -555,17 +597,21 @@ public class ProtocolProcessor {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void processConnectionLost(String clientID, Channel channel) {
|
public void processConnectionLost(String clientID, Channel channel, boolean clearSession) {
|
||||||
LOG.info("Processing connection lost event. CId={}", clientID);
|
LOG.info("Processing connection lost event. CId={}", clientID);
|
||||||
|
|
||||||
|
String username = NettyUtils.userName(channel);
|
||||||
|
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||||
|
if(session != null) {
|
||||||
|
session.refreshLastActiveTime();
|
||||||
|
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), clearSession ? UserOnlineStatus.LOGOUT : UserOnlineStatus.OFFLINE);
|
||||||
|
}
|
||||||
|
|
||||||
ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel);
|
ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel);
|
||||||
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
||||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
|
||||||
if(session != null) {
|
|
||||||
session.refreshLastActiveTime();
|
|
||||||
}
|
|
||||||
String username = NettyUtils.userName(channel);
|
|
||||||
m_interceptor.notifyClientConnectionLost(clientID, username);
|
m_interceptor.notifyClientConnectionLost(clientID, username);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -128,23 +128,25 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
String userId = new String(payloadContent);
|
String userId = new String(payloadContent);
|
||||||
|
|
||||||
int status;
|
int status;
|
||||||
ClientSession clientSession = m_sessionStore.sessionForClient(userId);
|
Collection<MemorySessionStore.Session> useSessions = m_sessionStore.sessionForUser(userId);
|
||||||
if (clientSession == null) {
|
OutputCheckUserOnline out = new OutputCheckUserOnline();
|
||||||
status = 2;
|
|
||||||
} else {
|
for (MemorySessionStore.Session session : useSessions) {
|
||||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(clientSession.clientID);
|
if (session.getDeleted() > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
||||||
if (descriptor == null) {
|
if (descriptor == null) {
|
||||||
status = 1;
|
status = 1;
|
||||||
} else {
|
} else {
|
||||||
status = 0;
|
status = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
OutputCheckUserOnline out = new OutputCheckUserOnline();
|
callback.onRouteHandled(new Gson().toJson(out).getBytes());
|
||||||
out.setStatus(status);
|
|
||||||
RestResult result = RestResult.ok(out);
|
|
||||||
|
|
||||||
callback.onRouteHandled(new Gson().toJson(result).getBytes());
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +189,7 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
gzip.close();
|
gzip.close();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
data = out.toByteArray();
|
data = out.toByteArray();
|
||||||
code = (byte)ErrorCode.ERROR_CODE_SUCCESS_GZIPED.code;
|
code = (byte)ErrorCode.ERROR_CODE_SUCCESS_GZIPED.code;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import io.moquette.spi.impl.security.AES;
|
|||||||
|
|
||||||
public class Tokenor {
|
public class Tokenor {
|
||||||
private static String KEY = "testim";
|
private static String KEY = "testim";
|
||||||
|
private static long expiredTime = Long.MAX_VALUE;
|
||||||
|
|
||||||
public static void setKey(String key) {
|
public static void setKey(String key) {
|
||||||
if (!StringUtil.isNullOrEmpty(key)) {
|
if (!StringUtil.isNullOrEmpty(key)) {
|
||||||
@@ -13,6 +14,10 @@ public class Tokenor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void setExpiredTime(long expiredTime) {
|
||||||
|
Tokenor.expiredTime = expiredTime;
|
||||||
|
}
|
||||||
|
|
||||||
public static String getUserId(byte[] password) {
|
public static String getUserId(byte[] password) {
|
||||||
try {
|
try {
|
||||||
String signKey =
|
String signKey =
|
||||||
@@ -21,8 +26,8 @@ public class Tokenor {
|
|||||||
if (signKey.startsWith(KEY + "|")) {
|
if (signKey.startsWith(KEY + "|")) {
|
||||||
signKey = signKey.substring(KEY.length() + 1);
|
signKey = signKey.substring(KEY.length() + 1);
|
||||||
long timestamp = Long.parseLong(signKey.substring(0, signKey.indexOf('|')));
|
long timestamp = Long.parseLong(signKey.substring(0, signKey.indexOf('|')));
|
||||||
if (System.currentTimeMillis() - timestamp > 7 * 24 * 60 *60 *1000) {
|
if (expiredTime > 0 && System.currentTimeMillis() - timestamp > expiredTime) {
|
||||||
//return false;
|
return null;
|
||||||
}
|
}
|
||||||
String id = signKey.substring(signKey.indexOf('|') + 1);
|
String id = signKey.substring(signKey.indexOf('|') + 1);
|
||||||
return id;
|
return id;
|
||||||
|
|||||||
@@ -52,7 +52,14 @@ public class HttpUtils {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(Call call, Response response) throws IOException {
|
public void onResponse(Call call, Response response) throws IOException {
|
||||||
LOG.info("POST to {} success with response", url, response.body().string());
|
LOG.info("POST to {} success with response: {}", url, response.body());
|
||||||
|
try {
|
||||||
|
if (response.body() != null) {
|
||||||
|
response.body().close();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,68 @@
|
|||||||
|
package win.liyufan.im;
|
||||||
|
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.MalformedURLException;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.net.URLClassLoader;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
public class I18n {
|
||||||
|
private static ClassLoader Loader = null;
|
||||||
|
static {
|
||||||
|
String configPath = System.getProperty("wildfirechat.path", null);
|
||||||
|
String resBundlePaht = "config/i18n";
|
||||||
|
|
||||||
|
File file = new File(configPath, resBundlePaht);
|
||||||
|
URL[] urls = new URL[0];
|
||||||
|
try {
|
||||||
|
urls = new URL[]{file.toURI().toURL()};
|
||||||
|
Loader = new URLClassLoader(urls);
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, ResourceBundle> bundleMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static String getString(String language, String key) {
|
||||||
|
ResourceBundle bundle = bundleMap.get(language);
|
||||||
|
|
||||||
|
if (StringUtil.isNullOrEmpty(language)) language = "zh_CN";
|
||||||
|
|
||||||
|
if (bundle == null) {
|
||||||
|
bundle = ResourceBundle.getBundle("messages", new Locale(language), Loader);
|
||||||
|
bundleMap.put(language, bundle);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
return bundle.getString(key);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return "糟糕,字符串 " + key + " 没有找到";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void test() throws MalformedURLException {
|
||||||
|
|
||||||
|
// 设置定制的语言国家代码
|
||||||
|
Locale locale1 = new Locale("zh");
|
||||||
|
Locale locale2 = new Locale("en");
|
||||||
|
ResourceBundle rb = ResourceBundle.getBundle("messages", locale1, Loader);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 获得相应的key值
|
||||||
|
String greeting = rb.getString("Above_Greeting_Message");
|
||||||
|
String userInfo = rb.getString("Friend_Can_Start_Chat");
|
||||||
|
|
||||||
|
System.out.println(greeting);
|
||||||
|
System.out.println(userInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
test();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -71,6 +71,7 @@ public interface IMTopic {
|
|||||||
String ChannelPullTopic = "CHP";
|
String ChannelPullTopic = "CHP";
|
||||||
|
|
||||||
String GetTokenTopic = "GETTOKEN";
|
String GetTokenTopic = "GETTOKEN";
|
||||||
|
String DestroyUserTopic = "DESTROYUSER";
|
||||||
|
|
||||||
String LoadRemoteMessagesTopic = "LRM";
|
String LoadRemoteMessagesTopic = "LRM";
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>0.32</version>
|
<version>0.39</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
Regular → Executable
+7
-6
@@ -8,14 +8,15 @@
|
|||||||
|
|
||||||
package cn.wildfirechat.pojos;
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
public class OutputCheckUserOnline {
|
|
||||||
private int status; //0 online, 1 have session offline, 2 no session
|
|
||||||
|
|
||||||
public int getStatus() {
|
public class InputDestroyUser {
|
||||||
return status;
|
private String userId;
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(int status) {
|
public void setUserId(String userId) {
|
||||||
this.status = status;
|
this.userId = userId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4,6 +4,7 @@ public interface APIPath {
|
|||||||
String Create_Chatroom = "/admin/chatroom/create";
|
String Create_Chatroom = "/admin/chatroom/create";
|
||||||
String Chatroom_Destroy = "/admin/chatroom/del";
|
String Chatroom_Destroy = "/admin/chatroom/del";
|
||||||
String Chatroom_Info = "/admin/chatroom/info";
|
String Chatroom_Info = "/admin/chatroom/info";
|
||||||
|
String Chatroom_GetMembers = "/admin/chatroom/members";
|
||||||
|
|
||||||
|
|
||||||
String Sensitive_Add = "/admin/sensitive/add";
|
String Sensitive_Add = "/admin/sensitive/add";
|
||||||
@@ -11,6 +12,7 @@ public interface APIPath {
|
|||||||
String Sensitive_Query = "/admin/sensitive/query";
|
String Sensitive_Query = "/admin/sensitive/query";
|
||||||
|
|
||||||
String Create_User = "/admin/user/create";
|
String Create_User = "/admin/user/create";
|
||||||
|
String Destroy_User = "/admin/user/destroy";
|
||||||
String Create_Robot = "/admin/robot/create";
|
String Create_Robot = "/admin/robot/create";
|
||||||
String User_Get_Token = "/admin/user/get_token";
|
String User_Get_Token = "/admin/user/get_token";
|
||||||
String User_Update_Block_Status = "/admin/user/update_block_status";
|
String User_Update_Block_Status = "/admin/user/update_block_status";
|
||||||
@@ -22,6 +24,10 @@ public interface APIPath {
|
|||||||
|
|
||||||
String Friend_Update_Status = "/admin/friend/status";
|
String Friend_Update_Status = "/admin/friend/status";
|
||||||
String Friend_Get_List = "/admin/friend/list";
|
String Friend_Get_List = "/admin/friend/list";
|
||||||
|
String Blacklist_Update_Status = "/admin/blacklist/status";
|
||||||
|
String Blacklist_Get_List = "/admin/blacklist/list";
|
||||||
|
String Friend_Get_Alias = "/admin/friend/get_alias";
|
||||||
|
String Friend_Set_Alias = "/admin/friend/set_alias";
|
||||||
|
|
||||||
String Msg_Send = "/admin/message/send";
|
String Msg_Send = "/admin/message/send";
|
||||||
String Msg_Recall = "/admin/message/recall";
|
String Msg_Recall = "/admin/message/recall";
|
||||||
@@ -36,15 +42,21 @@ public interface APIPath {
|
|||||||
String Group_Member_List = "/admin/group/member/list";
|
String Group_Member_List = "/admin/group/member/list";
|
||||||
String Group_Member_Add = "/admin/group/member/add";
|
String Group_Member_Add = "/admin/group/member/add";
|
||||||
String Group_Member_Kickoff = "/admin/group/member/del";
|
String Group_Member_Kickoff = "/admin/group/member/del";
|
||||||
|
String Group_Member_Quit = "/admin/group/member/quit";
|
||||||
String Group_Set_Manager = "/admin/group/manager/set";
|
String Group_Set_Manager = "/admin/group/manager/set";
|
||||||
|
String Get_User_Groups = "/admin/group/of_user";
|
||||||
|
|
||||||
|
|
||||||
String Create_Channel = "/admin/channel/create";
|
String Create_Channel = "/admin/channel/create";
|
||||||
String Get_System_Setting = "/admin/system/get_setting";
|
String Get_System_Setting = "/admin/system/get_setting";
|
||||||
String Put_System_Setting = "/admin/system/put_setting";
|
String Put_System_Setting = "/admin/system/put_setting";
|
||||||
|
|
||||||
|
String Channel_User_Info = "/channel/user_info";
|
||||||
|
String Channel_Update_Profile = "/channel/update_profile";
|
||||||
|
String Channel_Get_Profile = "/channel/get_profile";
|
||||||
String Channel_Message_Send = "/channel/message/send";
|
String Channel_Message_Send = "/channel/message/send";
|
||||||
|
String Channel_Subscribe = "/channel/subscribe";
|
||||||
|
String Channel_Subscriber_List = "/channel/subscriber_list";
|
||||||
|
|
||||||
String Robot_User_Info = "/robot/user_info";
|
String Robot_User_Info = "/robot/user_info";
|
||||||
String Robot_Message_Send = "/robot/message/send";
|
String Robot_Message_Send = "/robot/message/send";
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public enum ErrorCode {
|
|||||||
//user error
|
//user error
|
||||||
ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),
|
ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),
|
||||||
ERROR_CODE_FRIEND_REQUEST_BLOCKED(18, "friend request blocked"),
|
ERROR_CODE_FRIEND_REQUEST_BLOCKED(18, "friend request blocked"),
|
||||||
ERROR_CODE_FRIEND_REQUEST_OVERTIME(19, "friend request overtime"),
|
ERROR_CODE_FRIEND_REQUEST_EXPIRED(19, "friend request expired"),
|
||||||
|
|
||||||
ERROR_CODE_NOT_IN_CHATROOM(20, "not in chatroom"),
|
ERROR_CODE_NOT_IN_CHATROOM(20, "not in chatroom"),
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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 InputBlacklistRequest {
|
||||||
|
private String userId;
|
||||||
|
private String targetUid;
|
||||||
|
private int status;
|
||||||
|
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTargetUid() {
|
||||||
|
return targetUid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTargetUid(String targetUid) {
|
||||||
|
this.targetUid = targetUid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getStatus() {
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStatus(int status) {
|
||||||
|
this.status = status;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* 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.ProtoConstants;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class InputChannelSubscribe {
|
||||||
|
private String target;
|
||||||
|
private int subscribe; //1,订阅;0,取消订阅
|
||||||
|
|
||||||
|
public String getTarget() {
|
||||||
|
return target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTarget(String target) {
|
||||||
|
this.target = target;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSubscribe() {
|
||||||
|
return subscribe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubscribe(int subscribe) {
|
||||||
|
this.subscribe = subscribe;
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-7
@@ -9,7 +9,6 @@
|
|||||||
package cn.wildfirechat.pojos;
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
|
||||||
import cn.wildfirechat.proto.ProtoConstants;
|
|
||||||
import cn.wildfirechat.proto.WFCMessage;
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
import io.netty.util.internal.StringUtil;
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
@@ -22,7 +21,7 @@ public class InputCreateChannel {
|
|||||||
private int auto;
|
private int auto;
|
||||||
private String secret;
|
private String secret;
|
||||||
private String desc;
|
private String desc;
|
||||||
private int status;
|
private int state;
|
||||||
private String extra;
|
private String extra;
|
||||||
private long updateDt;
|
private long updateDt;
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ public class InputCreateChannel {
|
|||||||
builder = builder.setSecret(secret);
|
builder = builder.setSecret(secret);
|
||||||
if (!StringUtil.isNullOrEmpty(desc))
|
if (!StringUtil.isNullOrEmpty(desc))
|
||||||
builder = builder.setDesc(desc);
|
builder = builder.setDesc(desc);
|
||||||
builder = builder.setStatus(status);
|
builder = builder.setStatus(state);
|
||||||
if (!StringUtil.isNullOrEmpty(extra))
|
if (!StringUtil.isNullOrEmpty(extra))
|
||||||
builder = builder.setExtra(extra);
|
builder = builder.setExtra(extra);
|
||||||
if (!StringUtil.isNullOrEmpty(name))
|
if (!StringUtil.isNullOrEmpty(name))
|
||||||
@@ -116,12 +115,12 @@ public class InputCreateChannel {
|
|||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getStatus() {
|
public int getState() {
|
||||||
return status;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setStatus(int status) {
|
public void setState(int state) {
|
||||||
this.status = status;
|
this.state = state;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getExtra() {
|
public String getExtra() {
|
||||||
+9
@@ -13,6 +13,7 @@ public class InputFriendRequest {
|
|||||||
private String userId;
|
private String userId;
|
||||||
private String friendUid;
|
private String friendUid;
|
||||||
private int status;
|
private int status;
|
||||||
|
private String extra;
|
||||||
|
|
||||||
|
|
||||||
public String getUserId() {
|
public String getUserId() {
|
||||||
@@ -38,4 +39,12 @@ public class InputFriendRequest {
|
|||||||
public void setStatus(int status) {
|
public void setStatus(int status) {
|
||||||
this.status = status;
|
this.status = status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getExtra() {
|
||||||
|
return extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExtra(String extra) {
|
||||||
|
this.extra = extra;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user