Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
082f42af77 | ||
|
|
2bec610552 | ||
|
|
f3a2603309 | ||
|
|
7d10251bd9 | ||
|
|
5c7b320b04 | ||
|
|
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.7</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -12,9 +12,11 @@ package cn.wildfirechat.push;
|
|||||||
public class PushMessage {
|
public class PushMessage {
|
||||||
public String sender;
|
public String sender;
|
||||||
public String senderName;
|
public String senderName;
|
||||||
|
public String senderPortrait;
|
||||||
public int convType;
|
public int convType;
|
||||||
public String target;
|
public String target;
|
||||||
public String targetName;
|
public String targetName;
|
||||||
|
public String targetPortrait;
|
||||||
public String userId;
|
public String userId;
|
||||||
public int line;
|
public int line;
|
||||||
public int cntType;
|
public int cntType;
|
||||||
@@ -34,12 +36,14 @@ public class PushMessage {
|
|||||||
public String language;
|
public String language;
|
||||||
public long messageId;
|
public long messageId;
|
||||||
|
|
||||||
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
this.convType = conversationType;
|
this.convType = conversationType;
|
||||||
this.target = target;
|
this.target = target;
|
||||||
this.senderName = senderName;
|
this.senderName = senderName;
|
||||||
|
this.senderPortrait = senderPortrait;
|
||||||
this.targetName = targetName;
|
this.targetName = targetName;
|
||||||
|
this.targetPortrait = targetPortrait;
|
||||||
this.line = line;
|
this.line = line;
|
||||||
this.cntType = messageContentType;
|
this.cntType = messageContentType;
|
||||||
this.serverTime = serverTime;
|
this.serverTime = serverTime;
|
||||||
|
|||||||
@@ -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 <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.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 <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.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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,9 @@ import io.netty.util.internal.StringUtil;
|
|||||||
import cn.wildfirechat.common.ErrorCode;
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import win.liyufan.im.IMTopic;
|
import win.liyufan.im.IMTopic;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
@Route(APIPath.Msg_Recall)
|
@Route(APIPath.Msg_Recall)
|
||||||
@HttpMethod("POST")
|
@HttpMethod("POST")
|
||||||
public class RecallMessageAction extends AdminAction {
|
public class RecallMessageAction extends AdminAction {
|
||||||
@@ -42,10 +45,9 @@ public class RecallMessageAction extends AdminAction {
|
|||||||
|
|
||||||
WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build();
|
WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build();
|
||||||
sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> {
|
sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> {
|
||||||
ByteBuf byteBuf = Unpooled.buffer();
|
ErrorCode errorCode = ErrorCode.fromCode(result[0]);
|
||||||
byteBuf.writeBytes(result);
|
byte[] data = Arrays.copyOfRange(result,1, result.length);
|
||||||
ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte());
|
return new Result(errorCode, new String(data, StandardCharsets.UTF_8));
|
||||||
return new Result(errorCode);
|
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@ public class RecallMessageHandler extends IMHandler<WFCMessage.INT64Buf> {
|
|||||||
@Override
|
@Override
|
||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) {
|
||||||
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
||||||
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin);
|
ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin, ackPayload);
|
||||||
|
|
||||||
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
return errorCode;
|
return errorCode;
|
||||||
|
|||||||
@@ -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,12 @@ public class DatabaseStore {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
//searchType
|
|
||||||
// 0 模糊匹配displayName, 精确匹配账户名和电话号码
|
List<WFCMessage.User> searchUserByNameMobile(String keyword, int searchType) {
|
||||||
// 1 精确匹配账户名和电话号码
|
ArrayList<WFCMessage.User> out = new ArrayList<>();
|
||||||
// 2 精确匹配账户名
|
|
||||||
// 3 精确匹配电话号码
|
|
||||||
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
|
|
||||||
Connection connection = null;
|
Connection connection = null;
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet rs = null;
|
ResultSet rs = null;
|
||||||
|
|
||||||
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 +180,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 +255,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 +269,171 @@ 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, List<WFCMessage.User> nameOrIdMatched) {
|
||||||
|
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 ";
|
||||||
|
if(nameOrIdMatched.size() == 1) {
|
||||||
|
sql += " and u._uid <> ? and u._name <> ?";
|
||||||
|
} else if(nameOrIdMatched.size() == 2) {
|
||||||
|
sql += " and u._uid <> ? and u._uid <>? and u._name <> ? and u._name <>? ";
|
||||||
|
}
|
||||||
|
sql += " and (s._value is null or (s._value <> 1 and s._value <> 3 and s._value <> 5 and s._value <> 7)) limit ";
|
||||||
|
|
||||||
|
if(page == 0) {
|
||||||
|
sql += (20 - nameOrIdMatched.size());
|
||||||
|
} else {
|
||||||
|
sql += 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page > 0) {
|
||||||
|
sql += " offset " + (page * 20 - nameOrIdMatched.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
statement = connection.prepareStatement(sql);
|
||||||
|
statement.setString(1, "%" + keyword + "%");
|
||||||
|
if(nameOrIdMatched.size() == 1) {
|
||||||
|
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||||
|
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||||
|
} else if(nameOrIdMatched.size() == 2) {
|
||||||
|
statement.setString(2, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||||
|
statement.setString(3, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
|
||||||
|
statement.setString(4, nameOrIdMatched.toArray(new WFCMessage.User[0])[0].getUid());
|
||||||
|
statement.setString(5, nameOrIdMatched.toArray(new WFCMessage.User[0])[1].getUid());
|
||||||
|
}
|
||||||
|
|
||||||
|
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> nameOrIdMatched = searchUserByNameMobile(keyword, searchType);
|
||||||
|
List<WFCMessage.User> out = new ArrayList<>();
|
||||||
|
if(page == 0) {
|
||||||
|
out.addAll(nameOrIdMatched);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(searchType == SearchUserType_General) {
|
||||||
|
List<WFCMessage.User> general = searchUserByDisplayName(keyword, page, nameOrIdMatched);
|
||||||
|
general.removeAll(nameOrIdMatched);
|
||||||
|
out.addAll(general);
|
||||||
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2411,59 +2547,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 +2776,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 +3571,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) {
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import io.moquette.spi.IMessagesStore;
|
|||||||
import io.moquette.spi.impl.security.AES;
|
import io.moquette.spi.impl.security.AES;
|
||||||
import io.moquette.spi.security.Tokenor;
|
import io.moquette.spi.security.Tokenor;
|
||||||
import io.moquette.spi.impl.subscriptions.Topic;
|
import io.moquette.spi.impl.subscriptions.Topic;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.handler.codec.mqtt.MqttVersion;
|
import io.netty.handler.codec.mqtt.MqttVersion;
|
||||||
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.commons.codec.digest.DigestUtils;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@@ -44,6 +45,7 @@ import win.liyufan.im.*;
|
|||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
@@ -141,6 +143,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 +177,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 +300,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 +528,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) {
|
||||||
@@ -798,7 +812,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||||
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()*1000) {
|
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()* 1000L) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1627,13 +1641,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 +1662,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 +1757,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;
|
||||||
}
|
}
|
||||||
@@ -2162,7 +2179,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) {
|
public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload) {
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
|
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
|
||||||
|
|
||||||
@@ -2174,9 +2191,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 +2211,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 +2242,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());
|
||||||
@@ -2261,6 +2305,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
databaseStore.deleteMessage(messageUid);
|
databaseStore.deleteMessage(messageUid);
|
||||||
|
|
||||||
mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS);
|
mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS);
|
||||||
|
ackPayload.writeBytes(recalledContent.getBytes(StandardCharsets.UTF_8));
|
||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||||
@@ -2475,6 +2520,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 +2573,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 +2767,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 +3110,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 +3231,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 +3497,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 +4142,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 +4316,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 {
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ public interface IMessagesStore {
|
|||||||
ErrorCode canSendMessageInGroup(String member, String groupId);
|
ErrorCode canSendMessageInGroup(String member, String groupId);
|
||||||
Set<String> getGroupManagers(String groupId, boolean includeOwner);
|
Set<String> getGroupManagers(String groupId, boolean includeOwner);
|
||||||
|
|
||||||
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin);
|
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload);
|
||||||
ErrorCode recallCastMessage(long messageUid, String operatorId);
|
ErrorCode recallCastMessage(long messageUid, String operatorId);
|
||||||
|
|
||||||
void clearUserMessages(String userId);
|
void clearUserMessages(String userId);
|
||||||
@@ -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();
|
||||||
|
|||||||
@@ -35,14 +35,11 @@ import io.moquette.spi.ISessionsStore;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
import io.netty.handler.codec.mqtt.*;
|
import io.netty.handler.codec.mqtt.*;
|
||||||
import win.liyufan.im.GsonUtil;
|
import win.liyufan.im.*;
|
||||||
import win.liyufan.im.HttpUtils;
|
|
||||||
import win.liyufan.im.IMTopic;
|
|
||||||
|
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import win.liyufan.im.Utility;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -168,6 +165,9 @@ public class MessagesPublisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
WFCMessage.Message message = null;
|
WFCMessage.Message message = null;
|
||||||
|
String senderName = null;
|
||||||
|
String senderPortrait = null;
|
||||||
|
boolean sendNameLoaded = false;
|
||||||
for (String user : receivers) {
|
for (String user : receivers) {
|
||||||
if (!user.equals(sender)) {
|
if (!user.equals(sender)) {
|
||||||
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
|
WFCMessage.User userInfo = m_messagesStore.getUserInfo(user);
|
||||||
@@ -207,10 +207,10 @@ public class MessagesPublisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
||||||
String senderName = null;
|
|
||||||
String targetName = null;
|
|
||||||
boolean nameLoaded = false;
|
|
||||||
|
|
||||||
|
String targetName = null;
|
||||||
|
String targetPortrait = null;
|
||||||
|
boolean targetNameLoaded = false;
|
||||||
|
|
||||||
Collection<String> targetClients = null;
|
Collection<String> targetClients = null;
|
||||||
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
|
if (pullType == ProtoConstants.PullType.Pull_ChatRoom) {
|
||||||
@@ -386,10 +386,22 @@ public class MessagesPublisher {
|
|||||||
|
|
||||||
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
boolean isHiddenDetail = m_messagesStore.getUserPushHiddenDetail(user);
|
||||||
|
|
||||||
if(!nameLoaded) {
|
if(!sendNameLoaded) {
|
||||||
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null);
|
List<String> list = new ArrayList<>();
|
||||||
targetName = getTargetName(target, conversationType);
|
senderName = getUserDisplayName(sender, conversationType == ProtoConstants.ConversationType.ConversationType_Group ? target : null, list);
|
||||||
nameLoaded = true;
|
if(!list.isEmpty()) {
|
||||||
|
senderPortrait = list.get(0);
|
||||||
|
}
|
||||||
|
sendNameLoaded = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!targetNameLoaded) {
|
||||||
|
List<String> list = new ArrayList<>();
|
||||||
|
targetName = getTargetName(target, conversationType, user, list);
|
||||||
|
if(!list.isEmpty()) {
|
||||||
|
targetPortrait = list.get(0);
|
||||||
|
}
|
||||||
|
targetNameLoaded = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = senderName;
|
String name = senderName;
|
||||||
@@ -399,7 +411,7 @@ public class MessagesPublisher {
|
|||||||
name = fd.getAlias();
|
name = fd.getAlias();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, senderPortrait, targetName, targetPortrait, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -461,10 +473,13 @@ public class MessagesPublisher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getUserDisplayName(String userId, String groupId) {
|
String getUserDisplayName(String userId, String groupId, List<String> portraitList) {
|
||||||
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
|
WFCMessage.User user = m_messagesStore.getUserInfo(userId);
|
||||||
String userName = null;
|
String userName = null;
|
||||||
if(user != null) {
|
if(user != null) {
|
||||||
|
if(portraitList != null && !StringUtil.isNullOrEmpty(user.getPortrait())) {
|
||||||
|
portraitList.add(user.getPortrait());
|
||||||
|
}
|
||||||
userName = user.getDisplayName();
|
userName = user.getDisplayName();
|
||||||
}
|
}
|
||||||
if (!StringUtil.isNullOrEmpty(groupId)) {
|
if (!StringUtil.isNullOrEmpty(groupId)) {
|
||||||
@@ -476,17 +491,28 @@ public class MessagesPublisher {
|
|||||||
return userName;
|
return userName;
|
||||||
}
|
}
|
||||||
|
|
||||||
String getTargetName(String targetId, int cnvType) {
|
String getTargetName(String targetId, int cnvType, String fromUser, List<String> portraitList) {
|
||||||
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
if (cnvType == ProtoConstants.ConversationType.ConversationType_Private) {
|
||||||
return getUserDisplayName(targetId, null);
|
return getUserDisplayName(targetId, null, portraitList);
|
||||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||||
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
WFCMessage.GroupInfo group = m_messagesStore.getGroupInfo(targetId);
|
||||||
if(group != null) {
|
if(group != null) {
|
||||||
|
if(!StringUtil.isNullOrEmpty(group.getPortrait())) {
|
||||||
|
portraitList.add(group.getPortrait());
|
||||||
|
}
|
||||||
|
|
||||||
|
WFCMessage.UserSettingEntry entry = m_messagesStore.getUserSetting(fromUser, UserSettingScope.kUserSettingGroupRemark, targetId);
|
||||||
|
if(entry != null && !StringUtil.isNullOrEmpty(entry.getValue())) {
|
||||||
|
return entry.getValue();
|
||||||
|
}
|
||||||
return group.getName();
|
return group.getName();
|
||||||
}
|
}
|
||||||
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
|
} else if(cnvType == ProtoConstants.ConversationType.ConversationType_Channel) {
|
||||||
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
|
WFCMessage.ChannelInfo channelInfo = m_messagesStore.getChannelInfo(targetId);
|
||||||
if (channelInfo != null) {
|
if (channelInfo != null) {
|
||||||
|
if(!StringUtil.isNullOrEmpty(channelInfo.getPortrait())) {
|
||||||
|
portraitList.add(channelInfo.getPortrait());
|
||||||
|
}
|
||||||
return channelInfo.getName();
|
return channelInfo.getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,9 +37,9 @@ class PersistentQueueMessageSender {
|
|||||||
this.connectionDescriptorStore = connectionDescriptorStore;
|
this.connectionDescriptorStore = connectionDescriptorStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||||
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
||||||
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
|
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, senderPortrait, targetName, targetPortrait, unReceivedMsg, mentionType, isHiddenDetail, language);
|
||||||
pushMessage.pushContent = pushContent;
|
pushMessage.pushContent = pushContent;
|
||||||
pushMessage.pushData = pushData;
|
pushMessage.pushData = pushData;
|
||||||
pushMessage.messageId = messageId;
|
pushMessage.messageId = messageId;
|
||||||
|
|||||||
@@ -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.7</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
|
||||||
@@ -155,6 +156,8 @@ public class ProtoConstants {
|
|||||||
int Modify_Group_History_Message = 7;
|
int Modify_Group_History_Message = 7;
|
||||||
//仅专业版的server api支持
|
//仅专业版的server api支持
|
||||||
int Modify_Group_Max_Member_Count = 8;
|
int Modify_Group_Max_Member_Count = 8;
|
||||||
|
//仅专业版的server api支持
|
||||||
|
int Modify_Group_Super_Group = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
//ModifyGroupInfoRequest -> type
|
//ModifyGroupInfoRequest -> type
|
||||||
@@ -217,6 +220,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.7</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.7</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,41 @@
|
|||||||
|
|
||||||
# 更新记录
|
# 更新记录
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.1.7:
|
||||||
|
1. 优化用户搜索功能。
|
||||||
|
2. 推送消息中使用群备注。
|
||||||
|
3. 推送消息中添加发送者和目标头像。
|
||||||
|
4. 优化撤回消息流程。
|
||||||
|
|
||||||
|
--------------
|
||||||
|
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.7</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");
|
||||||
@@ -725,8 +747,8 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMResult<Void> voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
|
IMResult<String> stringIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid());
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (stringIMResult != null && stringIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("recall message success");
|
System.out.println("recall message success");
|
||||||
} else {
|
} else {
|
||||||
System.out.println("recall message failure");
|
System.out.println("recall message failure");
|
||||||
@@ -734,7 +756,7 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (commercialServer) {
|
if (commercialServer) {
|
||||||
voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
IMResult<Void> voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("delete message success");
|
System.out.println("delete message success");
|
||||||
} else {
|
} else {
|
||||||
@@ -810,7 +832,7 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers);
|
IMResult<Void> voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers);
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("Success");
|
System.out.println("Success");
|
||||||
} else {
|
} else {
|
||||||
@@ -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");
|
||||||
|
|||||||
@@ -25,12 +25,12 @@ public class MessageAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
|
return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMResult<Void> recallMessage(String operator, long messageUid) throws Exception {
|
public static IMResult<String> recallMessage(String operator, long messageUid) throws Exception {
|
||||||
String path = APIPath.Msg_Recall;
|
String path = APIPath.Msg_Recall;
|
||||||
RecallMessageData messageData = new RecallMessageData();
|
RecallMessageData messageData = new RecallMessageData();
|
||||||
messageData.setOperator(operator);
|
messageData.setOperator(operator);
|
||||||
messageData.setMessageUid(messageUid);
|
messageData.setMessageUid(messageUid);
|
||||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, messageData, String.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
//仅专业版支持
|
//仅专业版支持
|
||||||
|
|||||||
@@ -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