Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
509048da04 | ||
|
|
15f7777d78 | ||
|
|
45b1b9cf96 | ||
|
|
57314e673a | ||
|
|
0a7b8f9587 | ||
|
|
c8ff39c2ab | ||
|
|
252204a760 | ||
|
|
26fbde676e | ||
|
|
81585ec146 | ||
|
|
4ad0437730 | ||
|
|
6245fe37fc | ||
|
|
ca50872913 | ||
|
|
3c11c368a3 | ||
|
|
145709fd76 | ||
|
|
758c5de2c7 | ||
|
|
c159ff90e3 | ||
|
|
083b07fdba | ||
|
|
c6a8462ece | ||
|
|
afee0466e7 | ||
|
|
62b36cd2b4 | ||
|
|
99c5210935 | ||
|
|
75cb7f8b98 | ||
|
|
c89259e892 | ||
|
|
d40835aa18 | ||
|
|
b93c76c6c7 | ||
|
|
c29370ac61 | ||
|
|
68abeed907 | ||
|
|
11b7851b9f | ||
|
|
329791e70e | ||
|
|
b7b262be00 |
@@ -20,7 +20,8 @@
|
|||||||
* 结构设计合理,客户端分功能库、UI库和应用三层。应用成熟完善,开箱即用,也可把SDK嵌入其它应用。
|
* 结构设计合理,客户端分功能库、UI库和应用三层。应用成熟完善,开箱即用,也可把SDK嵌入其它应用。
|
||||||
* 拥有应用开放平台,可以开发和创建自建应用,扩展您的工作台。
|
* 拥有应用开放平台,可以开发和创建自建应用,扩展您的工作台。
|
||||||
* API丰富,方便与其它服务系统的对接。
|
* API丰富,方便与其它服务系统的对接。
|
||||||
* 拥有机器人和公众号功能。
|
* 拥有机器人和公众号功能,免费的频道(公众号)管理后台。
|
||||||
|
* 超级群组功能,可以支持万人大群。
|
||||||
* 社区版IM服务和移动端免费商用,可以免费构建出完备的移动互联网应用。
|
* 社区版IM服务和移动端免费商用,可以免费构建出完备的移动互联网应用。
|
||||||
* 收费项目非常便宜,野火独有的试用模式,可以先部署到客户环境试用6个月,试用满意后再购买,避免上当受骗。
|
* 收费项目非常便宜,野火独有的试用模式,可以先部署到客户环境试用6个月,试用满意后再购买,避免上当受骗。
|
||||||
* 技术支持专业和高效,核心研发人员及时处理issue和论坛回复。
|
* 技术支持专业和高效,核心研发人员及时处理issue和论坛回复。
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
#服务器的接入IP。给客户端提供是${server.ip}和${http_port}。
|
||||||
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
#客户端会从${http_port}端口获取到长链接端口。这个地址一定要改成客户端可以访问到的IP地址
|
||||||
#(如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
#(如果您部署云服务器上或者具有独立公网出口的服务器上,请改为对应的公网IP;如果您部署在在内网环境下,在内网使用,这个地方改成内网地址)
|
||||||
server.ip 192.168.3.124
|
server.ip 192.168.1.81
|
||||||
|
|
||||||
##原生客户端长链接端口
|
##原生客户端长链接端口
|
||||||
port 1883
|
port 1883
|
||||||
@@ -65,6 +65,9 @@ token.key testim
|
|||||||
##是否拒绝空签名的android客户端, 默认为true。当有旧的客户端需要兼容时改成false,当所有都是新客户端时,改成true。
|
##是否拒绝空签名的android客户端, 默认为true。当有旧的客户端需要兼容时改成false,当所有都是新客户端时,改成true。
|
||||||
#connect.reject_empty_signature true
|
#connect.reject_empty_signature true
|
||||||
|
|
||||||
|
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||||
|
#encrypt.use_aes256 true
|
||||||
|
|
||||||
##首次登录,是否接收之前的历史消息。
|
##首次登录,是否接收之前的历史消息。
|
||||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||||
@@ -151,6 +154,9 @@ friend.reject_request_duration 2592000000
|
|||||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||||
friend.request_expiration_duration 604800000
|
friend.request_expiration_duration 604800000
|
||||||
|
|
||||||
|
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||||
|
friend.robot_auto_accept true
|
||||||
|
|
||||||
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
||||||
chatroom.participant_idle_time 900000
|
chatroom.participant_idle_time 900000
|
||||||
|
|
||||||
@@ -320,6 +326,9 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#message.mentionmsg.forward.url http://localhost:8888/im_event/message
|
#message.mentionmsg.forward.url http://localhost:8888/im_event/message
|
||||||
|
|
||||||
|
##撤回消息转发地址,当用户撤回消息会回调此地址。
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
|
#message.recallmsg.forward.url http://localhost:8888/im_event/recall_message
|
||||||
|
|
||||||
##设备信息转发地址
|
##设备信息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
alter table `t_group` add column `_super_group` tinyint NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `t_group_messages`;
|
||||||
|
CREATE TABLE `t_group_messages` (
|
||||||
|
`_mid` bigint(20) NOT NULL PRIMARY KEY,
|
||||||
|
`_sender` varchar(64) NOT NULL,
|
||||||
|
`_gid` varchar(64) NOT NULL,
|
||||||
|
`_line` int(11) NOT NULL,
|
||||||
|
`_client_id` varchar(64) NULL,
|
||||||
|
`_seq` bigint(20) NOT NULL,
|
||||||
|
`_persist_flag` int(11) NOT NULL,
|
||||||
|
`_mentioned_type` int(11) NOT NULL,
|
||||||
|
`_mentioned_targets` BLOB NULL,
|
||||||
|
`_to` BLOB NULL,
|
||||||
|
`_cont_type` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`_duration` int(11) NOT NULL DEFAULT 0,
|
||||||
|
`_dt` bigint(20) NOT NULL DEFAULT 0,
|
||||||
|
INDEX `group_message_seq_uid_index` (`_gid` DESC, `_line`, `_seq` DESC)
|
||||||
|
);
|
||||||
+2722
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.1.2</version>
|
<version>1.1.6</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -80,6 +80,11 @@ public class IMAction extends Action {
|
|||||||
if (userId == null) {
|
if (userId == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_TOKEN_ERROR, null);
|
sendResponse(response, ErrorCode.ERROR_CODE_TOKEN_ERROR, null);
|
||||||
} else {
|
} else {
|
||||||
|
if(messagesStore.getUserStatus(userId) == ProtoConstants.UserStatus.Forbidden) {
|
||||||
|
sendResponse(response, ErrorCode.ERROR_CODE_USER_BLOCKED, null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ServerAPIHelper.sendRequest(userId, wrapper.getClientId(), wrapper.getRequest(), wrapper.getData().toByteArray(), new ServerAPIHelper.Callback() {
|
ServerAPIHelper.sendRequest(userId, wrapper.getClientId(), wrapper.getRequest(), wrapper.getData().toByteArray(), new ServerAPIHelper.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(byte[] result) {
|
public void onSuccess(byte[] result) {
|
||||||
|
|||||||
@@ -39,17 +39,10 @@ public class RouteAction extends Action {
|
|||||||
@Override
|
@Override
|
||||||
public boolean action(Request request, Response response) {
|
public boolean action(Request request, Response response) {
|
||||||
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
|
||||||
response.setContentType("application/octet-stream");
|
response.setContentType("application/octet-stream");
|
||||||
response.setHeader("Access-Control-Allow-Origin", "*");
|
response.setHeader("Access-Control-Allow-Origin", "*");
|
||||||
|
|
||||||
FullHttpRequest fullHttpRequest = (FullHttpRequest) request.getNettyRequest();
|
FullHttpRequest fullHttpRequest = (FullHttpRequest) request.getNettyRequest();
|
||||||
boolean b = false;
|
|
||||||
if ("web".equalsIgnoreCase(fullHttpRequest.headers().get("p"))) {
|
|
||||||
b = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean base64Response = b;
|
|
||||||
|
|
||||||
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
|
byte[] bytes = Utils.readBytesAndRewind(fullHttpRequest.content());
|
||||||
|
|
||||||
@@ -57,15 +50,20 @@ public class RouteAction extends Action {
|
|||||||
try {
|
try {
|
||||||
bytes = Base64.getDecoder().decode(str);
|
bytes = Base64.getDecoder().decode(str);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String cid = fullHttpRequest.headers().get("cid");
|
String cid = fullHttpRequest.headers().get("cid");
|
||||||
byte[] cbytes = Base64.getDecoder().decode(cid);
|
byte[] cbytes = Base64.getDecoder().decode(cid);
|
||||||
cbytes = AES.AESDecrypt(cbytes, "", true);
|
boolean[] invalidTime = new boolean[1];
|
||||||
|
cbytes = AES.AESDecrypt(cbytes, "", true, invalidTime);
|
||||||
if (cbytes == null) {
|
if (cbytes == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
if(invalidTime[0]) {
|
||||||
|
sendResponse(response, ErrorCode.ERROR_CODE_TIME_INCONSISTENT, null);
|
||||||
|
} else {
|
||||||
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
cid = new String(cbytes);
|
cid = new String(cbytes);
|
||||||
@@ -74,7 +72,7 @@ public class RouteAction extends Action {
|
|||||||
byte[] ubytes = Base64.getDecoder().decode(uid);
|
byte[] ubytes = Base64.getDecoder().decode(uid);
|
||||||
ubytes = AES.AESDecrypt(ubytes, "", true);
|
ubytes = AES.AESDecrypt(ubytes, "", true);
|
||||||
if (ubytes == null) {
|
if (ubytes == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
uid = new String(ubytes);
|
uid = new String(ubytes);
|
||||||
@@ -84,7 +82,7 @@ public class RouteAction extends Action {
|
|||||||
if (session == null) {
|
if (session == null) {
|
||||||
ErrorCode errorCode = sessionsStore.loadActiveSession(uid, cid);
|
ErrorCode errorCode = sessionsStore.loadActiveSession(uid, cid);
|
||||||
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
sendResponse(response, errorCode, null, base64Response);
|
sendResponse(response, errorCode, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
session = sessionsStore.sessionForClientAndUser(uid, cid);
|
session = sessionsStore.sessionForClientAndUser(uid, cid);
|
||||||
@@ -94,16 +92,20 @@ public class RouteAction extends Action {
|
|||||||
if (session != null) {
|
if (session != null) {
|
||||||
bytes = AES.AESDecrypt(bytes, session.getSecret(), true);
|
bytes = AES.AESDecrypt(bytes, session.getSecret(), true);
|
||||||
} else {
|
} else {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (bytes == null) {
|
if (bytes == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_SECRECT_KEY_MISMATCH, null);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(messagesStore.getUserStatus(uid) == ProtoConstants.UserStatus.Forbidden) {
|
||||||
|
sendResponse(response, ErrorCode.ERROR_CODE_USER_BLOCKED, null);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
WFCMessage.IMHttpWrapper wrapper = WFCMessage.IMHttpWrapper.parseFrom(bytes);
|
WFCMessage.IMHttpWrapper wrapper = WFCMessage.IMHttpWrapper.parseFrom(bytes);
|
||||||
@@ -111,22 +113,22 @@ public class RouteAction extends Action {
|
|||||||
String userId = Tokenor.getUserId(token.getBytes());
|
String userId = Tokenor.getUserId(token.getBytes());
|
||||||
LOG.info("RouteAction token={}, userId={}", token, userId);
|
LOG.info("RouteAction token={}, userId={}", token, userId);
|
||||||
if (userId == null) {
|
if (userId == null) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_TOKEN_ERROR, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_TOKEN_ERROR, null);
|
||||||
} else {
|
} else {
|
||||||
ServerAPIHelper.sendRequest(userId, wrapper.getClientId(), wrapper.getRequest(), wrapper.getData().toByteArray(), new ServerAPIHelper.Callback() {
|
ServerAPIHelper.sendRequest(userId, wrapper.getClientId(), wrapper.getRequest(), wrapper.getData().toByteArray(), new ServerAPIHelper.Callback() {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(byte[] result) {
|
public void onSuccess(byte[] result) {
|
||||||
sendResponse(response, null, result, base64Response);
|
sendResponse(response, null, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(ErrorCode errorCode) {
|
public void onError(ErrorCode errorCode) {
|
||||||
sendResponse(response, errorCode, null, base64Response);
|
sendResponse(response, errorCode, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTimeout() {
|
public void onTimeout() {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null, base64Response);
|
sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -139,25 +141,21 @@ public class RouteAction extends Action {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (InvalidProtocolBufferException e) {
|
} catch (InvalidProtocolBufferException e) {
|
||||||
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null, false);
|
sendResponse(response, ErrorCode.ERROR_CODE_INVALID_DATA, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendResponse(Response response, ErrorCode errorCode, byte[] contents, boolean base64Response) {
|
private void sendResponse(Response response, ErrorCode errorCode, byte[] contents) {
|
||||||
response.setStatus(HttpResponseStatus.OK);
|
response.setStatus(HttpResponseStatus.OK);
|
||||||
if (contents == null) {
|
if (contents == null) {
|
||||||
ByteBuf ackPayload = Unpooled.buffer();
|
ByteBuf ackPayload = Unpooled.buffer();
|
||||||
ackPayload.ensureWritable(1).writeByte(errorCode.getCode());
|
ackPayload.ensureWritable(1).writeByte(errorCode.getCode());
|
||||||
contents = ackPayload.array();
|
contents = ackPayload.array();
|
||||||
}
|
}
|
||||||
if (base64Response) {
|
|
||||||
byte[] base64Data = Base64.getEncoder().encode(contents);
|
response.setContent(contents);
|
||||||
response.setContent(base64Data);
|
|
||||||
} else {
|
|
||||||
response.setContent(contents);
|
|
||||||
}
|
|
||||||
response.send();
|
response.send();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+59
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* 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.InputGetUserInfo;
|
||||||
|
import cn.wildfirechat.pojos.InputGetUserList;
|
||||||
|
import cn.wildfirechat.pojos.InputOutputUserInfo;
|
||||||
|
import cn.wildfirechat.pojos.OutputGetUserList;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.User_Get_All)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetAllUserAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputGetUserList input = getRequestBody(request.getNettyRequest(), InputGetUserList.class);
|
||||||
|
if (input != null && input.count > 0 && input.offset >= 0) {
|
||||||
|
List<WFCMessage.User> users = messagesStore.getUserInfoList(input.count, input.offset);
|
||||||
|
OutputGetUserList outputGetUserList = new OutputGetUserList();
|
||||||
|
outputGetUserList.userInfoList = new ArrayList<>();
|
||||||
|
for (WFCMessage.User user : users) {
|
||||||
|
outputGetUserList.userInfoList.add(InputOutputUserInfo.fromPbUser(user));
|
||||||
|
}
|
||||||
|
|
||||||
|
RestResult result = RestResult.ok(outputGetUserList);
|
||||||
|
setResponseContent(result, response);
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+69
@@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Wildfire Chat package.
|
||||||
|
* (c) Heavyrain2012 <[email protected]>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.xiaoleilu.loServer.action.admin;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.pojos.InputGetGroup;
|
||||||
|
import cn.wildfirechat.pojos.InputGetGroupMember;
|
||||||
|
import cn.wildfirechat.pojos.OutputGroupMemberList;
|
||||||
|
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Group_Member_Get)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetGroupMemberAction extends AdminAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputGetGroupMember input = getRequestBody(request.getNettyRequest(), InputGetGroupMember.class);
|
||||||
|
if (input != null
|
||||||
|
&& (!StringUtil.isNullOrEmpty(input.getGroupId()))
|
||||||
|
&& (!StringUtil.isNullOrEmpty(input.getMemberId()))) {
|
||||||
|
|
||||||
|
WFCMessage.GroupMember groupMember = messagesStore.getGroupMember(input.getGroupId(), input.getMemberId());
|
||||||
|
|
||||||
|
RestResult result;
|
||||||
|
if (groupMember == null || StringUtil.isNullOrEmpty(groupMember.getMemberId()) || groupMember.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
|
||||||
|
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
|
||||||
|
} else {
|
||||||
|
PojoGroupMember pm = new PojoGroupMember();
|
||||||
|
pm.setMember_id(groupMember.getMemberId());
|
||||||
|
pm.setAlias(groupMember.getAlias());
|
||||||
|
pm.setType(groupMember.getType());
|
||||||
|
pm.setExtra(groupMember.getExtra());
|
||||||
|
pm.setCreateDt(groupMember.getCreateDt());
|
||||||
|
result = RestResult.ok(pm);
|
||||||
|
}
|
||||||
|
setResponseContent(result, response);
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
+98
@@ -0,0 +1,98 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.xiaoleilu.loServer.action.robot;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.APIPath;
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.pojos.InputGetGroup;
|
||||||
|
import cn.wildfirechat.pojos.InputGetGroupMember;
|
||||||
|
import cn.wildfirechat.pojos.OutputGroupMemberList;
|
||||||
|
import cn.wildfirechat.pojos.PojoGroupMember;
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import com.xiaoleilu.loServer.RestResult;
|
||||||
|
import com.xiaoleilu.loServer.annotation.HttpMethod;
|
||||||
|
import com.xiaoleilu.loServer.annotation.Route;
|
||||||
|
import com.xiaoleilu.loServer.handler.Request;
|
||||||
|
import com.xiaoleilu.loServer.handler.Response;
|
||||||
|
import io.netty.handler.codec.http.FullHttpRequest;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Route(APIPath.Robot_Group_Member_Get)
|
||||||
|
@HttpMethod("POST")
|
||||||
|
public class GetGroupMemberAction extends RobotAction {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTransactionAction() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean action(Request request, Response response) {
|
||||||
|
if (request.getNettyRequest() instanceof FullHttpRequest) {
|
||||||
|
InputGetGroupMember input = getRequestBody(request.getNettyRequest(), InputGetGroupMember.class);
|
||||||
|
String robotId = robot.getUid();
|
||||||
|
if (input != null
|
||||||
|
&& (!StringUtil.isNullOrEmpty(input.getGroupId()))
|
||||||
|
&& (!StringUtil.isNullOrEmpty(input.getMemberId()))) {
|
||||||
|
|
||||||
|
List<WFCMessage.GroupMember> members = new ArrayList<>();
|
||||||
|
ErrorCode errorCode = messagesStore.getGroupMembers(null, input.getGroupId(), 0, members);
|
||||||
|
RestResult result;
|
||||||
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
result = RestResult.resultOf(errorCode);
|
||||||
|
} else {
|
||||||
|
WFCMessage.GroupMember groupMember = null;
|
||||||
|
boolean isInGroup = false;
|
||||||
|
for (WFCMessage.GroupMember member : members) {
|
||||||
|
if (member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(member.getMemberId().equals(robotId)) {
|
||||||
|
isInGroup = true;
|
||||||
|
if(groupMember != null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(member.getMemberId().equals(input.getMemberId())) {
|
||||||
|
groupMember = member;
|
||||||
|
if(isInGroup) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!isInGroup) {
|
||||||
|
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_IN_GROUP);
|
||||||
|
} else {
|
||||||
|
if(groupMember == null) {
|
||||||
|
result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST);
|
||||||
|
} else {
|
||||||
|
PojoGroupMember pm = new PojoGroupMember();
|
||||||
|
pm.setMember_id(groupMember.getMemberId());
|
||||||
|
pm.setAlias(groupMember.getAlias());
|
||||||
|
pm.setType(groupMember.getType());
|
||||||
|
pm.setExtra(groupMember.getExtra());
|
||||||
|
pm.setCreateDt(groupMember.getCreateDt());
|
||||||
|
result = RestResult.ok(pm);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setResponseContent(result, response);
|
||||||
|
} else {
|
||||||
|
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29,6 +29,8 @@ public final class BrokerConstants {
|
|||||||
public static final String HTTP_SERVER_PORT = "http_port";
|
public static final String HTTP_SERVER_PORT = "http_port";
|
||||||
public static final String HTTP_LOCAL_PORT = "local_port";
|
public static final String HTTP_LOCAL_PORT = "local_port";
|
||||||
|
|
||||||
|
public static final String ENCRYPT_AES256 = "encrypt.use_aes256";
|
||||||
|
|
||||||
public static final String HTTP_ADMIN_PORT = "http.admin.port";
|
public static final String HTTP_ADMIN_PORT = "http.admin.port";
|
||||||
public static final String DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME = "moquette_store.mapdb";
|
public static final String DEFAULT_MOQUETTE_STORE_MAP_DB_FILENAME = "moquette_store.mapdb";
|
||||||
public static final String DEFAULT_PERSISTENT_PATH = System.getProperty("user.dir") + File.separator
|
public static final String DEFAULT_PERSISTENT_PATH = System.getProperty("user.dir") + File.separator
|
||||||
@@ -129,7 +131,7 @@ public final class BrokerConstants {
|
|||||||
public static final String MESSAGE_Forward_Types = "message.forward.types";
|
public static final String MESSAGE_Forward_Types = "message.forward.types";
|
||||||
public static final String MESSAGE_Forward_Exclude_Types = "message.forward.exclude_types";
|
public static final String MESSAGE_Forward_Exclude_Types = "message.forward.exclude_types";
|
||||||
public static final String MESSAGE_MentionMsg_Forward_Url = "message.mentionmsg.forward.url";
|
public static final String MESSAGE_MentionMsg_Forward_Url = "message.mentionmsg.forward.url";
|
||||||
|
public static final String MESSAGE_RecallMsg_Forward_Url = "message.recallmsg.forward.url";
|
||||||
|
|
||||||
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
|
public static final String SERVER_MULTI_ENDPOINT = "server.multi_endpoint";
|
||||||
public static final String SERVER_MULTI_PC_ENDPOINT = "server.multi_pc_endpoint";
|
public static final String SERVER_MULTI_PC_ENDPOINT = "server.multi_pc_endpoint";
|
||||||
@@ -161,6 +163,8 @@ public final class BrokerConstants {
|
|||||||
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
|
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_Reject_Request_Duration = "friend.reject_request_duration";
|
||||||
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
|
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
|
||||||
|
public static final String FRIEND_Request_Robot_Auto_Accept = "friend.robot_auto_accept";
|
||||||
|
|
||||||
|
|
||||||
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
|
public static final String CHATROOM_Participant_Idle_Time = "chatroom.participant_idle_time";
|
||||||
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
|
public static final String CHATROOM_Rejoin_When_Active = "chatroom.rejoin_when_active";
|
||||||
|
|||||||
@@ -30,8 +30,10 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
|
|||||||
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
||||||
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0], fromUser, request.getReason());
|
publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0], fromUser, request.getReason());
|
||||||
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
|
} else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) {
|
||||||
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
|
if(m_messagesStore.isRobotAutoAcceptFriendRequest()) {
|
||||||
mServer.onApiMessage(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, requestSourceType);
|
WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build();
|
||||||
|
mServer.onApiMessage(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, requestSourceType);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return errorCode;
|
return errorCode;
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package io.moquette.imhandler;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.proto.ProtoConstants;
|
||||||
|
import cn.wildfirechat.proto.WFCMessage;
|
||||||
|
import io.moquette.spi.impl.Qos1PublishHandler;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Handler(IMTopic.ListenedChannelListTopic)
|
||||||
|
public class ChannelListenedListHandler extends IMHandler<Void> {
|
||||||
|
@Override
|
||||||
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, Void request, Qos1PublishHandler.IMCallback callback) {
|
||||||
|
List<String> channelInfoList = m_messagesStore.getListenedChannels(fromUser);
|
||||||
|
WFCMessage.IDListBuf.Builder builder = WFCMessage.IDListBuf.newBuilder();
|
||||||
|
builder.addAllId(channelInfoList);
|
||||||
|
byte[] data = builder.build().toByteArray();
|
||||||
|
ackPayload.ensureWritable(data.length).writeBytes(data);
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -39,6 +39,7 @@ import static cn.wildfirechat.common.IMExceptionEvent.EventType.RDBS_Exception;
|
|||||||
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
|
||||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||||
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
|
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
|
||||||
|
import static win.liyufan.im.UserSettingScope.kUserSettingPrivacySearchable;
|
||||||
|
|
||||||
public class DatabaseStore {
|
public class DatabaseStore {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
|
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
|
||||||
@@ -161,18 +162,15 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
//searchType
|
|
||||||
// 0 模糊匹配displayName, 精确匹配账户名和电话号码
|
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType, int page) {
|
||||||
// 1 精确匹配账户名和电话号码
|
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
||||||
// 2 精确匹配账户名
|
if(page > 0) {
|
||||||
// 3 精确匹配电话号码
|
return out;
|
||||||
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
}
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
|
|
||||||
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
connection = DBUtil.getConnection();
|
connection = DBUtil.getConnection();
|
||||||
String sql = "select `_uid`, `_name`" +
|
String sql = "select `_uid`, `_name`" +
|
||||||
@@ -185,61 +183,34 @@ public class DatabaseStore {
|
|||||||
", `_company`" +
|
", `_company`" +
|
||||||
", `_social`" +
|
", `_social`" +
|
||||||
", `_extra`" +
|
", `_extra`" +
|
||||||
", `_dt` from t_user";
|
", `_dt`, `_type` from t_user";
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if(searchType == SearchUserType_Name) {
|
||||||
|
sql += " where `_name` = ? ";
|
||||||
|
} else if(searchType == SearchUserType_Mobile) {
|
||||||
|
sql += " where `_mobile` = ? ";
|
||||||
|
} else {
|
||||||
|
sql += " where (`_name` = ? or `_mobile` = ?) ";
|
||||||
|
}
|
||||||
|
|
||||||
sql += " and `_type` <> 2 and `_deleted` = 0"; //can search normal user(0) and robot(1) and admin(100), can not search things
|
sql += " and `_type` <> 2 and `_deleted` = 0"; //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) {
|
if(searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
|
||||||
sql += " limit 1";
|
sql += " limit 1";
|
||||||
} else {
|
} else {
|
||||||
sql += " limit 20";
|
sql += " limit 2";
|
||||||
}
|
|
||||||
|
|
||||||
if (page > 0) {
|
|
||||||
sql += " offset " + page * 20;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
int index = 1;
|
statement.setString(1, keyword);
|
||||||
|
if(searchType != SearchUserType_Name && searchType != SearchUserType_Mobile) {
|
||||||
switch (searchType) {
|
statement.setString(2, keyword);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rs = statement.executeQuery();
|
rs = statement.executeQuery();
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
|
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
|
||||||
index = 1;
|
int index = 1;
|
||||||
|
|
||||||
String value = rs.getString(index++);
|
String value = rs.getString(index++);
|
||||||
value = (value == null ? "" : value);
|
value = (value == null ? "" : value);
|
||||||
@@ -287,6 +258,9 @@ public class DatabaseStore {
|
|||||||
long longValue = rs.getLong(index++);
|
long longValue = rs.getLong(index++);
|
||||||
builder.setUpdateDt(longValue);
|
builder.setUpdateDt(longValue);
|
||||||
|
|
||||||
|
int type = rs.getInt(index++);
|
||||||
|
builder.setType( type);
|
||||||
|
|
||||||
WFCMessage.User user = builder.build();
|
WFCMessage.User user = builder.build();
|
||||||
|
|
||||||
out.add(user);
|
out.add(user);
|
||||||
@@ -298,6 +272,142 @@ public class DatabaseStore {
|
|||||||
} finally {
|
} finally {
|
||||||
DBUtil.closeDB(connection, statement, rs);
|
DBUtil.closeDB(connection, statement, rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<WFCMessage.User> filter = new ArrayList<>();
|
||||||
|
for (WFCMessage.User user : out) {
|
||||||
|
WFCMessage.UserSettingEntry userSettingEntry = Server.getServer().getStore().messagesStore().getUserSetting(user.getUid(), kUserSettingPrivacySearchable, null);
|
||||||
|
if(userSettingEntry != null) {
|
||||||
|
int value = 0;
|
||||||
|
try {
|
||||||
|
value = StringUtil.isNullOrEmpty(userSettingEntry.getValue())?0:Integer.parseInt(userSettingEntry.getValue());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if((value & ProtoConstants.DisableSearchMask.DisableSearchNameMask) > 0) {
|
||||||
|
if (searchType == SearchUserType_Name) {
|
||||||
|
filter.add(user);
|
||||||
|
continue;
|
||||||
|
} else if(searchType != SearchUserType_Mobile) {
|
||||||
|
if(keyword.equals(user.getName())) {
|
||||||
|
if(!keyword.equals(user.getMobile())) {
|
||||||
|
filter.add(user);
|
||||||
|
continue;
|
||||||
|
} else if((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||||
|
filter.add(user);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((value & ProtoConstants.DisableSearchMask.DisableSearchMobileMask) > 0) {
|
||||||
|
if (searchType == SearchUserType_Mobile) {
|
||||||
|
filter.add(user);
|
||||||
|
} else if(searchType != SearchUserType_Name) {
|
||||||
|
if(keyword.equals(user.getMobile()) && !keyword.equals(user.getName())) {
|
||||||
|
filter.add(user);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out.removeAll(filter);
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
List<WFCMessage.User> searchUserByDisplayName(String keyword, int page) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
|
||||||
|
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
||||||
|
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "select u._uid, u._name, u._display_name, u._portrait, u._mobile, u._gender, u._email, u._address, u._company, u._social, u._extra, u._dt, u._type " +
|
||||||
|
" from t_user u left join (select _uid, _value from t_user_setting where _scope = 27) s on u._uid = s._uid " +
|
||||||
|
" where u._display_name like ? and u._type <> 2 and u._deleted = 0 and (s._value is null or (s._value <> 1 and s._value <> 3 and s._value <> 5 and s._value <> 7)) limit 20";
|
||||||
|
|
||||||
|
if (page > 0) {
|
||||||
|
sql += " offset " + page * 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, "%" + keyword + "%");
|
||||||
|
rs = statement.executeQuery();
|
||||||
|
while (rs.next()) {
|
||||||
|
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
|
||||||
|
int index = 1;
|
||||||
|
|
||||||
|
String value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setUid(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setName(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setDisplayName(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setPortrait(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setMobile(value);
|
||||||
|
|
||||||
|
int gender = rs.getInt(index++);
|
||||||
|
builder.setGender(gender);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setEmail(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setAddress(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setCompany(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setSocial(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setExtra(value);
|
||||||
|
|
||||||
|
long longValue = rs.getLong(index++);
|
||||||
|
builder.setUpdateDt(longValue);
|
||||||
|
|
||||||
|
int type = rs.getInt(index++);
|
||||||
|
builder.setType(type);
|
||||||
|
|
||||||
|
WFCMessage.User user = builder.build();
|
||||||
|
|
||||||
|
out.add(user);
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement, rs);
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
||||||
|
List<WFCMessage.User> out = searchUserByNameMobile(keyword, searchType, page);
|
||||||
|
if(searchType == SearchUserType_General) {
|
||||||
|
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page);
|
||||||
|
out.addAll(general);
|
||||||
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2411,59 +2521,55 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void deleteUserStatus(String userId) {
|
void deleteUserStatus(String userId) {
|
||||||
mScheduler.execute(()->{
|
Connection connection = null;
|
||||||
Connection connection = null;
|
PreparedStatement statement = null;
|
||||||
PreparedStatement statement = null;
|
try {
|
||||||
try {
|
connection = DBUtil.getConnection();
|
||||||
connection = DBUtil.getConnection();
|
String sql = "delete from t_user_status where _uid = ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, userId);
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateUserStatus(String userId, int status) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
if (status == 0) {
|
||||||
String sql = "delete from t_user_status where _uid = ?";
|
String sql = "delete from t_user_status where _uid = ?";
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
statement.setString(1, userId);
|
statement.setString(1, userId);
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
} catch (SQLException e) {
|
} else {
|
||||||
// TODO Auto-generated catch block
|
String sql = "insert into t_user_status (`_uid`, `_status`, `_dt`) values(?,?,?) ON DUPLICATE KEY UPDATE `_status` = ?";
|
||||||
e.printStackTrace();
|
|
||||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
statement = connection.prepareStatement(sql);
|
||||||
} finally {
|
int index = 1;
|
||||||
DBUtil.closeDB(connection, statement);
|
statement.setString(index++, userId);
|
||||||
|
statement.setInt(index++, status);
|
||||||
|
statement.setLong(index++, System.currentTimeMillis());
|
||||||
|
statement.setInt(index++, status);
|
||||||
|
|
||||||
|
int count = statement.executeUpdate();
|
||||||
|
LOG.info("Update rows {}", count);
|
||||||
}
|
}
|
||||||
});
|
} catch (SQLException e) {
|
||||||
}
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
void updateUserStatus(String userId, int status) {
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
mScheduler.execute(()->{
|
} finally {
|
||||||
Connection connection = null;
|
DBUtil.closeDB(connection, statement);
|
||||||
PreparedStatement statement = null;
|
}
|
||||||
try {
|
|
||||||
connection = DBUtil.getConnection();
|
|
||||||
if (status == 0) {
|
|
||||||
String sql = "delete from t_user_status where _uid = ?";
|
|
||||||
statement = connection.prepareStatement(sql);
|
|
||||||
statement.setString(1, userId);
|
|
||||||
int count = statement.executeUpdate();
|
|
||||||
LOG.info("Update rows {}", count);
|
|
||||||
} else {
|
|
||||||
String sql = "insert into t_user_status (`_uid`, `_status`, `_dt`) values(?,?,?) ON DUPLICATE KEY UPDATE `_status` = ?";
|
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
|
||||||
int index = 1;
|
|
||||||
statement.setString(index++, userId);
|
|
||||||
statement.setInt(index++, status);
|
|
||||||
statement.setLong(index++, System.currentTimeMillis());
|
|
||||||
statement.setInt(index++, status);
|
|
||||||
|
|
||||||
int count = statement.executeUpdate();
|
|
||||||
LOG.info("Update rows {}", count);
|
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
|
||||||
} finally {
|
|
||||||
DBUtil.closeDB(connection, statement);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int getGeneratedId() {
|
int getGeneratedId() {
|
||||||
@@ -2644,6 +2750,103 @@ public class DatabaseStore {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<WFCMessage.User> getAllUsers(int count, int offset) {
|
||||||
|
Connection connection = null;
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet rs = null;
|
||||||
|
List<WFCMessage.User> outList = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
connection = DBUtil.getConnection();
|
||||||
|
String sql = "select `_uid`, `_name`" +
|
||||||
|
", `_display_name`" +
|
||||||
|
", `_portrait`" +
|
||||||
|
", `_mobile`" +
|
||||||
|
", `_gender`" +
|
||||||
|
", `_email`" +
|
||||||
|
", `_address`" +
|
||||||
|
", `_company`" +
|
||||||
|
", `_social`" +
|
||||||
|
", `_extra`" +
|
||||||
|
", `_type`" +
|
||||||
|
", `_deleted`" +
|
||||||
|
", `_dt` from t_user where `_deleted` = 0 order by _createTime limit ? offset ?";
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
|
||||||
|
int index = 1;
|
||||||
|
statement.setInt(1, count);
|
||||||
|
statement.setInt(2, offset);
|
||||||
|
|
||||||
|
|
||||||
|
rs = statement.executeQuery();
|
||||||
|
while (rs.next()) {
|
||||||
|
WFCMessage.User.Builder builder = WFCMessage.User.newBuilder();
|
||||||
|
index = 1;
|
||||||
|
String value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setUid(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setName(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setDisplayName(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setPortrait(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setMobile(value);
|
||||||
|
|
||||||
|
int gender = rs.getInt(index++);
|
||||||
|
builder.setGender(gender);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setEmail(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setAddress(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setCompany(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setSocial(value);
|
||||||
|
|
||||||
|
value = rs.getString(index++);
|
||||||
|
value = (value == null ? "" : value);
|
||||||
|
builder.setExtra(value);
|
||||||
|
|
||||||
|
int type = rs.getInt(index++);
|
||||||
|
builder.setType(type);
|
||||||
|
|
||||||
|
int deleted = rs.getInt(index++);
|
||||||
|
builder.setDeleted(deleted);
|
||||||
|
|
||||||
|
long longValue = rs.getLong(index++);
|
||||||
|
if(longValue <= 0)
|
||||||
|
longValue = 1;
|
||||||
|
builder.setUpdateDt(longValue);
|
||||||
|
|
||||||
|
outList.add(builder.build());
|
||||||
|
}
|
||||||
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement, rs);
|
||||||
|
}
|
||||||
|
return outList;
|
||||||
|
}
|
||||||
|
|
||||||
Set<String> getAllEnds() {
|
Set<String> getAllEnds() {
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
@@ -3342,47 +3545,45 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void updateChannelListener(final String channelId, final String listener, final boolean listen) {
|
void updateChannelListener(final String channelId, final String listener, final boolean listen) {
|
||||||
LOG.info("Database remove channel {}", channelId);
|
LOG.info("updateChannelListener channel {}, listener {}, listen {}", channelId, listener, listen);
|
||||||
mScheduler.execute(()->{
|
Connection connection = null;
|
||||||
Connection connection = null;
|
PreparedStatement statement = null;
|
||||||
PreparedStatement statement = null;
|
try {
|
||||||
try {
|
connection = DBUtil.getConnection();
|
||||||
connection = DBUtil.getConnection();
|
String sql;
|
||||||
String sql;
|
if (listen) {
|
||||||
if (listen) {
|
sql = "insert into t_channel_listener (`_cid`" +
|
||||||
sql = "insert into t_channel_listener (`_cid`" +
|
", `_mid`" +
|
||||||
", `_mid`" +
|
", `_dt`) values(?, ?, ?)" +
|
||||||
", `_dt`) values(?, ?, ?)" +
|
" ON DUPLICATE KEY UPDATE " +
|
||||||
" ON DUPLICATE KEY UPDATE " +
|
"`_dt` = ?";
|
||||||
"`_dt` = ?";
|
statement = connection.prepareStatement(sql);
|
||||||
statement = connection.prepareStatement(sql);
|
int index = 1;
|
||||||
int index = 1;
|
statement.setString(index++, channelId);
|
||||||
statement.setString(index++, channelId);
|
statement.setString(index++, listener);
|
||||||
statement.setString(index++, listener);
|
statement.setLong(index++, System.currentTimeMillis());
|
||||||
statement.setLong(index++, System.currentTimeMillis());
|
statement.setLong(index++, System.currentTimeMillis());
|
||||||
statement.setLong(index++, System.currentTimeMillis());
|
|
||||||
|
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
} else {
|
} else {
|
||||||
sql = "delete from t_channel_listener where `_cid`=? and `_mid`=?";
|
sql = "delete from t_channel_listener where `_cid`=? and `_mid`=?";
|
||||||
|
|
||||||
statement = connection.prepareStatement(sql);
|
statement = connection.prepareStatement(sql);
|
||||||
int index = 1;
|
int index = 1;
|
||||||
statement.setString(index++, channelId);
|
statement.setString(index++, channelId);
|
||||||
statement.setString(index++, listener);
|
statement.setString(index++, listener);
|
||||||
|
|
||||||
int count = statement.executeUpdate();
|
int count = statement.executeUpdate();
|
||||||
LOG.info("Update rows {}", count);
|
LOG.info("Update rows {}", count);
|
||||||
}
|
|
||||||
} catch (SQLException e) {
|
|
||||||
// TODO Auto-generated catch block
|
|
||||||
e.printStackTrace();
|
|
||||||
Utility.printExecption(LOG, e, RDBS_Exception);
|
|
||||||
} finally {
|
|
||||||
DBUtil.closeDB(connection, statement);
|
|
||||||
}
|
}
|
||||||
});
|
} catch (SQLException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, RDBS_Exception);
|
||||||
|
} finally {
|
||||||
|
DBUtil.closeDB(connection, statement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> getUserChannels(String userId) {
|
List<String> getUserChannels(String userId) {
|
||||||
|
|||||||
@@ -141,6 +141,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
||||||
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
||||||
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
||||||
|
private boolean mFriendRobotAutoAccept = true;
|
||||||
|
|
||||||
private boolean mMultiPlatformNotification = false;
|
private boolean mMultiPlatformNotification = false;
|
||||||
private boolean mMobileDefaultSilentWhenPCOnline = true;
|
private boolean mMobileDefaultSilentWhenPCOnline = true;
|
||||||
@@ -174,6 +175,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private int mGroupForbiddenClientOperation;
|
private int mGroupForbiddenClientOperation;
|
||||||
private int mSyncDataPartSize = 0;
|
private int mSyncDataPartSize = 0;
|
||||||
private boolean keepDisplayNameWhenDestroyUser = true;
|
private boolean keepDisplayNameWhenDestroyUser = true;
|
||||||
|
private String mRecallForwardUrl = null;
|
||||||
|
|
||||||
private boolean mForwardMessageWithClientInfo = false;
|
private boolean mForwardMessageWithClientInfo = false;
|
||||||
private boolean mRobotCallbackWithClientInfo = false;
|
private boolean mRobotCallbackWithClientInfo = false;
|
||||||
@@ -296,6 +298,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
|
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
mFriendRobotAutoAccept = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Request_Robot_Auto_Accept, "true"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mChatroomRejoinWhenActive = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.CHATROOM_Rejoin_When_Active));
|
mChatroomRejoinWhenActive = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.CHATROOM_Rejoin_When_Active));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
@@ -518,7 +526,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
mRecallForwardUrl = server.getConfig().getProperty(BrokerConstants.MESSAGE_RecallMsg_Forward_Url);
|
||||||
|
} catch (Exception e) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printMissConfigLog(String config, String defaultValue) {
|
private void printMissConfigLog(String config, String defaultValue) {
|
||||||
@@ -1627,13 +1639,17 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
WFCMessage.GroupMember gm = getGroupMember(groupId, operator);
|
||||||
|
if (gm == null || gm.getType() == GroupMemberType_Removed) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
|
}
|
||||||
|
|
||||||
if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || oldInfo.getType() == ProtoConstants.GroupType.GroupType_Organization) {
|
if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || oldInfo.getType() == ProtoConstants.GroupType.GroupType_Organization) {
|
||||||
boolean isAllow = false;
|
boolean isAllow = false;
|
||||||
if ((oldInfo.getOwner() != null && oldInfo.getOwner().equals(operator))) {
|
if ((oldInfo.getOwner() != null && oldInfo.getOwner().equals(operator))) {
|
||||||
isAllow = true;
|
isAllow = true;
|
||||||
} else {
|
} else {
|
||||||
WFCMessage.GroupMember gm = getGroupMember(groupId, operator);
|
if (gm.getType() == GroupMemberType_Manager) {
|
||||||
if (gm != null && gm.getType() == GroupMemberType_Manager) {
|
|
||||||
isAllow = true;
|
isAllow = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1644,9 +1660,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) {
|
if (oldInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) {
|
||||||
if (!operator.equals(oldInfo.getOwner())) {
|
if (!operator.equals(oldInfo.getOwner())) {
|
||||||
WFCMessage.GroupMember gm = getGroupMember(groupId, operator);
|
|
||||||
boolean isManager = false;
|
boolean isManager = false;
|
||||||
if (gm != null && gm.getType() == GroupMemberType_Manager) {
|
if (gm.getType() == GroupMemberType_Manager) {
|
||||||
isManager = true;
|
isManager = true;
|
||||||
}
|
}
|
||||||
if (!isManager && modifyType != Modify_Group_Name && modifyType != Modify_Group_Portrait && modifyType != Modify_Group_Extra) {
|
if (!isManager && modifyType != Modify_Group_Name && modifyType != Modify_Group_Portrait && modifyType != Modify_Group_Extra) {
|
||||||
@@ -1740,12 +1755,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (operatorMember == null) {
|
if (operatorMember == null || operatorMember.getType() == GroupMemberType_Removed) {
|
||||||
LOG.error("Modify group member alias error, the operator {} is not in group", operator);
|
LOG.error("Modify group member alias error, the operator {} is not in group", operator);
|
||||||
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (targetMember == null) {
|
if (targetMember == null || targetMember.getType() == GroupMemberType_Removed) {
|
||||||
LOG.error("Modify group member alias error, the member {} is not in group", memberId);
|
LOG.error("Modify group member alias error, the member {} is not in group", memberId);
|
||||||
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
|
||||||
}
|
}
|
||||||
@@ -2174,9 +2189,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
if (isAdmin) {
|
if (isAdmin) {
|
||||||
canRecall = true;
|
canRecall = true;
|
||||||
}
|
}
|
||||||
if (!isAdmin && message.getFromUser().equals(operatorId)) {
|
boolean isExpired = false;
|
||||||
|
if (!canRecall && message.getFromUser().equals(operatorId)) {
|
||||||
if (now - message.getServerTimestamp() > mRecallTimeLimit * 1000) {
|
if (now - message.getServerTimestamp() > mRecallTimeLimit * 1000) {
|
||||||
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
isExpired = true;
|
||||||
} else {
|
} else {
|
||||||
canRecall = true;
|
canRecall = true;
|
||||||
}
|
}
|
||||||
@@ -2193,17 +2209,26 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
canRecall = true;
|
canRecall = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
if(!canRecall && !message.getFromUser().equals(operatorId)) {
|
||||||
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
boolean isOperatorManager = false;
|
||||||
if (members == null || members.size() == 0) {
|
int senderType = GroupMemberType_Normal;
|
||||||
members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget());
|
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||||
}
|
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
|
||||||
for (WFCMessage.GroupMember member : members) {
|
if (members == null || members.size() == 0) {
|
||||||
if (member.getMemberId().equals(operatorId)) {
|
members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget());
|
||||||
if (member.getType() == GroupMemberType_Manager || member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Owner) {
|
}
|
||||||
canRecall = true;
|
for (WFCMessage.GroupMember member : members) {
|
||||||
|
if (member.getMemberId().equals(operatorId)) {
|
||||||
|
if (member.getType() == GroupMemberType_Manager || member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Owner) {
|
||||||
|
isOperatorManager = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
if(member.getMemberId().equals(message.getFromUser())) {
|
||||||
|
senderType = member.getType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(isOperatorManager && senderType != GroupMemberType_Manager && senderType != GroupMemberType_Owner) {
|
||||||
|
canRecall = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2215,13 +2240,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!canRecall) {
|
if (!canRecall) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
if(isExpired) {
|
||||||
|
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
||||||
|
} else {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(message.getContent().getType() == 80) {
|
if(message.getContent().getType() == 80) {
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!StringUtil.isNullOrEmpty(mRecallForwardUrl)) {
|
||||||
|
OutputRecallMessageData event = new OutputRecallMessageData(OutputMessageData.fromProtoMessage(message, null), operatorId, System.currentTimeMillis(), isAdmin);
|
||||||
|
m_Server.getCallbackScheduler().execute(() -> {
|
||||||
|
try {
|
||||||
|
HttpUtils.httpJsonPost(mRecallForwardUrl, GsonUtil.gson.toJson(event), HttpUtils.HttpPostType.POST_TYPE_Forward_Recall_Callback);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
Utility.printExecption(LOG, e, EVENT_CALLBACK_Exception);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("s", message.getFromUser());
|
json.put("s", message.getFromUser());
|
||||||
json.put("ts", message.getServerTimestamp());
|
json.put("ts", message.getServerTimestamp());
|
||||||
@@ -2475,6 +2517,28 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isOnlineValueEqual(WFCMessage.UserSettingEntry pcentry, String newValue) {
|
||||||
|
if(pcentry == null) {
|
||||||
|
return StringUtil.isNullOrEmpty(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
String oldValue = pcentry.getValue();
|
||||||
|
if(StringUtil.isNullOrEmpty(oldValue) && StringUtil.isNullOrEmpty(newValue)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(StringUtil.isNullOrEmpty(oldValue) || StringUtil.isNullOrEmpty(newValue)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] ssOld = oldValue.split("\\|");
|
||||||
|
String[] ssNew = newValue.split("\\|");
|
||||||
|
if(ssOld.length != 4 || ssNew.length != 4 || !ssOld[1].equals(ssNew[1]) || !ssOld[2].equals(ssNew[2]) || !ssOld[3].equals(ssNew[3])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online) {
|
public void updateUserOnlineSetting(MemorySessionStore.Session session, boolean online) {
|
||||||
if(!mMultiPlatformNotification) {
|
if(!mMultiPlatformNotification) {
|
||||||
@@ -2506,14 +2570,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC");
|
WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC");
|
||||||
if (pcValue != null) {
|
if (!isOnlineValueEqual(pcentry, pcValue)) {
|
||||||
if (pcentry == null || StringUtil.isNullOrEmpty(pcentry.getValue())) {
|
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(pcValue==null?"":pcValue).build(), session.clientID);
|
||||||
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(pcValue).build(), session.clientID);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (pcentry != null && !StringUtil.isNullOrEmpty(pcentry.getValue())) {
|
|
||||||
updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build(), session.clientID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2706,6 +2764,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
String userId = databaseStore.getUserIdByMobile(mobile);
|
String userId = databaseStore.getUserIdByMobile(mobile);
|
||||||
return getUserInfo(userId);
|
return getUserInfo(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<WFCMessage.User> getUserInfoList(int count, int offset) {
|
||||||
|
return databaseStore.getAllUsers(count, offset);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
|
public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
|
||||||
if (mDisableSearch) {
|
if (mDisableSearch) {
|
||||||
@@ -3043,27 +3107,16 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
FriendData friendData1 = getFriendData(userId, request.getTargetUid());
|
||||||
|
|
||||||
FriendData friendData1 = null;
|
|
||||||
Collection<FriendData> friendDatas = friendsMap.get(userId);
|
|
||||||
if (friendDatas == null || friendDatas.size() == 0) {
|
|
||||||
friendDatas = loadFriend(friendsMap, userId);
|
|
||||||
}
|
|
||||||
for (FriendData fd : friendDatas) {
|
|
||||||
if (fd.getFriendUid().equals(request.getTargetUid())) {
|
|
||||||
friendData1 = fd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (friendData1 != null && friendData1.getBlacked() > 0 && !isAdmin) {
|
|
||||||
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (friendData1 != null && friendData1.getState() == 0) {
|
if (friendData1 != null && friendData1.getState() == 0) {
|
||||||
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
return ErrorCode.ERROR_CODE_ALREADY_FRIENDS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FriendData friendData2 = getFriendData(request.getTargetUid(), userId);
|
||||||
|
if (friendData2 != null && friendData2.getBlacked() > 0 && !isAdmin) {
|
||||||
|
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||||
|
}
|
||||||
|
|
||||||
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
|
WFCMessage.FriendRequest newRequest = WFCMessage.FriendRequest
|
||||||
.newBuilder()
|
.newBuilder()
|
||||||
.setFromUid(userId)
|
.setFromUid(userId)
|
||||||
@@ -3175,7 +3228,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
friendsMap.remove(userId);
|
friendsMap.remove(userId);
|
||||||
friendsMap.remove(request.getTargetUid());
|
friendsMap.remove(request.getTargetUid());
|
||||||
|
|
||||||
callbackRelationEvent(userId, request.getTargetUid(), 0, "" + request.getStatus());
|
callbackRelationEvent(userId, request.getTargetUid(), 0, request.getStatus() == 0?"1":"0");
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3441,7 +3494,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String ensureSecretLength(String secret) {
|
private String ensureSecretLength(String secret) {
|
||||||
while ( secret.length() < 16) {
|
while ( secret.length() < AES.keyLen) {
|
||||||
secret += "w";
|
secret += "w";
|
||||||
secret += secret;
|
secret += secret;
|
||||||
}
|
}
|
||||||
@@ -4086,6 +4139,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return databaseStore.searchChannelFromDB(keyword, buzzy, page);
|
return databaseStore.searchChannelFromDB(keyword, buzzy, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<String> getListenedChannels(String userId) {
|
||||||
|
return databaseStore.getUserChannels(userId);
|
||||||
|
}
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode listenChannel(String operator, String channelId, boolean listen) {
|
public ErrorCode listenChannel(String operator, String channelId, boolean listen) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
@@ -4255,6 +4313,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return mChannelCallbackWithClientInfo;
|
return mChannelCallbackWithClientInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isRobotAutoAcceptFriendRequest() {
|
||||||
|
return mFriendRobotAutoAccept;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Integer> getClientForbiddenSendTypes() {
|
public List<Integer> getClientForbiddenSendTypes() {
|
||||||
return mForbiddenClientSendTypes;
|
return mForbiddenClientSendTypes;
|
||||||
|
|||||||
@@ -232,18 +232,6 @@ public class Server {
|
|||||||
handlers = Collections.emptyList();
|
handlers = Collections.emptyList();
|
||||||
}
|
}
|
||||||
DBUtil.init(config);
|
DBUtil.init(config);
|
||||||
String strKey = "0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F";
|
|
||||||
String[] strs = strKey.split(",");
|
|
||||||
if(strs.length != 16) {
|
|
||||||
LOG.error("Key error, it length should be 16");
|
|
||||||
}
|
|
||||||
byte[] keys = new byte[16];
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
keys[i] = (byte)(Integer.parseInt(strs[i].replace("0X", "").replace("0x", ""), 16));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AES.init(keys);
|
|
||||||
|
|
||||||
LOG.info("Starting Moquette Server. MQTT message interceptors={}", getInterceptorIds(handlers));
|
LOG.info("Starting Moquette Server. MQTT message interceptors={}", getInterceptorIds(handlers));
|
||||||
|
|
||||||
@@ -393,9 +381,13 @@ public class Server {
|
|||||||
|
|
||||||
longPort = config.getProperty(BrokerConstants.PORT_PROPERTY_NAME);
|
longPort = config.getProperty(BrokerConstants.PORT_PROPERTY_NAME);
|
||||||
shortPort = config.getProperty(BrokerConstants.HTTP_SERVER_PORT);
|
shortPort = config.getProperty(BrokerConstants.HTTP_SERVER_PORT);
|
||||||
|
boolean aes256 = Boolean.parseBoolean(config.getProperty(ENCRYPT_AES256, "false"));
|
||||||
|
|
||||||
MessageShardingUtil.setNodeId(1);
|
MessageShardingUtil.setNodeId(1);
|
||||||
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
Tokenor.setKey(config.getProperty(BrokerConstants.TOKEN_SECRET_KEY));
|
||||||
|
|
||||||
|
AES.useAes256(aes256);
|
||||||
|
|
||||||
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
|
String expirTimeStr = config.getProperty(TOKEN_EXPIRE_TIME);
|
||||||
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
|
if (!StringUtil.isNullOrEmpty(expirTimeStr)) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -158,6 +158,8 @@ public interface IMessagesStore {
|
|||||||
WFCMessage.User getUserInfoByMobile(String mobile);
|
WFCMessage.User getUserInfoByMobile(String mobile);
|
||||||
List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
|
List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
|
||||||
|
|
||||||
|
List<WFCMessage.User> getUserInfoList(int count, int offset);
|
||||||
|
|
||||||
boolean updateSystemSetting(int id, String value, String desc);
|
boolean updateSystemSetting(int id, String value, String desc);
|
||||||
SystemSettingPojo getSystemSetting(int id);
|
SystemSettingPojo getSystemSetting(int id);
|
||||||
void createChatroom(String chatroomId, WFCMessage.ChatroomInfo chatroomInfo);
|
void createChatroom(String chatroomId, WFCMessage.ChatroomInfo chatroomInfo);
|
||||||
@@ -216,6 +218,7 @@ public interface IMessagesStore {
|
|||||||
ErrorCode transferChannel(String operator, String channelId, String newOwner);
|
ErrorCode transferChannel(String operator, String channelId, String newOwner);
|
||||||
ErrorCode destroyChannel(String operator, String channelId, boolean isAdmin);
|
ErrorCode destroyChannel(String operator, String channelId, boolean isAdmin);
|
||||||
List<WFCMessage.ChannelInfo> searchChannel(String keyword, boolean buzzy, int page);
|
List<WFCMessage.ChannelInfo> searchChannel(String keyword, boolean buzzy, int page);
|
||||||
|
List<String> getListenedChannels(String userId);
|
||||||
ErrorCode listenChannel(String operator, String channelId, boolean listen);
|
ErrorCode listenChannel(String operator, String channelId, boolean listen);
|
||||||
WFCMessage.ChannelInfo getChannelInfo(String channelId);
|
WFCMessage.ChannelInfo getChannelInfo(String channelId);
|
||||||
boolean canSendMessageInChannel(String user, String channelId);
|
boolean canSendMessageInChannel(String user, String channelId);
|
||||||
@@ -239,6 +242,8 @@ public interface IMessagesStore {
|
|||||||
boolean isRobotCallbackWithClientInfo();
|
boolean isRobotCallbackWithClientInfo();
|
||||||
boolean isChannelCallbackWithClientInfo();
|
boolean isChannelCallbackWithClientInfo();
|
||||||
|
|
||||||
|
boolean isRobotAutoAcceptFriendRequest();
|
||||||
|
|
||||||
List<Integer> getClientForbiddenSendTypes();
|
List<Integer> getClientForbiddenSendTypes();
|
||||||
List<Integer> getBlackListExceptionTypes();
|
List<Integer> getBlackListExceptionTypes();
|
||||||
List<Integer> getGroupMuteExceptionTypes();
|
List<Integer> getGroupMuteExceptionTypes();
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ public class ProtocolProcessor {
|
|||||||
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID());
|
||||||
try {
|
try {
|
||||||
if (descriptor != null) {
|
if (descriptor != null) {
|
||||||
processDisconnect(descriptor.getChannel(), true, false);
|
processDisconnect(descriptor.getChannel(), false, false);
|
||||||
}
|
}
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@@ -608,8 +608,9 @@ public class ProtocolProcessor {
|
|||||||
channel.closeFuture();
|
channel.closeFuture();
|
||||||
|
|
||||||
//disconnect the session
|
//disconnect the session
|
||||||
|
if(session != null) {
|
||||||
m_sessionsStore.sessionForClient(clientID).disconnect(session.getUsername(), isDup, isRetain);
|
m_sessionsStore.sessionForClient(clientID).disconnect(session.getUsername(), isDup, isRetain);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -650,12 +651,22 @@ public class ProtocolProcessor {
|
|||||||
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
||||||
m_interceptor.notifyClientConnectionLost(clientID, username);
|
m_interceptor.notifyClientConnectionLost(clientID, username);
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
channel.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel);
|
ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel);
|
||||||
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
if(connectionDescriptors.removeConnection(oldConnDescr)) {
|
||||||
m_interceptor.notifyClientConnectionLost(clientID, username);
|
m_interceptor.notifyClientConnectionLost(clientID, username);
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
channel.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -243,15 +243,17 @@ public class Qos1PublishHandler extends QosPublishHandler {
|
|||||||
String imtopic = topic.getTopic();
|
String imtopic = topic.getTopic();
|
||||||
ByteBuf payload = msg.payload();
|
ByteBuf payload = msg.payload();
|
||||||
byte[] payloadContent = readBytesAndRewind(payload);
|
byte[] payloadContent = readBytesAndRewind(payload);
|
||||||
if(payloadContent.length == 0) {
|
if(payloadContent.length > 0) {
|
||||||
ByteBuf ackPayload = Unpooled.buffer();
|
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
|
||||||
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
|
payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true);
|
||||||
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
|
if(payloadContent == null) {
|
||||||
return;
|
ByteBuf ackPayload = Unpooled.buffer();
|
||||||
|
ackPayload.ensureWritable(1).writeByte(ERROR_CODE_INVALID_DATA.getCode());
|
||||||
|
sendPubAck(clientID, messageID, ackPayload, ERROR_CODE_INVALID_DATA);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MemorySessionStore.Session session = m_sessionStore.getSession(clientID);
|
|
||||||
payloadContent = AES.AESDecrypt(payloadContent, session.getSecret(), true);
|
|
||||||
imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), ProtoConstants.RequestSourceType.Request_From_User);
|
imHandler(clientID, username, imtopic, payloadContent, (errorCode, ackPayload) -> sendPubAck(clientID, messageID, ackPayload, errorCode), ProtoConstants.RequestSourceType.Request_From_User);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ public class HttpUtils {
|
|||||||
POST_TYPE_Channel_Message_Callback,
|
POST_TYPE_Channel_Message_Callback,
|
||||||
POST_TYPE_Forward_Message_Callback,
|
POST_TYPE_Forward_Message_Callback,
|
||||||
POST_TYPE_User_Online_Event_Callback,
|
POST_TYPE_User_Online_Event_Callback,
|
||||||
POST_TYPE_Server_Exception_Callback;
|
POST_TYPE_Server_Exception_Callback,
|
||||||
|
POST_TYPE_Forward_Recall_Callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void httpJsonPost(String url, String jsonStr, HttpPostType postType) {
|
public static void httpJsonPost(String url, String jsonStr, HttpPostType postType) {
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ public interface IMTopic {
|
|||||||
String ChannelSearchTopic = "CHS";
|
String ChannelSearchTopic = "CHS";
|
||||||
String ChannelListenTopic = "CHL";
|
String ChannelListenTopic = "CHL";
|
||||||
String ChannelPullTopic = "CHP";
|
String ChannelPullTopic = "CHP";
|
||||||
|
String ListenedChannelListTopic = "CHLL";
|
||||||
|
|
||||||
String GetTokenTopic = "GETTOKEN";
|
String GetTokenTopic = "GETTOKEN";
|
||||||
String DestroyUserTopic = "DESTROYUSER";
|
String DestroyUserTopic = "DESTROYUSER";
|
||||||
|
|||||||
@@ -14,5 +14,10 @@ public interface UserSettingScope {
|
|||||||
int kUserSettingConversationDraft = 19;
|
int kUserSettingConversationDraft = 19;
|
||||||
int kUserSettingDisableSyncDraft = 20;
|
int kUserSettingDisableSyncDraft = 20;
|
||||||
int kUserSettingVoipSilent = 21;
|
int kUserSettingVoipSilent = 21;
|
||||||
|
int kUserSettingPttReserved = 22;
|
||||||
|
int kUserSettingCustomState = 23;
|
||||||
|
int kUserSettingDisableSecretChat = 24;
|
||||||
|
int kUserSettingPttSilent = 25;
|
||||||
|
int kUserSettingGroupRemark = 26;
|
||||||
|
int kUserSettingPrivacySearchable = 27;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.1.2</version>
|
<version>1.1.6</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ public interface APIPath {
|
|||||||
String User_Get_Token = "/admin/user/get_token";
|
String User_Get_Token = "/admin/user/get_token";
|
||||||
String User_Update_Block_Status = "/admin/user/update_block_status";
|
String User_Update_Block_Status = "/admin/user/update_block_status";
|
||||||
String User_Get_Info = "/admin/user/get_info";
|
String User_Get_Info = "/admin/user/get_info";
|
||||||
|
String User_Get_All = "/admin/user/all";
|
||||||
String User_Get_Robot_Info = "/admin/user/get_robot_info";
|
String User_Get_Robot_Info = "/admin/user/get_robot_info";
|
||||||
String User_Get_Blocked_List = "/admin/user/get_blocked_list";
|
String User_Get_Blocked_List = "/admin/user/get_blocked_list";
|
||||||
String User_Check_Block_Status = "/admin/user/check_block_status";
|
String User_Check_Block_Status = "/admin/user/check_block_status";
|
||||||
@@ -68,6 +69,7 @@ public interface APIPath {
|
|||||||
String Group_Get_Info = "/admin/group/get_info";
|
String Group_Get_Info = "/admin/group/get_info";
|
||||||
String Group_Modify_Info = "/admin/group/modify";
|
String Group_Modify_Info = "/admin/group/modify";
|
||||||
String Group_Member_List = "/admin/group/member/list";
|
String Group_Member_List = "/admin/group/member/list";
|
||||||
|
String Group_Member_Get = "/admin/group/member/get";
|
||||||
String Group_Member_Add = "/admin/group/member/add";
|
String Group_Member_Add = "/admin/group/member/add";
|
||||||
String Group_Member_Kickoff = "/admin/group/member/del";
|
String Group_Member_Kickoff = "/admin/group/member/del";
|
||||||
String Group_Member_Quit = "/admin/group/member/quit";
|
String Group_Member_Quit = "/admin/group/member/quit";
|
||||||
@@ -122,6 +124,7 @@ public interface APIPath {
|
|||||||
String Robot_Group_Dismiss = "/robot/group/del";
|
String Robot_Group_Dismiss = "/robot/group/del";
|
||||||
String Robot_Group_Get_Info = "/robot/group/get_info";
|
String Robot_Group_Get_Info = "/robot/group/get_info";
|
||||||
String Robot_Group_Member_List = "/robot/group/member/list";
|
String Robot_Group_Member_List = "/robot/group/member/list";
|
||||||
|
String Robot_Group_Member_Get = "/robot/group/member/get";
|
||||||
String Robot_Group_Member_Kickoff = "/robot/group/member/del";
|
String Robot_Group_Member_Kickoff = "/robot/group/member/del";
|
||||||
String Robot_Group_Modify_Info = "/robot/group/modify";
|
String Robot_Group_Modify_Info = "/robot/group/modify";
|
||||||
String Robot_Group_Set_Member_Alias = "/robot/group/member/set_alias";
|
String Robot_Group_Set_Member_Alias = "/robot/group/member/set_alias";
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ public enum ErrorCode {
|
|||||||
ERROR_CODE_NOT_YOUR_LOCKED(26, "unload failure, not your lock"),
|
ERROR_CODE_NOT_YOUR_LOCKED(26, "unload failure, not your lock"),
|
||||||
ERROR_CODE_ROBOT_NO_TOKEN(27, "robot no token"),
|
ERROR_CODE_ROBOT_NO_TOKEN(27, "robot no token"),
|
||||||
ERROR_CODE_WS_NOT_CONFIGURED_CORRECTLY(28, "ws not configured correctly"),
|
ERROR_CODE_WS_NOT_CONFIGURED_CORRECTLY(28, "ws not configured correctly"),
|
||||||
|
ERROR_CODE_TIME_INCONSISTENT(30, "time inconsistent"),
|
||||||
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
ERROR_CODE_CONFERENCE_ROOM_NOT_EXIST(60, "conference room not exist"),
|
||||||
ERROR_CODE_CONFERENCE_SERVICE_NOT_AVAILABLE(61, "conference service not available"),
|
ERROR_CODE_CONFERENCE_SERVICE_NOT_AVAILABLE(61, "conference service not available"),
|
||||||
|
|
||||||
@@ -74,7 +75,7 @@ public enum ErrorCode {
|
|||||||
ERROR_CODE_SENSITIVE_MATCHED(242, "sensitive matched"),
|
ERROR_CODE_SENSITIVE_MATCHED(242, "sensitive matched"),
|
||||||
ERROR_CODE_SIGN_EXPIRED(243, "sign expired"),
|
ERROR_CODE_SIGN_EXPIRED(243, "sign expired"),
|
||||||
ERROR_CODE_AUTH_FAILURE(244, "auth failure"),
|
ERROR_CODE_AUTH_FAILURE(244, "auth failure"),
|
||||||
ERROR_CODE_CLIENT_COUNT_OUT_OF_LIMIT(245, "client count out of limit"),
|
ERROR_CODE_USER_BLOCKED(245, "user is blocked"),
|
||||||
ERROR_CODE_IN_BLACK_LIST(246, "user in black list"),
|
ERROR_CODE_IN_BLACK_LIST(246, "user in black list"),
|
||||||
ERROR_CODE_FORBIDDEN_SEND_MSG(247, "forbidden send msg globally"),
|
ERROR_CODE_FORBIDDEN_SEND_MSG(247, "forbidden send msg globally"),
|
||||||
ERROR_CODE_NOT_RIGHT(248, "no right to operate"),
|
ERROR_CODE_NOT_RIGHT(248, "no right to operate"),
|
||||||
|
|||||||
@@ -65,6 +65,9 @@ public class InputCreateGroup extends InputGroupBase {
|
|||||||
if(group_info.max_member_count > 0) {
|
if(group_info.max_member_count > 0) {
|
||||||
groupInfoBuilder.setMaxMemberCount(group_info.max_member_count);
|
groupInfoBuilder.setMaxMemberCount(group_info.max_member_count);
|
||||||
}
|
}
|
||||||
|
if(group_info.isSuper_group()) {
|
||||||
|
groupInfoBuilder.setSuperGroup(1);
|
||||||
|
}
|
||||||
|
|
||||||
groupBuilder.setGroupInfo(groupInfoBuilder);
|
groupBuilder.setGroupInfo(groupInfoBuilder);
|
||||||
if(group.getMembers() != null) {
|
if(group.getMembers() != null) {
|
||||||
|
|||||||
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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 InputGetGroupMember {
|
||||||
|
private String groupId;
|
||||||
|
private String memberId;
|
||||||
|
|
||||||
|
public String getGroupId() {
|
||||||
|
return groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setGroupId(String groupId) {
|
||||||
|
this.groupId = groupId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getMemberId() {
|
||||||
|
return memberId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMemberId(String memberId) {
|
||||||
|
this.memberId = memberId;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
public class InputGetUserList {
|
||||||
|
public int count;
|
||||||
|
public int offset;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package cn.wildfirechat.pojos;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class OutputGetUserList {
|
||||||
|
public List<InputOutputUserInfo> userInfoList;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* 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 OutputRecallMessageData {
|
||||||
|
private OutputMessageData message;
|
||||||
|
private String userId;
|
||||||
|
private long timestamp;
|
||||||
|
private boolean isAdmin;
|
||||||
|
|
||||||
|
public OutputRecallMessageData() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public OutputRecallMessageData(OutputMessageData message, String userId, long timestamp, boolean isAdmin) {
|
||||||
|
this.message = message;
|
||||||
|
this.userId = userId;
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
this.isAdmin = isAdmin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public OutputMessageData getMessage() {
|
||||||
|
return message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMessage(OutputMessageData message) {
|
||||||
|
this.message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTimestamp() {
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimestamp(long timestamp) {
|
||||||
|
this.timestamp = timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAdmin() {
|
||||||
|
return isAdmin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAdmin(boolean admin) {
|
||||||
|
isAdmin = admin;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ public class PojoGroupInfo {
|
|||||||
int searchable;
|
int searchable;
|
||||||
int max_member_count;
|
int max_member_count;
|
||||||
int history_message;
|
int history_message;
|
||||||
|
boolean super_group;
|
||||||
|
|
||||||
public String getTarget_id() {
|
public String getTarget_id() {
|
||||||
return target_id;
|
return target_id;
|
||||||
@@ -117,4 +118,12 @@ public class PojoGroupInfo {
|
|||||||
public void setHistory_message(int history_message) {
|
public void setHistory_message(int history_message) {
|
||||||
this.history_message = history_message;
|
this.history_message = history_message;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isSuper_group() {
|
||||||
|
return super_group;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSuper_group(boolean super_group) {
|
||||||
|
this.super_group = super_group;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ public class ProtoConstants {
|
|||||||
int ConversationType_ChatRoom = 2;
|
int ConversationType_ChatRoom = 2;
|
||||||
int ConversationType_Channel = 3;
|
int ConversationType_Channel = 3;
|
||||||
int ConversationType_Things = 4;
|
int ConversationType_Things = 4;
|
||||||
|
int ConversationType_SecretChat = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
//message GroupInfo -> type
|
//message GroupInfo -> type
|
||||||
@@ -217,6 +218,12 @@ public class ProtoConstants {
|
|||||||
int SearchUserType_Mobile = 3;
|
int SearchUserType_Mobile = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public interface DisableSearchMask {
|
||||||
|
int DisableSearchDisplayNameMask = 1;
|
||||||
|
int DisableSearchNameMask = 2;
|
||||||
|
int DisableSearchMobileMask = 4;
|
||||||
|
}
|
||||||
|
|
||||||
public interface UserStatus {
|
public interface UserStatus {
|
||||||
int Normal = 0;
|
int Normal = 0;
|
||||||
int Muted = 1;
|
int Muted = 1;
|
||||||
|
|||||||
@@ -1641,6 +1641,16 @@ public final class WFCMessage {
|
|||||||
* <code>optional int32 history_message = 15;</code>
|
* <code>optional int32 history_message = 15;</code>
|
||||||
*/
|
*/
|
||||||
int getHistoryMessage();
|
int getHistoryMessage();
|
||||||
|
|
||||||
|
// optional int32 super_group = 16;
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
boolean hasSuperGroup();
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
int getSuperGroup();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Protobuf type {@code GroupInfo}
|
* Protobuf type {@code GroupInfo}
|
||||||
@@ -1768,6 +1778,11 @@ public final class WFCMessage {
|
|||||||
historyMessage_ = input.readInt32();
|
historyMessage_ = input.readInt32();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 128: {
|
||||||
|
bitField0_ |= 0x00008000;
|
||||||
|
superGroup_ = input.readInt32();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||||
@@ -2183,6 +2198,22 @@ public final class WFCMessage {
|
|||||||
return historyMessage_;
|
return historyMessage_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// optional int32 super_group = 16;
|
||||||
|
public static final int SUPER_GROUP_FIELD_NUMBER = 16;
|
||||||
|
private int superGroup_;
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public boolean hasSuperGroup() {
|
||||||
|
return ((bitField0_ & 0x00008000) == 0x00008000);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public int getSuperGroup() {
|
||||||
|
return superGroup_;
|
||||||
|
}
|
||||||
|
|
||||||
private void initFields() {
|
private void initFields() {
|
||||||
targetId_ = "";
|
targetId_ = "";
|
||||||
name_ = "";
|
name_ = "";
|
||||||
@@ -2199,6 +2230,7 @@ public final class WFCMessage {
|
|||||||
searchable_ = 0;
|
searchable_ = 0;
|
||||||
maxMemberCount_ = 0;
|
maxMemberCount_ = 0;
|
||||||
historyMessage_ = 0;
|
historyMessage_ = 0;
|
||||||
|
superGroup_ = 0;
|
||||||
}
|
}
|
||||||
private byte memoizedIsInitialized = -1;
|
private byte memoizedIsInitialized = -1;
|
||||||
public final boolean isInitialized() {
|
public final boolean isInitialized() {
|
||||||
@@ -2265,6 +2297,9 @@ public final class WFCMessage {
|
|||||||
if (((bitField0_ & 0x00004000) == 0x00004000)) {
|
if (((bitField0_ & 0x00004000) == 0x00004000)) {
|
||||||
output.writeInt32(15, historyMessage_);
|
output.writeInt32(15, historyMessage_);
|
||||||
}
|
}
|
||||||
|
if (((bitField0_ & 0x00008000) == 0x00008000)) {
|
||||||
|
output.writeInt32(16, superGroup_);
|
||||||
|
}
|
||||||
getUnknownFields().writeTo(output);
|
getUnknownFields().writeTo(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2334,6 +2369,10 @@ public final class WFCMessage {
|
|||||||
size += com.google.protobuf.CodedOutputStream
|
size += com.google.protobuf.CodedOutputStream
|
||||||
.computeInt32Size(15, historyMessage_);
|
.computeInt32Size(15, historyMessage_);
|
||||||
}
|
}
|
||||||
|
if (((bitField0_ & 0x00008000) == 0x00008000)) {
|
||||||
|
size += com.google.protobuf.CodedOutputStream
|
||||||
|
.computeInt32Size(16, superGroup_);
|
||||||
|
}
|
||||||
size += getUnknownFields().getSerializedSize();
|
size += getUnknownFields().getSerializedSize();
|
||||||
memoizedSerializedSize = size;
|
memoizedSerializedSize = size;
|
||||||
return size;
|
return size;
|
||||||
@@ -2480,6 +2519,8 @@ public final class WFCMessage {
|
|||||||
bitField0_ = (bitField0_ & ~0x00002000);
|
bitField0_ = (bitField0_ & ~0x00002000);
|
||||||
historyMessage_ = 0;
|
historyMessage_ = 0;
|
||||||
bitField0_ = (bitField0_ & ~0x00004000);
|
bitField0_ = (bitField0_ & ~0x00004000);
|
||||||
|
superGroup_ = 0;
|
||||||
|
bitField0_ = (bitField0_ & ~0x00008000);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2568,6 +2609,10 @@ public final class WFCMessage {
|
|||||||
to_bitField0_ |= 0x00004000;
|
to_bitField0_ |= 0x00004000;
|
||||||
}
|
}
|
||||||
result.historyMessage_ = historyMessage_;
|
result.historyMessage_ = historyMessage_;
|
||||||
|
if (((from_bitField0_ & 0x00008000) == 0x00008000)) {
|
||||||
|
to_bitField0_ |= 0x00008000;
|
||||||
|
}
|
||||||
|
result.superGroup_ = superGroup_;
|
||||||
result.bitField0_ = to_bitField0_;
|
result.bitField0_ = to_bitField0_;
|
||||||
onBuilt();
|
onBuilt();
|
||||||
return result;
|
return result;
|
||||||
@@ -2639,6 +2684,9 @@ public final class WFCMessage {
|
|||||||
if (other.hasHistoryMessage()) {
|
if (other.hasHistoryMessage()) {
|
||||||
setHistoryMessage(other.getHistoryMessage());
|
setHistoryMessage(other.getHistoryMessage());
|
||||||
}
|
}
|
||||||
|
if (other.hasSuperGroup()) {
|
||||||
|
setSuperGroup(other.getSuperGroup());
|
||||||
|
}
|
||||||
this.mergeUnknownFields(other.getUnknownFields());
|
this.mergeUnknownFields(other.getUnknownFields());
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
@@ -3374,6 +3422,39 @@ public final class WFCMessage {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// optional int32 super_group = 16;
|
||||||
|
private int superGroup_ ;
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public boolean hasSuperGroup() {
|
||||||
|
return ((bitField0_ & 0x00008000) == 0x00008000);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public int getSuperGroup() {
|
||||||
|
return superGroup_;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public Builder setSuperGroup(int value) {
|
||||||
|
bitField0_ |= 0x00008000;
|
||||||
|
superGroup_ = value;
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* <code>optional int32 super_group = 16;</code>
|
||||||
|
*/
|
||||||
|
public Builder clearSuperGroup() {
|
||||||
|
bitField0_ = (bitField0_ & ~0x00008000);
|
||||||
|
superGroup_ = 0;
|
||||||
|
onChanged();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
// @@protoc_insertion_point(builder_scope:GroupInfo)
|
// @@protoc_insertion_point(builder_scope:GroupInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67224,179 +67305,180 @@ public final class WFCMessage {
|
|||||||
"dRequest\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006reason\030\002" +
|
"dRequest\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006reason\030\002" +
|
||||||
" \002(\t\022\r\n\005extra\030\003 \001(\t\":\n\014Conversation\022\014\n\004t" +
|
" \002(\t\022\r\n\005extra\030\003 \001(\t\":\n\014Conversation\022\014\n\004t" +
|
||||||
"ype\030\001 \002(\005\022\016\n\006target\030\002 \002(\t\022\014\n\004line\030\003 \002(\005\"" +
|
"ype\030\001 \002(\005\022\016\n\006target\030\002 \002(\t\022\014\n\004line\030\003 \002(\005\"" +
|
||||||
"\253\002\n\tGroupInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014\n\004name" +
|
"\300\002\n\tGroupInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014\n\004name" +
|
||||||
"\030\002 \002(\t\022\020\n\010portrait\030\003 \001(\t\022\r\n\005owner\030\004 \001(\t\022" +
|
"\030\002 \002(\t\022\020\n\010portrait\030\003 \001(\t\022\r\n\005owner\030\004 \001(\t\022" +
|
||||||
"\014\n\004type\030\005 \002(\005\022\024\n\014member_count\030\006 \001(\005\022\r\n\005e" +
|
"\014\n\004type\030\005 \002(\005\022\024\n\014member_count\030\006 \001(\005\022\r\n\005e" +
|
||||||
"xtra\030\007 \001(\t\022\021\n\tupdate_dt\030\010 \001(\003\022\030\n\020member_" +
|
"xtra\030\007 \001(\t\022\021\n\tupdate_dt\030\010 \001(\003\022\030\n\020member_" +
|
||||||
"update_dt\030\t \001(\003\022\014\n\004mute\030\n \001(\005\022\021\n\tjoin_ty" +
|
"update_dt\030\t \001(\003\022\014\n\004mute\030\n \001(\005\022\021\n\tjoin_ty" +
|
||||||
"pe\030\013 \001(\005\022\024\n\014private_chat\030\014 \001(\005\022\022\n\nsearch",
|
"pe\030\013 \001(\005\022\024\n\014private_chat\030\014 \001(\005\022\022\n\nsearch",
|
||||||
"able\030\r \001(\005\022\030\n\020max_member_count\030\016 \001(\005\022\027\n\017" +
|
"able\030\r \001(\005\022\030\n\020max_member_count\030\016 \001(\005\022\027\n\017" +
|
||||||
"history_message\030\017 \001(\005\"r\n\013GroupMember\022\021\n\t" +
|
"history_message\030\017 \001(\005\022\023\n\013super_group\030\020 \001" +
|
||||||
"member_id\030\001 \002(\t\022\r\n\005alias\030\002 \001(\t\022\014\n\004type\030\003" +
|
"(\005\"r\n\013GroupMember\022\021\n\tmember_id\030\001 \002(\t\022\r\n\005" +
|
||||||
" \002(\005\022\021\n\tupdate_dt\030\004 \001(\003\022\021\n\tcreate_dt\030\005 \001" +
|
"alias\030\002 \001(\t\022\014\n\004type\030\003 \002(\005\022\021\n\tupdate_dt\030\004" +
|
||||||
"(\003\022\r\n\005extra\030\006 \001(\t\"F\n\005Group\022\036\n\ngroup_info" +
|
" \001(\003\022\021\n\tcreate_dt\030\005 \001(\003\022\r\n\005extra\030\006 \001(\t\"F" +
|
||||||
"\030\001 \002(\0132\n.GroupInfo\022\035\n\007members\030\002 \003(\0132\014.Gr" +
|
"\n\005Group\022\036\n\ngroup_info\030\001 \002(\0132\n.GroupInfo\022" +
|
||||||
"oupMember\"\313\001\n\013ChannelMenu\022\014\n\004type\030\001 \002(\t\022" +
|
"\035\n\007members\030\002 \003(\0132\014.GroupMember\"\313\001\n\013Chann" +
|
||||||
"\014\n\004name\030\002 \002(\t\022\013\n\003key\030\003 \001(\t\022\013\n\003url\030\004 \001(\t\022" +
|
"elMenu\022\014\n\004type\030\001 \002(\t\022\014\n\004name\030\002 \002(\t\022\013\n\003ke" +
|
||||||
"\020\n\010media_id\030\005 \001(\t\022\022\n\narticle_id\030\006 \001(\t\022\016\n" +
|
"y\030\003 \001(\t\022\013\n\003url\030\004 \001(\t\022\020\n\010media_id\030\005 \001(\t\022\022" +
|
||||||
"\006app_id\030\007 \001(\t\022\020\n\010app_page\030\010 \001(\t\022\036\n\010sub_m",
|
"\n\narticle_id\030\006 \001(\t\022\016\n\006app_id\030\007 \001(\t\022\020\n\010ap",
|
||||||
"enu\030\t \003(\0132\014.ChannelMenu\022\017\n\007menu_id\030\n \001(\t" +
|
"p_page\030\010 \001(\t\022\036\n\010sub_menu\030\t \003(\0132\014.Channel" +
|
||||||
"\022\r\n\005extra\030\013 \001(\t\"-\n\017ChannelMenuList\022\032\n\004me" +
|
"Menu\022\017\n\007menu_id\030\n \001(\t\022\r\n\005extra\030\013 \001(\t\"-\n\017" +
|
||||||
"nu\030\001 \003(\0132\014.ChannelMenu\"\340\001\n\013ChannelInfo\022\021" +
|
"ChannelMenuList\022\032\n\004menu\030\001 \003(\0132\014.ChannelM" +
|
||||||
"\n\ttarget_id\030\001 \001(\t\022\014\n\004name\030\002 \002(\t\022\020\n\010portr" +
|
"enu\"\340\001\n\013ChannelInfo\022\021\n\ttarget_id\030\001 \001(\t\022\014" +
|
||||||
"ait\030\003 \001(\t\022\r\n\005owner\030\004 \001(\t\022\016\n\006status\030\005 \001(\005" +
|
"\n\004name\030\002 \002(\t\022\020\n\010portrait\030\003 \001(\t\022\r\n\005owner\030" +
|
||||||
"\022\014\n\004desc\030\006 \001(\t\022\r\n\005extra\030\007 \001(\t\022\021\n\tupdate_" +
|
"\004 \001(\t\022\016\n\006status\030\005 \001(\005\022\014\n\004desc\030\006 \001(\t\022\r\n\005e" +
|
||||||
"dt\030\010 \001(\003\022\016\n\006secret\030\t \001(\t\022\020\n\010callback\030\n \001" +
|
"xtra\030\007 \001(\t\022\021\n\tupdate_dt\030\010 \001(\003\022\016\n\006secret\030" +
|
||||||
"(\t\022\021\n\tautomatic\030\013 \001(\005\022\032\n\004menu\030\014 \003(\0132\014.Ch" +
|
"\t \001(\t\022\020\n\010callback\030\n \001(\t\022\021\n\tautomatic\030\013 \001" +
|
||||||
"annelMenu\"D\n\021ModifyChannelInfo\022\022\n\nchanne" +
|
"(\005\022\032\n\004menu\030\014 \003(\0132\014.ChannelMenu\"D\n\021Modify" +
|
||||||
"l_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\"",
|
"ChannelInfo\022\022\n\nchannel_id\030\001 \002(\t\022\014\n\004type\030",
|
||||||
"8\n\017TransferChannel\022\022\n\nchannel_id\030\001 \002(\t\022\021" +
|
"\002 \002(\005\022\r\n\005value\030\003 \002(\t\"8\n\017TransferChannel\022" +
|
||||||
"\n\tnew_owner\030\002 \002(\t\"3\n\017PullChannelInfo\022\022\n\n" +
|
"\022\n\nchannel_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\"3" +
|
||||||
"channel_id\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"H\n\023PullCh" +
|
"\n\017PullChannelInfo\022\022\n\nchannel_id\030\001 \002(\t\022\014\n" +
|
||||||
"annelListener\022\022\n\nchannel_id\030\001 \002(\t\022\016\n\006off" +
|
"\004head\030\002 \002(\003\"H\n\023PullChannelListener\022\022\n\nch" +
|
||||||
"set\030\002 \002(\005\022\r\n\005count\030\003 \002(\005\"R\n\031PullChannelL" +
|
"annel_id\030\001 \002(\t\022\016\n\006offset\030\002 \002(\005\022\r\n\005count\030" +
|
||||||
"istenerResult\022\023\n\013total_count\030\001 \002(\005\022\016\n\006of" +
|
"\003 \002(\005\"R\n\031PullChannelListenerResult\022\023\n\013to" +
|
||||||
"fset\030\002 \002(\005\022\020\n\010listener\030\003 \003(\t\"3\n\rListenCh" +
|
"tal_count\030\001 \002(\005\022\016\n\006offset\030\002 \002(\005\022\020\n\010liste" +
|
||||||
"annel\022\022\n\nchannel_id\030\001 \002(\t\022\016\n\006listen\030\002 \002(" +
|
"ner\030\003 \003(\t\"3\n\rListenChannel\022\022\n\nchannel_id" +
|
||||||
"\005\"E\n\023SearchChannelResult\022\035\n\007channel\030\001 \003(" +
|
"\030\001 \002(\t\022\016\n\006listen\030\002 \002(\005\"E\n\023SearchChannelR" +
|
||||||
"\0132\014.ChannelInfo\022\017\n\007keyword\030\002 \002(\t\"\235\002\n\016Mes",
|
"esult\022\035\n\007channel\030\001 \003(\0132\014.ChannelInfo\022\017\n\007",
|
||||||
"sageContent\022\014\n\004type\030\001 \002(\005\022\032\n\022searchable_" +
|
"keyword\030\002 \002(\t\"\235\002\n\016MessageContent\022\014\n\004type" +
|
||||||
"content\030\002 \001(\t\022\024\n\014push_content\030\003 \001(\t\022\017\n\007c" +
|
"\030\001 \002(\005\022\032\n\022searchable_content\030\002 \001(\t\022\024\n\014pu" +
|
||||||
"ontent\030\004 \001(\t\022\014\n\004data\030\005 \001(\014\022\021\n\tmediaType\030" +
|
"sh_content\030\003 \001(\t\022\017\n\007content\030\004 \001(\t\022\014\n\004dat" +
|
||||||
"\006 \001(\005\022\026\n\016remoteMediaUrl\030\007 \001(\t\022\024\n\014persist" +
|
"a\030\005 \001(\014\022\021\n\tmediaType\030\006 \001(\005\022\026\n\016remoteMedi" +
|
||||||
"_flag\030\010 \001(\005\022\027\n\017expire_duration\030\t \001(\005\022\026\n\016" +
|
"aUrl\030\007 \001(\t\022\024\n\014persist_flag\030\010 \001(\005\022\027\n\017expi" +
|
||||||
"mentioned_type\030\n \001(\005\022\030\n\020mentioned_target" +
|
"re_duration\030\t \001(\005\022\026\n\016mentioned_type\030\n \001(" +
|
||||||
"\030\013 \003(\t\022\r\n\005extra\030\014 \001(\t\022\021\n\tpush_data\030\r \001(\t" +
|
"\005\022\030\n\020mentioned_target\030\013 \003(\t\022\r\n\005extra\030\014 \001" +
|
||||||
"\"\226\001\n\025AddGroupMemberRequest\022\020\n\010group_id\030\001" +
|
"(\t\022\021\n\tpush_data\030\r \001(\t\"\226\001\n\025AddGroupMember" +
|
||||||
" \002(\t\022\"\n\014added_member\030\002 \003(\0132\014.GroupMember" +
|
"Request\022\020\n\010group_id\030\001 \002(\t\022\"\n\014added_membe" +
|
||||||
"\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(",
|
"r\030\002 \003(\0132\014.GroupMember\022\017\n\007to_line\030\003 \003(\005\022\'",
|
||||||
"\0132\017.MessageContent\022\r\n\005extra\030\005 \001(\t\"{\n\022Cre" +
|
"\n\016notify_content\030\004 \001(\0132\017.MessageContent\022" +
|
||||||
"ateGroupRequest\022\025\n\005group\030\001 \002(\0132\006.Group\022\017" +
|
"\r\n\005extra\030\005 \001(\t\"{\n\022CreateGroupRequest\022\025\n\005" +
|
||||||
"\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132" +
|
"group\030\001 \002(\0132\006.Group\022\017\n\007to_line\030\002 \003(\005\022\'\n\016" +
|
||||||
"\017.MessageContent\022\024\n\014member_extra\030\004 \001(\t\"a" +
|
"notify_content\030\003 \001(\0132\017.MessageContent\022\024\n" +
|
||||||
"\n\023DismissGroupRequest\022\020\n\010group_id\030\001 \002(\t\022" +
|
"\014member_extra\030\004 \001(\t\"a\n\023DismissGroupReque" +
|
||||||
"\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\013" +
|
"st\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n" +
|
||||||
"2\017.MessageContent\"\245\001\n\rFriendRequest\022\020\n\010f" +
|
"\016notify_content\030\003 \001(\0132\017.MessageContent\"\245" +
|
||||||
"rom_uid\030\001 \001(\t\022\016\n\006to_uid\030\002 \002(\t\022\016\n\006reason\030" +
|
"\001\n\rFriendRequest\022\020\n\010from_uid\030\001 \001(\t\022\016\n\006to" +
|
||||||
"\003 \002(\t\022\016\n\006status\030\004 \001(\005\022\021\n\tupdate_dt\030\005 \001(\003" +
|
"_uid\030\002 \002(\t\022\016\n\006reason\030\003 \002(\t\022\016\n\006status\030\004 \001" +
|
||||||
"\022\030\n\020from_read_status\030\006 \001(\010\022\026\n\016to_read_st",
|
"(\005\022\021\n\tupdate_dt\030\005 \001(\003\022\030\n\020from_read_statu",
|
||||||
"atus\030\007 \001(\010\022\r\n\005extra\030\010 \001(\t\"#\n\rGeneralResu" +
|
"s\030\006 \001(\010\022\026\n\016to_read_status\030\007 \001(\010\022\r\n\005extra" +
|
||||||
"lt\022\022\n\nerror_code\030\001 \002(\005\"?\n\025GetUploadToken" +
|
"\030\010 \001(\t\"#\n\rGeneralResult\022\022\n\nerror_code\030\001 " +
|
||||||
"Request\022\022\n\nmedia_type\030\001 \002(\005\022\022\n\nmedia_pat" +
|
"\002(\005\"?\n\025GetUploadTokenRequest\022\022\n\nmedia_ty" +
|
||||||
"h\030\002 \002(\t\"S\n\024GetUploadTokenResult\022\016\n\006domai" +
|
"pe\030\001 \002(\005\022\022\n\nmedia_path\030\002 \002(\t\"S\n\024GetUploa" +
|
||||||
"n\030\001 \002(\t\022\r\n\005token\030\002 \002(\t\022\016\n\006server\030\003 \002(\t\022\014" +
|
"dTokenResult\022\016\n\006domain\030\001 \002(\t\022\r\n\005token\030\002 " +
|
||||||
"\n\004port\030\004 \001(\005\"H\n\023HandleFriendRequest\022\022\n\nt" +
|
"\002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004port\030\004 \001(\005\"H\n\023Han" +
|
||||||
"arget_uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\022\r\n\005extra" +
|
"dleFriendRequest\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006" +
|
||||||
"\030\003 \001(\t\"\023\n\005IDBuf\022\n\n\002id\030\001 \002(\t\"\027\n\tIDListBuf" +
|
"status\030\002 \002(\005\022\r\n\005extra\030\003 \001(\t\"\023\n\005IDBuf\022\n\n\002" +
|
||||||
"\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Message\022#\n\014conversation" +
|
"id\030\001 \002(\t\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Me" +
|
||||||
"\030\001 \002(\0132\r.Conversation\022\021\n\tfrom_user\030\002 \002(\t",
|
"ssage\022#\n\014conversation\030\001 \002(\0132\r.Conversati",
|
||||||
"\022 \n\007content\030\003 \002(\0132\017.MessageContent\022\022\n\nme" +
|
"on\022\021\n\tfrom_user\030\002 \002(\t\022 \n\007content\030\003 \002(\0132\017" +
|
||||||
"ssage_id\030\004 \001(\003\022\030\n\020server_timestamp\030\005 \001(\003" +
|
".MessageContent\022\022\n\nmessage_id\030\004 \001(\003\022\030\n\020s" +
|
||||||
"\022\017\n\007to_user\030\006 \001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013" +
|
"erver_timestamp\030\005 \001(\003\022\017\n\007to_user\030\006 \001(\t\022\n" +
|
||||||
"\n\003uid\030\001 \002(\t\022\014\n\004name\030\002 \001(\t\022\024\n\014display_nam" +
|
"\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022\014\n\004name" +
|
||||||
"e\030\003 \001(\t\022\020\n\010portrait\030\004 \001(\t\022\016\n\006mobile\030\005 \001(" +
|
"\030\002 \001(\t\022\024\n\014display_name\030\003 \001(\t\022\020\n\010portrait" +
|
||||||
"\t\022\r\n\005email\030\006 \001(\t\022\017\n\007address\030\007 \001(\t\022\017\n\007com" +
|
"\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\017\n" +
|
||||||
"pany\030\010 \001(\t\022\r\n\005extra\030\t \001(\t\022\021\n\tupdate_dt\030\n" +
|
"\007address\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r\n\005extra" +
|
||||||
" \001(\003\022\016\n\006gender\030\013 \001(\005\022\016\n\006social\030\014 \001(\t\022\014\n\004" +
|
"\030\t \001(\t\022\021\n\tupdate_dt\030\n \001(\003\022\016\n\006gender\030\013 \001(" +
|
||||||
"type\030\r \001(\005\022\017\n\007deleted\030\016 \001(\005\"c\n\005Robot\022\013\n\003" +
|
"\005\022\016\n\006social\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007delet" +
|
||||||
"uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022",
|
"ed\030\016 \001(\005\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030",
|
||||||
"\016\n\006secret\030\004 \001(\t\022\020\n\010callback\030\005 \001(\t\022\r\n\005ext" +
|
"\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\020\n\010" +
|
||||||
"ra\030\006 \001(\t\"(\n\017GetRobotsResult\022\025\n\005entry\030\001 \003" +
|
"callback\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017GetRobo" +
|
||||||
"(\0132\006.Robot\"g\n\030UploadDeviceTokenRequest\022\020" +
|
"tsResult\022\025\n\005entry\030\001 \003(\0132\006.Robot\"g\n\030Uploa" +
|
||||||
"\n\010platform\030\001 \002(\005\022\020\n\010app_name\030\002 \002(\t\022\024\n\014de" +
|
"dDeviceTokenRequest\022\020\n\010platform\030\001 \002(\005\022\020\n" +
|
||||||
"vice_token\030\003 \002(\t\022\021\n\tpush_type\030\004 \002(\005\"\201\001\n\026" +
|
"\010app_name\030\002 \002(\t\022\024\n\014device_token\030\003 \002(\t\022\021\n" +
|
||||||
"ModifyGroupInfoRequest\022\020\n\010group_id\030\001 \002(\t" +
|
"\tpush_type\030\004 \002(\005\"\201\001\n\026ModifyGroupInfoRequ" +
|
||||||
"\022\014\n\004type\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\022\017\n\007to_line" +
|
"est\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005v" +
|
||||||
"\030\004 \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017.Message" +
|
"alue\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_co" +
|
||||||
"Content\"\203\001\n\026SetGroupManagerRequest\022\020\n\010gr" +
|
"ntent\030\005 \001(\0132\017.MessageContent\"\203\001\n\026SetGrou" +
|
||||||
"oup_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\017\n\007user_id\030\003 ",
|
"pManagerRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004typ",
|
||||||
"\003(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_content\030\005" +
|
"e\030\002 \002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007to_line\030\004 \003(" +
|
||||||
" \001(\0132\017.MessageContent\"(\n\tInfoEntry\022\014\n\004ty" +
|
"\005\022\'\n\016notify_content\030\005 \001(\0132\017.MessageConte" +
|
||||||
"pe\030\001 \002(\005\022\r\n\005value\030\002 \002(\t\"0\n\023ModifyMyInfoR" +
|
"nt\"(\n\tInfoEntry\022\014\n\004type\030\001 \002(\005\022\r\n\005value\030\002" +
|
||||||
"equest\022\031\n\005entry\030\001 \003(\0132\n.InfoEntry\";\n\rNot" +
|
" \002(\t\"0\n\023ModifyMyInfoRequest\022\031\n\005entry\030\001 \003" +
|
||||||
"ifyMessage\022\014\n\004type\030\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016" +
|
"(\0132\n.InfoEntry\";\n\rNotifyMessage\022\014\n\004type\030" +
|
||||||
"\n\006target\030\003 \001(\t\"=\n\022PullMessageRequest\022\n\n\002" +
|
"\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target\030\003 \001(\t\"=\n\022P" +
|
||||||
"id\030\001 \002(\003\022\014\n\004type\030\002 \002(\005\022\r\n\005delay\030\003 \001(\003\"M\n" +
|
"ullMessageRequest\022\n\n\002id\030\001 \002(\003\022\014\n\004type\030\002 " +
|
||||||
"\021PullMessageResult\022\031\n\007message\030\001 \003(\0132\010.Me" +
|
"\002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021PullMessageResult\022" +
|
||||||
"ssage\022\017\n\007current\030\002 \002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023" +
|
"\031\n\007message\030\001 \003(\0132\010.Message\022\017\n\007current\030\002 " +
|
||||||
"PullGroupInfoResult\022\030\n\004info\030\001 \003(\0132\n.Grou",
|
"\002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023PullGroupInfoResult",
|
||||||
"pInfo\"6\n\026PullGroupMemberRequest\022\016\n\006targe" +
|
"\022\030\n\004info\030\001 \003(\0132\n.GroupInfo\"6\n\026PullGroupM" +
|
||||||
"t\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"5\n\025PullGroupMember" +
|
"emberRequest\022\016\n\006target\030\001 \002(\t\022\014\n\004head\030\002 \002" +
|
||||||
"Result\022\034\n\006member\030\001 \003(\0132\014.GroupMember\"-\n\013" +
|
"(\003\"5\n\025PullGroupMemberResult\022\034\n\006member\030\001 " +
|
||||||
"UserRequest\022\013\n\003uid\030\001 \002(\t\022\021\n\tupdate_dt\030\002 " +
|
"\003(\0132\014.GroupMember\"-\n\013UserRequest\022\013\n\003uid\030" +
|
||||||
"\001(\003\"0\n\017PullUserRequest\022\035\n\007request\030\001 \003(\0132" +
|
"\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017PullUserRequ" +
|
||||||
"\014.UserRequest\"/\n\nUserResult\022\023\n\004user\030\001 \002(" +
|
"est\022\035\n\007request\030\001 \003(\0132\014.UserRequest\"/\n\nUs" +
|
||||||
"\0132\005.User\022\014\n\004code\030\002 \002(\005\"-\n\016PullUserResult" +
|
"erResult\022\023\n\004user\030\001 \002(\0132\005.User\022\014\n\004code\030\002 " +
|
||||||
"\022\033\n\006result\030\001 \003(\0132\013.UserResult\"^\n\020QuitGro" +
|
"\002(\005\"-\n\016PullUserResult\022\033\n\006result\030\001 \003(\0132\013." +
|
||||||
"upRequest\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002" +
|
"UserResult\"^\n\020QuitGroupRequest\022\020\n\010group_" +
|
||||||
" \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017.MessageCo",
|
"id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_cont",
|
||||||
"ntent\"~\n\030RemoveGroupMemberRequest\022\020\n\010gro" +
|
"ent\030\003 \001(\0132\017.MessageContent\"~\n\030RemoveGrou" +
|
||||||
"up_id\030\001 \002(\t\022\026\n\016removed_member\030\002 \003(\t\022\017\n\007t" +
|
"pMemberRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n\016remo" +
|
||||||
"o_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.M" +
|
"ved_member\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016not" +
|
||||||
"essageContent\"u\n\024TransferGroupRequest\022\020\n" +
|
"ify_content\030\004 \001(\0132\017.MessageContent\"u\n\024Tr" +
|
||||||
"\010group_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to" +
|
"ansferGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\021\n\t" +
|
||||||
"_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Me" +
|
"new_owner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016noti" +
|
||||||
"ssageContent\"\206\001\n\026ModifyGroupMemberAlias\022" +
|
"fy_content\030\004 \001(\0132\017.MessageContent\"\206\001\n\026Mo" +
|
||||||
"\020\n\010group_id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_l" +
|
"difyGroupMemberAlias\022\020\n\010group_id\030\001 \002(\t\022\r" +
|
||||||
"ine\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132\017.Mess" +
|
"\n\005alias\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify" +
|
||||||
"ageContent\022\021\n\tmember_id\030\005 \001(\t\"\206\001\n\026Modify",
|
"_content\030\004 \001(\0132\017.MessageContent\022\021\n\tmembe",
|
||||||
"GroupMemberExtra\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to" +
|
"r_id\030\005 \001(\t\"\206\001\n\026ModifyGroupMemberExtra\022\020\n" +
|
||||||
"_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017.Me" +
|
"\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016noti" +
|
||||||
"ssageContent\022\r\n\005extra\030\004 \001(\t\022\021\n\tmember_id" +
|
"fy_content\030\003 \001(\0132\017.MessageContent\022\r\n\005ext" +
|
||||||
"\030\005 \001(\t\"P\n\020UserSettingEntry\022\r\n\005scope\030\001 \002(" +
|
"ra\030\004 \001(\t\022\021\n\tmember_id\030\005 \001(\t\"P\n\020UserSetti" +
|
||||||
"\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\022\021\n\tupdate_" +
|
"ngEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005v" +
|
||||||
"dt\030\004 \002(\003\"A\n\024ModifyUserSettingReq\022\r\n\005scop" +
|
"alue\030\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyU" +
|
||||||
"e\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032\n\007V" +
|
"serSettingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(" +
|
||||||
"ersion\022\017\n\007version\030\001 \002(\003\"8\n\024GetUserSettin" +
|
"\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Version\022\017\n\007version\030\001" +
|
||||||
"gResult\022 \n\005entry\030\001 \003(\0132\021.UserSettingEntr" +
|
" \002(\003\"8\n\024GetUserSettingResult\022 \n\005entry\030\001 " +
|
||||||
"y\"f\n\006Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022",
|
"\003(\0132\021.UserSettingEntry\"f\n\006Friend\022\013\n\003uid\030",
|
||||||
"\021\n\tupdate_dt\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007bla" +
|
"\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tupdate_dt\030\003 \002(\003\022" +
|
||||||
"cked\030\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsR" +
|
"\r\n\005alias\030\004 \001(\t\022\017\n\007blacked\030\005 \001(\005\022\r\n\005extra" +
|
||||||
"esult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"7\n\026GetFrie" +
|
"\030\006 \001(\t\"*\n\020GetFriendsResult\022\026\n\005entry\030\001 \003(" +
|
||||||
"ndRequestResult\022\035\n\005entry\030\001 \003(\0132\016.FriendR" +
|
"\0132\007.Friend\"7\n\026GetFriendRequestResult\022\035\n\005" +
|
||||||
"equest\"\243\001\n\021ConnectAckPayload\022\020\n\010msg_head" +
|
"entry\030\001 \003(\0132\016.FriendRequest\"\243\001\n\021ConnectA" +
|
||||||
"\030\001 \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n\016friend_rq" +
|
"ckPayload\022\020\n\010msg_head\030\001 \001(\003\022\023\n\013friend_he" +
|
||||||
"_head\030\003 \001(\003\022\024\n\014setting_head\030\004 \001(\003\022\021\n\tnod" +
|
"ad\030\002 \001(\003\022\026\n\016friend_rq_head\030\003 \001(\003\022\024\n\014sett" +
|
||||||
"e_addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013serve" +
|
"ing_head\030\004 \001(\003\022\021\n\tnode_addr\030\005 \001(\t\022\021\n\tnod" +
|
||||||
"r_time\030\007 \001(\003\"P\n\rIMHttpWrapper\022\r\n\005token\030\001" +
|
"e_port\030\006 \001(\005\022\023\n\013server_time\030\007 \001(\003\"P\n\rIMH" +
|
||||||
" \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t",
|
"ttpWrapper\022\r\n\005token\030\001 \002(\t\022\021\n\tclient_id\030\002",
|
||||||
"\022\014\n\004data\030\004 \001(\014\"A\n\021SearchUserRequest\022\017\n\007k" +
|
" \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021S" +
|
||||||
"eyword\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(" +
|
"earchUserRequest\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuz" +
|
||||||
"\005\"(\n\020SearchUserResult\022\024\n\005entry\030\001 \003(\0132\005.U" +
|
"zy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020SearchUserResu" +
|
||||||
"ser\"@\n\026GetChatroomInfoRequest\022\023\n\013chatroo" +
|
"lt\022\024\n\005entry\030\001 \003(\0132\005.User\"@\n\026GetChatroomI" +
|
||||||
"m_id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014Chatro" +
|
"nfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tupdat" +
|
||||||
"omInfo\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010p" +
|
"e_dt\030\002 \001(\003\"\227\001\n\014ChatroomInfo\022\r\n\005title\030\001 \002" +
|
||||||
"ortrait\030\003 \001(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tc" +
|
"(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portrait\030\003 \001(\t\022\024\n\014me" +
|
||||||
"reate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005ext" +
|
"mber_count\030\004 \001(\005\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tu" +
|
||||||
"ra\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034GetChatroomMe" +
|
"pdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n\005state\030\010" +
|
||||||
"mberInfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\t",
|
" \001(\005\"F\n\034GetChatroomMemberInfoRequest\022\023\n\013",
|
||||||
"max_count\030\002 \001(\005\";\n\022ChatroomMemberInfo\022\024\n" +
|
"chatroom_id\030\001 \002(\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022" +
|
||||||
"\014member_count\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010" +
|
"ChatroomMemberInfo\022\024\n\014member_count\030\001 \001(\005" +
|
||||||
"INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023NotifyRecallMess" +
|
"\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(" +
|
||||||
"age\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020Bl" +
|
"\003\"4\n\023NotifyRecallMessage\022\n\n\002id\030\001 \002(\003\022\021\n\t" +
|
||||||
"ackUserRequest\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 " +
|
"from_user\030\002 \002(\t\"/\n\020BlackUserRequest\022\013\n\003u" +
|
||||||
"\002(\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010pla" +
|
"id\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323\001\n\014RouteReques" +
|
||||||
"tform\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device" +
|
"t\022\013\n\003app\030\001 \001(\t\022\020\n\010platform\030\002 \001(\005\022\021\n\tpush" +
|
||||||
"_name\030\004 \001(\t\022\026\n\016device_version\030\005 \001(\t\022\022\n\np" +
|
"_type\030\003 \001(\005\022\023\n\013device_name\030\004 \001(\t\022\026\n\016devi" +
|
||||||
"hone_name\030\006 \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014car" +
|
"ce_version\030\005 \001(\t\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010" +
|
||||||
"rier_name\030\010 \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013",
|
"language\030\007 \001(\t\022\024\n\014carrier_name\030\010 \001(\t\022\023\n\013",
|
||||||
"sdk_version\030\n \001(\t\"D\n\rRouteResponse\022\014\n\004ho" +
|
"app_version\030\t \001(\t\022\023\n\013sdk_version\030\n \001(\t\"D" +
|
||||||
"st\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n\nshort_por" +
|
"\n\rRouteResponse\022\014\n\004host\030\001 \002(\t\022\021\n\tlong_po" +
|
||||||
"t\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007user_id\030\001 " +
|
"rt\030\002 \002(\005\022\022\n\nshort_port\030\003 \002(\005\"G\n\017GetToken" +
|
||||||
"\002(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005" +
|
"Request\022\017\n\007user_id\030\001 \002(\t\022\021\n\tclient_id\030\002 " +
|
||||||
"\"r\n\022LoadRemoteMessages\022#\n\014conversation\030\001" +
|
"\002(\t\022\020\n\010platform\030\003 \001(\005\"r\n\022LoadRemoteMessa" +
|
||||||
" \002(\0132\r.Conversation\022\022\n\nbefore_uid\030\002 \002(\003\022" +
|
"ges\022#\n\014conversation\030\001 \002(\0132\r.Conversation" +
|
||||||
"\r\n\005count\030\003 \002(\005\022\024\n\014content_type\030\004 \003(\005\"a\n\020" +
|
"\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005count\030\003 \002(\005\022\024\n\014c" +
|
||||||
"MultiCastMessage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007c" +
|
"ontent_type\030\004 \003(\005\"a\n\020MultiCastMessage\022\021\n" +
|
||||||
"ontent\030\002 \002(\0132\017.MessageContent\022\n\n\002to\030\003 \003(" +
|
"\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\0132\017.Mess" +
|
||||||
"\t\022\014\n\004line\030\004 \002(\005\"E\n\035RecallMultiCastMessag",
|
"ageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005\"E\n\035",
|
||||||
"eRequest\022\022\n\nmessage_id\030\001 \002(\003\022\020\n\010receiver" +
|
"RecallMultiCastMessageRequest\022\022\n\nmessage" +
|
||||||
"\030\002 \003(\t\"@\n\017AuthCodeRequest\022\021\n\ttarget_id\030\001" +
|
"_id\030\001 \002(\003\022\020\n\010receiver\030\002 \003(\t\"@\n\017AuthCodeR" +
|
||||||
" \002(\t\022\014\n\004type\030\002 \002(\005\022\014\n\004host\030\003 \002(\t\"o\n\030Appl" +
|
"equest\022\021\n\ttarget_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022" +
|
||||||
"icationConfigRequest\022\r\n\005appId\030\001 \002(\t\022\017\n\007a" +
|
"\014\n\004host\030\003 \002(\t\"o\n\030ApplicationConfigReques" +
|
||||||
"ppType\030\002 \002(\005\022\021\n\ttimestamp\030\003 \002(\003\022\r\n\005nonce" +
|
"t\022\r\n\005appId\030\001 \002(\t\022\017\n\007appType\030\002 \002(\005\022\021\n\ttim" +
|
||||||
"\030\004 \002(\t\022\021\n\tsignature\030\005 \002(\tB#\n\025cn.wildfire" +
|
"estamp\030\003 \002(\003\022\r\n\005nonce\030\004 \002(\t\022\021\n\tsignature" +
|
||||||
"chat.protoB\nWFCMessage"
|
"\030\005 \002(\tB/\n\025cn.wildfirechat.protoB\nWFCMess" +
|
||||||
|
"ageZ\n./go;proto"
|
||||||
};
|
};
|
||||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||||
@@ -67420,7 +67502,7 @@ public final class WFCMessage {
|
|||||||
internal_static_GroupInfo_fieldAccessorTable = new
|
internal_static_GroupInfo_fieldAccessorTable = new
|
||||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||||
internal_static_GroupInfo_descriptor,
|
internal_static_GroupInfo_descriptor,
|
||||||
new java.lang.String[] { "TargetId", "Name", "Portrait", "Owner", "Type", "MemberCount", "Extra", "UpdateDt", "MemberUpdateDt", "Mute", "JoinType", "PrivateChat", "Searchable", "MaxMemberCount", "HistoryMessage", });
|
new java.lang.String[] { "TargetId", "Name", "Portrait", "Owner", "Type", "MemberCount", "Extra", "UpdateDt", "MemberUpdateDt", "Mute", "JoinType", "PrivateChat", "Searchable", "MaxMemberCount", "HistoryMessage", "SuperGroup", });
|
||||||
internal_static_GroupMember_descriptor =
|
internal_static_GroupMember_descriptor =
|
||||||
getDescriptor().getMessageTypes().get(3);
|
getDescriptor().getMessageTypes().get(3);
|
||||||
internal_static_GroupMember_fieldAccessorTable = new
|
internal_static_GroupMember_fieldAccessorTable = new
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import java.security.InvalidKeyException;
|
|||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.InvalidKeySpecException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
|
||||||
import javax.crypto.BadPaddingException;
|
import javax.crypto.BadPaddingException;
|
||||||
@@ -18,38 +19,46 @@ import javax.crypto.spec.IvParameterSpec;
|
|||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
|
|
||||||
public class AES {
|
public class AES {
|
||||||
private static byte[] aes_key= {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F};
|
public static int keyLen = 16;
|
||||||
public static void init(byte[] secret) {
|
private final static int ivLen = 16;
|
||||||
if (secret != null && secret.length == 16) {
|
private static byte[] aes_key= {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F,0x3A,0x1F,0x28,0x39,0x4F,0x52,0x68,0x79,0x71,0x73,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F};
|
||||||
aes_key = new byte[16];
|
|
||||||
for (int i = 0; i < 16; i++) {
|
|
||||||
aes_key[i] = secret[i];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
System.out.println("Error int key error, secret incorrect");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static byte[] AESEncrypt(String sSrc, String userKey) {
|
public static byte[] AESEncrypt(String sSrc, String userKey) {
|
||||||
return AESEncrypt(sSrc.getBytes(), userKey);
|
return AESEncrypt(sSrc.getBytes(), userKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void useAes256(boolean aes256) {
|
||||||
|
if(aes256)
|
||||||
|
keyLen = 32;
|
||||||
|
else
|
||||||
|
keyLen = 16;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] AESEncrypt(byte[] tobeencrypdata, byte[] aesKey) {
|
public static byte[] AESEncrypt(byte[] tobeencrypdata, byte[] aesKey) {
|
||||||
if (aesKey == null) {
|
if (aesKey == null) {
|
||||||
System.out.print("Key为空null");
|
System.out.print("Key为空null");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// 判断Key是否为16位
|
// 判断Key是否为16位
|
||||||
if (aesKey.length != 16) {
|
if (aesKey.length < keyLen) {
|
||||||
System.out.print("Key长度不是16位");
|
System.out.print("Key长度不是16位");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
if(aesKey.length > keyLen) {
|
||||||
|
aesKey = Arrays.copyOfRange(aesKey, 0, keyLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] ivKeys;
|
||||||
|
if(aesKey.length == ivLen) {
|
||||||
|
ivKeys = aesKey;
|
||||||
|
} else {
|
||||||
|
ivKeys = Arrays.copyOfRange(aesKey, 0, ivLen);
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");
|
SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
|
||||||
IvParameterSpec iv = new IvParameterSpec(aesKey);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
|
IvParameterSpec iv = new IvParameterSpec(ivKeys);//使用CBC模式,需要一个向量iv,可增加加密算法的强度
|
||||||
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
|
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
|
||||||
|
|
||||||
//2018.1.1 0:0:0 以来的小时数
|
//2018.1.1 0:0:0 以来的小时数
|
||||||
@@ -101,21 +110,26 @@ public class AES {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] convertUserKey(String userKey) {
|
private static byte[] convertUserKey(String userKey) {
|
||||||
byte[] key = new byte[16];
|
byte[] key = new byte[keyLen];
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < keyLen; i++) {
|
||||||
key[i] = (byte) (userKey.charAt(i) & 0xFF);
|
key[i] = (byte) (userKey.charAt(i) & 0xFF);
|
||||||
}
|
}
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] AESDecrypt(byte[] sSrc, String userKey, boolean checkTime) {
|
public static byte[] AESDecrypt(byte[] sSrc, String userKey, boolean checkTime) {
|
||||||
|
return AESDecrypt(sSrc, userKey, checkTime, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] AESDecrypt(byte[] sSrc, String userKey, boolean checkTime, boolean[] invalidTime) {
|
||||||
byte[] aesKey = aes_key;
|
byte[] aesKey = aes_key;
|
||||||
if (userKey != null && !userKey.isEmpty()) {
|
if (userKey != null && !userKey.isEmpty()) {
|
||||||
aesKey = convertUserKey(userKey);
|
aesKey = convertUserKey(userKey);
|
||||||
}
|
}
|
||||||
return AESDecrypt(sSrc, aesKey, checkTime);
|
return AESDecrypt(sSrc, aesKey, checkTime, invalidTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] AESDecrypt(byte[] sSrc, byte[] aesKey, boolean checkTime) {
|
public static byte[] AESDecrypt(byte[] sSrc, byte[] aesKey, boolean checkTime, boolean[] invalidTime) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
// 判断Key是否正确
|
// 判断Key是否正确
|
||||||
@@ -123,14 +137,25 @@ public class AES {
|
|||||||
aesKey = aes_key;
|
aesKey = aes_key;
|
||||||
}
|
}
|
||||||
// 判断Key是否为16位
|
// 判断Key是否为16位
|
||||||
if (aesKey.length != 16) {
|
if (aesKey.length < keyLen) {
|
||||||
System.out.print("Key长度不是16位");
|
System.out.print("Key长度不是16位");
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(aesKey.length > keyLen) {
|
||||||
|
aesKey = Arrays.copyOfRange(aesKey, 0, keyLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] ivKeys;
|
||||||
|
if(aesKey.length == ivLen) {
|
||||||
|
ivKeys = aesKey;
|
||||||
|
} else {
|
||||||
|
ivKeys = Arrays.copyOfRange(aesKey, 0, ivLen);
|
||||||
|
}
|
||||||
|
|
||||||
SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");
|
SecretKeySpec skeySpec = new SecretKeySpec(aesKey, "AES");
|
||||||
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
|
||||||
IvParameterSpec iv = new IvParameterSpec(aesKey);
|
IvParameterSpec iv = new IvParameterSpec(ivKeys);
|
||||||
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
|
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
|
||||||
try {
|
try {
|
||||||
byte[] original = cipher.doFinal(sSrc);
|
byte[] original = cipher.doFinal(sSrc);
|
||||||
@@ -152,6 +177,9 @@ public class AES {
|
|||||||
int curhour = (int) ((System.currentTimeMillis()/1000 - 1514736000)/3600);
|
int curhour = (int) ((System.currentTimeMillis()/1000 - 1514736000)/3600);
|
||||||
|
|
||||||
if (curhour - hours > 24 && checkTime) {
|
if (curhour - hours > 24 && checkTime) {
|
||||||
|
if(invalidTime != null) {
|
||||||
|
invalidTime[0] = true;
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
byte[] neworiginal = new byte[original.length - 4];
|
byte[] neworiginal = new byte[original.length - 4];
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!--<relativePath>../pom.xml</relativePath>-->
|
<!--<relativePath>../pom.xml</relativePath>-->
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.1.2</version>
|
<version>1.1.6</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>distribution</artifactId>
|
<artifactId>distribution</artifactId>
|
||||||
|
|||||||
@@ -63,6 +63,9 @@ token.key testim
|
|||||||
##是否拒绝空签名的android客户端, 默认为true。当有旧的客户端需要兼容时改成false,当所有都是新客户端时,改成true。
|
##是否拒绝空签名的android客户端, 默认为true。当有旧的客户端需要兼容时改成false,当所有都是新客户端时,改成true。
|
||||||
#connect.reject_empty_signature true
|
#connect.reject_empty_signature true
|
||||||
|
|
||||||
|
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||||
|
#encrypt.use_aes256 true
|
||||||
|
|
||||||
##首次登录,是否接收之前的历史消息。
|
##首次登录,是否接收之前的历史消息。
|
||||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||||
@@ -149,6 +152,9 @@ friend.reject_request_duration 2592000000
|
|||||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||||
friend.request_expiration_duration 604800000
|
friend.request_expiration_duration 604800000
|
||||||
|
|
||||||
|
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||||
|
friend.robot_auto_accept true
|
||||||
|
|
||||||
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
## 聊天室观众空闲退出时间,单位为毫秒,默认为15分钟,0为永远不退出
|
||||||
chatroom.participant_idle_time 900000
|
chatroom.participant_idle_time 900000
|
||||||
|
|
||||||
@@ -318,6 +324,10 @@ push.ios.server.address http://localhost:8085/ios/push
|
|||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#message.mentionmsg.forward.url http://localhost:8888/im_event/message
|
#message.mentionmsg.forward.url http://localhost:8888/im_event/message
|
||||||
|
|
||||||
|
##撤回消息转发地址,当用户撤回消息会回调此地址。
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
|
#message.recallmsg.forward.url http://localhost:8888/im_event/recall_message
|
||||||
|
|
||||||
##设备信息转发地址
|
##设备信息转发地址
|
||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
#things_message.forward.url http://localhost:8087/im_event/things/message
|
#things_message.forward.url http://localhost:8087/im_event/things/message
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ fi
|
|||||||
|
|
||||||
kill -15 $pid
|
kill -15 $pid
|
||||||
|
|
||||||
for i in {1..15}
|
for i in {1..30}
|
||||||
do
|
do
|
||||||
pid=`ps -ef | grep wildfirechat.server.Server | grep -v grep | awk '{print $2}'`
|
pid=`ps -ef | grep wildfirechat.server.Server | grep -v grep | awk '{print $2}'`
|
||||||
if [ -z $pid ]; then
|
if [ -z $pid ]; then
|
||||||
|
|||||||
@@ -72,6 +72,9 @@ rem set JAVA_OPTS=%JAVA_OPTS% -XX:+UseGCLogFileRotation
|
|||||||
rem set JAVA_OPTS=%JAVA_OPTS% -XX:NumberOfGCLogFiles=10
|
rem set JAVA_OPTS=%JAVA_OPTS% -XX:NumberOfGCLogFiles=10
|
||||||
rem set JAVA_OPTS=%JAVA_OPTS% -XX:GCLogFileSize=10M"
|
rem set JAVA_OPTS=%JAVA_OPTS% -XX:GCLogFileSize=10M"
|
||||||
|
|
||||||
|
rem If the JDK version is 9 or above, please open this configuration.
|
||||||
|
rem set JAVA_OPTS=%JAVA_OPTS% --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "Please set Xmx and Xms parameters!"
|
echo "Please set Xmx and Xms parameters!"
|
||||||
echo "Please set Xmx and Xms parameters!"
|
echo "Please set Xmx and Xms parameters!"
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ else
|
|||||||
fi
|
fi
|
||||||
export JAVA
|
export JAVA
|
||||||
|
|
||||||
|
$JAVA -version
|
||||||
|
|
||||||
WILDFIRECHAT_CONFIG_PATH=$WILDFIRECHAT_HOME
|
WILDFIRECHAT_CONFIG_PATH=$WILDFIRECHAT_HOME
|
||||||
|
|
||||||
LOG_FILE=$WILDFIRECHAT_CONFIG_PATH/config/log4j2.xml
|
LOG_FILE=$WILDFIRECHAT_CONFIG_PATH/config/log4j2.xml
|
||||||
@@ -84,6 +86,8 @@ JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=500"
|
|||||||
#JAVA_OPTS="$JAVA_OPTS -XX:NumberOfGCLogFiles=10"
|
#JAVA_OPTS="$JAVA_OPTS -XX:NumberOfGCLogFiles=10"
|
||||||
#JAVA_OPTS="$JAVA_OPTS -XX:GCLogFileSize=10M"
|
#JAVA_OPTS="$JAVA_OPTS -XX:GCLogFileSize=10M"
|
||||||
|
|
||||||
|
#如果JDK版本是9及以上,请打开这个配置
|
||||||
|
#JAVA_OPTS="$JAVA_OPTS --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED"
|
||||||
|
|
||||||
echo "警告:没有设置JVM内存参数!"
|
echo "警告:没有设置JVM内存参数!"
|
||||||
echo "请设置JVM参数Xmx和Xms,设置为您为IM服务预留的内存大小,注意需要刨除操作系统占用,如果有其它系统也需要相应去除占用。"
|
echo "请设置JVM参数Xmx和Xms,设置为您为IM服务预留的内存大小,注意需要刨除操作系统占用,如果有其它系统也需要相应去除占用。"
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ ADD distribution-*-bundle-tar.tar.gz /opt/im-server/
|
|||||||
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh
|
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xmx128M"/JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"/g' /opt/im-server/bin/wildfirechat.sh
|
||||||
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh
|
RUN sed -i 's/#JAVA_OPTS="$JAVA_OPTS -Xms128M"/JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"/g' /opt/im-server/bin/wildfirechat.sh
|
||||||
|
|
||||||
|
RUN chmod a+x /opt/im-server/bin/wildfirechat.sh
|
||||||
|
|
||||||
WORKDIR /opt/im-server
|
WORKDIR /opt/im-server
|
||||||
|
|
||||||
VOLUME /opt/im-server/config
|
VOLUME /opt/im-server/config
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>1.1.2</version>
|
<version>1.1.6</version>
|
||||||
<name>Wildfire Chat</name>
|
<name>Wildfire Chat</name>
|
||||||
<description>Wildfire Chat Server</description>
|
<description>Wildfire Chat Server</description>
|
||||||
<inceptionYear>2019</inceptionYear>
|
<inceptionYear>2019</inceptionYear>
|
||||||
|
|||||||
@@ -12,6 +12,34 @@
|
|||||||
|
|
||||||
# 更新记录
|
# 更新记录
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.1.6:
|
||||||
|
1. 支持用户设置查找自己的方法。
|
||||||
|
2. 解决获取用户信息返回type无效的问题。
|
||||||
|
3. 添加用户获取频道的功能。
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.1.5:
|
||||||
|
1. 添加获取所有用户的Server API。
|
||||||
|
2. 解决添加好友时没有处理黑名单的问题。
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.1.4:
|
||||||
|
1. 添加PC客户端多端登录互踢时没有更新pc在线状态问题。
|
||||||
|
2. 添加支持使用AES256加密。
|
||||||
|
3. Server API添加获取单个群成员的接口。
|
||||||
|
4. 添加配置,添加机器人为好友时是否自动接受。
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.1.3:
|
||||||
|
1. 添加服务器和客户端时间检查功能。
|
||||||
|
2. 解决用户被block后session失效的问题。
|
||||||
|
3. 添加消息撤回回调。
|
||||||
|
4. 优化群组撤回逻辑。
|
||||||
|
5. 解决用户离开群组后还能修改群昵称的问题。
|
||||||
|
6. 修改server api修改好友关系回调数据错误问题。
|
||||||
|
7. 同步超级群组数据库和数据。
|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
Release note 1.1.2:
|
Release note 1.1.2:
|
||||||
1. 会议SDK添加查询会议是否存在的接口
|
1. 会议SDK添加查询会议是否存在的接口
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.1.2</version>
|
<version>1.1.6</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -27,7 +27,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>commons-codec</groupId>
|
<groupId>commons-codec</groupId>
|
||||||
<artifactId>commons-codec</artifactId>
|
<artifactId>commons-codec</artifactId>
|
||||||
<version>1.11</version>
|
<version>1.15</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
|
|||||||
@@ -71,6 +71,14 @@ public class GroupAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
return AdminHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<PojoGroupMember> getGroupMember(String groupId, String memberId) throws Exception {
|
||||||
|
String path = APIPath.Group_Member_Get;
|
||||||
|
InputGetGroupMember input = new InputGetGroupMember();
|
||||||
|
input.setGroupId(groupId);
|
||||||
|
input.setMemberId(memberId);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||||
|
}
|
||||||
|
|
||||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Group_Member_Add;
|
String path = APIPath.Group_Member_Add;
|
||||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||||
|
|||||||
@@ -50,10 +50,10 @@ public class Main {
|
|||||||
|
|
||||||
|
|
||||||
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
|
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
|
||||||
// testAdmin();
|
testAdmin();
|
||||||
|
|
||||||
//Robot和Channel都是使用的80端口,第三方可以创建或者为第三方创建,第三方可以使用robot或者channel与IM系统进行对接。
|
//Robot和Channel都是使用的80端口,第三方可以创建或者为第三方创建,第三方可以使用robot或者channel与IM系统进行对接。
|
||||||
// testRobot();
|
testRobot();
|
||||||
testChannel();
|
testChannel();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -300,6 +300,20 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int limit = 5;
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
IMResult<OutputGetUserList> getUserListIMResult = UserAdmin.getAllUsers(limit, i*limit);
|
||||||
|
if (getUserListIMResult != null && getUserListIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("getUserListIMResult success");
|
||||||
|
if(getUserListIMResult.getResult().userInfoList.size() < limit) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.out.println("getUserListIMResult failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (commercialServer) {
|
if (commercialServer) {
|
||||||
IMResult<GetOnlineUserCountResult> getOnlineUserCountResultIMResult = UserAdmin.getOnlineUserCount();
|
IMResult<GetOnlineUserCountResult> getOnlineUserCountResultIMResult = UserAdmin.getOnlineUserCount();
|
||||||
if (getOnlineUserCountResultIMResult != null && getOnlineUserCountResultIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (getOnlineUserCountResultIMResult != null && getOnlineUserCountResultIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
@@ -572,6 +586,14 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IMResult<PojoGroupMember> groupMemberIMResult = GroupAdmin.getGroupMember(groupInfo.getTarget_id(), "user1");
|
||||||
|
if (groupMemberIMResult != null && groupMemberIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("get group member success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get group member failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
voidIMResult = GroupAdmin.kickoffGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
|
voidIMResult = GroupAdmin.kickoffGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("kickoff group member success");
|
System.out.println("kickoff group member success");
|
||||||
@@ -1215,7 +1237,7 @@ public class Main {
|
|||||||
if (resultGetMembers != null && resultGetMembers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultGetMembers != null && resultGetMembers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("get group member success");
|
System.out.println("get group member success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("create group failure");
|
System.out.println("get group member failure");
|
||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1231,6 +1253,14 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IMResult<PojoGroupMember> groupMemberIMResult = robotService.getGroupMember(groupInfo.getTarget_id(), "user0");
|
||||||
|
if (groupMemberIMResult != null && groupMemberIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("get group member success");
|
||||||
|
} else {
|
||||||
|
System.out.println("get group member failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
voidIMResult = robotService.kickoffGroupMembers(groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
|
voidIMResult = robotService.kickoffGroupMembers(groupInfo.getTarget_id(), Arrays.asList("user3"), null, null);
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("kickoff group member success");
|
System.out.println("kickoff group member success");
|
||||||
|
|||||||
@@ -134,6 +134,14 @@ public class RobotService {
|
|||||||
return robotHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
return robotHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IMResult<PojoGroupMember> getGroupMember(String groupId, String memberId) throws Exception {
|
||||||
|
String path = APIPath.Robot_Group_Member_Get;
|
||||||
|
InputGetGroupMember input = new InputGetGroupMember();
|
||||||
|
input.setGroupId(groupId);
|
||||||
|
input.setMemberId(memberId);
|
||||||
|
return robotHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||||
|
}
|
||||||
|
|
||||||
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Robot_Group_Member_Add;
|
String path = APIPath.Robot_Group_Member_Add;
|
||||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||||
|
|||||||
@@ -24,6 +24,14 @@ public class UserAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
|
return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMResult<OutputGetUserList> getAllUsers(int count, int offset) throws Exception {
|
||||||
|
String path = APIPath.User_Get_All;
|
||||||
|
InputGetUserList input = new InputGetUserList();
|
||||||
|
input.count = count;
|
||||||
|
input.offset = offset;
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, input, OutputGetUserList.class);
|
||||||
|
}
|
||||||
|
|
||||||
public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception {
|
public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception {
|
||||||
String path = APIPath.Create_User;
|
String path = APIPath.Create_User;
|
||||||
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
|
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
|
||||||
|
|||||||
Reference in New Issue
Block a user