Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c377360049 | ||
|
|
2e74a77e5b | ||
|
|
90286e9484 | ||
|
|
7f479dd9e5 | ||
|
|
bae0805e64 | ||
|
|
e5d63a8d5f | ||
|
|
06fe70bd6f | ||
|
|
5a14b2f2f0 | ||
|
|
fbe5bf7a77 | ||
|
|
4ae117dd6f | ||
|
|
4518beff28 | ||
|
|
3cc278211b | ||
|
|
355fc6cb06 | ||
|
|
aef125eb50 | ||
|
|
d89e641470 | ||
|
|
e41ae9a9e7 | ||
|
|
989f5aa190 | ||
|
|
a820300f04 | ||
|
|
68707560b9 | ||
|
|
bb5b6fac17 | ||
|
|
584eb094f3 | ||
|
|
b9b1a76d71 | ||
|
|
a40950fb8c | ||
|
|
a6fe4e9d6e | ||
|
|
6f06a499aa | ||
|
|
069770c411 | ||
|
|
1f5f7eb572 | ||
|
|
405ad6c121 | ||
|
|
ff6e94cee7 | ||
|
|
db6f273cba | ||
|
|
df3bace44b | ||
|
|
3f9a8be02c | ||
|
|
39eb08e3f2 | ||
|
|
22a4ef4f42 | ||
|
|
da0d2e22cc | ||
|
|
a80ef20da3 | ||
|
|
45fd11f641 | ||
|
|
cdc731a23b | ||
|
|
68a968a94c | ||
|
|
8604f4edf3 | ||
|
|
b1484b0c95 | ||
|
|
631986f7a2 | ||
|
|
db27e77303 | ||
|
|
5177779066 |
@@ -1,13 +1,17 @@
|
||||
### Expected behavior
|
||||
## 提issue小提示
|
||||
为了尽快定位问题,需要提供足够的信息,请按照我们的要求格式来提问。***如果您不按照格式提问,我们将无法回复您的问题***
|
||||
|
||||
### Actual behavior
|
||||
#### 操作说明
|
||||
详细说明操作那个界面,每一步骤都要说得详细,如果是SDK或者api使用问题,需要详细说明调用的那个函数,参数都是什么。
|
||||
|
||||
### Steps to reproduce
|
||||
#### 表现现象
|
||||
描述一下什么现象,比如说函数返回error,errorcode是多少,或者界面上是什么状态,比如发送消息显示发送失败的红点。不要笼统的说功能有问题,不起作用。
|
||||
|
||||
### Minimal yet complete reproducer code (or URL to code) or complete log file
|
||||
#### 预期结果
|
||||
你认为正确的表现应该是什么样的。
|
||||
|
||||
### Moquette MQTT version
|
||||
#### 补充条件
|
||||
是否是毕现的,还是偶现的?是否只有在特殊的网络/设备/平台上出现,还是所有的都出现。还有您用的版本是什么时候的,是不是最新版
|
||||
|
||||
### JVM version (e.g. `java -version`)
|
||||
|
||||
### OS version (e.g. `uname -a`)
|
||||
#### demo对比结果
|
||||
请用demo对比测试,demo上是什么状态。
|
||||
|
||||
@@ -69,13 +69,15 @@ message.max_queue 1024
|
||||
##是否禁止陌生人聊天
|
||||
message.disable_stranger_chat false
|
||||
|
||||
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;2 敏感词替换为***;3 不处理。
|
||||
##所有命中敏感词的消息都会被记录在敏感词消息表中
|
||||
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
||||
message.blacklist.strategy 0
|
||||
|
||||
##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
|
||||
message.disable_remote_search false
|
||||
|
||||
##允许客户端撤回消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
||||
message.recall_time_limit 120
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -114,7 +116,8 @@ hazelcast.configuration config/hazelcast.xml
|
||||
#*********************************************************************
|
||||
# Media server configuration
|
||||
#*********************************************************************
|
||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。
|
||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||
## https://docs.wildfirechat.cn/server/media_server.html
|
||||
media.server.use_qiniu 0
|
||||
|
||||
##媒体类型分类
|
||||
@@ -154,10 +157,10 @@ qiniu.bucket_favorite_domain http://cdn2.wildfirechat.cn
|
||||
# 本地媒体服务器配置。
|
||||
local.media.storage.root media
|
||||
|
||||
# 是否支持多端登陆
|
||||
# 是否支持多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
||||
server.multi_endpoint false
|
||||
|
||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效)
|
||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
||||
server.multi_platform_notification false
|
||||
|
||||
#*********************************************************************
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
alter table `t_settings` change column `value` `_value` varchar(64) NOT NULL;
|
||||
alter table `t_settings` change column `desc` `_desc` varchar(64) NOT NULL;
|
||||
@@ -0,0 +1,2 @@
|
||||
alter table `t_settings` change column `value` `_value` varchar(64) NOT NULL;
|
||||
alter table `t_settings` change column `desc` `_desc` varchar(64) NOT NULL;
|
||||
@@ -0,0 +1,6 @@
|
||||
程序会自动创建数据库和执行migrate里的数据库,不需要手动创建库和执行sql语句。
|
||||
|
||||
数据库版本管理使用了flyway,flyway进行数据库升级时会校验数据库脚本的有效性,如果修改过这里的脚本,下次升级时就会失败。
|
||||
|
||||
强烈不建议修改数据库表结构,如果有内容(比如默认用户或者默认机器人的属性)需要修改,可以等数据库升级完成后,通过命令行或者数据库客户端进行修改。
|
||||
由于服务具有缓存,一般修改过数据库内容后要重启后才能生效。
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<relativePath>../</relativePath>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.42</version>
|
||||
<version>0.45</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>moquette-broker</artifactId>
|
||||
|
||||
@@ -23,6 +23,7 @@ public class PushMessage {
|
||||
//推送类型,android推送分为小米/华为/魅族等。ios分别为开发和发布。
|
||||
public int pushType;
|
||||
public String pushContent;
|
||||
public String pushData;
|
||||
public int unReceivedMsg;
|
||||
public int mentionedType;
|
||||
public String packageName;
|
||||
|
||||
@@ -44,9 +44,20 @@ abstract public class AdminAction extends Action {
|
||||
if (!mLimitCounter.isGranted("admin")) {
|
||||
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||
}
|
||||
|
||||
String nonce = request.getHeader("nonce");
|
||||
if (StringUtil.isNullOrEmpty(nonce)) {
|
||||
nonce = request.getHeader("Nonce");
|
||||
}
|
||||
String timestamp = request.getHeader("timestamp");
|
||||
if (StringUtil.isNullOrEmpty(timestamp)) {
|
||||
timestamp = request.getHeader("Timestamp");
|
||||
}
|
||||
String sign = request.getHeader("sign");
|
||||
if (StringUtil.isNullOrEmpty(sign)) {
|
||||
sign = request.getHeader("Sign");
|
||||
}
|
||||
|
||||
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign)) {
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -61,8 +61,8 @@ public class CreateChannelAction extends AdminAction {
|
||||
if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
byte[] data = new byte[byteBuf.readableBytes()];
|
||||
byteBuf.readBytes(data);
|
||||
String secret = new String(data);
|
||||
sendResponse(response, null, new OutputCreateChannel(inputCreateChannel.getTargetId(), secret));
|
||||
String channelId = new String(data);
|
||||
sendResponse(response, null, new OutputCreateChannel(channelId));
|
||||
} else {
|
||||
sendResponse(response, errorCode, null);
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public class GetGroupMembersAction extends AdminAction {
|
||||
&& (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) {
|
||||
|
||||
List<WFCMessage.GroupMember> members = new ArrayList<>();
|
||||
ErrorCode errorCode = messagesStore.getGroupMembers(inputGetGroup.getGroupId(), 0, members);
|
||||
ErrorCode errorCode = messagesStore.getGroupMembers(null, inputGetGroup.getGroupId(), 0, members);
|
||||
|
||||
|
||||
response.setStatus(HttpResponseStatus.OK);
|
||||
|
||||
@@ -34,9 +34,21 @@ abstract public class ChannelAction extends Action {
|
||||
@Override
|
||||
public ErrorCode preAction(Request request, Response response) {
|
||||
String nonce = request.getHeader("nonce");
|
||||
if (StringUtil.isNullOrEmpty(nonce)) {
|
||||
nonce = request.getHeader("Nonce");
|
||||
}
|
||||
String timestamp = request.getHeader("timestamp");
|
||||
if (StringUtil.isNullOrEmpty(timestamp)) {
|
||||
timestamp = request.getHeader("Timestamp");
|
||||
}
|
||||
String sign = request.getHeader("sign");
|
||||
if (StringUtil.isNullOrEmpty(sign)) {
|
||||
sign = request.getHeader("Sign");
|
||||
}
|
||||
String cid = request.getHeader("cid");
|
||||
if (StringUtil.isNullOrEmpty(cid)) {
|
||||
cid = request.getHeader("Cid");
|
||||
}
|
||||
|
||||
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign) || StringUtil.isNullOrEmpty(cid)) {
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
|
||||
@@ -38,9 +38,22 @@ abstract public class RobotAction extends Action {
|
||||
@Override
|
||||
public ErrorCode preAction(Request request, Response response) {
|
||||
String nonce = request.getHeader("nonce");
|
||||
if (StringUtil.isNullOrEmpty(nonce)) {
|
||||
nonce = request.getHeader("Nonce");
|
||||
}
|
||||
String timestamp = request.getHeader("timestamp");
|
||||
if (StringUtil.isNullOrEmpty(timestamp)) {
|
||||
timestamp = request.getHeader("Timestamp");
|
||||
}
|
||||
String sign = request.getHeader("sign");
|
||||
if (StringUtil.isNullOrEmpty(sign)) {
|
||||
sign = request.getHeader("Sign");
|
||||
}
|
||||
String rid = request.getHeader("rid");
|
||||
if (StringUtil.isNullOrEmpty(rid)) {
|
||||
rid = request.getHeader("Rid");
|
||||
}
|
||||
|
||||
if (StringUtil.isNullOrEmpty(nonce) || StringUtil.isNullOrEmpty(timestamp) || StringUtil.isNullOrEmpty(sign) || StringUtil.isNullOrEmpty(rid)) {
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@@ -142,6 +142,8 @@ public final class BrokerConstants {
|
||||
|
||||
public static final String MESSAGES_DISABLE_REMOTE_SEARCH = "message.disable_remote_search";
|
||||
|
||||
public static final String MESSAGES_RECALL_TIME_LIMIT = "message.recall_time_limit";
|
||||
|
||||
private BrokerConstants() {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,13 @@ public class BroadcastMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
}
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long messageId = 0;
|
||||
try {
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||
}
|
||||
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(message.getConversation().getLine()).setType(ProtoConstants.ConversationType.ConversationType_Private).build()).build();
|
||||
|
||||
long count = saveAndBroadcast(fromUser, clientID, message);
|
||||
|
||||
@@ -27,7 +27,7 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
|
||||
return ErrorCode.ERROR_CODE_GROUP_ALREADY_EXIST;
|
||||
}
|
||||
}
|
||||
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList());
|
||||
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), isAdmin);
|
||||
if (groupInfo != null) {
|
||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||
|
||||
@@ -24,7 +24,7 @@ public class GetGroupMemberHandler extends IMHandler<WFCMessage.PullGroupMemberR
|
||||
@Override
|
||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.PullGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||
List<WFCMessage.GroupMember> members = new ArrayList<>();
|
||||
ErrorCode errorCode = m_messagesStore.getGroupMembers(request.getTarget(), request.getHead(), members);
|
||||
ErrorCode errorCode = m_messagesStore.getGroupMembers(fromUser, request.getTarget(), request.getHead(), members);
|
||||
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
WFCMessage.PullGroupMemberResult result = WFCMessage.PullGroupMemberResult.newBuilder().addAllMember(members).build();
|
||||
|
||||
@@ -19,6 +19,8 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
||||
protected void sendGroupNotification(String fromUser, String targetId, List<Integer> lines, WFCMessage.MessageContent content) {
|
||||
if (lines == null) {
|
||||
lines = new ArrayList<>();
|
||||
} else {
|
||||
lines = new ArrayList<>(lines);
|
||||
}
|
||||
|
||||
if (lines.isEmpty()) {
|
||||
@@ -30,9 +32,13 @@ abstract public class GroupHandler<T> extends IMHandler<T> {
|
||||
WFCMessage.Message.Builder builder = WFCMessage.Message.newBuilder().setContent(content).setServerTimestamp(timestamp);
|
||||
builder.setConversation(builder.getConversationBuilder().setType(ProtoConstants.ConversationType.ConversationType_Group).setTarget(targetId).setLine(line));
|
||||
builder.setFromUser(fromUser);
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(fromUser, null, builder.build(), false);
|
||||
try {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(fromUser, null, builder.build(), false);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -32,50 +32,57 @@ public class HandleFriendRequestHandler extends IMHandler<WFCMessage.HandleFrien
|
||||
|
||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||
if (!isAdmin && builder.getConversation() != null && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long timestamp = System.currentTimeMillis();
|
||||
builder.setMessageId(messageId);
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
try {
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long timestamp = System.currentTimeMillis();
|
||||
builder.setMessageId(messageId);
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||
String language = "zh_CN";
|
||||
if (session != null && !StringUtil.isNullOrEmpty(session.getLanguage())) {
|
||||
language = session.getLanguage();
|
||||
}
|
||||
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder();
|
||||
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
||||
contentBuilder.setType(92);
|
||||
} else {
|
||||
contentBuilder.setType(90).setContent(I18n.getString(language, "Above_Greeting_Message"));
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||
String language = "zh_CN";
|
||||
if (session != null && !StringUtil.isNullOrEmpty(session.getLanguage())) {
|
||||
language = session.getLanguage();
|
||||
}
|
||||
WFCMessage.MessageContent.Builder contentBuilder = WFCMessage.MessageContent.newBuilder();
|
||||
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
||||
contentBuilder.setType(92);
|
||||
} else {
|
||||
contentBuilder.setType(90).setContent(I18n.getString(language, "Above_Greeting_Message"));
|
||||
}
|
||||
|
||||
builder = WFCMessage.Message.newBuilder();
|
||||
builder.setFromUser(request.getTargetUid());
|
||||
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||
builder.setContent(contentBuilder);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
||||
contentBuilder.setType(93);
|
||||
} else {
|
||||
contentBuilder.setContent(I18n.getString(language, "Friend_Can_Start_Chat"));
|
||||
}
|
||||
|
||||
builder.setContent(contentBuilder);
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
builder = WFCMessage.Message.newBuilder();
|
||||
builder.setFromUser(request.getTargetUid());
|
||||
builder.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setLine(0).setType(ProtoConstants.ConversationType.ConversationType_Private).build());
|
||||
builder.setContent(contentBuilder);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
if (m_messagesStore.isNewFriendWelcomeMessage()) {
|
||||
contentBuilder.setType(93);
|
||||
} else {
|
||||
contentBuilder.setContent(I18n.getString(language, "Friend_Can_Start_Chat"));
|
||||
if (request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted || isAdmin) {
|
||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
|
||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
||||
}
|
||||
|
||||
builder.setContent(contentBuilder);
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
builder.setMessageId(messageId);
|
||||
timestamp = System.currentTimeMillis();
|
||||
builder.setServerTimestamp(timestamp);
|
||||
saveAndPublish(request.getTargetUid(), null, builder.build(), false);
|
||||
|
||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, request.getTargetUid(), heads[0]);
|
||||
publisher.publishNotification(IMTopic.NotifyFriendTopic, fromUser, heads[1]);
|
||||
}
|
||||
}
|
||||
return errorCode;
|
||||
|
||||
@@ -36,7 +36,13 @@ public class MultiCastMessageHandler extends IMHandler<WFCMessage.MultiCastMessa
|
||||
}
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long messageId = 0;
|
||||
try {
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||
}
|
||||
WFCMessage.Message message = WFCMessage.Message.newBuilder()
|
||||
.setContent(multiCastMessage.getContent())
|
||||
.setConversation(WFCMessage.Conversation.newBuilder().setTarget(fromUser).setType(ConversationType_Private).setLine(multiCastMessage.getLine()).build())
|
||||
|
||||
@@ -100,7 +100,13 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
||||
}
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
long messageId = MessageShardingUtil.generateId();
|
||||
long messageId = 0;
|
||||
try {
|
||||
messageId = MessageShardingUtil.generateId();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||
}
|
||||
message = message.toBuilder().setFromUser(fromUser).setMessageId(messageId).setServerTimestamp(timestamp).build();
|
||||
|
||||
if (mForwardUrl != null) {
|
||||
|
||||
@@ -86,10 +86,10 @@ public class DatabaseStore {
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "insert into t_settings " +
|
||||
" (`id`, `value`, `desc`) values(?, ?, ?)" +
|
||||
" (`id`, `_value`, `_desc`) values(?, ?, ?)" +
|
||||
" ON DUPLICATE KEY UPDATE " +
|
||||
"`value` = ?," +
|
||||
"`desc` = ?";
|
||||
"`_value` = ?," +
|
||||
"`_desc` = ?";
|
||||
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
@@ -120,7 +120,7 @@ public class DatabaseStore {
|
||||
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "select `value`, `desc` from t_settings where `id` = ?";
|
||||
String sql = "select `_value`, `_desc` from t_settings where `id` = ?";
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
int index = 1;
|
||||
@@ -826,7 +826,16 @@ public class DatabaseStore {
|
||||
}
|
||||
}
|
||||
WFCMessage.Message message = builder.build();
|
||||
messages.add(message);
|
||||
boolean expired = false;
|
||||
if (message.getContent().getExpireDuration() > 0) {
|
||||
if (System.currentTimeMillis() > message.getServerTimestamp() + message.getContent().getExpireDuration()*1000) {
|
||||
expired = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!expired) {
|
||||
messages.add(message);
|
||||
}
|
||||
}
|
||||
|
||||
if (count == 0) {
|
||||
@@ -2177,6 +2186,33 @@ public class DatabaseStore {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
boolean isUidAndNameConflict(String uid, String name) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
long start = System.currentTimeMillis();
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "select _uid from t_user where _name = ? and _uid <> ? limit 1";
|
||||
statement = connection.prepareStatement(sql);
|
||||
statement.setString(1, name);
|
||||
statement.setString(2, uid);
|
||||
rs = statement.executeQuery();
|
||||
if (rs.next()) {
|
||||
String conflictId = rs.getString(1);
|
||||
LOG.error("user {} already have name {} !!!", conflictId, name);
|
||||
return true;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void updateUser(final WFCMessage.User user) throws Exception {
|
||||
LOG.info("Database update user info {} {}", user.getUid(), user.getUpdateDt());
|
||||
|
||||
@@ -34,6 +34,7 @@ import io.moquette.spi.IMessagesStore;
|
||||
import io.moquette.spi.security.Tokenor;
|
||||
import io.moquette.spi.impl.subscriptions.Topic;
|
||||
import io.netty.handler.codec.mqtt.MqttVersion;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import win.liyufan.im.*;
|
||||
@@ -135,6 +136,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
private long mChatroomParticipantIdleTime = 900000;
|
||||
private boolean mChatroomRejoinWhenActive = true;
|
||||
|
||||
private long mRecallTimeLimit = 300;
|
||||
|
||||
MemoryMessagesStore(Server server, DatabaseStore databaseStore) {
|
||||
m_Server = server;
|
||||
this.databaseStore = databaseStore;
|
||||
@@ -235,6 +238,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
databaseStore.setDisableRemoteMessageSearch(disableRemoteMessageSearch);
|
||||
} catch (Exception e) {
|
||||
}
|
||||
|
||||
try {
|
||||
mRecallTimeLimit = Long.parseLong(m_Server.getConfig().getProperty(BrokerConstants.MESSAGES_RECALL_TIME_LIMIT));
|
||||
} catch (Exception e) {
|
||||
}
|
||||
}
|
||||
|
||||
private void printMissConfigLog(String config, String defaultValue) {
|
||||
@@ -492,7 +500,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||
if (System.currentTimeMillis() < bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()) {
|
||||
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration()*1000) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -586,6 +594,12 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
MessageBundle bundle = mIMap.get(targetMessageId);
|
||||
if (bundle != null) {
|
||||
if (exceptClientId == null || !exceptClientId.equals(bundle.getFromClientId()) || !fromUser.equals(bundle.getFromUser())) {
|
||||
if (bundle.getMessage().getContent().getExpireDuration() > 0) {
|
||||
if (System.currentTimeMillis() > bundle.getMessage().getServerTimestamp() + bundle.getMessage().getContent().getExpireDuration() * 1000) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
size += bundle.getMessage().getSerializedSize();
|
||||
if (size >= 3 * 1024 * 1024) { //3M
|
||||
break;
|
||||
@@ -762,7 +776,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList) {
|
||||
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, boolean isAdmin) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
|
||||
|
||||
@@ -773,6 +787,26 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} else {
|
||||
groupId = groupInfo.getTargetId();
|
||||
}
|
||||
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
|
||||
String owner = fromUser;
|
||||
if (isAdmin && !StringUtil.isNullOrEmpty(groupInfo.getOwner())) {
|
||||
owner = groupInfo.getOwner();
|
||||
}
|
||||
|
||||
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
|
||||
for (WFCMessage.GroupMember member : memberList) {
|
||||
if (member.getMemberId().equals(owner)) {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
|
||||
} else {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).build();
|
||||
}
|
||||
groupMembers.put(groupId, member);
|
||||
updatedMemberList.add(member);
|
||||
dt++;
|
||||
}
|
||||
|
||||
groupInfo = groupInfo.toBuilder()
|
||||
.setTargetId(groupId)
|
||||
.setName(groupInfo.getName())
|
||||
@@ -782,23 +816,10 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
.setUpdateDt(dt)
|
||||
.setMemberUpdateDt(dt)
|
||||
.setMemberCount(memberList.size())
|
||||
.setOwner(StringUtil.isNullOrEmpty(groupInfo.getOwner()) ? fromUser : groupInfo.getOwner())
|
||||
.setOwner(owner)
|
||||
.build();
|
||||
|
||||
mIMap.put(groupId, groupInfo);
|
||||
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
|
||||
|
||||
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
|
||||
for (WFCMessage.GroupMember member : memberList) {
|
||||
if (member.getMemberId().equals(groupInfo.getOwner())) {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
|
||||
} else {
|
||||
member = member.toBuilder().setUpdateDt(dt).setCreateDt(dt).build();
|
||||
}
|
||||
groupMembers.put(groupId, member);
|
||||
updatedMemberList.add(member);
|
||||
}
|
||||
|
||||
mIMap.set(groupId, groupInfo);
|
||||
databaseStore.persistGroupMember(groupId, updatedMemberList);
|
||||
|
||||
return groupInfo;
|
||||
@@ -864,12 +885,20 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
ArrayList<String> newInviteUsers = new ArrayList<>();
|
||||
for (WFCMessage.GroupMember member : memberList) {
|
||||
if (member.getMemberId().equals(groupInfo.getOwner())) {
|
||||
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).setCreateDt(updateDt).setAlias("").build();
|
||||
member = member.toBuilder().setType(GroupMemberType_Owner).setUpdateDt(updateDt).setCreateDt(updateDt).build();
|
||||
} else {
|
||||
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).setCreateDt(updateDt).setAlias("").build();
|
||||
if (isAdmin) {
|
||||
if (member.getType() != GroupMemberType_Owner)
|
||||
member = member.toBuilder().setUpdateDt(updateDt).setCreateDt(updateDt).build();
|
||||
else
|
||||
return ErrorCode.INVALID_PARAMETER;
|
||||
} else {
|
||||
member = member.toBuilder().setType(GroupMemberType_Normal).setUpdateDt(updateDt).setCreateDt(updateDt).build();
|
||||
}
|
||||
}
|
||||
tmp.add(member);
|
||||
newInviteUsers.add(member.getMemberId());
|
||||
updateDt++;
|
||||
}
|
||||
memberList = tmp;
|
||||
|
||||
@@ -1216,7 +1245,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members) {
|
||||
public ErrorCode getGroupMembers(String fromUser, String groupId, long maxDt, List<WFCMessage.GroupMember> members) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
|
||||
|
||||
@@ -1232,10 +1261,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
if (memberCollection == null || memberCollection.size() == 0) {
|
||||
memberCollection = loadGroupMemberFromDB(hzInstance, groupId);
|
||||
}
|
||||
boolean notInGroup = true;
|
||||
WFCMessage.GroupMember self = null;
|
||||
for (WFCMessage.GroupMember member:memberCollection) {
|
||||
if (member.getUpdateDt() > maxDt) {
|
||||
members.add(member);
|
||||
}
|
||||
if (fromUser != null && notInGroup) {
|
||||
if (member.getMemberId().equals(fromUser)) {
|
||||
if (member.getType() != GroupMemberType_Removed) {
|
||||
notInGroup = false;
|
||||
} else {
|
||||
self = member;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//server api fromUser is null
|
||||
if (fromUser != null && notInGroup) {
|
||||
members.clear();
|
||||
if (self != null) {
|
||||
members.add(self.toBuilder().setUpdateDt(0).setType(GroupMemberType_Removed).build());
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
@@ -1422,6 +1471,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
|
||||
|
||||
MessageBundle messageBundle = mIMap.get(messageUid);
|
||||
long now = System.currentTimeMillis();
|
||||
if (messageBundle != null) {
|
||||
WFCMessage.Message message = messageBundle.getMessage();
|
||||
boolean canRecall = false;
|
||||
@@ -1429,7 +1479,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
canRecall = true;
|
||||
}
|
||||
if (!isAdmin && message.getFromUser().equals(operatorId)) {
|
||||
canRecall = true;
|
||||
if (now - message.getServerTimestamp() > mRecallTimeLimit * 1000) {
|
||||
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
||||
} else {
|
||||
canRecall = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!canRecall && message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group) {
|
||||
@@ -1437,7 +1491,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
WFCMessage.GroupInfo groupInfo = groupMap.get(message.getConversation().getTarget());
|
||||
if (groupInfo == null) {
|
||||
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||
return ErrorCode.ERROR_CODE_RECALL_TIME_EXPIRED;
|
||||
}
|
||||
if (operatorId.equals(groupInfo.getOwner())) {
|
||||
canRecall = true;
|
||||
@@ -1468,12 +1522,26 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||
}
|
||||
|
||||
String searchContent = message.getContent().getSearchableContent() == null ? "" : message.getContent().getSearchableContent();
|
||||
String cont = message.getContent().getContent() == null ? "" : message.getContent().getContent();
|
||||
String extra = message.getContent().getExtra() == null ? "" : message.getContent().getExtra();
|
||||
String recalledContent = "{\"s\":\"" + message.getFromUser() + "\",\"ts\":" + message.getServerTimestamp() + ",\"t\":" + message.getContent().getType() + ",\"sc\":\"" + searchContent + "\",\"c\":\"" + cont + "\",\"e\":\"" + extra + "\"}";
|
||||
JSONObject json = new JSONObject();
|
||||
json.put("s", message.getFromUser());
|
||||
json.put("ts", message.getServerTimestamp());
|
||||
json.put("t", message.getContent().getType());
|
||||
json.put("sc", message.getContent().getSearchableContent());
|
||||
json.put("c", message.getContent().getContent());
|
||||
json.put("e", message.getContent().getExtra());
|
||||
if (message.getContent().getData() != null && message.getContent().getData().size() > 0) {
|
||||
json.put("b", Base64.getEncoder().encode(message.getContent().getData().toByteArray()));
|
||||
}
|
||||
if (message.getContent().getMediaType() > 0) {
|
||||
json.put("mt", message.getContent().getMediaType());
|
||||
}
|
||||
if (!StringUtil.isNullOrEmpty(message.getContent().getRemoteMediaUrl())) {
|
||||
json.put("mu", message.getContent().getRemoteMediaUrl());
|
||||
}
|
||||
|
||||
message = message.toBuilder().setContent(message.getContent().toBuilder().setContent(operatorId).setType(80).clearSearchableContent().setData(ByteString.copyFrom(String.valueOf(messageUid).getBytes())).setExtra(recalledContent).build()).build();
|
||||
String recalledContent = json.toJSONString();
|
||||
|
||||
message = message.toBuilder().setContent(WFCMessage.MessageContent.newBuilder().setContent(operatorId).setType(80).setData(ByteString.copyFrom(String.valueOf(messageUid).getBytes())).setExtra(recalledContent)).build();
|
||||
messageBundle.setMessage(message);
|
||||
messageBundle.setFromClientId(clientId);
|
||||
|
||||
@@ -1715,6 +1783,9 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
public void addUserInfo(WFCMessage.User user, String password) throws Exception {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
|
||||
if (databaseStore.isUidAndNameConflict(user.getUid(), user.getName())) {
|
||||
throw new Exception("用户名不能重复,必须唯一!!!");
|
||||
}
|
||||
databaseStore.updateUser(user);
|
||||
mUserMap.put(user.getUid(), user);
|
||||
databaseStore.updateUserPassword(user.getUid(), password);
|
||||
@@ -1941,60 +2012,6 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorCode login(String name, String password, List<String> userIdRet) {
|
||||
Connection connection = null;
|
||||
PreparedStatement statement = null;
|
||||
ResultSet rs = null;
|
||||
try {
|
||||
connection = DBUtil.getConnection();
|
||||
String sql = "select `_uid`, `_passwd_md5` from t_user where `_name` = ?";
|
||||
|
||||
statement = connection.prepareStatement(sql);
|
||||
|
||||
int index = 1;
|
||||
statement.setString(index++, name);
|
||||
|
||||
rs = statement.executeQuery();
|
||||
if (rs.next()) {
|
||||
String uid = rs.getString(1);
|
||||
|
||||
int status = getUserStatus(uid);
|
||||
if (status == 1) {
|
||||
return ErrorCode.ERROR_CODE_USER_FORBIDDEN;
|
||||
}
|
||||
String pwd_md5 = rs.getString(2);
|
||||
try {
|
||||
MessageDigest md5 = MessageDigest.getInstance("MD5");
|
||||
String passwdMd5 = Base64.getEncoder().encodeToString(md5.digest(password.getBytes("utf-8")));
|
||||
if (passwdMd5.equals(pwd_md5)) {
|
||||
LOG.info("login success userName={}, userId={}", name, uid);
|
||||
userIdRet.add(uid);
|
||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||
} else {
|
||||
LOG.info("login failure incorrect password, userName={}, userId={}", name, uid);
|
||||
return ErrorCode.ERROR_CODE_PASSWORD_INCORRECT;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
LOG.info("login failure execption password, userName={}", name);
|
||||
return ErrorCode.ERROR_CODE_PASSWORD_INCORRECT;
|
||||
}
|
||||
} else {
|
||||
LOG.info("login failure user not exist, userName={}", name);
|
||||
return ErrorCode.ERROR_CODE_NOT_EXIST;
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
e.printStackTrace();
|
||||
Utility.printExecption(LOG, e);
|
||||
LOG.info("login failure db execption, userName={}", name);
|
||||
return ErrorCode.ERROR_CODE_SERVER_ERROR;
|
||||
} finally {
|
||||
DBUtil.closeDB(connection, statement, rs);
|
||||
}
|
||||
}
|
||||
|
||||
synchronized Collection<FriendData> loadFriend(MultiMap<String, FriendData> friendsMap, String userId) {
|
||||
Collection<FriendData> friends = databaseStore.getPersistFriends(userId);
|
||||
if (friends != null) {
|
||||
@@ -2188,7 +2205,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
public ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin) {
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
|
||||
if(request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||
|
||||
if(!isAdmin && request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||
|
||||
Collection<FriendData> friends = friendsMap.get(userId);
|
||||
@@ -2284,6 +2302,27 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
} else {
|
||||
existRequest = existRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(System.currentTimeMillis()).build();
|
||||
databaseStore.persistOrUpdateFriendRequest(existRequest);
|
||||
|
||||
if (request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) {
|
||||
Collection<WFCMessage.FriendRequest> targetRequests = requestMap.get(request.getTargetUid());
|
||||
if (targetRequests == null || targetRequests.size() == 0) {
|
||||
targetRequests = loadFriendRequest(requestMap, request.getTargetUid());
|
||||
}
|
||||
|
||||
WFCMessage.FriendRequest existTargetRequest = null;
|
||||
for (WFCMessage.FriendRequest tmpRequest : targetRequests) {
|
||||
if (tmpRequest.getFromUid().equals(userId)) {
|
||||
existTargetRequest = tmpRequest;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (existTargetRequest != null && existTargetRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Sent) {
|
||||
existTargetRequest = existTargetRequest.toBuilder().setStatus(request.getStatus()).setUpdateDt(existRequest.getUpdateDt()).build();
|
||||
databaseStore.persistOrUpdateFriendRequest(existTargetRequest);
|
||||
}
|
||||
}
|
||||
|
||||
if(request.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Accepted){
|
||||
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||
FriendData friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getExtra(), 0, 0, System.currentTimeMillis());
|
||||
@@ -2318,6 +2357,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
||||
|
||||
if (state == 2) {
|
||||
state = 1;
|
||||
} else {
|
||||
state = 0;
|
||||
}
|
||||
|
||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||
|
||||
@@ -104,7 +104,7 @@ public interface IMessagesStore {
|
||||
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
|
||||
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
|
||||
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId);
|
||||
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList);
|
||||
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, boolean isAdmin);
|
||||
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList);
|
||||
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
|
||||
ErrorCode quitGroup(String operator, String groupId);
|
||||
@@ -115,7 +115,7 @@ public interface IMessagesStore {
|
||||
List<WFCMessage.GroupInfo> getGroupInfos(List<WFCMessage.UserRequest> requests);
|
||||
WFCMessage.GroupInfo getGroupInfo(String groupId);
|
||||
Set<String> getUserGroupIds(String userId);
|
||||
ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members);
|
||||
ErrorCode getGroupMembers(String fromUser, String groupId, long maxDt, List<WFCMessage.GroupMember> members);
|
||||
WFCMessage.GroupMember getGroupMember(String groupId, String memberId);
|
||||
ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin);
|
||||
ErrorCode setGroupManager(String operator, String groupId, int type, List<String> userList, boolean isAdmin);
|
||||
@@ -159,7 +159,6 @@ public interface IMessagesStore {
|
||||
WFCMessage.PullMessageResult fetchChatroomMessage(String fromUser, String chatroomId, String exceptClientId, long fromMessageId);
|
||||
|
||||
ErrorCode verifyToken(String userId, String token, List<String> serverIPs, List<Integer> ports);
|
||||
ErrorCode login(String name, String password, List<String> userIdRet);
|
||||
|
||||
List<FriendData> getFriendList(String userId, String clientId, long version);
|
||||
void clearUserFriend(String userId);
|
||||
|
||||
@@ -159,7 +159,7 @@ public class MessagesPublisher {
|
||||
}
|
||||
}
|
||||
|
||||
private void publish2Receivers(String sender, int conversationType, String target, int line, long messageHead, Collection<String> receivers, String pushContent, String exceptClientId, int pullType, int messageContentType, long serverTime, int mentionType, List<String> mentionTargets, int persistFlag) {
|
||||
private void publish2Receivers(String sender, int conversationType, String target, int line, long messageHead, Collection<String> receivers, String pushContent, String pushData, String exceptClientId, int pullType, int messageContentType, long serverTime, int mentionType, List<String> mentionTargets, int persistFlag) {
|
||||
if (persistFlag == Transparent) {
|
||||
publishTransparentMessage2Receivers(messageHead, receivers, pullType);
|
||||
return;
|
||||
@@ -254,7 +254,7 @@ public class MessagesPublisher {
|
||||
}
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(pushContent) || messageContentType == 400) {
|
||||
if (!isSlient) {
|
||||
if (!isSlient && (persistFlag & 0x02) > 0) {
|
||||
targetSession.setUnReceivedMsgs(targetSession.getUnReceivedMsgs() + 1);
|
||||
}
|
||||
}
|
||||
@@ -332,7 +332,7 @@ public class MessagesPublisher {
|
||||
name = fd.getAlias();
|
||||
}
|
||||
}
|
||||
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||
this.messageSender.sendPush(sender, conversationType, target, line, messageHead, targetSession.getClientID(), pushContent, pushData, messageContentType, serverTime, name, targetName, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -545,7 +545,7 @@ public class MessagesPublisher {
|
||||
message.getConversation().getType(), message.getConversation().getTarget(), message.getConversation().getLine(),
|
||||
messageId,
|
||||
receivers,
|
||||
pushContent, exceptClientId, pullType, message.getContent().getType(), message.getServerTimestamp(), message.getContent().getMentionedType(), message.getContent().getMentionedTargetList(), message.getContent().getPersistFlag());
|
||||
pushContent, message.getContent().getPushData(), exceptClientId, pullType, message.getContent().getType(), message.getServerTimestamp(), message.getContent().getMentionedType(), message.getContent().getMentionedTargetList(), message.getContent().getPersistFlag());
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -37,10 +37,11 @@ class PersistentQueueMessageSender {
|
||||
this.connectionDescriptorStore = connectionDescriptorStore;
|
||||
}
|
||||
|
||||
void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||
void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, String pushData, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) {
|
||||
LOG.info("Send push to {}, message from {}", deviceId, sender);
|
||||
PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language);
|
||||
pushMessage.pushContent = pushContent;
|
||||
pushMessage.pushData = pushData;
|
||||
PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent);
|
||||
}
|
||||
|
||||
|
||||
@@ -243,18 +243,16 @@ public class ProtocolProcessor {
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientId);
|
||||
if(session != null) {
|
||||
session.refreshLastActiveTime();
|
||||
forwardOnlineStatusEvent(payload.userName(), clientId, session.getPlatform(), UserOnlineStatus.ONLINE);
|
||||
forwardOnlineStatusEvent(payload.userName(), clientId, session.getPlatform(), UserOnlineStatus.ONLINE, session.getAppName());
|
||||
m_messagesStore.updateUserOnlineSetting(session, true);
|
||||
} else {
|
||||
forwardOnlineStatusEvent(payload.userName(), clientId, ProtoConstants.Platform.Platform_UNSET, UserOnlineStatus.ONLINE);
|
||||
}
|
||||
|
||||
LOG.info("The CONNECT message has been processed. CId={}, username={}", clientId, payload.userName());
|
||||
}
|
||||
|
||||
public void forwardOnlineStatusEvent(String userId, String clientId, int platform, int status) {
|
||||
public void forwardOnlineStatusEvent(String userId, String clientId, int platform, int status, String packageName) {
|
||||
if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) {
|
||||
executorCallback.execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status))));
|
||||
executorCallback.execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status, packageName))));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -562,9 +560,7 @@ public class ProtocolProcessor {
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||
if(session != null) {
|
||||
m_messagesStore.updateUserOnlineSetting(session, false);
|
||||
}
|
||||
if(session != null) {
|
||||
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), UserOnlineStatus.LOGOUT);
|
||||
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), UserOnlineStatus.LOGOUT, session.getAppName());
|
||||
}
|
||||
|
||||
channel.closeFuture();
|
||||
@@ -608,7 +604,7 @@ public class ProtocolProcessor {
|
||||
MemorySessionStore.Session session = m_sessionsStore.getSession(clientID);
|
||||
if(session != null) {
|
||||
session.refreshLastActiveTime();
|
||||
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), clearSession ? UserOnlineStatus.LOGOUT : UserOnlineStatus.OFFLINE);
|
||||
forwardOnlineStatusEvent(username, clientID, session.getPlatform(), clearSession ? UserOnlineStatus.LOGOUT : UserOnlineStatus.OFFLINE, session.getAppName());
|
||||
m_messagesStore.updateUserOnlineSetting(session, false);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import java.util.Date;
|
||||
public class MessageShardingUtil {
|
||||
private static SpinLock mLock = new SpinLock();
|
||||
private static volatile int rotateId = 0;
|
||||
private static volatile long timeId = 0;
|
||||
private static int nodeId = 0;
|
||||
|
||||
private static int rotateIdWidth = 15;
|
||||
@@ -33,13 +34,41 @@ public class MessageShardingUtil {
|
||||
* 所以时间限制是到2157/5/15(2的42次幂代表的时间 + (2018-1970))。节点数限制是小于64,每台服务器每毫秒最多发送32768条消息
|
||||
* @return
|
||||
*/
|
||||
public static long generateId() {
|
||||
public static long generateId() throws Exception {
|
||||
mLock.lock();
|
||||
rotateId = (rotateId + 1)&rotateIdMask;
|
||||
mLock.unLock();
|
||||
|
||||
long id = System.currentTimeMillis() - T201801010000;
|
||||
|
||||
if (id > timeId) {
|
||||
timeId = id;
|
||||
rotateId = 1;
|
||||
} else if(id == timeId) {
|
||||
if (rotateId == (rotateIdMask - 1)) { //当前空间已经用完,等待下一个空间打开
|
||||
while (id <= timeId) {
|
||||
id = System.currentTimeMillis() - T201801010000;
|
||||
}
|
||||
mLock.unLock();
|
||||
return generateId();
|
||||
}
|
||||
} else { //id < timeId;
|
||||
if (rotateId > (rotateIdMask -1)*9/10) { //空间已经接近用完
|
||||
if (timeId - id < 3000) { //时间回拨小于3秒,等待时间赶上回拨之前记录
|
||||
while (id < timeId) {
|
||||
id = System.currentTimeMillis() - T201801010000;
|
||||
}
|
||||
mLock.unLock();
|
||||
return generateId();
|
||||
} else { //时间回拨大于3秒,抛出异常,这段时间消息将不可用。
|
||||
mLock.unLock();
|
||||
throw new Exception("Time turn back " + (timeId - id) + " ms, it too long!!!");
|
||||
}
|
||||
} else {
|
||||
id = timeId;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
id <<= nodeIdWidth;
|
||||
id += (nodeId & nodeIdMask);
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.42</version>
|
||||
<version>0.45</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ public interface APIPath {
|
||||
String Group_Member_Quit = "/admin/group/member/quit";
|
||||
String Group_Set_Manager = "/admin/group/manager/set";
|
||||
String Group_Mute_Member = "/admin/group/manager/mute";
|
||||
String Group_Allow_Member = "/admin/group/manager/allow";
|
||||
String Get_User_Groups = "/admin/group/of_user";
|
||||
|
||||
|
||||
|
||||
@@ -29,10 +29,6 @@ public enum ErrorCode {
|
||||
//Group error
|
||||
ERROR_CODE_GROUP_ALREADY_EXIST(11, "group aleady exist"),
|
||||
|
||||
|
||||
//user error
|
||||
ERROR_CODE_PASSWORD_INCORRECT(15, "password incorrect"),
|
||||
|
||||
//user error
|
||||
ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),
|
||||
ERROR_CODE_FRIEND_REQUEST_BLOCKED(18, "friend request blocked"),
|
||||
@@ -44,6 +40,8 @@ public enum ErrorCode {
|
||||
|
||||
ERROR_CODE_ALREADY_FRIENDS(23, "already friends"),
|
||||
|
||||
ERROR_CODE_RECALL_TIME_EXPIRED(24, "time expired"),
|
||||
|
||||
ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT(240, "group exceed max member count"),
|
||||
ERROR_CODE_GROUP_MUTED(241, "group is muted"),
|
||||
ERROR_CODE_SENSITIVE_MATCHED(242, "sensitive matched"),
|
||||
|
||||
@@ -149,4 +149,7 @@ public class GroupNotificationBinaryContent {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_MUTE_MEMBER);
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent getAllowGroupMemberNotifyContent() {
|
||||
return getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_ALLOW_MEMBER);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,27 +24,41 @@ public class InputCreateGroup extends InputGroupBase {
|
||||
public WFCMessage.CreateGroupRequest toProtoGroupRequest() {
|
||||
WFCMessage.Group.Builder groupBuilder = WFCMessage.Group.newBuilder();
|
||||
WFCMessage.GroupInfo.Builder groupInfoBuilder = WFCMessage.GroupInfo.newBuilder();
|
||||
if (!StringUtil.isNullOrEmpty(group.getGroup_info().target_id)) {
|
||||
groupInfoBuilder.setTargetId(group.getGroup_info().getTarget_id());
|
||||
PojoGroupInfo group_info = group.getGroup_info();
|
||||
if (!StringUtil.isNullOrEmpty(group_info.target_id)) {
|
||||
groupInfoBuilder.setTargetId(group_info.getTarget_id());
|
||||
}
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(group.getGroup_info().name)) {
|
||||
groupInfoBuilder.setName(group.getGroup_info().getName());
|
||||
if (!StringUtil.isNullOrEmpty(group_info.name)) {
|
||||
groupInfoBuilder.setName(group_info.getName());
|
||||
}
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(group.getGroup_info().portrait)) {
|
||||
groupInfoBuilder.setPortrait(group.getGroup_info().getPortrait());
|
||||
if (!StringUtil.isNullOrEmpty(group_info.portrait)) {
|
||||
groupInfoBuilder.setPortrait(group_info.getPortrait());
|
||||
}
|
||||
if (!StringUtil.isNullOrEmpty(group.getGroup_info().owner)) {
|
||||
groupInfoBuilder.setOwner(group.getGroup_info().getOwner());
|
||||
if (!StringUtil.isNullOrEmpty(group_info.owner)) {
|
||||
groupInfoBuilder.setOwner(group_info.getOwner());
|
||||
}
|
||||
|
||||
groupInfoBuilder.setType(group.getGroup_info().getType());
|
||||
groupInfoBuilder.setType(group_info.getType());
|
||||
|
||||
if (!StringUtil.isNullOrEmpty(group.getGroup_info().extra)) {
|
||||
groupInfoBuilder.setExtra(group.getGroup_info().getExtra());
|
||||
if (!StringUtil.isNullOrEmpty(group_info.extra)) {
|
||||
groupInfoBuilder.setExtra(group_info.getExtra());
|
||||
}
|
||||
|
||||
if (group_info.join_type > 0 && group_info.join_type < 128) {
|
||||
groupInfoBuilder.setJoinType(group_info.join_type);
|
||||
}
|
||||
|
||||
if (group_info.mute > 0 && group_info.mute < 128) {
|
||||
groupInfoBuilder.setMute(group_info.mute);
|
||||
}
|
||||
if (group_info.private_chat > 0 && group_info.private_chat < 128) {
|
||||
groupInfoBuilder.setPrivateChat(group_info.private_chat);
|
||||
}
|
||||
if (group_info.searchable > 0) {
|
||||
groupInfoBuilder.setSearchable(group_info.searchable);
|
||||
}
|
||||
|
||||
groupBuilder.setGroupInfo(groupInfoBuilder);
|
||||
for (PojoGroupMember pojoGroupMember : group.getMembers()) {
|
||||
|
||||
@@ -20,6 +20,7 @@ public class MessagePayload {
|
||||
private int type;
|
||||
private String searchableContent;
|
||||
private String pushContent;
|
||||
private String pushData;
|
||||
private String content;
|
||||
private String base64edData;
|
||||
private int mediaType;
|
||||
@@ -127,6 +128,14 @@ public class MessagePayload {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public String getPushData() {
|
||||
return pushData;
|
||||
}
|
||||
|
||||
public void setPushData(String pushData) {
|
||||
this.pushData = pushData;
|
||||
}
|
||||
|
||||
public WFCMessage.MessageContent toProtoMessageContent() {
|
||||
WFCMessage.MessageContent.Builder builder = WFCMessage.MessageContent.newBuilder()
|
||||
.setType(type)
|
||||
@@ -149,6 +158,8 @@ public class MessagePayload {
|
||||
builder.addAllMentionedTarget(mentionedTarget);
|
||||
if (!StringUtil.isNullOrEmpty(extra))
|
||||
builder.setExtra(extra);
|
||||
if (!StringUtil.isNullOrEmpty(pushData))
|
||||
builder.setPushData(pushData);
|
||||
|
||||
return builder.build();
|
||||
}
|
||||
@@ -172,6 +183,7 @@ public class MessagePayload {
|
||||
payload.mentionedTarget = new ArrayList<>();
|
||||
payload.mentionedTarget.addAll(protoContent.getMentionedTargetList());
|
||||
payload.extra = protoContent.getExtra();
|
||||
payload.pushData = protoContent.getPushData();
|
||||
return payload;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,11 +13,9 @@ import cn.wildfirechat.proto.WFCMessage;
|
||||
|
||||
public class OutputCreateChannel {
|
||||
private String targetId;
|
||||
private String secret;
|
||||
|
||||
public OutputCreateChannel(String targetId, String secret) {
|
||||
public OutputCreateChannel(String targetId) {
|
||||
this.targetId = targetId;
|
||||
this.secret = secret;
|
||||
}
|
||||
|
||||
public String getTargetId() {
|
||||
@@ -27,12 +25,4 @@ public class OutputCreateChannel {
|
||||
public void setTargetId(String targetId) {
|
||||
this.targetId = targetId;
|
||||
}
|
||||
|
||||
public String getSecret() {
|
||||
return secret;
|
||||
}
|
||||
|
||||
public void setSecret(String secret) {
|
||||
this.secret = secret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,6 +15,12 @@ public class PojoGroupInfo {
|
||||
String owner;
|
||||
int type;
|
||||
String extra;
|
||||
int mute;
|
||||
int join_type;
|
||||
int private_chat;
|
||||
int searchable;
|
||||
int max_member_count;
|
||||
int history_message;
|
||||
|
||||
public String getTarget_id() {
|
||||
return target_id;
|
||||
@@ -63,4 +69,52 @@ public class PojoGroupInfo {
|
||||
public void setExtra(String extra) {
|
||||
this.extra = extra;
|
||||
}
|
||||
|
||||
public int getMax_member_count() {
|
||||
return max_member_count;
|
||||
}
|
||||
|
||||
public void setMax_member_count(int max_member_count) {
|
||||
this.max_member_count = max_member_count;
|
||||
}
|
||||
|
||||
public int getMute() {
|
||||
return mute;
|
||||
}
|
||||
|
||||
public void setMute(int mute) {
|
||||
this.mute = mute;
|
||||
}
|
||||
|
||||
public int getJoin_type() {
|
||||
return join_type;
|
||||
}
|
||||
|
||||
public void setJoin_type(int join_type) {
|
||||
this.join_type = join_type;
|
||||
}
|
||||
|
||||
public int getPrivate_chat() {
|
||||
return private_chat;
|
||||
}
|
||||
|
||||
public void setPrivate_chat(int private_chat) {
|
||||
this.private_chat = private_chat;
|
||||
}
|
||||
|
||||
public int getSearchable() {
|
||||
return searchable;
|
||||
}
|
||||
|
||||
public void setSearchable(int searchable) {
|
||||
this.searchable = searchable;
|
||||
}
|
||||
|
||||
public int getHistory_message() {
|
||||
return history_message;
|
||||
}
|
||||
|
||||
public void setHistory_message(int history_message) {
|
||||
this.history_message = history_message;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,12 +10,14 @@ public class UserOnlineStatus {
|
||||
public int platform;
|
||||
public int status;
|
||||
public long timestamp;
|
||||
public String packageName;
|
||||
|
||||
public UserOnlineStatus(String userId, String clientId, int platform, int status) {
|
||||
public UserOnlineStatus(String userId, String clientId, int platform, int status, String packageName) {
|
||||
this.userId = userId;
|
||||
this.clientId = clientId;
|
||||
this.platform = platform;
|
||||
this.status = status;
|
||||
this.packageName = packageName;
|
||||
this.timestamp = System.currentTimeMillis();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,6 +28,7 @@ public class ProtoConstants {
|
||||
int GroupMemberType_Owner = 2;
|
||||
int GroupMemberType_Silent = 3;
|
||||
int GroupMemberType_Removed = 4;
|
||||
int GroupMemberType_Allowed = 5;
|
||||
}
|
||||
|
||||
//message FriendRequest -> status
|
||||
@@ -182,5 +183,6 @@ public class ProtoConstants {
|
||||
|
||||
public static final int MESSAGE_CONTENT_TYPE_SET_MANAGER = 117;
|
||||
public static final int MESSAGE_CONTENT_TYPE_MUTE_MEMBER = 118;
|
||||
public static final int MESSAGE_CONTENT_TYPE_ALLOW_MEMBER = 119;
|
||||
}
|
||||
|
||||
|
||||
@@ -11552,6 +11552,21 @@ public final class WFCMessage {
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getExtraBytes();
|
||||
|
||||
// optional string push_data = 13;
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
boolean hasPushData();
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
java.lang.String getPushData();
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
com.google.protobuf.ByteString
|
||||
getPushDataBytes();
|
||||
}
|
||||
/**
|
||||
* Protobuf type {@code MessageContent}
|
||||
@@ -11667,6 +11682,11 @@ public final class WFCMessage {
|
||||
extra_ = input.readBytes();
|
||||
break;
|
||||
}
|
||||
case 106: {
|
||||
bitField0_ |= 0x00000800;
|
||||
pushData_ = input.readBytes();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
|
||||
@@ -12051,6 +12071,49 @@ public final class WFCMessage {
|
||||
}
|
||||
}
|
||||
|
||||
// optional string push_data = 13;
|
||||
public static final int PUSH_DATA_FIELD_NUMBER = 13;
|
||||
private java.lang.Object pushData_;
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public boolean hasPushData() {
|
||||
return ((bitField0_ & 0x00000800) == 0x00000800);
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public java.lang.String getPushData() {
|
||||
java.lang.Object ref = pushData_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
return (java.lang.String) ref;
|
||||
} else {
|
||||
com.google.protobuf.ByteString bs =
|
||||
(com.google.protobuf.ByteString) ref;
|
||||
java.lang.String s = bs.toStringUtf8();
|
||||
if (bs.isValidUtf8()) {
|
||||
pushData_ = s;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getPushDataBytes() {
|
||||
java.lang.Object ref = pushData_;
|
||||
if (ref instanceof java.lang.String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
pushData_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
|
||||
private void initFields() {
|
||||
type_ = 0;
|
||||
searchableContent_ = "";
|
||||
@@ -12064,6 +12127,7 @@ public final class WFCMessage {
|
||||
mentionedType_ = 0;
|
||||
mentionedTarget_ = com.google.protobuf.LazyStringArrayList.EMPTY;
|
||||
extra_ = "";
|
||||
pushData_ = "";
|
||||
}
|
||||
private byte memoizedIsInitialized = -1;
|
||||
public final boolean isInitialized() {
|
||||
@@ -12117,6 +12181,9 @@ public final class WFCMessage {
|
||||
if (((bitField0_ & 0x00000400) == 0x00000400)) {
|
||||
output.writeBytes(12, getExtraBytes());
|
||||
}
|
||||
if (((bitField0_ & 0x00000800) == 0x00000800)) {
|
||||
output.writeBytes(13, getPushDataBytes());
|
||||
}
|
||||
getUnknownFields().writeTo(output);
|
||||
}
|
||||
|
||||
@@ -12179,6 +12246,10 @@ public final class WFCMessage {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeBytesSize(12, getExtraBytes());
|
||||
}
|
||||
if (((bitField0_ & 0x00000800) == 0x00000800)) {
|
||||
size += com.google.protobuf.CodedOutputStream
|
||||
.computeBytesSize(13, getPushDataBytes());
|
||||
}
|
||||
size += getUnknownFields().getSerializedSize();
|
||||
memoizedSerializedSize = size;
|
||||
return size;
|
||||
@@ -12319,6 +12390,8 @@ public final class WFCMessage {
|
||||
bitField0_ = (bitField0_ & ~0x00000400);
|
||||
extra_ = "";
|
||||
bitField0_ = (bitField0_ & ~0x00000800);
|
||||
pushData_ = "";
|
||||
bitField0_ = (bitField0_ & ~0x00001000);
|
||||
return this;
|
||||
}
|
||||
|
||||
@@ -12397,6 +12470,10 @@ public final class WFCMessage {
|
||||
to_bitField0_ |= 0x00000400;
|
||||
}
|
||||
result.extra_ = extra_;
|
||||
if (((from_bitField0_ & 0x00001000) == 0x00001000)) {
|
||||
to_bitField0_ |= 0x00000800;
|
||||
}
|
||||
result.pushData_ = pushData_;
|
||||
result.bitField0_ = to_bitField0_;
|
||||
onBuilt();
|
||||
return result;
|
||||
@@ -12466,6 +12543,11 @@ public final class WFCMessage {
|
||||
extra_ = other.extra_;
|
||||
onChanged();
|
||||
}
|
||||
if (other.hasPushData()) {
|
||||
bitField0_ |= 0x00001000;
|
||||
pushData_ = other.pushData_;
|
||||
onChanged();
|
||||
}
|
||||
this.mergeUnknownFields(other.getUnknownFields());
|
||||
return this;
|
||||
}
|
||||
@@ -13161,6 +13243,80 @@ public final class WFCMessage {
|
||||
return this;
|
||||
}
|
||||
|
||||
// optional string push_data = 13;
|
||||
private java.lang.Object pushData_ = "";
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public boolean hasPushData() {
|
||||
return ((bitField0_ & 0x00001000) == 0x00001000);
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public java.lang.String getPushData() {
|
||||
java.lang.Object ref = pushData_;
|
||||
if (!(ref instanceof java.lang.String)) {
|
||||
java.lang.String s = ((com.google.protobuf.ByteString) ref)
|
||||
.toStringUtf8();
|
||||
pushData_ = s;
|
||||
return s;
|
||||
} else {
|
||||
return (java.lang.String) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public com.google.protobuf.ByteString
|
||||
getPushDataBytes() {
|
||||
java.lang.Object ref = pushData_;
|
||||
if (ref instanceof String) {
|
||||
com.google.protobuf.ByteString b =
|
||||
com.google.protobuf.ByteString.copyFromUtf8(
|
||||
(java.lang.String) ref);
|
||||
pushData_ = b;
|
||||
return b;
|
||||
} else {
|
||||
return (com.google.protobuf.ByteString) ref;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public Builder setPushData(
|
||||
java.lang.String value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00001000;
|
||||
pushData_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public Builder clearPushData() {
|
||||
bitField0_ = (bitField0_ & ~0x00001000);
|
||||
pushData_ = getDefaultInstance().getPushData();
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
/**
|
||||
* <code>optional string push_data = 13;</code>
|
||||
*/
|
||||
public Builder setPushDataBytes(
|
||||
com.google.protobuf.ByteString value) {
|
||||
if (value == null) {
|
||||
throw new NullPointerException();
|
||||
}
|
||||
bitField0_ |= 0x00001000;
|
||||
pushData_ = value;
|
||||
onChanged();
|
||||
return this;
|
||||
}
|
||||
|
||||
// @@protoc_insertion_point(builder_scope:MessageContent)
|
||||
}
|
||||
|
||||
@@ -59026,131 +59182,132 @@ public final class WFCMessage {
|
||||
"et\030\002 \002(\005\022\020\n\010listener\030\003 \003(\t\"3\n\rListenChan" +
|
||||
"nel\022\022\n\nchannel_id\030\001 \002(\t\022\016\n\006listen\030\002 \002(\005\"" +
|
||||
"E\n\023SearchChannelResult\022\035\n\007channel\030\001 \003(\0132",
|
||||
"\014.ChannelInfo\022\017\n\007keyword\030\002 \002(\t\"\212\002\n\016Messa" +
|
||||
"\014.ChannelInfo\022\017\n\007keyword\030\002 \002(\t\"\235\002\n\016Messa" +
|
||||
"geContent\022\014\n\004type\030\001 \002(\005\022\032\n\022searchable_co" +
|
||||
"ntent\030\002 \001(\t\022\024\n\014push_content\030\003 \001(\t\022\017\n\007con" +
|
||||
"tent\030\004 \001(\t\022\014\n\004data\030\005 \001(\014\022\021\n\tmediaType\030\006 " +
|
||||
"\001(\005\022\026\n\016remoteMediaUrl\030\007 \001(\t\022\024\n\014persist_f" +
|
||||
"lag\030\010 \001(\005\022\027\n\017expire_duration\030\t \001(\005\022\026\n\016me" +
|
||||
"ntioned_type\030\n \001(\005\022\030\n\020mentioned_target\030\013" +
|
||||
" \003(\t\022\r\n\005extra\030\014 \001(\t\"\207\001\n\025AddGroupMemberRe" +
|
||||
"quest\022\020\n\010group_id\030\001 \002(\t\022\"\n\014added_member\030" +
|
||||
"\002 \003(\0132\014.GroupMember\022\017\n\007to_line\030\003 \003(\005\022\'\n\016",
|
||||
"notify_content\030\004 \001(\0132\017.MessageContent\"e\n" +
|
||||
"\022CreateGroupRequest\022\025\n\005group\030\001 \002(\0132\006.Gro" +
|
||||
"up\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 " +
|
||||
"\001(\0132\017.MessageContent\"a\n\023DismissGroupRequ" +
|
||||
"est\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'" +
|
||||
"\n\016notify_content\030\003 \001(\0132\017.MessageContent\"" +
|
||||
"\226\001\n\rFriendRequest\022\020\n\010from_uid\030\001 \001(\t\022\016\n\006t" +
|
||||
"o_uid\030\002 \002(\t\022\016\n\006reason\030\003 \002(\t\022\016\n\006status\030\004 " +
|
||||
"\001(\005\022\021\n\tupdate_dt\030\005 \001(\003\022\030\n\020from_read_stat" +
|
||||
"us\030\006 \001(\010\022\026\n\016to_read_status\030\007 \001(\010\"#\n\rGene",
|
||||
"ralResult\022\022\n\nerror_code\030\001 \002(\005\"?\n\025GetUplo" +
|
||||
"adTokenRequest\022\022\n\nmedia_type\030\001 \002(\005\022\022\n\nme" +
|
||||
"dia_path\030\002 \002(\t\"S\n\024GetUploadTokenResult\022\016" +
|
||||
"\n\006domain\030\001 \002(\t\022\r\n\005token\030\002 \002(\t\022\016\n\006server\030" +
|
||||
"\003 \002(\t\022\014\n\004port\030\004 \001(\005\"H\n\023HandleFriendReque" +
|
||||
"st\022\022\n\ntarget_uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\022\r" +
|
||||
"\n\005extra\030\003 \001(\t\"\023\n\005IDBuf\022\n\n\002id\030\001 \002(\t\"\027\n\tID" +
|
||||
"ListBuf\022\n\n\002id\030\001 \003(\t\"\256\001\n\007Message\022#\n\014conve" +
|
||||
"rsation\030\001 \002(\0132\r.Conversation\022\021\n\tfrom_use" +
|
||||
"r\030\002 \002(\t\022 \n\007content\030\003 \002(\0132\017.MessageConten",
|
||||
"t\022\022\n\nmessage_id\030\004 \001(\003\022\030\n\020server_timestam" +
|
||||
"p\030\005 \001(\003\022\017\n\007to_user\030\006 \001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n" +
|
||||
"\004User\022\013\n\003uid\030\001 \002(\t\022\014\n\004name\030\002 \001(\t\022\024\n\014disp" +
|
||||
"lay_name\030\003 \001(\t\022\020\n\010portrait\030\004 \001(\t\022\016\n\006mobi" +
|
||||
"le\030\005 \001(\t\022\r\n\005email\030\006 \001(\t\022\017\n\007address\030\007 \001(\t" +
|
||||
"\022\017\n\007company\030\010 \001(\t\022\r\n\005extra\030\t \001(\t\022\021\n\tupda" +
|
||||
"te_dt\030\n \001(\003\022\016\n\006gender\030\013 \001(\005\022\016\n\006social\030\014 " +
|
||||
"\001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007deleted\030\016 \001(\005\"c\n\005Ro" +
|
||||
"bot\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\r\n\005owner" +
|
||||
"\030\003 \001(\t\022\016\n\006secret\030\004 \001(\t\022\020\n\010callback\030\005 \001(\t",
|
||||
"\022\r\n\005extra\030\006 \001(\t\"(\n\017GetRobotsResult\022\025\n\005en" +
|
||||
"try\030\001 \003(\0132\006.Robot\"g\n\030UploadDeviceTokenRe" +
|
||||
"quest\022\020\n\010platform\030\001 \002(\005\022\020\n\010app_name\030\002 \002(" +
|
||||
"\t\022\024\n\014device_token\030\003 \002(\t\022\021\n\tpush_type\030\004 \002" +
|
||||
"(\005\"\201\001\n\026ModifyGroupInfoRequest\022\020\n\010group_i" +
|
||||
"d\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\r\n\005value\030\003 \002(\t\022\017\n\007" +
|
||||
"to_line\030\004 \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017." +
|
||||
"MessageContent\"\203\001\n\026SetGroupManagerReques" +
|
||||
"t\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005\022\017\n\007use" +
|
||||
"r_id\030\003 \003(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016notify_co",
|
||||
"ntent\030\005 \001(\0132\017.MessageContent\"(\n\tInfoEntr" +
|
||||
"y\022\014\n\004type\030\001 \002(\005\022\r\n\005value\030\002 \002(\t\"0\n\023Modify" +
|
||||
"MyInfoRequest\022\031\n\005entry\030\001 \003(\0132\n.InfoEntry" +
|
||||
"\";\n\rNotifyMessage\022\014\n\004type\030\001 \002(\005\022\014\n\004head\030" +
|
||||
"\002 \002(\003\022\016\n\006target\030\003 \001(\t\"=\n\022PullMessageRequ" +
|
||||
"est\022\n\n\002id\030\001 \002(\003\022\014\n\004type\030\002 \002(\005\022\r\n\005delay\030\003" +
|
||||
" \001(\003\"M\n\021PullMessageResult\022\031\n\007message\030\001 \003" +
|
||||
"(\0132\010.Message\022\017\n\007current\030\002 \002(\003\022\014\n\004head\030\003 " +
|
||||
"\002(\003\"/\n\023PullGroupInfoResult\022\030\n\004info\030\001 \003(\013" +
|
||||
"2\n.GroupInfo\"6\n\026PullGroupMemberRequest\022\016",
|
||||
"\n\006target\030\001 \002(\t\022\014\n\004head\030\002 \002(\003\"5\n\025PullGrou" +
|
||||
"pMemberResult\022\034\n\006member\030\001 \003(\0132\014.GroupMem" +
|
||||
"ber\"-\n\013UserRequest\022\013\n\003uid\030\001 \002(\t\022\021\n\tupdat" +
|
||||
"e_dt\030\002 \001(\003\"0\n\017PullUserRequest\022\035\n\007request" +
|
||||
"\030\001 \003(\0132\014.UserRequest\"/\n\nUserResult\022\023\n\004us" +
|
||||
"er\030\001 \002(\0132\005.User\022\014\n\004code\030\002 \002(\005\"-\n\016PullUse" +
|
||||
"rResult\022\033\n\006result\030\001 \003(\0132\013.UserResult\"^\n\020" +
|
||||
"QuitGroupRequest\022\020\n\010group_id\030\001 \002(\t\022\017\n\007to" +
|
||||
"_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(\0132\017.Me" +
|
||||
"ssageContent\"~\n\030RemoveGroupMemberRequest",
|
||||
"\022\020\n\010group_id\030\001 \002(\t\022\026\n\016removed_member\030\002 \003" +
|
||||
"(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_content\030\004 " +
|
||||
"\001(\0132\017.MessageContent\"u\n\024TransferGroupReq" +
|
||||
"uest\022\020\n\010group_id\030\001 \002(\t\022\021\n\tnew_owner\030\002 \002(" +
|
||||
"\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001" +
|
||||
"(\0132\017.MessageContent\"s\n\026ModifyGroupMember" +
|
||||
"Alias\022\020\n\010group_id\030\001 \002(\t\022\r\n\005alias\030\002 \002(\t\022\017" +
|
||||
" \003(\t\022\r\n\005extra\030\014 \001(\t\022\021\n\tpush_data\030\r \001(\t\"\207" +
|
||||
"\001\n\025AddGroupMemberRequest\022\020\n\010group_id\030\001 \002" +
|
||||
"(\t\022\"\n\014added_member\030\002 \003(\0132\014.GroupMember\022\017",
|
||||
"\n\007to_line\030\003 \003(\005\022\'\n\016notify_content\030\004 \001(\0132" +
|
||||
"\017.MessageContent\"P\n\020UserSettingEntry\022\r\n\005" +
|
||||
"scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\022",
|
||||
"\021\n\tupdate_dt\030\004 \002(\003\"A\n\024ModifyUserSettingR" +
|
||||
"eq\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 \002(\t\022\r\n\005value\030" +
|
||||
"\003 \002(\t\"\032\n\007Version\022\017\n\007version\030\001 \002(\003\"8\n\024Get" +
|
||||
"UserSettingResult\022 \n\005entry\030\001 \003(\0132\021.UserS" +
|
||||
"ettingEntry\"f\n\006Friend\022\013\n\003uid\030\001 \002(\t\022\r\n\005st" +
|
||||
"ate\030\002 \002(\005\022\021\n\tupdate_dt\030\003 \002(\003\022\r\n\005alias\030\004 " +
|
||||
"\001(\t\022\017\n\007blacked\030\005 \001(\005\022\r\n\005extra\030\006 \001(\t\"*\n\020G" +
|
||||
"etFriendsResult\022\026\n\005entry\030\001 \003(\0132\007.Friend\"" +
|
||||
"7\n\026GetFriendRequestResult\022\035\n\005entry\030\001 \003(\013" +
|
||||
"2\016.FriendRequest\"\243\001\n\021ConnectAckPayload\022\020",
|
||||
"\n\010msg_head\030\001 \001(\003\022\023\n\013friend_head\030\002 \001(\003\022\026\n" +
|
||||
"\016friend_rq_head\030\003 \001(\003\022\024\n\014setting_head\030\004 " +
|
||||
"\001(\003\022\021\n\tnode_addr\030\005 \001(\t\022\021\n\tnode_port\030\006 \001(" +
|
||||
"\005\022\023\n\013server_time\030\007 \001(\003\"P\n\rIMHttpWrapper\022" +
|
||||
"\r\n\005token\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\017\n\007req" +
|
||||
"uest\030\003 \002(\t\022\014\n\004data\030\004 \001(\014\"A\n\021SearchUserRe" +
|
||||
"quest\022\017\n\007keyword\030\001 \002(\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n" +
|
||||
"\004page\030\003 \001(\005\"(\n\020SearchUserResult\022\024\n\005entry" +
|
||||
"\030\001 \003(\0132\005.User\"@\n\026GetChatroomInfoRequest\022" +
|
||||
"\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"",
|
||||
"\227\001\n\014ChatroomInfo\022\r\n\005title\030\001 \002(\t\022\014\n\004desc\030" +
|
||||
"\002 \001(\t\022\020\n\010portrait\030\003 \001(\t\022\024\n\014member_count\030" +
|
||||
"\004 \001(\005\022\021\n\tcreate_dt\030\005 \001(\003\022\021\n\tupdate_dt\030\006 " +
|
||||
"\001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n\005state\030\010 \001(\005\"F\n\034Get" +
|
||||
"ChatroomMemberInfoRequest\022\023\n\013chatroom_id" +
|
||||
"\030\001 \002(\t\022\021\n\tmax_count\030\002 \001(\005\";\n\022ChatroomMem" +
|
||||
"berInfo\022\024\n\014member_count\030\001 \001(\005\022\017\n\007members" +
|
||||
"\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n\002id\030\001 \002(\003\"4\n\023Notify" +
|
||||
"RecallMessage\022\n\n\002id\030\001 \002(\003\022\021\n\tfrom_user\030\002" +
|
||||
" \002(\t\"/\n\020BlackUserRequest\022\013\n\003uid\030\001 \002(\t\022\016\n",
|
||||
"\006status\030\002 \002(\005\"\323\001\n\014RouteRequest\022\013\n\003app\030\001 " +
|
||||
"\001(\t\022\020\n\010platform\030\002 \001(\005\022\021\n\tpush_type\030\003 \001(\005" +
|
||||
"\022\023\n\013device_name\030\004 \001(\t\022\026\n\016device_version\030" +
|
||||
"\005 \001(\t\022\022\n\nphone_name\030\006 \001(\t\022\020\n\010language\030\007 " +
|
||||
"\001(\t\022\024\n\014carrier_name\030\010 \001(\t\022\023\n\013app_version" +
|
||||
"\030\t \001(\t\022\023\n\013sdk_version\030\n \001(\t\"D\n\rRouteResp" +
|
||||
"onse\022\014\n\004host\030\001 \002(\t\022\021\n\tlong_port\030\002 \002(\005\022\022\n" +
|
||||
"\nshort_port\030\003 \002(\005\"G\n\017GetTokenRequest\022\017\n\007" +
|
||||
"user_id\030\001 \002(\t\022\021\n\tclient_id\030\002 \002(\t\022\020\n\010plat" +
|
||||
"form\030\003 \001(\005\"\\\n\022LoadRemoteMessages\022#\n\014conv",
|
||||
"ersation\030\001 \002(\0132\r.Conversation\022\022\n\nbefore_" +
|
||||
"uid\030\002 \002(\003\022\r\n\005count\030\003 \002(\005\"a\n\020MultiCastMes" +
|
||||
"sage\022\021\n\tfrom_user\030\001 \002(\t\022 \n\007content\030\002 \002(\013" +
|
||||
"2\017.MessageContent\022\n\n\002to\030\003 \003(\t\022\014\n\004line\030\004 " +
|
||||
"\002(\005B#\n\025cn.wildfirechat.protoB\nWFCMessage"
|
||||
"\017.MessageContent\"e\n\022CreateGroupRequest\022\025" +
|
||||
"\n\005group\030\001 \002(\0132\006.Group\022\017\n\007to_line\030\002 \003(\005\022\'" +
|
||||
"\n\016notify_content\030\003 \001(\0132\017.MessageContent\"" +
|
||||
"a\n\023DismissGroupRequest\022\020\n\010group_id\030\001 \002(\t" +
|
||||
"\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify_content\030\003 \001(" +
|
||||
"\0132\017.MessageContent\"\226\001\n\rFriendRequest\022\020\n\010" +
|
||||
"from_uid\030\001 \001(\t\022\016\n\006to_uid\030\002 \002(\t\022\016\n\006reason" +
|
||||
"\030\003 \002(\t\022\016\n\006status\030\004 \001(\005\022\021\n\tupdate_dt\030\005 \001(" +
|
||||
"\003\022\030\n\020from_read_status\030\006 \001(\010\022\026\n\016to_read_s",
|
||||
"tatus\030\007 \001(\010\"#\n\rGeneralResult\022\022\n\nerror_co" +
|
||||
"de\030\001 \002(\005\"?\n\025GetUploadTokenRequest\022\022\n\nmed" +
|
||||
"ia_type\030\001 \002(\005\022\022\n\nmedia_path\030\002 \002(\t\"S\n\024Get" +
|
||||
"UploadTokenResult\022\016\n\006domain\030\001 \002(\t\022\r\n\005tok" +
|
||||
"en\030\002 \002(\t\022\016\n\006server\030\003 \002(\t\022\014\n\004port\030\004 \001(\005\"H" +
|
||||
"\n\023HandleFriendRequest\022\022\n\ntarget_uid\030\001 \002(" +
|
||||
"\t\022\016\n\006status\030\002 \002(\005\022\r\n\005extra\030\003 \001(\t\"\023\n\005IDBu" +
|
||||
"f\022\n\n\002id\030\001 \002(\t\"\027\n\tIDListBuf\022\n\n\002id\030\001 \003(\t\"\256" +
|
||||
"\001\n\007Message\022#\n\014conversation\030\001 \002(\0132\r.Conve" +
|
||||
"rsation\022\021\n\tfrom_user\030\002 \002(\t\022 \n\007content\030\003 ",
|
||||
"\002(\0132\017.MessageContent\022\022\n\nmessage_id\030\004 \001(\003" +
|
||||
"\022\030\n\020server_timestamp\030\005 \001(\003\022\017\n\007to_user\030\006 " +
|
||||
"\001(\t\022\n\n\002to\030\007 \003(\t\"\353\001\n\004User\022\013\n\003uid\030\001 \002(\t\022\014\n" +
|
||||
"\004name\030\002 \001(\t\022\024\n\014display_name\030\003 \001(\t\022\020\n\010por" +
|
||||
"trait\030\004 \001(\t\022\016\n\006mobile\030\005 \001(\t\022\r\n\005email\030\006 \001" +
|
||||
"(\t\022\017\n\007address\030\007 \001(\t\022\017\n\007company\030\010 \001(\t\022\r\n\005" +
|
||||
"extra\030\t \001(\t\022\021\n\tupdate_dt\030\n \001(\003\022\016\n\006gender" +
|
||||
"\030\013 \001(\005\022\016\n\006social\030\014 \001(\t\022\014\n\004type\030\r \001(\005\022\017\n\007" +
|
||||
"deleted\030\016 \001(\005\"c\n\005Robot\022\013\n\003uid\030\001 \002(\t\022\r\n\005s" +
|
||||
"tate\030\002 \002(\005\022\r\n\005owner\030\003 \001(\t\022\016\n\006secret\030\004 \001(",
|
||||
"\t\022\020\n\010callback\030\005 \001(\t\022\r\n\005extra\030\006 \001(\t\"(\n\017Ge" +
|
||||
"tRobotsResult\022\025\n\005entry\030\001 \003(\0132\006.Robot\"g\n\030" +
|
||||
"UploadDeviceTokenRequest\022\020\n\010platform\030\001 \002" +
|
||||
"(\005\022\020\n\010app_name\030\002 \002(\t\022\024\n\014device_token\030\003 \002" +
|
||||
"(\t\022\021\n\tpush_type\030\004 \002(\005\"\201\001\n\026ModifyGroupInf" +
|
||||
"oRequest\022\020\n\010group_id\030\001 \002(\t\022\014\n\004type\030\002 \002(\005" +
|
||||
"\022\r\n\005value\030\003 \002(\t\022\017\n\007to_line\030\004 \003(\005\022\'\n\016noti" +
|
||||
"fy_content\030\005 \001(\0132\017.MessageContent\"\203\001\n\026Se" +
|
||||
"tGroupManagerRequest\022\020\n\010group_id\030\001 \002(\t\022\014" +
|
||||
"\n\004type\030\002 \002(\005\022\017\n\007user_id\030\003 \003(\t\022\017\n\007to_line",
|
||||
"\030\004 \003(\005\022\'\n\016notify_content\030\005 \001(\0132\017.Message" +
|
||||
"Content\"(\n\tInfoEntry\022\014\n\004type\030\001 \002(\005\022\r\n\005va" +
|
||||
"lue\030\002 \002(\t\"0\n\023ModifyMyInfoRequest\022\031\n\005entr" +
|
||||
"y\030\001 \003(\0132\n.InfoEntry\";\n\rNotifyMessage\022\014\n\004" +
|
||||
"type\030\001 \002(\005\022\014\n\004head\030\002 \002(\003\022\016\n\006target\030\003 \001(\t" +
|
||||
"\"=\n\022PullMessageRequest\022\n\n\002id\030\001 \002(\003\022\014\n\004ty" +
|
||||
"pe\030\002 \002(\005\022\r\n\005delay\030\003 \001(\003\"M\n\021PullMessageRe" +
|
||||
"sult\022\031\n\007message\030\001 \003(\0132\010.Message\022\017\n\007curre" +
|
||||
"nt\030\002 \002(\003\022\014\n\004head\030\003 \002(\003\"/\n\023PullGroupInfoR" +
|
||||
"esult\022\030\n\004info\030\001 \003(\0132\n.GroupInfo\"6\n\026PullG",
|
||||
"roupMemberRequest\022\016\n\006target\030\001 \002(\t\022\014\n\004hea" +
|
||||
"d\030\002 \002(\003\"5\n\025PullGroupMemberResult\022\034\n\006memb" +
|
||||
"er\030\001 \003(\0132\014.GroupMember\"-\n\013UserRequest\022\013\n" +
|
||||
"\003uid\030\001 \002(\t\022\021\n\tupdate_dt\030\002 \001(\003\"0\n\017PullUse" +
|
||||
"rRequest\022\035\n\007request\030\001 \003(\0132\014.UserRequest\"" +
|
||||
"/\n\nUserResult\022\023\n\004user\030\001 \002(\0132\005.User\022\014\n\004co" +
|
||||
"de\030\002 \002(\005\"-\n\016PullUserResult\022\033\n\006result\030\001 \003" +
|
||||
"(\0132\013.UserResult\"^\n\020QuitGroupRequest\022\020\n\010g" +
|
||||
"roup_id\030\001 \002(\t\022\017\n\007to_line\030\002 \003(\005\022\'\n\016notify" +
|
||||
"_content\030\003 \001(\0132\017.MessageContent\"~\n\030Remov",
|
||||
"eGroupMemberRequest\022\020\n\010group_id\030\001 \002(\t\022\026\n" +
|
||||
"\016removed_member\030\002 \003(\t\022\017\n\007to_line\030\003 \003(\005\022\'" +
|
||||
"\n\016notify_content\030\004 \001(\0132\017.MessageContent\"" +
|
||||
"u\n\024TransferGroupRequest\022\020\n\010group_id\030\001 \002(" +
|
||||
"\t\022\021\n\tnew_owner\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n" +
|
||||
"\016notify_content\030\004 \001(\0132\017.MessageContent\"s" +
|
||||
"\n\026ModifyGroupMemberAlias\022\020\n\010group_id\030\001 \002" +
|
||||
"(\t\022\r\n\005alias\030\002 \002(\t\022\017\n\007to_line\030\003 \003(\005\022\'\n\016no" +
|
||||
"tify_content\030\004 \001(\0132\017.MessageContent\"P\n\020U" +
|
||||
"serSettingEntry\022\r\n\005scope\030\001 \002(\005\022\013\n\003key\030\002 ",
|
||||
"\002(\t\022\r\n\005value\030\003 \002(\t\022\021\n\tupdate_dt\030\004 \002(\003\"A\n" +
|
||||
"\024ModifyUserSettingReq\022\r\n\005scope\030\001 \002(\005\022\013\n\003" +
|
||||
"key\030\002 \002(\t\022\r\n\005value\030\003 \002(\t\"\032\n\007Version\022\017\n\007v" +
|
||||
"ersion\030\001 \002(\003\"8\n\024GetUserSettingResult\022 \n\005" +
|
||||
"entry\030\001 \003(\0132\021.UserSettingEntry\"f\n\006Friend" +
|
||||
"\022\013\n\003uid\030\001 \002(\t\022\r\n\005state\030\002 \002(\005\022\021\n\tupdate_d" +
|
||||
"t\030\003 \002(\003\022\r\n\005alias\030\004 \001(\t\022\017\n\007blacked\030\005 \001(\005\022" +
|
||||
"\r\n\005extra\030\006 \001(\t\"*\n\020GetFriendsResult\022\026\n\005en" +
|
||||
"try\030\001 \003(\0132\007.Friend\"7\n\026GetFriendRequestRe" +
|
||||
"sult\022\035\n\005entry\030\001 \003(\0132\016.FriendRequest\"\243\001\n\021",
|
||||
"ConnectAckPayload\022\020\n\010msg_head\030\001 \001(\003\022\023\n\013f" +
|
||||
"riend_head\030\002 \001(\003\022\026\n\016friend_rq_head\030\003 \001(\003" +
|
||||
"\022\024\n\014setting_head\030\004 \001(\003\022\021\n\tnode_addr\030\005 \001(" +
|
||||
"\t\022\021\n\tnode_port\030\006 \001(\005\022\023\n\013server_time\030\007 \001(" +
|
||||
"\003\"P\n\rIMHttpWrapper\022\r\n\005token\030\001 \002(\t\022\021\n\tcli" +
|
||||
"ent_id\030\002 \002(\t\022\017\n\007request\030\003 \002(\t\022\014\n\004data\030\004 " +
|
||||
"\001(\014\"A\n\021SearchUserRequest\022\017\n\007keyword\030\001 \002(" +
|
||||
"\t\022\r\n\005fuzzy\030\002 \001(\005\022\014\n\004page\030\003 \001(\005\"(\n\020Search" +
|
||||
"UserResult\022\024\n\005entry\030\001 \003(\0132\005.User\"@\n\026GetC" +
|
||||
"hatroomInfoRequest\022\023\n\013chatroom_id\030\001 \002(\t\022",
|
||||
"\021\n\tupdate_dt\030\002 \001(\003\"\227\001\n\014ChatroomInfo\022\r\n\005t" +
|
||||
"itle\030\001 \002(\t\022\014\n\004desc\030\002 \001(\t\022\020\n\010portrait\030\003 \001" +
|
||||
"(\t\022\024\n\014member_count\030\004 \001(\005\022\021\n\tcreate_dt\030\005 " +
|
||||
"\001(\003\022\021\n\tupdate_dt\030\006 \001(\003\022\r\n\005extra\030\007 \001(\t\022\r\n" +
|
||||
"\005state\030\010 \001(\005\"F\n\034GetChatroomMemberInfoReq" +
|
||||
"uest\022\023\n\013chatroom_id\030\001 \002(\t\022\021\n\tmax_count\030\002" +
|
||||
" \001(\005\";\n\022ChatroomMemberInfo\022\024\n\014member_cou" +
|
||||
"nt\030\001 \001(\005\022\017\n\007members\030\002 \003(\t\"\026\n\010INT64Buf\022\n\n" +
|
||||
"\002id\030\001 \002(\003\"4\n\023NotifyRecallMessage\022\n\n\002id\030\001" +
|
||||
" \002(\003\022\021\n\tfrom_user\030\002 \002(\t\"/\n\020BlackUserRequ",
|
||||
"est\022\013\n\003uid\030\001 \002(\t\022\016\n\006status\030\002 \002(\005\"\323\001\n\014Rou" +
|
||||
"teRequest\022\013\n\003app\030\001 \001(\t\022\020\n\010platform\030\002 \001(\005" +
|
||||
"\022\021\n\tpush_type\030\003 \001(\005\022\023\n\013device_name\030\004 \001(\t" +
|
||||
"\022\026\n\016device_version\030\005 \001(\t\022\022\n\nphone_name\030\006" +
|
||||
" \001(\t\022\020\n\010language\030\007 \001(\t\022\024\n\014carrier_name\030\010" +
|
||||
" \001(\t\022\023\n\013app_version\030\t \001(\t\022\023\n\013sdk_version" +
|
||||
"\030\n \001(\t\"D\n\rRouteResponse\022\014\n\004host\030\001 \002(\t\022\021\n" +
|
||||
"\tlong_port\030\002 \002(\005\022\022\n\nshort_port\030\003 \002(\005\"G\n\017" +
|
||||
"GetTokenRequest\022\017\n\007user_id\030\001 \002(\t\022\021\n\tclie" +
|
||||
"nt_id\030\002 \002(\t\022\020\n\010platform\030\003 \001(\005\"\\\n\022LoadRem",
|
||||
"oteMessages\022#\n\014conversation\030\001 \002(\0132\r.Conv" +
|
||||
"ersation\022\022\n\nbefore_uid\030\002 \002(\003\022\r\n\005count\030\003 " +
|
||||
"\002(\005\"a\n\020MultiCastMessage\022\021\n\tfrom_user\030\001 \002" +
|
||||
"(\t\022 \n\007content\030\002 \002(\0132\017.MessageContent\022\n\n\002" +
|
||||
"to\030\003 \003(\t\022\014\n\004line\030\004 \002(\005B#\n\025cn.wildfirecha" +
|
||||
"t.protoB\nWFCMessage"
|
||||
};
|
||||
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
|
||||
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
|
||||
@@ -59240,7 +59397,7 @@ public final class WFCMessage {
|
||||
internal_static_MessageContent_fieldAccessorTable = new
|
||||
com.google.protobuf.GeneratedMessage.FieldAccessorTable(
|
||||
internal_static_MessageContent_descriptor,
|
||||
new java.lang.String[] { "Type", "SearchableContent", "PushContent", "Content", "Data", "MediaType", "RemoteMediaUrl", "PersistFlag", "ExpireDuration", "MentionedType", "MentionedTarget", "Extra", });
|
||||
new java.lang.String[] { "Type", "SearchableContent", "PushContent", "Content", "Data", "MediaType", "RemoteMediaUrl", "PersistFlag", "ExpireDuration", "MentionedType", "MentionedTarget", "Extra", "PushData", });
|
||||
internal_static_AddGroupMemberRequest_descriptor =
|
||||
getDescriptor().getMessageTypes().get(14);
|
||||
internal_static_AddGroupMemberRequest_fieldAccessorTable = new
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<!--<relativePath>../pom.xml</relativePath>-->
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.42</version>
|
||||
<version>0.45</version>
|
||||
</parent>
|
||||
|
||||
<artifactId>distribution</artifactId>
|
||||
|
||||
@@ -37,7 +37,7 @@ http.admin.secret_key 123456
|
||||
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
|
||||
http.admin.no_check_time false
|
||||
|
||||
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥对安全性帮助不大,客户不要修改
|
||||
##客户端协议栈密钥,需要与客户端协议栈文件libemqq.cc文件中的aes_key值保持一致,16进制byte用逗号分割。这个密钥不能修改!!!
|
||||
client.proto.secret_key 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F
|
||||
|
||||
##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记
|
||||
@@ -60,13 +60,15 @@ message.max_queue 1024
|
||||
##是否禁止陌生人聊天
|
||||
message.disable_stranger_chat false
|
||||
|
||||
##黑名单处理策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃;2 敏感词替换为***;3 不处理。
|
||||
##所有命中敏感词的消息都会被记录在敏感词消息表中
|
||||
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
||||
message.blacklist.strategy 0
|
||||
|
||||
##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
|
||||
message.disable_remote_search false
|
||||
|
||||
##允许客户端撤回消息时限,单位是秒。群组管理员或群主撤回群成员消息、server api不受此限制,可以撤回任意时限内的消息
|
||||
message.recall_time_limit 120
|
||||
|
||||
##禁止搜索用户
|
||||
friend.disable_search false
|
||||
|
||||
@@ -105,7 +107,8 @@ hazelcast.configuration config/hazelcast.xml
|
||||
#*********************************************************************
|
||||
# Media server configuration
|
||||
#*********************************************************************
|
||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。
|
||||
##是否使用七牛云存储。1使用七牛;0使用内存文件服务器。默认的七牛账户信息不可用,请在七牛官网申请账户并配置
|
||||
## https://docs.wildfirechat.cn/server/media_server.html
|
||||
media.server.use_qiniu 0
|
||||
|
||||
##媒体类型分类
|
||||
@@ -148,10 +151,10 @@ qiniu.bucket_favorite_domain http://cdn2.wildfirechat.cn
|
||||
local.media.storage.root ./media
|
||||
|
||||
|
||||
# 是否支持多端登陆
|
||||
# 是否支持多端登陆,为true时支持任意平台任意多个客户端同时登录;为false时每个平台只支持一个端登录,但不同平台可以同时登录。
|
||||
server.multi_endpoint false
|
||||
|
||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效)
|
||||
# 多平台连接状态通知(仅当multi_endpoint为false时有效),true时移动端可以收到pc或web端登录的通知。
|
||||
server.multi_platform_notification false
|
||||
|
||||
#*********************************************************************
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
|
||||
<packaging>pom</packaging>
|
||||
<version>0.42</version>
|
||||
<version>0.45</version>
|
||||
<name>Wildfire Chat</name>
|
||||
<description>Wildfire Chat Server</description>
|
||||
<inceptionYear>2019</inceptionYear>
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>wildfirechat-parent</artifactId>
|
||||
<groupId>cn.wildfirechat</groupId>
|
||||
<version>0.42</version>
|
||||
<version>0.45</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -72,17 +72,11 @@ public class GroupAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<String> groupMemberIds, 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;
|
||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
List<PojoGroupMember> members = new ArrayList<>();
|
||||
for (String mid : groupMemberIds) {
|
||||
PojoGroupMember m = new PojoGroupMember();
|
||||
m.setMember_id(mid);
|
||||
members.add(m);
|
||||
}
|
||||
addGroupMember.setMembers(members);
|
||||
addGroupMember.setMembers(groupMembers);
|
||||
addGroupMember.setOperator(operator);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
@@ -101,12 +95,24 @@ public class GroupAdmin {
|
||||
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> muteGroupMemeber(String operator, String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
public static IMResult<Void> muteGroupMemeber(String operator, String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Mute_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMemberIds);
|
||||
addGroupMember.setIs_manager(isManager);
|
||||
addGroupMember.setIs_manager(isMute);
|
||||
addGroupMember.setOperator(operator);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||
}
|
||||
|
||||
public static IMResult<Void> allowGroupMemeber(String operator, String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||
String path = APIPath.Group_Allow_Member;
|
||||
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
|
||||
addGroupMember.setGroup_id(groupId);
|
||||
addGroupMember.setMembers(groupMemberIds);
|
||||
addGroupMember.setIs_manager(isAllow);
|
||||
addGroupMember.setOperator(operator);
|
||||
addGroupMember.setTo_lines(to_lines);
|
||||
addGroupMember.setNotify_message(notify_message);
|
||||
|
||||
@@ -17,13 +17,15 @@ import java.util.List;
|
||||
import static cn.wildfirechat.proto.ProtoConstants.SystemSettingType.Group_Max_Member_Count;
|
||||
|
||||
public class Main {
|
||||
private static boolean commercialServer = false;
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
//admin使用的是18080端口,超级管理接口,理论上不能对外开放端口,也不能让非内部服务知悉密钥。
|
||||
testAdmin();
|
||||
|
||||
//Robot和Channel都是使用的80端口,第三方可以创建或者为第三方创建,第三方可以使用robot或者channel与IM系统进行对接。
|
||||
testRobot();
|
||||
//testChannel();
|
||||
testChannel();
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +39,10 @@ public class Main {
|
||||
testChatroom();
|
||||
testMessage();
|
||||
testGeneralApi();
|
||||
testDevice();
|
||||
if (commercialServer) {
|
||||
testDevice();
|
||||
}
|
||||
|
||||
|
||||
System.out.println("Congratulation, all admin test case passed!!!!!!!");
|
||||
}
|
||||
@@ -47,7 +52,9 @@ public class Main {
|
||||
//***********************************************
|
||||
static void testUser() throws Exception {
|
||||
InputOutputUserInfo userInfo = new InputOutputUserInfo();
|
||||
//用户ID,必须保证唯一性
|
||||
userInfo.setUserId("userId1");
|
||||
//用户名,一般是用户登录帐号,也必须保证唯一性。也就是说所有用户的userId必须不能重复,所有用户的name必须不能重复,但可以同一个用户的userId和name是同一个,一般建议userId使用一个uuid,name是"微信号"且可以修改,
|
||||
userInfo.setName("user1");
|
||||
userInfo.setMobile("13900000000");
|
||||
userInfo.setDisplayName("user 1");
|
||||
@@ -262,6 +269,23 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
updateFriendStatusResult = RelationAdmin.setUserFriend("ff1", "ff2", false, null);
|
||||
if (updateFriendStatusResult != null && updateFriendStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("update friend status success");
|
||||
} else {
|
||||
System.out.println("update friend status failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultGetFriendList = RelationAdmin.getFriendList("ff1");
|
||||
if (resultGetFriendList != null && resultGetFriendList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !resultGetFriendList.getResult().getList().contains("ff2")) {
|
||||
System.out.println("get friend status success");
|
||||
} else {
|
||||
System.out.println("get friend status failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
|
||||
IMResult<Void> updateBlacklistStatusResult = RelationAdmin.setUserBlacklist("ff1", "ff2", true);
|
||||
if (updateBlacklistStatusResult != null && updateBlacklistStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("update blacklist status success");
|
||||
@@ -382,7 +406,11 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList("use4", "user5"), null, null);
|
||||
PojoGroupMember m = new PojoGroupMember();
|
||||
m.setMember_id("user1");
|
||||
m.setAlias("hello user1");
|
||||
|
||||
voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList(m), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("add group member success");
|
||||
} else {
|
||||
@@ -414,23 +442,6 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.muteGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("mute group member success");
|
||||
} else {
|
||||
System.out.println("mute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = GroupAdmin.muteGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user4", "user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unmute group member success");
|
||||
} else {
|
||||
System.out.println("unmute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
voidIMResult = GroupAdmin.quitGroup("user4", groupInfo.getTarget_id(), null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
@@ -453,6 +464,44 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
|
||||
//仅专业版支持
|
||||
if (commercialServer) {
|
||||
//开启群成员禁言
|
||||
voidIMResult = GroupAdmin.muteGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("mute group member success");
|
||||
} else {
|
||||
System.out.println("mute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
//关闭群成员禁言
|
||||
voidIMResult = GroupAdmin.muteGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unmute group member success");
|
||||
} else {
|
||||
System.out.println("unmute group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//开启群成员白名单,当群全局禁言时,白名单用户可以发言
|
||||
voidIMResult = GroupAdmin.allowGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user5"), true, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("allow group member success");
|
||||
} else {
|
||||
System.out.println("allow group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
//关闭群成员白名单
|
||||
voidIMResult = GroupAdmin.allowGroupMemeber("user1", groupInfo.getTarget_id(), Arrays.asList("user5"), false, null, null);
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unallow group member success");
|
||||
} else {
|
||||
System.out.println("unallow group member failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//***********************************************
|
||||
@@ -483,20 +532,22 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("delete message success");
|
||||
} else {
|
||||
System.out.println("delete message failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
if (commercialServer) {
|
||||
voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("delete message success");
|
||||
} else {
|
||||
System.out.println("delete message failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<BroadMessageResult> resultBroadcastMessage = MessageAdmin.broadcastMessage("user1", 0, payload);
|
||||
if (resultBroadcastMessage != null && resultBroadcastMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("broad message success, send message to " + resultBroadcastMessage.getResult().getCount() + " users");
|
||||
} else {
|
||||
System.out.println("broad message failure");
|
||||
System.exit(-1);
|
||||
IMResult<BroadMessageResult> resultBroadcastMessage = MessageAdmin.broadcastMessage("user1", 0, payload);
|
||||
if (resultBroadcastMessage != null && resultBroadcastMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("broad message success, send message to " + resultBroadcastMessage.getResult().getCount() + " users");
|
||||
} else {
|
||||
System.out.println("broad message failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
List<String> multicastReceivers = Arrays.asList("user2", "user3", "user4");
|
||||
@@ -574,7 +625,7 @@ public class Main {
|
||||
System.out.println("chatroom info incorrect");
|
||||
System.exit(-1);
|
||||
} else {
|
||||
System.out.println("chatroom info incorrect");
|
||||
System.out.println("chatroom info correct");
|
||||
}
|
||||
} else {
|
||||
System.out.println("get chatroom info failure");
|
||||
@@ -786,6 +837,8 @@ public class Main {
|
||||
InputCreateChannel inputCreateChannel = new InputCreateChannel();
|
||||
inputCreateChannel.setName("testChannel");
|
||||
inputCreateChannel.setOwner("userId1");
|
||||
String secret = "channelsecret";
|
||||
inputCreateChannel.setSecret(secret);
|
||||
IMResult<OutputCreateChannel> resultCreateChannel = GeneralAdmin.createChannel(inputCreateChannel);
|
||||
if (resultCreateChannel != null && resultCreateChannel.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("create channel success");
|
||||
@@ -794,56 +847,61 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
|
||||
//2. 初始化api
|
||||
ChannelServiceApi channelServiceApi = new ChannelServiceApi("http://localhost", resultCreateChannel.getResult().getTargetId(), resultCreateChannel.getResult().getSecret());
|
||||
ChannelServiceApi channelServiceApi = new ChannelServiceApi("http://localhost", resultCreateChannel.getResult().getTargetId(), secret);
|
||||
|
||||
//3. 测试channel api功能
|
||||
IMResult<Void> resultVoid = channelServiceApi.subscribe("userId2");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("subscribe success");
|
||||
} else {
|
||||
System.out.println("subscribe failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultVoid = channelServiceApi.subscribe("userId3");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("subscribe done");
|
||||
} else {
|
||||
System.out.println("subscribe failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<OutputStringList> resultStringList = channelServiceApi.getSubscriberList();
|
||||
if (resultStringList != null && resultStringList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultStringList.getResult().getList().contains("userId2") && resultStringList.getResult().getList().contains("userId3")) {
|
||||
System.out.println("get subscriber done");
|
||||
} else {
|
||||
System.out.println("get subscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
if (commercialServer) {
|
||||
//3. 测试channel api功能
|
||||
IMResult<Void> resultVoid = channelServiceApi.subscribe("userId2");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("subscribe success");
|
||||
} else {
|
||||
System.out.println("subscribe failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultVoid = channelServiceApi.unsubscribe("userId2");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unsubscriber done");
|
||||
} else {
|
||||
System.out.println("unsubscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
resultVoid = channelServiceApi.subscribe("userId3");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("subscribe done");
|
||||
} else {
|
||||
System.out.println("subscribe failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultStringList = channelServiceApi.getSubscriberList();
|
||||
if (resultStringList != null && resultStringList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultStringList.getResult().getList().contains("userId3") && !resultStringList.getResult().getList().contains("userId2")) {
|
||||
System.out.println("get subscriber done");
|
||||
} else {
|
||||
System.out.println("get subscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
IMResult<OutputStringList> resultStringList = channelServiceApi.getSubscriberList();
|
||||
if (resultStringList != null && resultStringList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultStringList.getResult().getList().contains("userId2") && resultStringList.getResult().getList().contains("userId3")) {
|
||||
System.out.println("get subscriber done");
|
||||
} else {
|
||||
System.out.println("get subscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<InputOutputUserInfo> resultGetUserInfo1 = channelServiceApi.getUserInfo("userId3");
|
||||
if (resultGetUserInfo1 != null && resultGetUserInfo1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("get user info success");
|
||||
} else {
|
||||
System.out.println("get user info failure");
|
||||
System.exit(-1);
|
||||
resultVoid = channelServiceApi.unsubscribe("userId2");
|
||||
if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("unsubscriber done");
|
||||
} else {
|
||||
System.out.println("unsubscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
resultStringList = channelServiceApi.getSubscriberList();
|
||||
if (resultStringList != null && resultStringList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && resultStringList.getResult().getList().contains("userId3") && !resultStringList.getResult().getList().contains("userId2")) {
|
||||
System.out.println("get subscriber done");
|
||||
} else {
|
||||
System.out.println("get subscriber failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<InputOutputUserInfo> resultGetUserInfo1 = channelServiceApi.getUserInfo("userId3");
|
||||
if (resultGetUserInfo1 != null && resultGetUserInfo1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("get user info success");
|
||||
} else {
|
||||
System.out.println("get user info failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -869,20 +927,22 @@ public class Main {
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<Void> voidIMResult = channelServiceApi.modifyChannelInfo(ProtoConstants.ModifyChannelInfoType.Modify_Channel_Desc, "this is a test channel, update at:" + new Date().toString());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("modify channel profile success");
|
||||
} else {
|
||||
System.out.println("modify channel profile failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
if (commercialServer) {
|
||||
IMResult<Void> voidIMResult = channelServiceApi.modifyChannelInfo(ProtoConstants.ModifyChannelInfoType.Modify_Channel_Desc, "this is a test channel, update at:" + new Date().toString());
|
||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("modify channel profile success");
|
||||
} else {
|
||||
System.out.println("modify channel profile failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
IMResult<OutputGetChannelInfo> outputGetChannelInfoIMResult = channelServiceApi.getChannelInfo();
|
||||
if (outputGetChannelInfoIMResult != null && outputGetChannelInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("destroy user success");
|
||||
} else {
|
||||
System.out.println("destroy user failure");
|
||||
System.exit(-1);
|
||||
IMResult<OutputGetChannelInfo> outputGetChannelInfoIMResult = channelServiceApi.getChannelInfo();
|
||||
if (outputGetChannelInfoIMResult != null && outputGetChannelInfoIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||
System.out.println("destroy user success");
|
||||
} else {
|
||||
System.out.println("destroy user failure");
|
||||
System.exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user