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 |
@@ -56,3 +56,7 @@ broker/media
|
||||
common/target
|
||||
server/target
|
||||
sdk/target
|
||||
moments/target
|
||||
monitor
|
||||
wildfire_jmeter
|
||||
git.properties
|
||||
|
||||
@@ -61,6 +61,15 @@
|
||||
</map-store>
|
||||
</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"/>
|
||||
|
||||
<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
|
||||
|
||||
##是否使用内置DB。0使用mysql;1使用h2db;2使用mysql+mongodb。社区版只支持0和1,专业版支持2
|
||||
embed.db 0
|
||||
embed.db 1
|
||||
|
||||
##服务器管理接口密钥
|
||||
http.admin.secret_key 123456
|
||||
@@ -52,6 +52,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0
|
||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||
token.key testim
|
||||
|
||||
##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题
|
||||
##token.expire_time 2592000000
|
||||
|
||||
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
|
||||
message.roaming 0
|
||||
|
||||
@@ -61,6 +64,28 @@ 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
|
||||
#*********************************************************************
|
||||
@@ -116,6 +141,11 @@ push.android.server.address http://localhost:8085/android/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
|
||||
|
||||
+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 @@
|
||||
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;
|
||||
index index.html index.htm index.php;
|
||||
|
||||
## send request back to im server ##
|
||||
location /im {
|
||||
location /route {
|
||||
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 /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;
|
||||
}
|
||||
|
||||
location /api {
|
||||
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>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.34</version>
|
||||
<version>0.39</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>moquette-broker</artifactId>
|
||||
@@ -41,7 +41,7 @@
|
||||
<dependency>
|
||||
<groupId>log4j</groupId>
|
||||
<artifactId>log4j</artifactId>
|
||||
<version>1.2.14</version>
|
||||
<version>1.2.17</version>
|
||||
</dependency>
|
||||
|
||||
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
|
||||
|
||||
@@ -46,4 +46,13 @@ public class PushMessage {
|
||||
this.isHiddenDetail = isHiddenDetail;
|
||||
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_VOIP_INVITE = 1;
|
||||
int PUSH_MESSAGE_TYPE_VOIP_BYE = 2;
|
||||
int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3;
|
||||
}
|
||||
|
||||
private static PushServer INSTANCE = new PushServer();
|
||||
@@ -57,7 +58,7 @@ public class PushServer {
|
||||
}
|
||||
|
||||
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(() ->{
|
||||
try {
|
||||
pushMessageInternel(pushMessage, deviceId, pushContent);
|
||||
|
||||
@@ -21,6 +21,7 @@ import io.netty.handler.codec.http.HttpResponseEncoder;
|
||||
import io.netty.handler.stream.ChunkedWriteHandler;
|
||||
import com.xiaoleilu.loServer.action.ClassUtil;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@@ -141,6 +142,7 @@ public class LoServer {
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(Logger, e);
|
||||
} catch (ClassNotFoundException e) {
|
||||
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
|
||||
public boolean action(Request request, Response response) {
|
||||
response.setHeader("Access-Control-Allow-Origin", "*");
|
||||
if (false == Request.METHOD_GET.equalsIgnoreCase(request.getMethod())) {
|
||||
response.sendError(HttpResponseStatus.METHOD_NOT_ALLOWED, "Please use GET method to request file!");
|
||||
return true;
|
||||
|
||||
@@ -57,7 +57,7 @@ public class RouteAction extends Action {
|
||||
try {
|
||||
bytes = Base64.getDecoder().decode(str);
|
||||
} catch (IllegalArgumentException e) {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ public class RouteAction extends Action {
|
||||
byte[] cbytes = Base64.getDecoder().decode(cid);
|
||||
cbytes = AES.AESDecrypt(cbytes, "", true);
|
||||
if (cbytes == null) {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||
return true;
|
||||
}
|
||||
cid = new String(cbytes);
|
||||
@@ -74,7 +74,7 @@ public class RouteAction extends Action {
|
||||
byte[] ubytes = Base64.getDecoder().decode(uid);
|
||||
ubytes = AES.AESDecrypt(ubytes, "", true);
|
||||
if (ubytes == null) {
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
||||
return true;
|
||||
}
|
||||
uid = new String(ubytes);
|
||||
|
||||
@@ -28,7 +28,7 @@ public class UnknownErrorAction extends Action{
|
||||
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
response.setStatus(HttpResponseStatus.NOT_FOUND);
|
||||
response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR);
|
||||
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);
|
||||
|
||||
File tmpFile = new File(filePath);
|
||||
@@ -279,7 +279,7 @@ public class UploadFileAction extends Action {
|
||||
fileUpload.release();
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
String relativePath = datePath + "/" + requestId;
|
||||
String relativePath = datePath + "/" + (StringUtil.isNullOrEmpty(remoteFileName) ? requestId : remoteFileName);
|
||||
response.setContent("{\"key\":\"" + relativePath + "\"}");
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.LoServer;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
@@ -17,9 +18,12 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.RateLimiter;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
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 boolean NO_CHECK_TIME = false;
|
||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 500);
|
||||
@@ -50,8 +54,9 @@ abstract public class AdminAction extends Action {
|
||||
Long ts;
|
||||
try {
|
||||
ts = Long.parseLong(timestamp);
|
||||
} catch (NumberFormatException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
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;
|
||||
|
||||
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.Route;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
@@ -16,10 +20,15 @@ import com.xiaoleilu.loServer.handler.Response;
|
||||
import cn.wildfirechat.pojos.InputGetUserInfo;
|
||||
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 cn.wildfirechat.common.ErrorCode;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
@Route(APIPath.User_Get_Online_Status)
|
||||
@HttpMethod("POST")
|
||||
public class CheckUserOnlineAction extends AdminAction {
|
||||
@@ -34,12 +43,34 @@ public class CheckUserOnlineAction extends AdminAction {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class);
|
||||
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);
|
||||
return true;
|
||||
RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
@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 {
|
||||
sendResponse(response, ErrorCode.INVALID_PARAMETER, null);
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -44,7 +44,8 @@ public class CreateChannelAction extends AdminAction {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputCreateChannel inputCreateChannel = getRequestBody(request.getNettyRequest(), InputCreateChannel.class);
|
||||
if (inputCreateChannel != null
|
||||
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getName())) {
|
||||
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getName())
|
||||
&& !StringUtil.isNullOrEmpty(inputCreateChannel.getOwner())) {
|
||||
|
||||
|
||||
if(StringUtil.isNullOrEmpty(inputCreateChannel.getTargetId())) {
|
||||
@@ -58,7 +59,10 @@ public class CreateChannelAction extends AdminAction {
|
||||
byteBuf.writeBytes(result);
|
||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
||||
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 {
|
||||
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.util.internal.StringUtil;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.UUIDGenerator;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
@Route(APIPath.Create_Robot)
|
||||
@HttpMethod("POST")
|
||||
public class CreateRobotAction extends AdminAction {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CreateRobotAction.class);
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
@@ -55,7 +59,16 @@ public class CreateRobotAction extends AdminAction {
|
||||
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())) {
|
||||
inputCreateRobot.setOwner(inputCreateRobot.getUserId());
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.google.gson.Gson;
|
||||
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.util.internal.StringUtil;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.DBUtil;
|
||||
import win.liyufan.im.UUIDGenerator;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
@Route(APIPath.Create_User)
|
||||
@HttpMethod("POST")
|
||||
public class CreateUserAction extends AdminAction {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(CreateUserAction.class);
|
||||
|
||||
@Override
|
||||
public boolean isTransactionAction() {
|
||||
@@ -38,7 +44,8 @@ public class CreateUserAction extends AdminAction {
|
||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||
InputOutputUserInfo inputCreateUser = getRequestBody(request.getNettyRequest(), InputOutputUserInfo.class);
|
||||
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())) {
|
||||
inputCreateUser.setPassword(UUIDGenerator.getUUID());
|
||||
@@ -73,9 +80,20 @@ public class CreateUserAction extends AdminAction {
|
||||
if (inputCreateUser.getExtra() != null)
|
||||
newUserBuilder.setExtra(inputCreateUser.getExtra());
|
||||
|
||||
newUserBuilder.setType(inputCreateUser.getType());
|
||||
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);
|
||||
RestResult result = RestResult.ok(new OutputCreateUser(inputCreateUser.getUserId(), inputCreateUser.getName()));
|
||||
|
||||
@@ -46,8 +46,11 @@ public class FriendRelationAction extends AdminAction {
|
||||
&& !StringUtil.isNullOrEmpty(friendAdd.getUserId())
|
||||
&& !StringUtil.isNullOrEmpty(friendAdd.getFriendUid())
|
||||
) {
|
||||
WFCMessage.HandleFriendRequest friendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus()).build();
|
||||
RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequest.toByteArray(), friendAdd.getFriendUid(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() {
|
||||
WFCMessage.HandleFriendRequest.Builder friendRequestBuilder = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus());
|
||||
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
|
||||
public void onSuccess(byte[] result) {
|
||||
ByteBuf byteBuf = Unpooled.buffer();
|
||||
|
||||
+5
-3
@@ -9,6 +9,8 @@
|
||||
package com.xiaoleilu.loServer.action.admin;
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
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;
|
||||
@@ -35,16 +37,16 @@ public class FriendRelationGetAction extends AdminAction {
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
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<String> list = new ArrayList<>();
|
||||
for (FriendData data : dataList) {
|
||||
if (data.getState() == inputGetFriendList.getStatus()) {
|
||||
if (data.getState() == 0) {
|
||||
list.add(data.getFriendUid());
|
||||
}
|
||||
}
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
RestResult result = RestResult.ok(list);
|
||||
RestResult result = RestResult.ok(new OutputStringList(list));
|
||||
response.setContent(new Gson().toJson(result));
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
+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.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.action.admin.AdminAction;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.spi.impl.Utils;
|
||||
@@ -21,9 +22,12 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.RateLimiter;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
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);
|
||||
protected WFCMessage.ChannelInfo channelInfo;
|
||||
|
||||
@@ -45,8 +49,9 @@ abstract public class ChannelAction extends Action {
|
||||
Long ts;
|
||||
try {
|
||||
ts = Long.parseLong(timestamp);
|
||||
} catch (NumberFormatException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ package com.xiaoleilu.loServer.action.channel;
|
||||
|
||||
|
||||
import cn.wildfirechat.common.APIPath;
|
||||
import cn.wildfirechat.pojos.SendChannelMessageData;
|
||||
import com.google.gson.Gson;
|
||||
import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||
@@ -44,11 +45,15 @@ public class SendMessageAction extends ChannelAction {
|
||||
@Override
|
||||
public boolean action(Request request, Response response) {
|
||||
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.getConv().setType(ConversationType_Channel);
|
||||
sendMessageData.getConv().setTarget(channelInfo.getTargetId());
|
||||
sendMessageData.getConv().setLine(sendChannelMessageData.getLine());
|
||||
sendMessageData.setSender(channelInfo.getOwner());
|
||||
sendMessageData.setPayload(sendChannelMessageData.getPayload());
|
||||
sendMessageData.setToUsers(sendChannelMessageData.getTargets());
|
||||
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() {
|
||||
@Override
|
||||
|
||||
@@ -14,6 +14,7 @@ import com.xiaoleilu.loServer.RestResult;
|
||||
import com.xiaoleilu.loServer.action.Action;
|
||||
import com.xiaoleilu.loServer.handler.Request;
|
||||
import com.xiaoleilu.loServer.handler.Response;
|
||||
import io.moquette.imhandler.IMHandler;
|
||||
import io.moquette.spi.impl.Utils;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpRequest;
|
||||
@@ -21,11 +22,15 @@ import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.apache.commons.codec.digest.DigestUtils;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.RateLimiter;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
abstract public class RobotAction extends Action {
|
||||
protected static final Logger LOG = LoggerFactory.getLogger(RobotAction.class);
|
||||
private final RateLimiter mLimitCounter = new RateLimiter(10, 1000);
|
||||
|
||||
protected WFCMessage.Robot robot;
|
||||
@@ -47,8 +52,9 @@ abstract public class RobotAction extends Action {
|
||||
Long ts;
|
||||
try {
|
||||
ts = Long.parseLong(timestamp);
|
||||
} catch (NumberFormatException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -89,6 +95,7 @@ abstract public class RobotAction extends Action {
|
||||
return t;
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -21,6 +21,7 @@ import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.handler.codec.http.HttpResponseStatus;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
/**
|
||||
* Action处理单元
|
||||
@@ -51,6 +52,8 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
|
||||
this.doAction(ctx, request, response);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(Logger, e);
|
||||
Action errorAction = ServerSetting.getErrorAction(ServerSetting.MAPPING_ERROR);
|
||||
request.putParam(UnknownErrorAction.ERROR_PARAM_NAME, e);
|
||||
response.setContent(e.toString());
|
||||
@@ -110,7 +113,8 @@ abstract public class ActionHandler extends SimpleChannelInboundHandler<FullHttp
|
||||
* @param 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);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.channel.SimpleChannelInboundHandler;
|
||||
import io.netty.handler.codec.http.FullHttpRequest;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
@@ -37,7 +38,7 @@ public class IMActionHandler extends ActionHandler {
|
||||
|
||||
@Override
|
||||
boolean isValidePath(String path) {
|
||||
if (!path.startsWith("/admin")) {
|
||||
if (!StringUtil.isNullOrEmpty(path) && !path.startsWith("/admin")) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -14,15 +14,17 @@ public class FriendData implements Serializable {
|
||||
private String userId;
|
||||
private String friendUid;
|
||||
private String alias;
|
||||
private String extra;
|
||||
private int state;
|
||||
private int blacked;
|
||||
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.friendUid = friendUid;
|
||||
this.alias = alias;
|
||||
this.extra = extra;
|
||||
this.state = state;
|
||||
this.blacked = blacked;
|
||||
this.timestamp = timestamp;
|
||||
@@ -55,6 +57,14 @@ public class FriendData implements Serializable {
|
||||
this.alias = alias;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
}
|
||||
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public int getState() {
|
||||
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_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_Long_Port = "node_external_long_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 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";
|
||||
|
||||
@@ -117,6 +120,15 @@ public final class BrokerConstants {
|
||||
|
||||
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() {
|
||||
|
||||
@@ -27,7 +27,7 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
||||
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) {
|
||||
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);
|
||||
|
||||
@@ -30,6 +30,9 @@ public class FriendPullHandler extends IMHandler<WFCMessage.Version> {
|
||||
if (!StringUtil.isNullOrEmpty(data.getAlias())) {
|
||||
builder1.setAlias(data.getAlias());
|
||||
}
|
||||
if (!StringUtil.isNullOrEmpty(data.getExtra())) {
|
||||
builder1.setExtra(data.getExtra());
|
||||
}
|
||||
builder.addEntry(builder1.build());
|
||||
}
|
||||
byte[] data = builder.build().toByteArray();
|
||||
|
||||
@@ -20,7 +20,7 @@ import win.liyufan.im.IMTopic;
|
||||
public class GetTokenHandler extends IMHandler<WFCMessage.GetTokenRequest> {
|
||||
@Override
|
||||
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();
|
||||
String strToken = authenticator.generateToken(fromUser);
|
||||
String result = strToken + "|" + session.getSecret() + "|" + session.getDbSecret();
|
||||
|
||||
@@ -32,7 +32,7 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
||||
builder.setFromUser(fromUser);
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
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.WFCMessage;
|
||||
import io.moquette.persistence.MemorySessionStore;
|
||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
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.MessageShardingUtil;
|
||||
|
||||
@@ -27,33 +30,41 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
||||
long[] heads = new long[2];
|
||||
ErrorCode errorCode = m_messagesStore.handleFriendRequest(fromUser, request, builder, heads, isAdmin);
|
||||
|
||||
if (errorCode == ERROR_CODE_SUCCESS && !isAdmin) {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long timestamp = System.currentTimeMillis();
|
||||
builder.setMessageId(messageId);
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if (!isAdmin && builder.getConversation() != null) {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long timestamp = System.currentTimeMillis();
|
||||
builder.setMessageId(messageId);
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent("以上是打招呼信息");
|
||||
builder = WFCMessage.Message.newBuilder();
|
||||
builder.setFromUser(request.getTargetUid());
|
||||
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||
builder.setContent(contentBuilder);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||
String language = "zh_CN";
|
||||
if (session != null && !StringUtil.isNullOrEmpty(session.getLanguage())) {
|
||||
language = session.getLanguage();
|
||||
}
|
||||
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder().setType(90).setContent(I18n.getString(language, "Above_Greeting_Message"));
|
||||
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||
builder = WFCMessage.Message.newBuilder();
|
||||
builder.setFromUser(request.getTargetUid());
|
||||
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("你们已经成为好友了,现在可以开始聊天了");
|
||||
builder.setContent(contentBuilder);
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build());
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
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, fromUser, heads[1]);
|
||||
}
|
||||
|
||||
@@ -32,6 +32,8 @@ import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.ParameterizedType;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
@@ -83,15 +85,11 @@ abstract public class IMHandler<T> {
|
||||
}
|
||||
}
|
||||
|
||||
for (Method method : getClass().getDeclaredMethods()
|
||||
) {
|
||||
|
||||
if (method.getName() == actionName && method.getParameterCount() == 6 && !method.getParameterTypes()[4].equals(Object.class)) {
|
||||
dataCls = method.getParameterTypes()[4];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Type t = getClass().getGenericSuperclass();
|
||||
ParameterizedType p = (ParameterizedType) t ;
|
||||
Class<T> c = (Class<T>) p.getActualTypeArguments()[0];
|
||||
dataCls = c;
|
||||
|
||||
if (dataCls.getSuperclass().equals(GeneratedMessage.class)) {
|
||||
parseDataMethod = dataCls.getMethod("parseFrom", byte[].class);
|
||||
} else if (dataCls.isPrimitive()) {
|
||||
@@ -238,17 +236,17 @@ abstract public class IMHandler<T> {
|
||||
Set<String> notifyReceivers = new LinkedHashSet<>();
|
||||
|
||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, false);
|
||||
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||
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<>();
|
||||
|
||||
message = m_messagesStore.storeMessage(username, clientID, message);
|
||||
WFCMessage.Message.Builder messageBuilder = message.toBuilder();
|
||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers);
|
||||
int pullType = m_messagesStore.getNotifyReceivers(username, messageBuilder, notifyReceivers, ignoreMsg);
|
||||
mServer.getImBusinessScheduler().execute(() -> this.publisher.publish2Receivers(messageBuilder.build(), notifyReceivers, clientID, pullType));
|
||||
return notifyReceivers.size();
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
package io.moquette.imhandler;
|
||||
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
@@ -24,6 +25,19 @@ public class LoadRemoteMessagesHandler extends IMHandler<WFCMessage.LoadRemoteMe
|
||||
if (beforeUid == 0) {
|
||||
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());
|
||||
byte[] data = result.toByteArray();
|
||||
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) {
|
||||
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupNameNotifyContent();
|
||||
} 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) {
|
||||
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupMuteNotifyContent();
|
||||
} else if(request.getType() == Modify_Group_JoinType) {
|
||||
|
||||
@@ -13,11 +13,18 @@ import io.moquette.spi.impl.Qos1PublishHandler;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import win.liyufan.im.IMTopic;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
@Handler(IMTopic.ModifyMyInfoTopic)
|
||||
public class ModifyMyInfoHandler extends IMHandler<WFCMessage.ModifyMyInfoRequest> {
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyMyInfoRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
try {
|
||||
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);
|
||||
|
||||
return errorCode;
|
||||
|
||||
@@ -17,6 +17,7 @@ import io.netty.buffer.ByteBuf;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import win.liyufan.im.IMTopic;
|
||||
import win.liyufan.im.MessageShardingUtil;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
@@ -26,6 +27,7 @@ import static cn.wildfirechat.proto.ProtoConstants.ContentType.Text;
|
||||
public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
private int mSensitiveType = 0; //命中敏感词时,0 失败,1 吞掉, 2 敏感词替换成*。
|
||||
private String mForwardUrl = null;
|
||||
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
||||
public SendMessageHandler() {
|
||||
super();
|
||||
|
||||
@@ -38,6 +40,14 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
mSensitiveType = Integer.parseInt(mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Filter_Type));
|
||||
} catch (Exception e) {
|
||||
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) {
|
||||
ErrorCode errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
||||
if (message != null) {
|
||||
boolean ignoreMsg = false;
|
||||
if (!isAdmin) { //admin do not check the right
|
||||
// 不能在端上直接发送撤回和群通知
|
||||
if (message.getContent().getType() == 80 || (message.getContent().getType() >= 100 && message.getContent().getType() < 200)) {
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||
if (m_messagesStore.isBlacked(message.getConversation().getTarget(), fromUser)) {
|
||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
|
||||
ignoreMsg = true;
|
||||
errorCode = ErrorCode.ERROR_CODE_SUCCESS;
|
||||
} else {
|
||||
return errorCode;
|
||||
}
|
||||
}
|
||||
|
||||
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 ) {
|
||||
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
@@ -86,8 +107,8 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
publisher.forwardMessage(message, mForwardUrl);
|
||||
}
|
||||
|
||||
boolean ignoreMsg = false;
|
||||
if (!isAdmin && message.getContent().getType() == Text) {
|
||||
|
||||
if (!isAdmin) {
|
||||
Set<String> matched = m_messagesStore.handleSensitiveWord(message.getContent().getSearchableContent());
|
||||
if (matched != null && !matched.isEmpty()) {
|
||||
m_messagesStore.storeSensitiveMessage(message);
|
||||
@@ -109,9 +130,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
}
|
||||
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
if (!ignoreMsg) {
|
||||
saveAndPublish(fromUser, clientID, message);
|
||||
}
|
||||
saveAndPublish(fromUser, clientID, message, ignoreMsg);
|
||||
ackPayload = ackPayload.capacity(20);
|
||||
ackPayload.writeLong(messageId);
|
||||
ackPayload.writeLong(timestamp);
|
||||
|
||||
@@ -31,7 +31,7 @@ public class UploadDeviceTokenHandler extends IMHandler<WFCMessage.UploadDeviceT
|
||||
session.setDeviceToken(request.getDeviceToken());
|
||||
session.setPushType(request.getPushType());
|
||||
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;
|
||||
|
||||
@@ -20,7 +20,7 @@ import java.util.List;
|
||||
public class UserSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> {
|
||||
@Override
|
||||
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();
|
||||
builder.addAllEntry(users);
|
||||
byte[] data = builder.build().toByteArray();
|
||||
|
||||
@@ -35,6 +35,7 @@ import java.util.function.Function;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||
import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS;
|
||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
|
||||
|
||||
public class DatabaseStore {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
|
||||
@@ -148,8 +149,12 @@ public class DatabaseStore {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
List<WFCMessage.User> searchUserFromDB(String keyword, boolean buzzy, int page) {
|
||||
//searchType
|
||||
// 0 模糊匹配displayName, 精确匹配账户名和电话号码
|
||||
// 1 精确匹配账户名和电话号码
|
||||
// 2 精确匹配账户名
|
||||
// 3 精确匹配电话号码
|
||||
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
@@ -169,18 +174,29 @@ public class DatabaseStore {
|
||||
", `_social`" +
|
||||
", `_extra`" +
|
||||
", `_dt` from t_user";
|
||||
if (buzzy) {
|
||||
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
|
||||
} else {
|
||||
sql += " where (`_name` = ? or `_mobile` = ?) ";
|
||||
switch (searchType) {
|
||||
case SearchUserType_Name_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 += " limit 20";
|
||||
} else {
|
||||
sql += " and _type <> 2"; //can search normal user(0) and robot(1) and admin(100), can not search things
|
||||
|
||||
if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
|
||||
sql += " limit 1";
|
||||
} else {
|
||||
sql += " limit 20";
|
||||
}
|
||||
|
||||
if (page > 0) {
|
||||
@@ -190,12 +206,24 @@ public class DatabaseStore {
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
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();
|
||||
while (rs.next()) {
|
||||
@@ -352,7 +380,7 @@ public class DatabaseStore {
|
||||
|
||||
try {
|
||||
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);
|
||||
|
||||
int index;
|
||||
@@ -383,6 +411,8 @@ public class DatabaseStore {
|
||||
long longvalue = rs.getLong(index++);
|
||||
builder.setTimestamp(longvalue);
|
||||
|
||||
builder.setExtra(rs.getString(index++));
|
||||
|
||||
friendsMap.put(builder.getUserId(), builder);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
@@ -465,7 +495,7 @@ public class DatabaseStore {
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
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 " +
|
||||
"`_data` = ?," +
|
||||
"`_searchable_key` = ?," +
|
||||
@@ -487,6 +517,13 @@ public class DatabaseStore {
|
||||
statement.setString(index++, searchableContent);
|
||||
statement.setTimestamp(index++, new Timestamp(message.getServerTimestamp()));
|
||||
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.setString(index++, searchableContent);
|
||||
@@ -693,21 +730,27 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
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));
|
||||
if (messages != null && messages.size() < count) {
|
||||
String nexTable = MessageShardingUtil.getPreviousMessageTable(beforeUid);
|
||||
if (!StringUtil.isNullOrEmpty(nexTable)) {
|
||||
List<WFCMessage.Message> nextMessages = loadRemoteMessagesFromTable(user, conversation, beforeUid, count - messages.size(), nexTable);
|
||||
if (nextMessages != null) {
|
||||
messages.addAll(nextMessages);
|
||||
List<WFCMessage.Message> messages = new ArrayList<>();
|
||||
long[] before = new long[1];
|
||||
before[0] = beforeUid;
|
||||
boolean hasMore = loadRemoteMessagesFromTable(user, conversation, before, count, MessageShardingUtil.getMessageTable(beforeUid), messages);
|
||||
if (messages.size() < count) {
|
||||
if (hasMore) {
|
||||
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;
|
||||
}
|
||||
|
||||
List<WFCMessage.Message> loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long beforeUid, int count, String table) {
|
||||
String sql = "select `_mid`, `_from`, `_type`, `_target`, `_line`, `_data`, `_dt` from " + table +" where";
|
||||
boolean loadRemoteMessagesFromTable(String user, WFCMessage.Conversation conversation, long[] before, int count, String table, List<WFCMessage.Message> messages) {
|
||||
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) {
|
||||
sql += " _type = ? and _line = ? and _mid < ? and ((_target = ? and _from = ?) or (_target = ? and _from = ?))";
|
||||
} else {
|
||||
@@ -719,7 +762,6 @@ public class DatabaseStore {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet resultSet = null;
|
||||
List<WFCMessage.Message> out = new ArrayList<>();
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -736,9 +778,12 @@ public class DatabaseStore {
|
||||
statement.setInt(index++, count);
|
||||
resultSet = statement.executeQuery();
|
||||
while (resultSet.next()) {
|
||||
count--;
|
||||
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder();
|
||||
index = 1;
|
||||
builder.setMessageId(resultSet.getLong(index++));
|
||||
before[0] = builder.getMessageId();
|
||||
|
||||
builder.setFromUser(resultSet.getString(index++));
|
||||
WFCMessage.Conversation.Builder cb = WFCMessage.Conversation.newBuilder();
|
||||
cb.setType(resultSet.getInt(index++));
|
||||
@@ -749,9 +794,22 @@ public class DatabaseStore {
|
||||
|
||||
WFCMessage.MessageContent messageContent = WFCMessage.MessageContent.parseFrom(blob.getBinaryStream());
|
||||
builder.setContent(messageContent);
|
||||
|
||||
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();
|
||||
out.add(message);
|
||||
messages.add(message);
|
||||
}
|
||||
|
||||
if (count == 0) {
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException | IOException e) {
|
||||
e.printStackTrace();
|
||||
@@ -759,7 +817,7 @@ public class DatabaseStore {
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, resultSet);
|
||||
}
|
||||
return out;
|
||||
return false;
|
||||
}
|
||||
|
||||
void persistUserMessage(final String userId, final long messageId, final long messageSeq) {
|
||||
@@ -1011,78 +1069,76 @@ public class DatabaseStore {
|
||||
}
|
||||
|
||||
void persistGroupInfo(final WFCMessage.GroupInfo groupInfo) {
|
||||
mScheduler.execute(()->{
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "insert into t_group (`_gid`" +
|
||||
", `_name`" +
|
||||
", `_portrait`" +
|
||||
", `_owner`" +
|
||||
", `_type`" +
|
||||
", `_extra`" +
|
||||
", `_dt`" +
|
||||
", `_member_count`" +
|
||||
", `_mute`" +
|
||||
", `_join_type`" +
|
||||
", `_private_chat`" +
|
||||
", `_searchable`" +
|
||||
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||
" ON DUPLICATE KEY UPDATE " +
|
||||
"`_name` = ?," +
|
||||
"`_portrait` = ?," +
|
||||
"`_owner` = ?," +
|
||||
"`_type` = ?," +
|
||||
"`_extra` = ?," +
|
||||
"`_dt` = ?," +
|
||||
"`_member_count` = ?," +
|
||||
"`_mute` = ?" +
|
||||
", `_join_type` = ?" +
|
||||
", `_private_chat` = ?" +
|
||||
", `_searchable` = ?, " +
|
||||
"`_member_dt` = ?";
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "insert into t_group (`_gid`" +
|
||||
", `_name`" +
|
||||
", `_portrait`" +
|
||||
", `_owner`" +
|
||||
", `_type`" +
|
||||
", `_extra`" +
|
||||
", `_dt`" +
|
||||
", `_member_count`" +
|
||||
", `_mute`" +
|
||||
", `_join_type`" +
|
||||
", `_private_chat`" +
|
||||
", `_searchable`" +
|
||||
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
|
||||
" ON DUPLICATE KEY UPDATE " +
|
||||
"`_name` = ?," +
|
||||
"`_portrait` = ?," +
|
||||
"`_owner` = ?," +
|
||||
"`_type` = ?," +
|
||||
"`_extra` = ?," +
|
||||
"`_dt` = ?," +
|
||||
"`_member_count` = ?," +
|
||||
"`_mute` = ?" +
|
||||
", `_join_type` = ?" +
|
||||
", `_private_chat` = ?" +
|
||||
", `_searchable` = ?, " +
|
||||
"`_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());
|
||||
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);
|
||||
}
|
||||
});
|
||||
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) {
|
||||
@@ -1420,8 +1476,9 @@ public class DatabaseStore {
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql;
|
||||
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX
|
||||
|| platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
||||
if (platform == ProtoConstants.Platform.Platform_Windows || platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
|
||||
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
||||
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and (`_platform` = ? or `_platform` = ?) and `_cid` <> ? and `_deleted` = 0";
|
||||
} else {
|
||||
sql = "update t_user_session set `_deleted` = ?, `_token` = ?, `_voip_token` = ?, `_dt` = ? where `_uid`=? and `_platform` = ? and `_cid` <> ? and `_deleted` = 0";
|
||||
@@ -1437,9 +1494,10 @@ public class DatabaseStore {
|
||||
|
||||
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_OSX);
|
||||
statement.setInt(index++, ProtoConstants.Platform.Platform_Linux);
|
||||
} else if(platform == ProtoConstants.Platform.Platform_iOS || platform == ProtoConstants.Platform.Platform_Android) {
|
||||
statement.setInt(index++, ProtoConstants.Platform.Platform_iOS);
|
||||
statement.setInt(index++, ProtoConstants.Platform.Platform_Android);
|
||||
@@ -1532,39 +1590,37 @@ public class DatabaseStore {
|
||||
return null;
|
||||
}
|
||||
void updateGroupMemberCountDt(final String groupId, final int count, final long dt) {
|
||||
mScheduler.execute(()->{
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
|
||||
String sql ;
|
||||
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);
|
||||
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) {
|
||||
@@ -2104,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());
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
@@ -2178,6 +2234,7 @@ public class DatabaseStore {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
throw new Exception(e.getMessage());
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement);
|
||||
}
|
||||
@@ -2448,7 +2505,7 @@ public class DatabaseStore {
|
||||
ResultSet rs = null;
|
||||
try {
|
||||
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);
|
||||
|
||||
|
||||
@@ -2464,8 +2521,9 @@ public class DatabaseStore {
|
||||
int state = rs.getInt(3);
|
||||
int blacked = rs.getInt(4);
|
||||
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);
|
||||
}
|
||||
return out;
|
||||
@@ -2485,7 +2543,7 @@ public class DatabaseStore {
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "update t_friend set `_alias` = '', `_state` = 1, `_blacked` = 0, `_dt` = ? where `_uid` = ? or `_friend_uid` = ?";
|
||||
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;
|
||||
@@ -2668,12 +2726,13 @@ public class DatabaseStore {
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
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 " +
|
||||
"`_alias` = ?," +
|
||||
"`_state` = ?," +
|
||||
"`_blacked` = ?," +
|
||||
"`_dt` = ?";
|
||||
"`_dt` = ?," +
|
||||
"`_extra` = ?";
|
||||
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -2684,10 +2743,12 @@ public class DatabaseStore {
|
||||
statement.setInt(index++, request.getState());
|
||||
statement.setInt(index++, request.getBlacked());
|
||||
statement.setLong(index++, request.getTimestamp());
|
||||
statement.setString(index++, request.getExtra());
|
||||
statement.setString(index++, request.getAlias());
|
||||
statement.setInt(index++, request.getState());
|
||||
statement.setInt(index++, request.getBlacked());
|
||||
statement.setLong(index++, request.getTimestamp());
|
||||
statement.setString(index++, request.getExtra());
|
||||
int count = statement.executeUpdate();
|
||||
LOG.info("Update rows {}", count);
|
||||
} catch (SQLException e) {
|
||||
@@ -2976,7 +3037,7 @@ public class DatabaseStore {
|
||||
rs = statement.executeQuery();
|
||||
while (rs.next()) {
|
||||
|
||||
String value = rs.getString(index++);
|
||||
String value = rs.getString(1);
|
||||
if (!StringUtil.isNullOrEmpty(value)) {
|
||||
out.add(value);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ import com.hazelcast.util.StringUtil;
|
||||
import com.xiaoleilu.loServer.model.FriendData;
|
||||
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
||||
import cn.wildfirechat.common.ErrorCode;
|
||||
import io.moquette.BrokerConstants;
|
||||
import io.moquette.server.Constants;
|
||||
import io.moquette.server.Server;
|
||||
import io.moquette.spi.IMatchingCondition;
|
||||
@@ -42,7 +43,6 @@ import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
@@ -50,8 +50,7 @@ import java.util.concurrent.locks.ReadWriteLock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ChannelStatus.Channel_Status_Destoryed;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ChannelState.Channel_State_Mask_Deleted;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.GroupMemberType.*;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
|
||||
@@ -112,19 +111,70 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private final DatabaseStore databaseStore;
|
||||
private ConcurrentHashMap<String, Long> userMaxPullSeq = new ConcurrentHashMap<>();
|
||||
|
||||
private AtomicReference<SensitiveFilter> mSensitiveFilter = new AtomicReference<>();
|
||||
private SensitiveFilter mSensitiveFilter;
|
||||
private volatile long lastUpdateSensitiveTime = 0;
|
||||
|
||||
private ConcurrentHashMap<String, Boolean> userGlobalSlientMap = new ConcurrentHashMap<>();
|
||||
private ConcurrentHashMap<String, Boolean> userPushHiddenDetail = 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) {
|
||||
m_Server = server;
|
||||
this.databaseStore = databaseStore;
|
||||
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));
|
||||
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
|
||||
@@ -148,7 +198,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
Set<String> sensitiveWords = databaseStore.getSensitiveWord();
|
||||
mSensitiveFilter.set(new SensitiveFilter(sensitiveWords));
|
||||
mSensitiveFilter = new SensitiveFilter(sensitiveWords);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,12 +230,24 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
|
||||
@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();
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
int type = message.getConversation().getType();
|
||||
int pullType = ProtoConstants.PullType.Pull_Normal;
|
||||
|
||||
if (ignoreMsg) {
|
||||
if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
|
||||
pullType = ProtoConstants.PullType.Pull_ChatRoom;
|
||||
}
|
||||
|
||||
if (message.getContent().getPersistFlag() != Transparent) {
|
||||
notifyReceivers.add(fromUser);
|
||||
}
|
||||
return pullType;
|
||||
}
|
||||
|
||||
|
||||
int pullType = 0;
|
||||
if (type == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||
notifyReceivers.add(fromUser);
|
||||
notifyReceivers.add(message.getConversation().getTarget());
|
||||
@@ -195,8 +257,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||
notifyReceivers.add(message.getToUser());
|
||||
} else if(!message.getToList().isEmpty()) {
|
||||
notifyReceivers.addAll(message.getToList());
|
||||
} else if(message.getToList()!=null && !message.getToList().isEmpty()) {
|
||||
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 {
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
||||
@@ -233,14 +304,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (channelInfo != null) {
|
||||
notifyReceivers.add(fromUser);
|
||||
if (channelInfo.getOwner().equals(fromUser)) {
|
||||
if (StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
||||
notifyReceivers.addAll(listeners.get(message.getConversation().getTarget()));
|
||||
} else {
|
||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
||||
if (listeners.values().contains(message.getToUser())) {
|
||||
Collection<String> listeners = getChannelListener(message.getConversation().getTarget());
|
||||
if (!StringUtil.isNullOrEmpty(message.getToUser())) {
|
||||
if (listeners.contains(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 {
|
||||
if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) {
|
||||
@@ -351,8 +427,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||
if (System.currentTimeMillis() < bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
size += bundle.getMessage().getSerializedSize();
|
||||
if (size >= 512 * 1024) { //3M
|
||||
if(builder.getMessageCount() == 0){
|
||||
builder.addMessage(bundle.getMessage());
|
||||
}
|
||||
break;
|
||||
}
|
||||
builder.addMessage(bundle.getMessage());
|
||||
@@ -531,13 +616,29 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
@Override
|
||||
public boolean checkUserClientInChatroom(String user, String clientId, String chatroomId) {
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -687,7 +788,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
List<WFCMessage.GroupMember> tmp = new ArrayList<>();
|
||||
ArrayList<String> newInviteUsers = new ArrayList<>();
|
||||
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);
|
||||
newInviteUsers.add(member.getMemberId());
|
||||
}
|
||||
@@ -1188,8 +1293,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (members == null || members.size() == 0) {
|
||||
members = loadGroupMemberFromDB(hzInstance, groupId);
|
||||
}
|
||||
for (WFCMessage.GroupMember member : members
|
||||
) {
|
||||
|
||||
boolean isInGroup = false;
|
||||
for (WFCMessage.GroupMember member : members) {
|
||||
if (member.getMemberId().equals(memberId)) {
|
||||
if (member.getType() == GroupMemberType_Silent) {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
@@ -1202,11 +1308,16 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (member.getMemberId().equals(memberId) && member.getType() == GroupMemberType_Removed) {
|
||||
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||
}
|
||||
isInGroup = true;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (!isInGroup) {
|
||||
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||
}
|
||||
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -1340,7 +1451,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) {
|
||||
public ErrorCode modifyUserInfo(String userId, WFCMessage.ModifyMyInfoRequest request) throws Exception {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||
|
||||
@@ -1389,7 +1500,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Social:
|
||||
|
||||
builder.setSocial(entry.getValue());
|
||||
modified = true;
|
||||
break;
|
||||
case Modify_Extra:
|
||||
builder.setExtra(entry.getValue());
|
||||
@@ -1403,8 +1515,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (modified) {
|
||||
builder.setUpdateDt(System.currentTimeMillis());
|
||||
user = builder.build();
|
||||
databaseStore.updateUser(user);
|
||||
mUserMap.set(userId, user);
|
||||
// databaseStore.updateUser(user);
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
} else {
|
||||
return ErrorCode.ERROR_CODE_NOT_MODIFIED;
|
||||
@@ -1449,9 +1561,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addUserInfo(WFCMessage.User user, String password) {
|
||||
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||
databaseStore.updateUser(user);
|
||||
mUserMap.put(user.getUid(), user);
|
||||
databaseStore.updateUserPassword(user.getUid(), password);
|
||||
}
|
||||
@@ -1462,7 +1575,13 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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();
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -1492,8 +1611,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return getUserInfo(userId);
|
||||
}
|
||||
@Override
|
||||
public List<WFCMessage.User> searchUser(String keyword, boolean buzzy, int page) {
|
||||
return databaseStore.searchUserFromDB(keyword, buzzy, page);
|
||||
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
|
||||
return databaseStore.searchUserFromDB(keyword, searchType, page);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1618,27 +1737,49 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBlacked(String fromUser, String userId) {
|
||||
public ErrorCode isAllowUserMessage(String targetUser, String fromUser) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
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) {
|
||||
friendDatas = loadFriend(friendsMap, fromUser);
|
||||
friendDatas = loadFriend(friendsMap, targetUser);
|
||||
}
|
||||
|
||||
for (FriendData friendData : friendDatas) {
|
||||
if (friendData.getFriendUid().equals(userId)) {
|
||||
if (friendData.getFriendUid().equals(fromUser)) {
|
||||
if (friendData.getBlacked() == 1) {
|
||||
return true;
|
||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||
} 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
|
||||
@@ -1821,9 +1962,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
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
|
||||
&& System.currentTimeMillis() - existRequest.getUpdateDt() < 30 * 24 * 60 * 60 * 1000) {
|
||||
&& System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_BLOCKED;
|
||||
}
|
||||
} else {
|
||||
@@ -1899,9 +2040,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
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 {
|
||||
friendData1.setState(request.getStatus());
|
||||
friendData1.setExtra(request.getExtra());
|
||||
friendData1.setTimestamp(System.currentTimeMillis());
|
||||
}
|
||||
|
||||
@@ -1921,7 +2063,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
}
|
||||
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 {
|
||||
friendsMap.remove(request.getTargetUid(), friendData2);
|
||||
friendData2.setState(request.getStatus());
|
||||
@@ -1955,29 +2097,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
if (existRequest != null) {
|
||||
if (System.currentTimeMillis() - existRequest.getUpdateDt() > 7 * 24 * 60 * 60 * 1000) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_OVERTIME;
|
||||
if (mFriendRequestExpiration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestExpiration) {
|
||||
return ErrorCode.ERROR_CODE_FRIEND_REQUEST_EXPIRED;
|
||||
} 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);
|
||||
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());
|
||||
databaseStore.persistOrUpdateFriendData(friendData1);
|
||||
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getExtra(), 0, 0, friendData1.getTimestamp());
|
||||
databaseStore.persistOrUpdateFriendData(friendData2);
|
||||
|
||||
FriendData friendData2 = new FriendData(request.getTargetUid(), userId, "", 0, 0, friendData1.getTimestamp());
|
||||
databaseStore.persistOrUpdateFriendData(friendData2);
|
||||
requestMap.remove(userId);
|
||||
requestMap.remove(request.getTargetUid());
|
||||
friendsMap.remove(userId);
|
||||
friendsMap.remove(request.getTargetUid());
|
||||
|
||||
requestMap.remove(userId);
|
||||
requestMap.remove(request.getTargetUid());
|
||||
friendsMap.remove(userId);
|
||||
friendsMap.remove(request.getTargetUid());
|
||||
heads[0] = friendData2.getTimestamp();
|
||||
heads[1] = friendData1.getTimestamp();
|
||||
|
||||
heads[0] = friendData2.getTimestamp();
|
||||
heads[1] = friendData1.getTimestamp();
|
||||
|
||||
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());
|
||||
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;
|
||||
}
|
||||
} else {
|
||||
@@ -1992,7 +2135,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} else {
|
||||
state = 0;
|
||||
}
|
||||
|
||||
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||
|
||||
@@ -2010,7 +2153,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
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.setTimestamp(System.currentTimeMillis());
|
||||
@@ -2024,6 +2167,25 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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
|
||||
public ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] heads){
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
@@ -2088,6 +2250,18 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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
|
||||
public ErrorCode deleteFriend(String userId, String friendUid, long[] head) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
@@ -2179,6 +2353,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2387,8 +2562,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
else if(modifyType == Modify_Channel_OnlyCallback) {
|
||||
try {
|
||||
newInfoBuilder.setAutomatic(Integer.parseInt(value));
|
||||
} catch (NumberFormatException e) {
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2442,7 +2618,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
WFCMessage.ChannelInfo.Builder newInfoBuilder = oldInfo.toBuilder();
|
||||
|
||||
newInfoBuilder.setStatus(Channel_Status_Destoryed);
|
||||
newInfoBuilder.setStatus(oldInfo.getStatus() | Channel_State_Mask_Deleted);
|
||||
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
|
||||
mIMap.put(channelId, newInfoBuilder.build());
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
@@ -2458,6 +2634,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
MultiMap<String, String> listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS);
|
||||
|
||||
getChannelListener(channelId);
|
||||
|
||||
if (listen) {
|
||||
listeners.put(channelId, operator);
|
||||
} else {
|
||||
@@ -2468,6 +2646,19 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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
|
||||
public WFCMessage.ChannelInfo getChannelInfo(String channelId) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
@@ -2477,12 +2668,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
@Override
|
||||
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) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(!chatroomMembers.containsEntry(channelId, user)) {
|
||||
if(!chatroomMembers.contains(user)) {
|
||||
IMap<String, WFCMessage.ChannelInfo> mIMap = m_Server.getHazelcastInstance().getMap(CHANNELS);
|
||||
WFCMessage.ChannelInfo info = mIMap.get(channelId);
|
||||
if (info == null || !info.getOwner().equals(user)) {
|
||||
@@ -2492,10 +2683,20 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
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
|
||||
public Set<String> handleSensitiveWord(String message) {
|
||||
updateSensitiveWord();
|
||||
return mSensitiveFilter.get().getSensitiveWords(message, SensitiveFilter.MatchType.MAX_MATCH);
|
||||
return mSensitiveFilter.getSensitiveWords(message, SensitiveFilter.MatchType.MAX_MATCH);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -2638,7 +2839,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
return UUIDGenerator.getUUID();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void storeRetained(Topic topic, StoredMessage storedMessage) {
|
||||
LOG.debug("Store retained message for topic={}, CId={}", topic, storedMessage.getClientID());
|
||||
|
||||
@@ -29,6 +29,7 @@ import io.moquette.spi.IMessagesStore.StoredMessage;
|
||||
import io.netty.handler.codec.mqtt.MqttVersion;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.*;
|
||||
@@ -272,11 +273,15 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
supportMultiEndpoint = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.SERVER_MULTI_ENDPOINT));
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Session getSession(String clientID) {
|
||||
if (StringUtil.isNullOrEmpty(clientID)) {
|
||||
return null;
|
||||
}
|
||||
Session session = sessions.get(clientID);
|
||||
if (session == null) {
|
||||
LOG.error("Can't find the session for client <{}>", clientID);
|
||||
@@ -285,7 +290,7 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
}
|
||||
|
||||
@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) {
|
||||
return;
|
||||
}
|
||||
@@ -293,7 +298,7 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
Iterator<Map.Entry<String, Session>> it = sessions.entrySet().iterator();
|
||||
while (it.hasNext()) {
|
||||
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 = null;
|
||||
}
|
||||
}
|
||||
@@ -328,15 +333,24 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Session createUserSession(String username, String clientID, int platform) {
|
||||
public Session updateOrCreateUserSession(String username, String clientID, int platform) {
|
||||
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);
|
||||
Session session = databaseStore.getSession(username, clientID, clientSession);
|
||||
session = databaseStore.getSession(username, clientID, clientSession);
|
||||
|
||||
if (session == null) {
|
||||
session = databaseStore.createSession(username, clientID, clientSession, platform);
|
||||
}
|
||||
sessions.put(clientID, session);
|
||||
|
||||
|
||||
if (session.getDeleted() > 0) {
|
||||
session.setDeleted(0);
|
||||
@@ -367,8 +381,8 @@ public class MemorySessionStore implements ISessionsStore {
|
||||
if (s.getPlatform() == ProtoConstants.Platform.Platform_Android || s.getPlatform() == ProtoConstants.Platform.Platform_iOS) {
|
||||
remove = true;
|
||||
}
|
||||
} else if(platform == ProtoConstants.Platform.Platform_OSX || platform == ProtoConstants.Platform.Platform_Windows) {
|
||||
if (s.getPlatform() == ProtoConstants.Platform.Platform_OSX || s.getPlatform() == 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 || platform == ProtoConstants.Platform.Platform_Linux) {
|
||||
remove = true;
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -19,7 +19,7 @@ import java.util.Map;
|
||||
public class UserLoader implements MapStore<String, WFCMessage.User> {
|
||||
@Override
|
||||
public void store(String s, WFCMessage.User user) {
|
||||
getDatabaseStore().updateUser(user);
|
||||
// getDatabaseStore().updateUser(user);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -35,11 +35,13 @@ import io.moquette.spi.IStore;
|
||||
import io.moquette.spi.impl.ProtocolProcessor;
|
||||
import io.moquette.spi.impl.ProtocolProcessorBootstrapper;
|
||||
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.IAuthorizator;
|
||||
import io.moquette.spi.security.ISslContextCreator;
|
||||
import io.moquette.spi.security.Tokenor;
|
||||
import io.netty.util.ResourceLeakDetector;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
import win.liyufan.im.DBUtil;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
@@ -387,6 +389,14 @@ public class Server {
|
||||
hazelcastInstance.getCluster().getLocalMember().setIntAttribute(HZ_Cluster_Node_ID, nodeId);
|
||||
hazelcastInstance.getCluster().getLocalMember().setStringAttribute(HZ_Cluster_Node_External_IP, serverIp);
|
||||
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -103,7 +103,7 @@ public class NettyMQTTHandler extends ChannelInboundHandlerAdapter {
|
||||
String clientID = NettyUtils.clientID(ctx.channel());
|
||||
if (clientID != null && !clientID.isEmpty()) {
|
||||
LOG.info("Notifying connection lost event. MqttClientId = {}.", clientID);
|
||||
m_processor.processConnectionLost(clientID, ctx.channel());
|
||||
m_processor.processConnectionLost(clientID, ctx.channel(), false);
|
||||
}
|
||||
ctx.close();
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import cn.wildfirechat.proto.WFCMessage;
|
||||
import com.xiaoleilu.loServer.model.FriendData;
|
||||
import cn.wildfirechat.pojos.InputOutputUserBlockStatus;
|
||||
import io.moquette.persistence.DatabaseStore;
|
||||
import io.moquette.persistence.MemorySessionStore;
|
||||
import io.moquette.persistence.UserClientEntry;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
@@ -98,7 +99,7 @@ public interface IMessagesStore {
|
||||
DatabaseStore getDatabaseStore();
|
||||
WFCMessage.Message storeMessage(String fromUser, String fromClientId, WFCMessage.Message message);
|
||||
void storeSensitiveMessage(WFCMessage.Message message);
|
||||
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers);
|
||||
int getNotifyReceivers(String fromUser, WFCMessage.Message.Builder message, Set<String> notifyReceivers, boolean ignoreMsg);
|
||||
Set<String> getAllEnds();
|
||||
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
||||
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
|
||||
@@ -128,18 +129,18 @@ public interface IMessagesStore {
|
||||
WFCMessage.Robot getRobot(String robotId);
|
||||
void addRobot(WFCMessage.Robot robot);
|
||||
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);
|
||||
int getUserStatus(String userId);
|
||||
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 getUserInfoByName(String name);
|
||||
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);
|
||||
SystemSettingPojo getSystemSetting(int id);
|
||||
@@ -166,13 +167,16 @@ public interface IMessagesStore {
|
||||
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
|
||||
ErrorCode deleteFriend(String userId, String friendUid, 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);
|
||||
boolean isBlacked(String fromUser, String userId);
|
||||
ErrorCode isAllowUserMessage(String fromUser, String userId);
|
||||
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
||||
|
||||
ErrorCode handleJoinChatroom(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);
|
||||
WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key);
|
||||
List<WFCMessage.UserSettingEntry> getUserSetting(String userId, int scope);
|
||||
@@ -192,6 +196,7 @@ public interface IMessagesStore {
|
||||
ErrorCode listenChannel(String operator, String channelId, boolean listen);
|
||||
WFCMessage.ChannelInfo getChannelInfo(String channelId);
|
||||
boolean checkUserInChannel(String user, String channelId);
|
||||
Collection<String> getChannelSubscriber(String channelId);
|
||||
|
||||
Set<String> handleSensitiveWord(String message);
|
||||
boolean addSensitiveWords(List<String> words);
|
||||
|
||||
@@ -38,7 +38,7 @@ public interface ISessionsStore {
|
||||
*/
|
||||
boolean contains(String clientID);
|
||||
|
||||
Session createUserSession(String username, String clientID, int platform);
|
||||
Session updateOrCreateUserSession(String username, String clientID, int platform);
|
||||
|
||||
ErrorCode loadActiveSession(String username, String clientID);
|
||||
|
||||
@@ -46,7 +46,7 @@ public interface ISessionsStore {
|
||||
|
||||
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);
|
||||
|
||||
|
||||
@@ -18,11 +18,14 @@ package io.moquette.spi.impl;
|
||||
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import cn.wildfirechat.push.PushServer;
|
||||
import com.google.gson.Gson;
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
import com.hazelcast.util.StringUtil;
|
||||
import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus;
|
||||
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.MemorySessionStore.Session;
|
||||
import io.moquette.server.ConnectionDescriptorStore;
|
||||
@@ -87,6 +90,7 @@ public class MessagesPublisher {
|
||||
Thread.sleep(1000);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
chatroomScheduler.shutdown();
|
||||
}
|
||||
@@ -216,7 +220,7 @@ public class MessagesPublisher {
|
||||
targetSession.refreshLastChatroomActiveTime();
|
||||
}
|
||||
|
||||
if(System.currentTimeMillis() - targetSession.getLastChatroomActiveTime() > 5*60*1000) {
|
||||
if (!m_messagesStore.checkChatroomParticipantIdelTime(targetSession)) {
|
||||
m_messagesStore.handleQuitChatroom(user, targetSession.getClientID(), target);
|
||||
continue;
|
||||
}
|
||||
@@ -315,11 +319,19 @@ public class MessagesPublisher {
|
||||
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
||||
|
||||
if(!nameLoaded) {
|
||||
senderName = getUserDisplayName(sender);
|
||||
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
|
||||
targetName = getTargetName(target, conversationType);
|
||||
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);
|
||||
|
||||
for (Session targetSession : sessions) {
|
||||
if(System.currentTimeMillis() - targetSession.getLastActiveTime() > 60 * 60 * 1000) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (targetSession.getClientID() == null) {
|
||||
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);
|
||||
String userName = 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) {
|
||||
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||
return getUserDisplayName(targetId);
|
||||
return getUserDisplayName(targetId, null);
|
||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
||||
if(group != null) {
|
||||
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;
|
||||
}
|
||||
|
||||
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);
|
||||
String fromUserName = null;
|
||||
for (Session targetSession : sessions) {
|
||||
boolean needPush = !StringUtil.isNullOrEmpty(pushContent);
|
||||
boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID);
|
||||
if (targetIsActive) {
|
||||
ByteBuf payload = Unpooled.buffer();
|
||||
@@ -392,9 +426,24 @@ public class MessagesPublisher {
|
||||
boolean result = this.messageSender.sendPublish(targetSession.getClientSession(), publishMsg);
|
||||
if (!result) {
|
||||
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) {
|
||||
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.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);
|
||||
}
|
||||
|
||||
|
||||
@@ -17,7 +17,14 @@
|
||||
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 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.interception.InterceptHandler;
|
||||
import io.moquette.interception.messages.InterceptAcknowledgedMessage;
|
||||
@@ -39,9 +46,12 @@ import io.netty.handler.codec.mqtt.*;
|
||||
import io.netty.handler.timeout.IdleStateHandler;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.HttpUtils;
|
||||
import win.liyufan.im.Utility;
|
||||
|
||||
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.Utils.readBytesAndRewind;
|
||||
@@ -58,7 +68,7 @@ import static io.moquette.server.ConnectionDescriptor.ConnectionState.*;
|
||||
*/
|
||||
|
||||
public class ProtocolProcessor {
|
||||
|
||||
private static ExecutorService executorCallback = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
|
||||
|
||||
public void kickoffSession(final MemorySessionStore.Session session) {
|
||||
mServer.getImBusinessScheduler().execute(()->{
|
||||
@@ -99,8 +109,6 @@ public class ProtocolProcessor {
|
||||
|
||||
protected ConnectionDescriptorStore connectionDescriptors;
|
||||
|
||||
private boolean allowAnonymous;
|
||||
private boolean allowZeroByteClientId;
|
||||
private IAuthorizator m_authorizator;
|
||||
|
||||
private IMessagesStore m_messagesStore;
|
||||
@@ -137,8 +145,6 @@ public class ProtocolProcessor {
|
||||
LOG.info("Initializing MQTT protocol processor...");
|
||||
this.connectionDescriptors = connectionDescriptors;
|
||||
this.m_interceptor = interceptor;
|
||||
this.allowAnonymous = false;
|
||||
this.allowZeroByteClientId = false;
|
||||
m_authorizator = authorizator;
|
||||
m_authenticator = authenticator;
|
||||
m_messagesStore = storageService;
|
||||
@@ -153,8 +159,15 @@ public class ProtocolProcessor {
|
||||
this.connectionDescriptors, this.messagesPublisher, sessionsStore, server.getImBusinessScheduler(), 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) {
|
||||
MqttConnectPayload payload = msg.payload();
|
||||
String clientId = payload.clientIdentifier();
|
||||
@@ -182,9 +195,7 @@ public class ProtocolProcessor {
|
||||
|
||||
MqttVersion mqttVersion = MqttVersion.fromProtocolLevel(msg.variableHeader().version());
|
||||
if (!login(channel, msg, clientId, mqttVersion)) {
|
||||
MqttConnAckMessage badId = connAck(CONNECTION_REFUSED_BAD_USER_NAME_OR_PASSWORD);
|
||||
|
||||
channel.writeAndFlush(badId);
|
||||
channel.flush();
|
||||
channel.close();
|
||||
LOG.error("The MQTT login failure. Username={}", payload.userName());
|
||||
return;
|
||||
@@ -232,11 +243,20 @@ public class ProtocolProcessor {
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
||||
if(session != null) {
|
||||
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());
|
||||
}
|
||||
|
||||
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) {
|
||||
return connAck(returnCode, false);
|
||||
}
|
||||
@@ -265,7 +285,7 @@ public class ProtocolProcessor {
|
||||
// handle user authentication
|
||||
if (msg.variableHeader().hasUserName()) {
|
||||
int status = m_messagesStore.getUserStatus(msg.payload().userName());
|
||||
if (status == 2) {
|
||||
if (status == ProtoConstants.UserStatus.Forbidden) {
|
||||
failedBlocked(channel);
|
||||
return false;
|
||||
}
|
||||
@@ -277,12 +297,15 @@ public class ProtocolProcessor {
|
||||
if (session == null) {
|
||||
ErrorCode errorCode = m_sessionsStore.loadActiveSession(msg.payload().userName(), clientId);
|
||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
failedNoSession(channel);
|
||||
return false;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -300,7 +323,7 @@ public class ProtocolProcessor {
|
||||
return false;
|
||||
}
|
||||
session.setMqttVersion(mqttVersion);
|
||||
} else if (!this.allowAnonymous) {
|
||||
} else {
|
||||
LOG.error("Client didn't supply any password and MQTT anonymous mode is disabled CId={}", clientId);
|
||||
failedCredentials(channel);
|
||||
return false;
|
||||
@@ -312,12 +335,12 @@ public class ProtocolProcessor {
|
||||
return false;
|
||||
}
|
||||
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);
|
||||
failedCredentials(channel);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean sendAck(ConnectionDescriptor descriptor, MqttConnectMessage msg, final String clientId) {
|
||||
@@ -493,7 +516,7 @@ public class ProtocolProcessor {
|
||||
}
|
||||
|
||||
if (!clearSession) {
|
||||
processConnectionLost(clientID, channel);
|
||||
processConnectionLost(clientID, channel, clearSession);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -534,9 +557,16 @@ public class ProtocolProcessor {
|
||||
|
||||
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();
|
||||
|
||||
//disconnect the session
|
||||
|
||||
m_sessionsStore.sessionForClient(clientID).disconnect(clearSession);
|
||||
}
|
||||
|
||||
@@ -567,17 +597,21 @@ public class ProtocolProcessor {
|
||||
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);
|
||||
|
||||
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);
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -128,23 +128,25 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
||||
String userId = new String(payloadContent);
|
||||
|
||||
int status;
|
||||
ClientSession clientSession = m_sessionStore.sessionForClient(userId);
|
||||
if (clientSession == null) {
|
||||
status = 2;
|
||||
} else {
|
||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(clientSession.clientID);
|
||||
Collection<MemorySessionStore.Session> useSessions = m_sessionStore.sessionForUser(userId);
|
||||
OutputCheckUserOnline out = new OutputCheckUserOnline();
|
||||
|
||||
for (MemorySessionStore.Session session : useSessions) {
|
||||
if (session.getDeleted() > 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
||||
if (descriptor == null) {
|
||||
status = 1;
|
||||
} else {
|
||||
status = 0;
|
||||
}
|
||||
|
||||
out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime());
|
||||
}
|
||||
|
||||
OutputCheckUserOnline out = new OutputCheckUserOnline();
|
||||
out.setStatus(status);
|
||||
RestResult result = RestResult.ok(out);
|
||||
|
||||
callback.onRouteHandled(new Gson().toJson(result).getBytes());
|
||||
callback.onRouteHandled(new Gson().toJson(out).getBytes());
|
||||
});
|
||||
}
|
||||
|
||||
@@ -179,15 +181,17 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
||||
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
|
||||
if (session != null && session.getUsername().equals(fromUser)) {
|
||||
if (data.length > 7*1024 && session.getMqttVersion().protocolLevel() >= MqttVersion.Wildfire_1.protocolLevel()) {
|
||||
try (
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzip = new GZIPOutputStream(out)
|
||||
) {
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzip;
|
||||
try {
|
||||
gzip = new GZIPOutputStream(out);
|
||||
gzip.write(data);
|
||||
data = out.toByteArray();
|
||||
gzip.close();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
}
|
||||
data = out.toByteArray();
|
||||
code = (byte)ErrorCode.ERROR_CODE_SUCCESS_GZIPED.code;
|
||||
}
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ import io.moquette.spi.impl.security.AES;
|
||||
|
||||
public class Tokenor {
|
||||
private static String KEY = "testim";
|
||||
private static long expiredTime = Long.MAX_VALUE;
|
||||
|
||||
public static void setKey(String 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) {
|
||||
try {
|
||||
String signKey =
|
||||
@@ -21,8 +26,8 @@ public class Tokenor {
|
||||
if (signKey.startsWith(KEY + "|")) {
|
||||
signKey = signKey.substring(KEY.length() + 1);
|
||||
long timestamp = Long.parseLong(signKey.substring(0, signKey.indexOf('|')));
|
||||
if (System.currentTimeMillis() - timestamp > 7 * 24 * 60 *60 *1000) {
|
||||
//return false;
|
||||
if (expiredTime > 0 && System.currentTimeMillis() - timestamp > expiredTime) {
|
||||
return null;
|
||||
}
|
||||
String id = signKey.substring(signKey.indexOf('|') + 1);
|
||||
return id;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.34</version>
|
||||
<version>0.39</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ public interface APIPath {
|
||||
String Create_Chatroom = "/admin/chatroom/create";
|
||||
String Chatroom_Destroy = "/admin/chatroom/del";
|
||||
String Chatroom_Info = "/admin/chatroom/info";
|
||||
String Chatroom_GetMembers = "/admin/chatroom/members";
|
||||
|
||||
|
||||
String Sensitive_Add = "/admin/sensitive/add";
|
||||
@@ -23,6 +24,10 @@ public interface APIPath {
|
||||
|
||||
String Friend_Update_Status = "/admin/friend/status";
|
||||
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_Recall = "/admin/message/recall";
|
||||
@@ -37,6 +42,7 @@ public interface APIPath {
|
||||
String Group_Member_List = "/admin/group/member/list";
|
||||
String Group_Member_Add = "/admin/group/member/add";
|
||||
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 Get_User_Groups = "/admin/group/of_user";
|
||||
|
||||
@@ -45,8 +51,12 @@ public interface APIPath {
|
||||
String Get_System_Setting = "/admin/system/get_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_Subscribe = "/channel/subscribe";
|
||||
String Channel_Subscriber_List = "/channel/subscriber_list";
|
||||
|
||||
String Robot_User_Info = "/robot/user_info";
|
||||
String Robot_Message_Send = "/robot/message/send";
|
||||
|
||||
@@ -36,7 +36,7 @@ public enum ErrorCode {
|
||||
//user error
|
||||
ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),
|
||||
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"),
|
||||
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <[email protected]>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package 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 <[email protected]>
|
||||
*
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,6 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
@@ -22,7 +21,7 @@ public class InputCreateChannel {
|
||||
private int auto;
|
||||
private String secret;
|
||||
private String desc;
|
||||
private int status;
|
||||
private int state;
|
||||
private String extra;
|
||||
private long updateDt;
|
||||
|
||||
@@ -41,7 +40,7 @@ public class InputCreateChannel {
|
||||
builder = builder.setSecret(secret);
|
||||
if (!StringUtil.isNullOrEmpty(desc))
|
||||
builder = builder.setDesc(desc);
|
||||
builder = builder.setStatus(status);
|
||||
builder = builder.setStatus(state);
|
||||
if (!StringUtil.isNullOrEmpty(extra))
|
||||
builder = builder.setExtra(extra);
|
||||
if (!StringUtil.isNullOrEmpty(name))
|
||||
@@ -116,12 +115,12 @@ public class InputCreateChannel {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
public int getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
public void setState(int state) {
|
||||
this.state = state;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
|
||||
@@ -13,6 +13,7 @@ public class InputFriendRequest {
|
||||
private String userId;
|
||||
private String friendUid;
|
||||
private int status;
|
||||
private String extra;
|
||||
|
||||
|
||||
public String getUserId() {
|
||||
@@ -38,4 +39,12 @@ public class InputFriendRequest {
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
}
|
||||
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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 InputGetAlias {
|
||||
private String operator;
|
||||
private String targetId;
|
||||
|
||||
public String getTargetId() {
|
||||
return targetId;
|
||||
}
|
||||
|
||||
public void setTargetId(String targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
}
|
||||
@@ -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.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class InputModifyChannelInfo {
|
||||
private int type;
|
||||
private String value;
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public String getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@ public class InputOutputUserInfo {
|
||||
private String company;
|
||||
private String social;
|
||||
private String extra;
|
||||
private int type;
|
||||
private long updateDt;
|
||||
|
||||
public static InputOutputUserInfo fromPbUser(WFCMessage.User pbUser) {
|
||||
@@ -39,6 +40,7 @@ public class InputOutputUserInfo {
|
||||
inputCreateUser.company = pbUser.getCompany();
|
||||
inputCreateUser.social = pbUser.getSocial();
|
||||
inputCreateUser.extra = pbUser.getExtra();
|
||||
inputCreateUser.type = pbUser.getType();
|
||||
inputCreateUser.updateDt = pbUser.getUpdateDt();
|
||||
return inputCreateUser;
|
||||
}
|
||||
@@ -74,6 +76,7 @@ public class InputOutputUserInfo {
|
||||
if (getExtra() != null)
|
||||
newUserBuilder.setExtra(getExtra());
|
||||
newUserBuilder.setGender(gender);
|
||||
newUserBuilder.setType(type);
|
||||
|
||||
newUserBuilder.setUpdateDt(System.currentTimeMillis());
|
||||
return newUserBuilder.build();
|
||||
@@ -174,4 +177,12 @@ public class InputOutputUserInfo {
|
||||
public void setGender(int gender) {
|
||||
this.gender = gender;
|
||||
}
|
||||
|
||||
public int getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(int type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InputQuitGroup extends InputGroupBase {
|
||||
private String group_id;
|
||||
|
||||
public String getGroup_id() {
|
||||
return group_id;
|
||||
}
|
||||
|
||||
public void setGroup_id(String group_id) {
|
||||
this.group_id = group_id;
|
||||
}
|
||||
|
||||
public boolean isValide() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public WFCMessage.QuitGroupRequest toProtoGroupRequest() {
|
||||
WFCMessage.QuitGroupRequest.Builder removedGroupBuilder = WFCMessage.QuitGroupRequest.newBuilder();
|
||||
removedGroupBuilder.setGroupId(group_id);
|
||||
|
||||
if (to_lines != null) {
|
||||
for (Integer line : to_lines
|
||||
) {
|
||||
removedGroupBuilder.addToLine(line);
|
||||
}
|
||||
}
|
||||
|
||||
if (notify_message != null) {
|
||||
removedGroupBuilder.setNotifyContent(notify_message.toProtoMessageContent());
|
||||
}
|
||||
return removedGroupBuilder.build();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
public class InputUpdateAlias {
|
||||
private String operator;
|
||||
private String targetId;
|
||||
private String alias;
|
||||
|
||||
public String getTargetId() {
|
||||
return targetId;
|
||||
}
|
||||
|
||||
public void setTargetId(String targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
}
|
||||
@@ -8,14 +8,39 @@
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class OutputCheckUserOnline {
|
||||
private int status; //0 online, 1 have session offline, 2 no session
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
public class OutputCheckUserOnline {
|
||||
public static class Session {
|
||||
public String clientId;
|
||||
public String userId;
|
||||
public int platform;
|
||||
public int status; //0 online, 1 have session offline
|
||||
public long lastSeen;
|
||||
|
||||
public Session(String clientId, String userId, int platform, int status, long lastSeen) {
|
||||
this.clientId = clientId;
|
||||
this.userId = userId;
|
||||
this.platform = platform;
|
||||
this.status = status;
|
||||
this.lastSeen = lastSeen;
|
||||
}
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
public void addSession(String userId, String clientId, int platform, int status, long lastSeen) {
|
||||
Session session = new Session(clientId, userId, platform, status, lastSeen);
|
||||
sessions.add(session);
|
||||
}
|
||||
|
||||
private List<Session> sessions = new ArrayList<>();
|
||||
|
||||
public List<Session> getSessions() {
|
||||
return sessions;
|
||||
}
|
||||
|
||||
public void setSessions(List<Session> sessions) {
|
||||
this.sessions = sessions;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,9 +13,11 @@ import cn.wildfirechat.proto.WFCMessage;
|
||||
|
||||
public class OutputCreateChannel {
|
||||
private String targetId;
|
||||
private String secret;
|
||||
|
||||
public OutputCreateChannel(String targetId) {
|
||||
public OutputCreateChannel(String targetId, String secret) {
|
||||
this.targetId = targetId;
|
||||
this.secret = secret;
|
||||
}
|
||||
|
||||
public String getTargetId() {
|
||||
@@ -25,4 +27,12 @@ public class OutputCreateChannel {
|
||||
public void setTargetId(String targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getSecret() {
|
||||
return secret;
|
||||
}
|
||||
|
||||
public void setSecret(String secret) {
|
||||
this.secret = secret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* 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 OutputGetAlias {
|
||||
private String operator;
|
||||
private String targetId;
|
||||
private String alias;
|
||||
|
||||
public OutputGetAlias() {
|
||||
}
|
||||
|
||||
public OutputGetAlias(String operator, String targetId) {
|
||||
this.operator = operator;
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getTargetId() {
|
||||
return targetId;
|
||||
}
|
||||
|
||||
public void setTargetId(String targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getOperator() {
|
||||
return operator;
|
||||
}
|
||||
|
||||
public void setOperator(String operator) {
|
||||
this.operator = operator;
|
||||
}
|
||||
|
||||
public String getAlias() {
|
||||
return alias;
|
||||
}
|
||||
|
||||
public void setAlias(String alias) {
|
||||
this.alias = alias;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
|
||||
public class OutputGetChannelInfo {
|
||||
private String channelId;
|
||||
private String name;
|
||||
private String desc;
|
||||
private String portrait;
|
||||
private String extra;
|
||||
private String owner;
|
||||
private int status;
|
||||
private long updateDt;
|
||||
private String callback;
|
||||
private int automatic;
|
||||
|
||||
|
||||
public String getChannelId() {
|
||||
return channelId;
|
||||
}
|
||||
|
||||
public void setChannelId(String channelId) {
|
||||
this.channelId = channelId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public String getDesc() {
|
||||
return desc;
|
||||
}
|
||||
|
||||
public void setDesc(String desc) {
|
||||
this.desc = desc;
|
||||
}
|
||||
|
||||
public String getPortrait() {
|
||||
return portrait;
|
||||
}
|
||||
|
||||
public void setPortrait(String portrait) {
|
||||
this.portrait = portrait;
|
||||
}
|
||||
|
||||
public String getExtra() {
|
||||
return extra;
|
||||
}
|
||||
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public String getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public void setOwner(String owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
public int getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(int status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public long getUpdateDt() {
|
||||
return updateDt;
|
||||
}
|
||||
|
||||
public void setUpdateDt(long updateDt) {
|
||||
this.updateDt = updateDt;
|
||||
}
|
||||
|
||||
public String getCallback() {
|
||||
return callback;
|
||||
}
|
||||
|
||||
public void setCallback(String callback) {
|
||||
this.callback = callback;
|
||||
}
|
||||
|
||||
public int getAutomatic() {
|
||||
return automatic;
|
||||
}
|
||||
|
||||
public void setAutomatic(int automatic) {
|
||||
this.automatic = automatic;
|
||||
}
|
||||
|
||||
public static OutputGetChannelInfo fromPbInfo(WFCMessage.ChannelInfo channelInfo) {
|
||||
OutputGetChannelInfo out = new OutputGetChannelInfo();
|
||||
out.automatic = channelInfo.getAutomatic();
|
||||
out.callback = channelInfo.getCallback();
|
||||
out.channelId = channelInfo.getTargetId();
|
||||
out.desc = channelInfo.getDesc();
|
||||
out.extra = channelInfo.getExtra();
|
||||
out.name = channelInfo.getName();
|
||||
out.owner = channelInfo.getOwner();
|
||||
out.portrait = channelInfo.getPortrait();
|
||||
out.status = channelInfo.getStatus();
|
||||
out.updateDt = channelInfo.getUpdateDt();
|
||||
return out;
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ public class OutputGetChatroomInfo {
|
||||
private String desc;
|
||||
private String portrait;
|
||||
private String extra;
|
||||
private int state;
|
||||
private int memberCount;
|
||||
private long createDt;
|
||||
private long updateDt;
|
||||
@@ -28,6 +29,8 @@ public class OutputGetChatroomInfo {
|
||||
this.desc = chatroomInfo.getDesc();
|
||||
this.portrait = chatroomInfo.getPortrait();
|
||||
this.memberCount = memberCount;
|
||||
this.extra = chatroomInfo.getExtra();
|
||||
this.state = chatroomInfo.getState();
|
||||
this.createDt = chatroomInfo.getCreateDt();
|
||||
this.updateDt = chatroomInfo.getUpdateDt();
|
||||
}
|
||||
@@ -98,4 +101,12 @@ public class OutputGetChatroomInfo {
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public int getState() {
|
||||
return state;
|
||||
}
|
||||
|
||||
public void setState(int state) {
|
||||
this.state = state;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class OutputStringList {
|
||||
private List<String> list;
|
||||
|
||||
public OutputStringList() {
|
||||
}
|
||||
|
||||
public OutputStringList(List<String> list) {
|
||||
this.list = list;
|
||||
}
|
||||
|
||||
public List<String> getList() {
|
||||
return list;
|
||||
}
|
||||
|
||||
public void setList(List<String> list) {
|
||||
this.list = list;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* This file is part of the Wildfire Chat package.
|
||||
* (c) Heavyrain2012 <heavyrain.lee@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SendChannelMessageData {
|
||||
private List<String> targets;
|
||||
private int line;
|
||||
private MessagePayload payload;
|
||||
|
||||
public List<String> getTargets() {
|
||||
return targets;
|
||||
}
|
||||
|
||||
public void setTargets(List<String> targets) {
|
||||
this.targets = targets;
|
||||
}
|
||||
|
||||
public int getLine() {
|
||||
return line;
|
||||
}
|
||||
|
||||
public void setLine(int line) {
|
||||
this.line = line;
|
||||
}
|
||||
|
||||
public MessagePayload getPayload() {
|
||||
return payload;
|
||||
}
|
||||
|
||||
public void setPayload(MessagePayload payload) {
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
public static boolean isValide(SendChannelMessageData sendMessageData) {
|
||||
if(sendMessageData == null ||
|
||||
sendMessageData.getPayload() == null) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public WFCMessage.Message toProtoMessage(String channelId, String channelOwner) {
|
||||
if (targets == null) {
|
||||
targets = new ArrayList<>();
|
||||
}
|
||||
|
||||
return WFCMessage.Message.newBuilder().setFromUser(channelOwner)
|
||||
.setConversation(WFCMessage.Conversation.newBuilder().setType(ProtoConstants.ConversationType.ConversationType_Channel).setTarget(channelId).setLine(line))
|
||||
.addAllTo(targets)
|
||||
.setContent(payload.toProtoMessageContent())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
@@ -12,10 +12,13 @@ import cn.wildfirechat.proto.ProtoConstants;
|
||||
import cn.wildfirechat.proto.WFCMessage;
|
||||
import io.netty.util.internal.StringUtil;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class SendMessageData {
|
||||
private String sender;
|
||||
private Conversation conv;
|
||||
private MessagePayload payload;
|
||||
private List<String> toUsers;
|
||||
|
||||
public String getSender() {
|
||||
return sender;
|
||||
@@ -41,6 +44,14 @@ public class SendMessageData {
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
public List<String> getToUsers() {
|
||||
return toUsers;
|
||||
}
|
||||
|
||||
public void setToUsers(List<String> toUsers) {
|
||||
this.toUsers = toUsers;
|
||||
}
|
||||
|
||||
public static boolean isValide(SendMessageData sendMessageData) {
|
||||
if(sendMessageData == null ||
|
||||
sendMessageData.getConv() == null ||
|
||||
@@ -55,10 +66,18 @@ public class SendMessageData {
|
||||
}
|
||||
|
||||
public WFCMessage.Message toProtoMessage() {
|
||||
return WFCMessage.Message.newBuilder().setFromUser(sender)
|
||||
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
|
||||
.setContent(payload.toProtoMessageContent())
|
||||
.build();
|
||||
if (toUsers != null && toUsers.size() > 0) {
|
||||
return WFCMessage.Message.newBuilder().setFromUser(sender)
|
||||
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
|
||||
.setContent(payload.toProtoMessageContent())
|
||||
.addAllTo(toUsers)
|
||||
.build();
|
||||
} else {
|
||||
return WFCMessage.Message.newBuilder().setFromUser(sender)
|
||||
.setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine()))
|
||||
.setContent(payload.toProtoMessageContent())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
public static SendMessageData fromProtoMessage(WFCMessage.Message protoMessage) {
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
package cn.wildfirechat.pojos;
|
||||
|
||||
public class UserOnlineStatus {
|
||||
public static final int ONLINE = 0;
|
||||
public static final int OFFLINE = 1;
|
||||
public static final int LOGOUT = -1;
|
||||
|
||||
public String userId;
|
||||
public String clientId;
|
||||
public int platform;
|
||||
public int status;
|
||||
public long timestamp;
|
||||
|
||||
public UserOnlineStatus(String userId, String clientId, int platform, int status) {
|
||||
this.userId = userId;
|
||||
this.clientId = clientId;
|
||||
this.platform = platform;
|
||||
this.status = status;
|
||||
this.timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,8 @@ public class ProtoConstants {
|
||||
int Platform_Windows = 3;
|
||||
int Platform_OSX = 4;
|
||||
int Platform_WEB = 5;
|
||||
int Platform_WX = 6;
|
||||
int Platform_Linux = 7;
|
||||
}
|
||||
|
||||
//message NotifyMessage & PullMessageRequest -> type
|
||||
@@ -114,10 +116,19 @@ public class ProtoConstants {
|
||||
}
|
||||
|
||||
//Channel -> status
|
||||
public interface ChannelStatus {
|
||||
int Channel_Status_Public = 0;
|
||||
int Channel_Status_Private = 1;
|
||||
int Channel_Status_Destoryed = 2;
|
||||
//第0位表示是否允许查看用户所有信息,还是只允许看用户id,用户名称,用户昵称和用户头像
|
||||
//第1位表示是否允许查看非订阅用户信息
|
||||
//第2位表示是否允许主动添加用户订阅关系
|
||||
//第3位表示是否允许给非订阅用户发送消息
|
||||
//第4位表示是否私有
|
||||
//第6位表示是否删除
|
||||
public interface ChannelState {
|
||||
int Channel_State_Mask_FullInfo = 0x01;
|
||||
int Channel_State_Mask_Unsubscribed_User_Access = 0x02;
|
||||
int Channel_State_Mask_Active_Subscribe = 0x04;
|
||||
int Channel_State_Mask_Message_Unsubscribed = 0x08;
|
||||
int Channel_State_Mask_Private = 0x10;
|
||||
int Channel_State_Mask_Deleted = 0x40;
|
||||
}
|
||||
|
||||
|
||||
@@ -125,6 +136,8 @@ public class ProtoConstants {
|
||||
int UserType_Normal = 0;
|
||||
int UserType_Robot = 1;
|
||||
int UserType_Device = 2;
|
||||
int UserType_Admin = 3;
|
||||
int UserType_Super_Admin = 100;
|
||||
}
|
||||
|
||||
|
||||
@@ -132,6 +145,23 @@ public class ProtoConstants {
|
||||
int Group_Max_Member_Count = 1;
|
||||
}
|
||||
|
||||
public interface SearchUserType {
|
||||
int SearchUserType_General = 0;
|
||||
int SearchUserType_Name_Mobile = 1;
|
||||
int SearchUserType_Name = 2;
|
||||
int SearchUserType_Mobile = 3;
|
||||
}
|
||||
|
||||
public interface UserStatus {
|
||||
int Normal = 0;
|
||||
int Muted = 1;
|
||||
int Forbidden = 2;
|
||||
}
|
||||
|
||||
public interface BlacklistStrategy {
|
||||
int Message_Reject = 0;
|
||||
int Message_Ignore = 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19039,6 +19039,21 @@ public final class WFCMessage {
|
||||
* <code>required int32 status = 2;</code>
|
||||
*/
|
||||
int getStatus();
|
||||
|
||||
// optional string extra = 3;
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
boolean hasExtra();
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
java.lang.String getExtra();
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getExtraBytes();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code HandleFriendRequest}
|
||||
@@ -19101,6 +19116,11 @@ public final class WFCMessage {
|
||||
status_ = input.readInt32();
|
||||
break;
|
||||
}
|
||||
case 26: {
|
||||
bitField0_ |= 0x00000004;
|
||||
extra_ = input.readBytes();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
@@ -19200,9 +19220,53 @@ public final class WFCMessage {
|
||||
return status_;
|
||||
}
|
||||
|
||||
// optional string extra = 3;
|
||||
public static final int EXTRA_FIELD_NUMBER = 3;
|
||||
private java.lang.Object extra_;
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public boolean hasExtra() {
|
||||
return ((bitField0_ & 0x00000004) == 0x00000004);
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public java.lang.String getExtra() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
return (java.lang.String) ref;
|
||||
} else {
|
||||
com.google.protobuf.ByteString bs =
|
||||
(com.google.protobuf.ByteString) ref;
|
||||
java.lang.String s = bs.toStringUtf8();
|
||||
if (bs.isValidUtf8()) {
|
||||
extra_ = s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getExtraBytes() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
extra_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
|
||||
private void initFields() {
|
||||
targetUid_ = "";
|
||||
status_ = 0;
|
||||
extra_ = "";
|
||||
}
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
@@ -19230,6 +19294,9 @@ public final class WFCMessage {
|
||||
if (((bitField0_ & 0x00000002) == 0x00000002)) {
|
||||
output.writeInt32(2, status_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
||||
output.writeBytes(3, getExtraBytes());
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
@@ -19247,6 +19314,10 @@ public final class WFCMessage {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32Size(2, status_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000004) == 0x00000004)) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeBytesSize(3, getExtraBytes());
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
@@ -19367,6 +19438,8 @@ public final class WFCMessage {
|
||||
bitField0_ = (bitField0_ & ~0x00000001);
|
||||
status_ = 0;
|
||||
bitField0_ = (bitField0_ & ~0x00000002);
|
||||
extra_ = "";
|
||||
bitField0_ = (bitField0_ & ~0x00000004);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -19403,6 +19476,10 @@ public final class WFCMessage {
|
||||
to_bitField0_ |= 0x00000002;
|
||||
}
|
||||
result.status_ = status_;
|
||||
if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
|
||||
to_bitField0_ |= 0x00000004;
|
||||
}
|
||||
result.extra_ = extra_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
@@ -19427,6 +19504,11 @@ public final class WFCMessage {
|
||||
if (other.hasStatus()) {
|
||||
setStatus(other.getStatus());
|
||||
}
|
||||
if (other.hasExtra()) {
|
||||
bitField0_ |= 0x00000004;
|
||||
extra_ = other.extra_;
|
||||
onChanged();
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
@@ -19569,6 +19651,80 @@ public final class WFCMessage {
|
||||
return this;
|
||||
}
|
||||
|
||||
// optional string extra = 3;
|
||||
private java.lang.Object extra_ = "";
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public boolean hasExtra() {
|
||||
return ((bitField0_ & 0x00000004) == 0x00000004);
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public java.lang.String getExtra() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (!(ref instanceof java.lang.String)) {
|
||||
java.lang.String s = ((com.google.protobuf.ByteString) ref)
|
||||
.toStringUtf8();
|
||||
extra_ = s;
|
||||
return s;
|
||||
} else {
|
||||
return (java.lang.String) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getExtraBytes() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
extra_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public Builder setExtra(
|
||||
java.lang.String value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00000004;
|
||||
extra_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public Builder clearExtra() {
|
||||
bitField0_ = (bitField0_ & ~0x00000004);
|
||||
extra_ = getDefaultInstance().getExtra();
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 3;</code>
|
||||
*/
|
||||
public Builder setExtraBytes(
|
||||
com.google.protobuf.ByteString value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00000004;
|
||||
extra_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:HandleFriendRequest)
|
||||
}
|
||||
|
||||
@@ -45347,6 +45503,21 @@ public final class WFCMessage {
|
||||
* <code>optional int32 blacked = 5;</code>
|
||||
*/
|
||||
int getBlacked();
|
||||
|
||||
// optional string extra = 6;
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
boolean hasExtra();
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
java.lang.String getExtra();
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getExtraBytes();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code Friend}
|
||||
@@ -45424,6 +45595,11 @@ public final class WFCMessage {
|
||||
blacked_ = input.readInt32();
|
||||
break;
|
||||
}
|
||||
case 50: {
|
||||
bitField0_ |= 0x00000020;
|
||||
extra_ = input.readBytes();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
@@ -45598,12 +45774,56 @@ public final class WFCMessage {
|
||||
return blacked_;
|
||||
}
|
||||
|
||||
// optional string extra = 6;
|
||||
public static final int EXTRA_FIELD_NUMBER = 6;
|
||||
private java.lang.Object extra_;
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public boolean hasExtra() {
|
||||
return ((bitField0_ & 0x00000020) == 0x00000020);
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public java.lang.String getExtra() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
return (java.lang.String) ref;
|
||||
} else {
|
||||
com.google.protobuf.ByteString bs =
|
||||
(com.google.protobuf.ByteString) ref;
|
||||
java.lang.String s = bs.toStringUtf8();
|
||||
if (bs.isValidUtf8()) {
|
||||
extra_ = s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getExtraBytes() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
extra_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
|
||||
private void initFields() {
|
||||
uid_ = "";
|
||||
state_ = 0;
|
||||
updateDt_ = 0L;
|
||||
alias_ = "";
|
||||
blacked_ = 0;
|
||||
extra_ = "";
|
||||
}
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
@@ -45644,6 +45864,9 @@ public final class WFCMessage {
|
||||
if (((bitField0_ & 0x00000010) == 0x00000010)) {
|
||||
output.writeInt32(5, blacked_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000020) == 0x00000020)) {
|
||||
output.writeBytes(6, getExtraBytes());
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
@@ -45673,6 +45896,10 @@ public final class WFCMessage {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeInt32Size(5, blacked_);
|
||||
}
|
||||
if (((bitField0_ & 0x00000020) == 0x00000020)) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeBytesSize(6, getExtraBytes());
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
@@ -45799,6 +46026,8 @@ public final class WFCMessage {
|
||||
bitField0_ = (bitField0_ & ~0x00000008);
|
||||
blacked_ = 0;
|
||||
bitField0_ = (bitField0_ & ~0x00000010);
|
||||
extra_ = "";
|
||||
bitField0_ = (bitField0_ & ~0x00000020);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -45847,6 +46076,10 @@ public final class WFCMessage {
|
||||
to_bitField0_ |= 0x00000010;
|
||||
}
|
||||
result.blacked_ = blacked_;
|
||||
if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
|
||||
to_bitField0_ |= 0x00000020;
|
||||
}
|
||||
result.extra_ = extra_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
@@ -45882,6 +46115,11 @@ public final class WFCMessage {
|
||||
if (other.hasBlacked()) {
|
||||
setBlacked(other.getBlacked());
|
||||
}
|
||||
if (other.hasExtra()) {
|
||||
bitField0_ |= 0x00000020;
|
||||
extra_ = other.extra_;
|
||||
onChanged();
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
@@ -46168,6 +46406,80 @@ public final class WFCMessage {
|
||||
return this;
|
||||
}
|
||||
|
||||
// optional string extra = 6;
|
||||
private java.lang.Object extra_ = "";
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public boolean hasExtra() {
|
||||
return ((bitField0_ & 0x00000020) == 0x00000020);
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public java.lang.String getExtra() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (!(ref instanceof java.lang.String)) {
|
||||
java.lang.String s = ((com.google.protobuf.ByteString) ref)
|
||||
.toStringUtf8();
|
||||
extra_ = s;
|
||||
return s;
|
||||
} else {
|
||||
return (java.lang.String) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getExtraBytes() {
|
||||
java.lang.Object ref = extra_;
|
||||
if (ref instanceof String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
extra_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public Builder setExtra(
|
||||
java.lang.String value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00000020;
|
||||
extra_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public Builder clearExtra() {
|
||||
bitField0_ = (bitField0_ & ~0x00000020);
|
||||
extra_ = getDefaultInstance().getExtra();
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string extra = 6;</code>
|
||||
*/
|
||||
public Builder setExtraBytes(
|
||||
com.google.protobuf.ByteString value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00000020;
|
||||
extra_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:Friend)
|
||||
}
|
||||
|
||||
@@ -60429,109 +60741,110 @@ public final class WFCMessage {
|
||||
"edia_type\030\001 \002(\005\022\022\n\nmedia_path\030\002 \002(\t\"S\n\024G" +
|
||||
"etUploadTokenResult\022\016\n\006domain\030\001 \002(\t\022\r\n\005t" +
|
||||
"oken\030\002 \002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004port\030\004 \001(\005" +
|
||||
"\"9\n\023HandleFriendRequest\022\022\n\ntarget_uid\030\001 " +
|
||||
"\002(\t\022\016\n\006status\030\002 \002(\005\"\023\n\005IDBuf\022\n\n\002id\030\001 \002(\t" +
|
||||
"\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Message\022#\n" +
|
||||
"\014conversation\030\001 \002(\0132\r.Conversation\022\021\n\tfr" +
|
||||
"om_user\030\002 \002(\t\022 \n\007content\030\003 \002(\0132\017.Message" +
|
||||
"Content\022\022\n\nmessage_id\030\004 \001(\003\022\030\n\020server_ti",
|
||||
"mestamp\030\005 \001(\003\022\017\n\007to_user\030\006 \001(\t\022\n\n\002to\030\007 \003" +
|
||||
"(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022\014\n\004name\030\002 \001(\t\022\024" +
|
||||
"\n\014display_name\030\003 \001(\t\022\020\n\010portrait\030\004 \001(\t\022\016" +
|
||||
"\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\017\n\007address" +
|
||||
"\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r\n\005extra\030\t \001(\t\022\021" +
|
||||
"\n\tupdate_dt\030\n \001(\003\022\016\n\006gender\030\013 \001(\005\022\016\n\006soc" +
|
||||
"ial\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007deleted\030\016 \001(\005" +
|
||||
"\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n" +
|
||||
"\005owner\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\020\n\010callback" +
|
||||
"\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017GetRobotsResult",
|
||||
"\022\025\n\005entry\030\001 \003(\0132\006.Robot\"P\n\005Thing\022\013\n\003uid\030" +
|
||||
"\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005token\030\003 \002(\t\022\r\n\005o" +
|
||||
"wner\030\004 \001(\t\022\r\n\005extra\030\005 \001(\t\"(\n\017GetThingsRe" +
|
||||
"sult\022\025\n\005entry\030\001 \003(\0132\006.Thing\"g\n\030UploadDev" +
|
||||
"iceTokenRequest\022\020\n\010platform\030\001 \002(\005\022\020\n\010app" +
|
||||
"_name\030\002 \002(\t\022\024\n\014device_token\030\003 \002(\t\022\021\n\tpus" +
|
||||
"h_type\030\004 \002(\005\"\201\001\n\026ModifyGroupInfoRequest\022" +
|
||||
"\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005value" +
|
||||
"\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_conten" +
|
||||
"t\030\005 \001(\0132\017.MessageContent\"\203\001\n\026SetGroupMan",
|
||||
"agerRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 " +
|
||||
"\002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n" +
|
||||
"\016notify_content\030\005 \001(\0132\017.MessageContent\"(" +
|
||||
"\n\tInfoEntry\022\014\n\004type\030\001 \002(\005\022\r\n\005value\030\002 \002(\t" +
|
||||
"\"0\n\023ModifyMyInfoRequest\022\031\n\005entry\030\001 \003(\0132\n" +
|
||||
".InfoEntry\";\n\rNotifyMessage\022\014\n\004type\030\001 \002(" +
|
||||
"\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target\030\003 \001(\t\"=\n\022PullM" +
|
||||
"essageRequest\022\n\n\002id\030\001 \002(\003\022\014\n\004type\030\002 \002(\005\022" +
|
||||
"\r\n\005delay\030\003 \001(\003\"M\n\021PullMessageResult\022\031\n\007m" +
|
||||
"essage\030\001 \003(\0132\010.Message\022\017\n\007current\030\002 \002(\003\022",
|
||||
"\014\n\004head\030\003 \002(\003\"/\n\023PullGroupInfoResult\022\030\n\004" +
|
||||
"info\030\001 \003(\0132\n.GroupInfo\"6\n\026PullGroupMembe" +
|
||||
"rRequest\022\016\n\006target\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"5" +
|
||||
"\n\025PullGroupMemberResult\022\034\n\006member\030\001 \003(\0132" +
|
||||
"\014.GroupMember\"-\n\013UserRequest\022\013\n\003uid\030\001 \002(" +
|
||||
"\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017PullUserRequest\022" +
|
||||
"\035\n\007request\030\001 \003(\0132\014.UserRequest\"/\n\nUserRe" +
|
||||
"sult\022\023\n\004user\030\001 \002(\0132\005.User\022\014\n\004code\030\002 \002(\005\"" +
|
||||
"-\n\016PullUserResult\022\033\n\006result\030\001 \003(\0132\013.User" +
|
||||
"Result\"^\n\020QuitGroupRequest\022\020\n\010group_id\030\001",
|
||||
" \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030" +
|
||||
"\003 \001(\0132\017.MessageContent\"~\n\030RemoveGroupMem" +
|
||||
"berRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n\016removed_" +
|
||||
"member\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_" +
|
||||
"content\030\004 \001(\0132\017.MessageContent\"u\n\024Transf" +
|
||||
"erGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\021\n\tnew_" +
|
||||
"owner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_c" +
|
||||
"ontent\030\004 \001(\0132\017.MessageContent\"s\n\026ModifyG" +
|
||||
"roupMemberAlias\022\020\n\010group_id\030\001 \002(\t\022\r\n\005ali" +
|
||||
"as\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_cont",
|
||||
"ent\030\004 \001(\0132\017.MessageContent\"P\n\020UserSettin" +
|
||||
"gEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005va" +
|
||||
"lue\030\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyUs" +
|
||||
"erSettingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t" +
|
||||
"\022\r\n\005value\030\003 \002(\t\"\032\n\007Version\022\017\n\007version\030\001 " +
|
||||
"\002(\003\"8\n\024GetUserSettingResult\022 \n\005entry\030\001 \003" +
|
||||
"(\0132\021.UserSettingEntry\"W\n\006Friend\022\013\n\003uid\030\001" +
|
||||
" \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tupdate_dt\030\003 \002(\003\022\r" +
|
||||
"\n\005alias\030\004 \001(\t\022\017\n\007blacked\030\005 \001(\005\"*\n\020GetFri" +
|
||||
"endsResult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026Ge",
|
||||
"tFriendRequestResult\022\035\n\005entry\030\001 \003(\0132\016.Fr" +
|
||||
"iendRequest\"\243\001\n\021ConnectAckPayload\022\020\n\010msg" +
|
||||
"_head\030\001 \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016frie" +
|
||||
"nd_rq_head\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021" +
|
||||
"\n\tnode_addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013" +
|
||||
"server_time\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005to" +
|
||||
"ken\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030" +
|
||||
"\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021SearchUserRequest" +
|
||||
"\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page" +
|
||||
"\030\003 \001(\005\"(\n\020SearchUserResult\022\024\n\005entry\030\001 \003(",
|
||||
"\0132\005.User\"@\n\026GetChatroomInfoRequest\022\023\n\013ch" +
|
||||
"atroom_id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014C" +
|
||||
"hatroomInfo\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t" +
|
||||
"\022\020\n\010portrait\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005" +
|
||||
"\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r" +
|
||||
"\n\005extra\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatr" +
|
||||
"oomMemberInfoRequest\022\023\n\013chatroom_id\030\001 \002(" +
|
||||
"\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022ChatroomMemberIn" +
|
||||
"fo\022\024\n\014member_count\030\001 \001(\005\022\017\n\007members\030\002 \003(" +
|
||||
"\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecal",
|
||||
"lMessage\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"" +
|
||||
"/\n\020BlackUserRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006stat" +
|
||||
"us\030\002 \002(\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020" +
|
||||
"\n\010platform\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013d" +
|
||||
"evice_name\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t" +
|
||||
"\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024" +
|
||||
"\n\014carrier_name\030\010 \001(\t\022\023\n\013app_version\030\t \001(" +
|
||||
"\t\022\023\n\013sdk_version\030\n \001(\t\"D\n\rRouteResponse\022" +
|
||||
"\014\n\004host\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshor" +
|
||||
"t_port\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_",
|
||||
"id\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030" +
|
||||
"\003 \001(\005\"\\\n\022LoadRemoteMessages\022#\n\014conversat" +
|
||||
"ion\030\001 \002(\0132\r.Conversation\022\022\n\nbefore_uid\030\002" +
|
||||
" \002(\003\022\r\n\005count\030\003 \002(\005\"a\n\020MultiCastMessage\022" +
|
||||
"\021\n\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.Me" +
|
||||
"ssageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#" +
|
||||
"\n\025cn.wildfirechat.protoB\nWFCMessage"
|
||||
"\"H\n\023HandleFriendRequest\022\022\n\ntarget_uid\030\001 " +
|
||||
"\002(\t\022\016\n\006status\030\002 \002(\005\022\r\n\005extra\030\003 \001(\t\"\023\n\005ID" +
|
||||
"Buf\022\n\n\002id\030\001 \002(\t\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t" +
|
||||
"\"\256\001\n\007Message\022#\n\014conversation\030\001 \002(\0132\r.Con" +
|
||||
"versation\022\021\n\tfrom_user\030\002 \002(\t\022 \n\007content\030" +
|
||||
"\003 \002(\0132\017.MessageContent\022\022\n\nmessage_id\030\004 \001",
|
||||
"(\003\022\030\n\020server_timestamp\030\005 \001(\003\022\017\n\007to_user\030" +
|
||||
"\006 \001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022" +
|
||||
"\014\n\004name\030\002 \001(\t\022\024\n\014display_name\030\003 \001(\t\022\020\n\010p" +
|
||||
"ortrait\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006" +
|
||||
" \001(\t\022\017\n\007address\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r" +
|
||||
"\n\005extra\030\t \001(\t\022\021\n\tupdate_dt\030\n \001(\003\022\016\n\006gend" +
|
||||
"er\030\013 \001(\005\022\016\n\006social\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017" +
|
||||
"\n\007deleted\030\016 \001(\005\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n" +
|
||||
"\005state\030\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n\006secret\030\004 " +
|
||||
"\001(\t\022\020\n\010callback\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017",
|
||||
"GetRobotsResult\022\025\n\005entry\030\001 \003(\0132\006.Robot\"P" +
|
||||
"\n\005Thing\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005t" +
|
||||
"oken\030\003 \002(\t\022\r\n\005owner\030\004 \001(\t\022\r\n\005extra\030\005 \001(\t" +
|
||||
"\"(\n\017GetThingsResult\022\025\n\005entry\030\001 \003(\0132\006.Thi" +
|
||||
"ng\"g\n\030UploadDeviceTokenRequest\022\020\n\010platfo" +
|
||||
"rm\030\001 \002(\005\022\020\n\010app_name\030\002 \002(\t\022\024\n\014device_tok" +
|
||||
"en\030\003 \002(\t\022\021\n\tpush_type\030\004 \002(\005\"\201\001\n\026ModifyGr" +
|
||||
"oupInfoRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type" +
|
||||
"\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'" +
|
||||
"\n\016notify_content\030\005 \001(\0132\017.MessageContent\"",
|
||||
"\203\001\n\026SetGroupManagerRequest\022\020\n\010group_id\030\001" +
|
||||
" \002(\t\022\014\n\004type\030\002 \002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007t" +
|
||||
"o_line\030\004 \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017.M" +
|
||||
"essageContent\"(\n\tInfoEntry\022\014\n\004type\030\001 \002(\005" +
|
||||
"\022\r\n\005value\030\002 \002(\t\"0\n\023ModifyMyInfoRequest\022\031" +
|
||||
"\n\005entry\030\001 \003(\0132\n.InfoEntry\";\n\rNotifyMessa" +
|
||||
"ge\022\014\n\004type\030\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target" +
|
||||
"\030\003 \001(\t\"=\n\022PullMessageRequest\022\n\n\002id\030\001 \002(\003" +
|
||||
"\022\014\n\004type\030\002 \002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021PullMes" +
|
||||
"sageResult\022\031\n\007message\030\001 \003(\0132\010.Message\022\017\n",
|
||||
"\007current\030\002 \002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023PullGrou" +
|
||||
"pInfoResult\022\030\n\004info\030\001 \003(\0132\n.GroupInfo\"6\n" +
|
||||
"\026PullGroupMemberRequest\022\016\n\006target\030\001 \002(\t\022" +
|
||||
"\014\n\004head\030\002 \002(\003\"5\n\025PullGroupMemberResult\022\034" +
|
||||
"\n\006member\030\001 \003(\0132\014.GroupMember\"-\n\013UserRequ" +
|
||||
"est\022\013\n\003uid\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017P" +
|
||||
"ullUserRequest\022\035\n\007request\030\001 \003(\0132\014.UserRe" +
|
||||
"quest\"/\n\nUserResult\022\023\n\004user\030\001 \002(\0132\005.User" +
|
||||
"\022\014\n\004code\030\002 \002(\005\"-\n\016PullUserResult\022\033\n\006resu" +
|
||||
"lt\030\001 \003(\0132\013.UserResult\"^\n\020QuitGroupReques",
|
||||
"t\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016" +
|
||||
"notify_content\030\003 \001(\0132\017.MessageContent\"~\n" +
|
||||
"\030RemoveGroupMemberRequest\022\020\n\010group_id\030\001 " +
|
||||
"\002(\t\022\026\n\016removed_member\030\002 \003(\t\022\017\n\007to_line\030\003" +
|
||||
" \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.MessageCo" +
|
||||
"ntent\"u\n\024TransferGroupRequest\022\020\n\010group_i" +
|
||||
"d\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to_line\030\003 " +
|
||||
"\003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.MessageCon" +
|
||||
"tent\"s\n\026ModifyGroupMemberAlias\022\020\n\010group_" +
|
||||
"id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005",
|
||||
"\022\'\n\016notify_content\030\004 \001(\0132\017.MessageConten" +
|
||||
"t\"P\n\020UserSettingEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003" +
|
||||
"key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\022\021\n\tupdate_dt\030\004 " +
|
||||
"\002(\003\"A\n\024ModifyUserSettingReq\022\r\n\005scope\030\001 \002" +
|
||||
"(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Versio" +
|
||||
"n\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSettingResu" +
|
||||
"lt\022 \n\005entry\030\001 \003(\0132\021.UserSettingEntry\"f\n\006" +
|
||||
"Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tup" +
|
||||
"date_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007blacked\030" +
|
||||
"\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsResult",
|
||||
"\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026GetFriendReq" +
|
||||
"uestResult\022\035\n\005entry\030\001 \003(\0132\016.FriendReques" +
|
||||
"t\"\243\001\n\021ConnectAckPayload\022\020\n\010msg_head\030\001 \001(" +
|
||||
"\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016friend_rq_head" +
|
||||
"\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021\n\tnode_add" +
|
||||
"r\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013server_tim" +
|
||||
"e\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005token\030\001 \002(\t\022" +
|
||||
"\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004d" +
|
||||
"ata\030\004 \001(\014\"A\n\021SearchUserRequest\022\017\n\007keywor" +
|
||||
"d\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020",
|
||||
"SearchUserResult\022\024\n\005entry\030\001 \003(\0132\005.User\"@" +
|
||||
"\n\026GetChatroomInfoRequest\022\023\n\013chatroom_id\030" +
|
||||
"\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014ChatroomInf" +
|
||||
"o\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portra" +
|
||||
"it\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcreate" +
|
||||
"_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 " +
|
||||
"\001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatroomMemberI" +
|
||||
"nfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tmax_c" +
|
||||
"ount\030\002 \001(\005\";\n\022ChatroomMemberInfo\022\024\n\014memb" +
|
||||
"er_count\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64",
|
||||
"Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecallMessage\022\n" +
|
||||
"\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020BlackUs" +
|
||||
"erRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323" +
|
||||
"\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010platform" +
|
||||
"\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_name" +
|
||||
"\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t\022\022\n\nphone_" +
|
||||
"name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carrier_" +
|
||||
"name\030\010 \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sdk_v" +
|
||||
"ersion\030\n \001(\t\"D\n\rRouteResponse\022\014\n\004host\030\001 " +
|
||||
"\002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_port\030\003 \002",
|
||||
"(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 \002(\t\022\021" +
|
||||
"\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"\\\n\022L" +
|
||||
"oadRemoteMessages\022#\n\014conversation\030\001 \002(\0132" +
|
||||
"\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005co" +
|
||||
"unt\030\003 \002(\005\"a\n\020MultiCastMessage\022\021\n\tfrom_us" +
|
||||
"er\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.MessageConte" +
|
||||
"nt\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#\n\025cn.wildf" +
|
||||
"irechat.protoB\nWFCMessage"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
@@ -60669,7 +60982,7 @@ public final class WFCMessage {
|
||||
internal_static_HandleFriendRequest_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_HandleFriendRequest_descriptor,
|
||||
new java.lang.String[] { "TargetUid", "Status", });
|
||||
new java.lang.String[] { "TargetUid", "Status", "Extra", });
|
||||
internal_static_IDBuf_descriptor =
|
||||
getDescriptor().getMessageTypes().get(22);
|
||||
internal_static_IDBuf_fieldAccessorTable = new
|
||||
@@ -60861,7 +61174,7 @@ public final class WFCMessage {
|
||||
internal_static_Friend_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_Friend_descriptor,
|
||||
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", "Blacked", });
|
||||
new java.lang.String[] { "Uid", "State", "UpdateDt", "Alias", "Blacked", "Extra", });
|
||||
internal_static_GetFriendsResult_descriptor =
|
||||
getDescriptor().getMessageTypes().get(54);
|
||||
internal_static_GetFriendsResult_fieldAccessorTable = new
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<relativePath>../pom.xml</relativePath>-->
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.34</version>
|
||||
<version>0.39</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>distribution</artifactId>
|
||||
|
||||
@@ -19,6 +19,11 @@
|
||||
<directory>../broker/migrate/h2/</directory>
|
||||
<outputDirectory>/migrate/h2</outputDirectory>
|
||||
</fileSet>
|
||||
|
||||
<fileSet>
|
||||
<directory>../broker/config/i18n/</directory>
|
||||
<outputDirectory>/config/i18n</outputDirectory>
|
||||
</fileSet>
|
||||
</fileSets>
|
||||
|
||||
<files>
|
||||
|
||||
@@ -57,6 +57,13 @@
|
||||
</map-store>
|
||||
</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"/>
|
||||
|
||||
<multimap name="user_setting">
|
||||
|
||||
@@ -28,8 +28,8 @@ log4j.logger.io.moquette.parser.netty=WARN
|
||||
log4j.appender.file=org.apache.log4j.RollingFileAppender
|
||||
log4j.appender.file.Threshold=INFO
|
||||
log4j.appender.file.File=logs/wildfirechat.log
|
||||
log4j.appender.file.MaxFileSize=10MB
|
||||
log4j.appender.file.MaxBackupIndex=20
|
||||
log4j.appender.file.MaxFileSize=20MB
|
||||
log4j.appender.file.MaxBackupIndex=100
|
||||
log4j.appender.file.layout=org.apache.log4j.PatternLayout
|
||||
#log4j.appender.file.layout.ConversionPattern=%-4r [%t] %-5p %c{1} %x - %m%n
|
||||
log4j.appender.file.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n
|
||||
@@ -41,7 +41,7 @@ log4j.appender.messagelog=org.apache.log4j.RollingFileAppender
|
||||
log4j.appender.messagelog.Threshold=WARN
|
||||
log4j.appender.messagelog.File=logs/wildfirechat_messages.log
|
||||
log4j.appender.messagelog.MaxFileSize=100MB
|
||||
log4j.appender.messagelog.MaxBackupIndex=1
|
||||
log4j.appender.messagelog.MaxBackupIndex=3
|
||||
log4j.appender.messagelog.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.messagelog.layout.ConversionPattern=%d{dd/MM/yyyy HH:mm:ss,SSS} [%t] %-5p %c{1} %L %x - %m%n
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ http.admin.secret_key 123456
|
||||
|
||||
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
|
||||
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
|
||||
http.admin.no_check_time true
|
||||
http.admin.no_check_time false
|
||||
|
||||
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥对安全性帮助不大,客户不要修改
|
||||
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
|
||||
@@ -43,6 +43,9 @@ client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0
|
||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||
token.key testim
|
||||
|
||||
##token的过期时间,单位为毫秒,默认为无限期。如果需要设置无限期,客户端上一定需要加上token过期的处理。token过期的处理请参考文档的常见问题
|
||||
##token.expire_time 2592000000
|
||||
|
||||
##首次登录,是否接收之前的历史消息。0 不接收;1接收。
|
||||
message.roaming 0
|
||||
|
||||
@@ -52,6 +55,27 @@ 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
|
||||
#*********************************************************************
|
||||
@@ -110,6 +134,14 @@ push.android.server.address http://localhost:8085/android/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
|
||||
#*********************************************************************
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
<version>0.34</version>
|
||||
<version>0.39</version>
|
||||
<name>Wildfire Chat</name>
|
||||
<description>Wildfire Chat Server</description>
|
||||
<inceptionYear>2019</inceptionYear>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user