Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3f08b3026 | ||
|
|
78e6efce14 | ||
|
|
462423a6f3 | ||
|
|
55190a4f76 | ||
|
|
4ed21ecb03 | ||
|
|
1ff3b592bd | ||
|
|
fbc2351d82 | ||
|
|
dd1783d4ac | ||
|
|
845e6ff8aa | ||
|
|
6d91f3869e | ||
|
|
d100bd5fb1 | ||
|
|
bf22b365a8 | ||
|
|
f1298a51ae | ||
|
|
41f62c6354 | ||
|
|
a45de0ecd1 | ||
|
|
fc35865478 | ||
|
|
b1f59498e5 | ||
|
|
04f5471385 | ||
|
|
291fdfb08d | ||
|
|
52de13e20d |
@@ -9,7 +9,7 @@
|
|||||||
* 安全加密。网络连接AES加密。客户端数据库SqlCipher加密。安全无小事。
|
* 安全加密。网络连接AES加密。客户端数据库SqlCipher加密。安全无小事。
|
||||||
* 全平台客户端,支持Android、iOS、鸿蒙、Web、小程序、UniApp、Flutter、Windows、Mac OS、Linux等所有常见平台。
|
* 全平台客户端,支持Android、iOS、鸿蒙、Web、小程序、UniApp、Flutter、Windows、Mac OS、Linux等所有常见平台。
|
||||||
* 四端同时在线(移动端,pc端,web端和小程序端),数据和状态多端完美同步。
|
* 四端同时在线(移动端,pc端,web端和小程序端),数据和状态多端完美同步。
|
||||||
* 支持国产化。支持国产化操作系统、国产化芯片和国产操作系统。支持国密加密。
|
* 支持国产化。支持国产化操作系统、国产化芯片和国产数据库。支持国密加密。
|
||||||
* 客户端使用微信[mars](https://github.com/tencent/mars)连接库,野火IM可能是最适应中国网络国情的即时通讯服务。
|
* 客户端使用微信[mars](https://github.com/tencent/mars)连接库,野火IM可能是最适应中国网络国情的即时通讯服务。
|
||||||
* 支持加速点加速,即可用于全球应用,也可用于政企内外双网复杂的网络环境。
|
* 支持加速点加速,即可用于全球应用,也可用于政企内外双网复杂的网络环境。
|
||||||
* 支持阅读回执和在线状态功能,适用于办公环境。
|
* 支持阅读回执和在线状态功能,适用于办公环境。
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
* 支持多个IM服务组网互通,打破孤岛,适用于集团公司下多个分公司互联互通。
|
* 支持多个IM服务组网互通,打破孤岛,适用于集团公司下多个分公司互联互通。
|
||||||
* 社区版IM服务和移动端免费商用,可以免费构建出完备的移动互联网应用。
|
* 社区版IM服务和移动端免费商用,可以免费构建出完备的移动互联网应用。
|
||||||
* 收费项目非常便宜,野火独有的试用模式,可以先部署到客户环境试用6个月,试用满意后再购买,避免上当受骗。
|
* 收费项目非常便宜,野火独有的试用模式,可以先部署到客户环境试用6个月,试用满意后再购买,避免上当受骗。
|
||||||
* 技术支持专业和高效,***核心研发***及时处理issue和工单,能最快解决用户的技术难题。
|
* 技术支持专业高效,***核心研发***及时处理issue和工单,能最快解决用户的技术难题。技术支持不收费,让客户顺利使用是我们最大的愿望。
|
||||||
|
|
||||||
## 野火开源项目
|
## 野火开源项目
|
||||||
主要包括以下项目:
|
主要包括以下项目:
|
||||||
|
|||||||
@@ -68,6 +68,10 @@ token.key testim
|
|||||||
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||||
#encrypt.use_aes256 true
|
#encrypt.use_aes256 true
|
||||||
|
|
||||||
|
##当创建一个对象时(用户,群组,频道,机器人等),如果没有传入ID,野火会为这个对象生成一个ID。如果id.use_uuid为true,会使用uuid作为对象ID,否则会使用野火短ID,默认为false。
|
||||||
|
## 短ID有个很大的风险是容易被人穷举进行攻击。建议用UUID。
|
||||||
|
id.use_uuid true
|
||||||
|
|
||||||
##首次登录,是否接收之前的历史消息。
|
##首次登录,是否接收之前的历史消息。
|
||||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||||
@@ -94,6 +98,9 @@ message.allow_stranger_chat_list admin,FireRobot,wfc_file_transfer
|
|||||||
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
|
||||||
message.blacklist.strategy 0
|
message.blacklist.strategy 0
|
||||||
|
|
||||||
|
##拉黑对方后,对方不能发送消息给你。这个开关确定拉黑对方后你还能不能给对方发送消息。
|
||||||
|
message.blacklist.allow_send_to_black false
|
||||||
|
|
||||||
##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
|
##是否禁止服务器端消息搜索,该功能暂未实现。目前的影响是如果打开,则存储消息时不单独保存_searchable_content字段
|
||||||
message.disable_remote_search false
|
message.disable_remote_search false
|
||||||
|
|
||||||
@@ -173,6 +180,9 @@ friend.reject_request_duration 2592000000
|
|||||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||||
friend.request_expiration_duration 604800000
|
friend.request_expiration_duration 604800000
|
||||||
|
|
||||||
|
##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。
|
||||||
|
friend.request_rate_limit 30
|
||||||
|
|
||||||
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||||
friend.robot_auto_accept true
|
friend.robot_auto_accept true
|
||||||
|
|
||||||
@@ -331,6 +341,10 @@ push.android.server.address http://localhost:8085/android/push
|
|||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
push.ios.server.address http://localhost:8085/ios/push
|
push.ios.server.address http://localhost:8085/ios/push
|
||||||
|
|
||||||
|
##鸿蒙推送服务器地址
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
|
push.harmony.server.address http://localhost:8085/harmony/push
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# 监控配置
|
# 监控配置
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<relativePath>../</relativePath>
|
<relativePath>../</relativePath>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.2.8</version>
|
<version>1.3.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>moquette-broker</artifactId>
|
<artifactId>moquette-broker</artifactId>
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ public class PushMessage {
|
|||||||
public String voipDeviceToken;
|
public String voipDeviceToken;
|
||||||
public boolean isHiddenDetail;
|
public boolean isHiddenDetail;
|
||||||
public String language;
|
public String language;
|
||||||
|
public boolean republish;
|
||||||
public long messageId;
|
public long messageId;
|
||||||
|
|
||||||
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) {
|
||||||
@@ -65,6 +66,7 @@ public class PushMessage {
|
|||||||
this.mentionedType = mentionedType;
|
this.mentionedType = mentionedType;
|
||||||
this.isHiddenDetail = isHiddenDetail;
|
this.isHiddenDetail = isHiddenDetail;
|
||||||
this.language = language;
|
this.language = language;
|
||||||
|
this.republish = messageContentType == 80 || messageContentType == 81;
|
||||||
}
|
}
|
||||||
public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) {
|
public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) {
|
||||||
this.sender = sender;
|
this.sender = sender;
|
||||||
|
|||||||
@@ -24,8 +24,7 @@ import win.liyufan.im.Utility;
|
|||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
|
||||||
import static io.moquette.BrokerConstants.PUSH_ANDROID_SERVER_ADDRESS;
|
import static io.moquette.BrokerConstants.*;
|
||||||
import static io.moquette.BrokerConstants.PUSH_IOS_SERVER_ADDRESS;
|
|
||||||
import static win.liyufan.im.HttpUtils.HttpPostType.POST_TYPE_Push;
|
import static win.liyufan.im.HttpUtils.HttpPostType.POST_TYPE_Push;
|
||||||
|
|
||||||
public class PushServer {
|
public class PushServer {
|
||||||
@@ -47,6 +46,7 @@ public class PushServer {
|
|||||||
|
|
||||||
private String androidPushServerUrl;
|
private String androidPushServerUrl;
|
||||||
private String iOSPushServerUrl;
|
private String iOSPushServerUrl;
|
||||||
|
private String harmonyPushServerUrl;
|
||||||
|
|
||||||
private PushServer() {
|
private PushServer() {
|
||||||
}
|
}
|
||||||
@@ -59,6 +59,7 @@ public class PushServer {
|
|||||||
this.sessionsStore = sessionsStore;
|
this.sessionsStore = sessionsStore;
|
||||||
this.androidPushServerUrl = config.getProperty(PUSH_ANDROID_SERVER_ADDRESS);
|
this.androidPushServerUrl = config.getProperty(PUSH_ANDROID_SERVER_ADDRESS);
|
||||||
this.iOSPushServerUrl = config.getProperty(PUSH_IOS_SERVER_ADDRESS);
|
this.iOSPushServerUrl = config.getProperty(PUSH_IOS_SERVER_ADDRESS);
|
||||||
|
this.harmonyPushServerUrl = config.getProperty(PUSH_HARMONY_SERVER_ADDRESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
|
public void pushMessage(PushMessage pushMessage, String deviceId, String pushContent) {
|
||||||
@@ -106,6 +107,8 @@ public class PushServer {
|
|||||||
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad) {
|
if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad) {
|
||||||
url = iOSPushServerUrl;
|
url = iOSPushServerUrl;
|
||||||
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
|
pushMessage.voipDeviceToken = session.getVoipDeviceToken();
|
||||||
|
} else if (session.getPlatform() == ProtoConstants.Platform.Platform_Harmony || session.getPlatform() == ProtoConstants.Platform.Platform_HarmonyPad) {
|
||||||
|
url = harmonyPushServerUrl;
|
||||||
}
|
}
|
||||||
HttpUtils.httpJsonPost(url, gson.toJson(pushMessage, pushMessage.getClass()), POST_TYPE_Push);
|
HttpUtils.httpJsonPost(url, gson.toJson(pushMessage, pushMessage.getClass()), POST_TYPE_Push);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public class GetGroupInfoAction extends AdminAction {
|
|||||||
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
||||||
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
||||||
pojoGroupInfo.setType(groupInfo.getType());
|
pojoGroupInfo.setType(groupInfo.getType());
|
||||||
|
pojoGroupInfo.setMember_count(groupInfo.getMemberCount());
|
||||||
pojoGroupInfo.setMute(groupInfo.getMute());
|
pojoGroupInfo.setMute(groupInfo.getMute());
|
||||||
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
||||||
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
||||||
@@ -61,6 +62,8 @@ public class GetGroupInfoAction extends AdminAction {
|
|||||||
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
||||||
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
||||||
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
||||||
|
pojoGroupInfo.setUpdate_dt(groupInfo.getUpdateDt());
|
||||||
|
pojoGroupInfo.setMember_update_dt(groupInfo.getMemberUpdateDt());
|
||||||
result = RestResult.ok(pojoGroupInfo);
|
result = RestResult.ok(pojoGroupInfo);
|
||||||
}
|
}
|
||||||
setResponseContent(result, response);
|
setResponseContent(result, response);
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ public class GetGroupInfoAction extends RobotAction {
|
|||||||
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
pojoGroupInfo.setPortrait(groupInfo.getPortrait());
|
||||||
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
pojoGroupInfo.setTarget_id(groupInfo.getTargetId());
|
||||||
pojoGroupInfo.setType(groupInfo.getType());
|
pojoGroupInfo.setType(groupInfo.getType());
|
||||||
|
pojoGroupInfo.setMember_count(groupInfo.getMemberCount());
|
||||||
pojoGroupInfo.setMute(groupInfo.getMute());
|
pojoGroupInfo.setMute(groupInfo.getMute());
|
||||||
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
pojoGroupInfo.setJoin_type(groupInfo.getJoinType());
|
||||||
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
pojoGroupInfo.setPrivate_chat(groupInfo.getPrivateChat());
|
||||||
@@ -60,6 +61,8 @@ public class GetGroupInfoAction extends RobotAction {
|
|||||||
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
pojoGroupInfo.setHistory_message(groupInfo.getHistoryMessage());
|
||||||
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
pojoGroupInfo.setSuper_group(groupInfo.getSuperGroup()>0);
|
||||||
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
pojoGroupInfo.setDeleted(groupInfo.getDeleted()>0);
|
||||||
|
pojoGroupInfo.setUpdate_dt(groupInfo.getUpdateDt());
|
||||||
|
pojoGroupInfo.setMember_update_dt(groupInfo.getMemberUpdateDt());
|
||||||
result = RestResult.ok(pojoGroupInfo);
|
result = RestResult.ok(pojoGroupInfo);
|
||||||
}
|
}
|
||||||
setResponseContent(result, response);
|
setResponseContent(result, response);
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ public final class BrokerConstants {
|
|||||||
|
|
||||||
public static final String PUSH_ANDROID_SERVER_ADDRESS = "push.android.server.address";
|
public static final String PUSH_ANDROID_SERVER_ADDRESS = "push.android.server.address";
|
||||||
public static final String PUSH_IOS_SERVER_ADDRESS = "push.ios.server.address";
|
public static final String PUSH_IOS_SERVER_ADDRESS = "push.ios.server.address";
|
||||||
|
public static final String PUSH_HARMONY_SERVER_ADDRESS = "push.harmony.server.address";
|
||||||
|
|
||||||
public static final String MONITOR_Exception_Event_Address = "monitor.exception_event_address";
|
public static final String MONITOR_Exception_Event_Address = "monitor.exception_event_address";
|
||||||
|
|
||||||
@@ -115,6 +116,8 @@ public final class BrokerConstants {
|
|||||||
public static final String CONNECT_CLIENT_SIGNATURE_LIST = "connect.client_signature_list";
|
public static final String CONNECT_CLIENT_SIGNATURE_LIST = "connect.client_signature_list";
|
||||||
public static final String CONNECT_REJECT_EMPTY_SIGNATURE = "connect.reject_empty_signature";
|
public static final String CONNECT_REJECT_EMPTY_SIGNATURE = "connect.reject_empty_signature";
|
||||||
|
|
||||||
|
public static final String ID_USE_UUID = "id.use_uuid";
|
||||||
|
|
||||||
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
|
public static final String EMBED_DB_PROPERTY_NAME = "embed.db";
|
||||||
public static final String DB_AUTO_CLEAN_HISTORY_MESSAGES = "db.auto_clean_history_messages";
|
public static final String DB_AUTO_CLEAN_HISTORY_MESSAGES = "db.auto_clean_history_messages";
|
||||||
public static final String H2DB_PATH = "h2db.path";
|
public static final String H2DB_PATH = "h2db.path";
|
||||||
@@ -151,6 +154,7 @@ public final class BrokerConstants {
|
|||||||
public static final String MESSAGE_Allow_Stranger_Chat_List = "message.allow_stranger_chat_list";
|
public static final String MESSAGE_Allow_Stranger_Chat_List = "message.allow_stranger_chat_list";
|
||||||
|
|
||||||
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
|
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
|
||||||
|
public static final String MESSAGE_Blacklist_Allow_Send = "message.blacklist.allow_send_to_black";
|
||||||
|
|
||||||
public static final String MESSAGE_NO_Forward_Admin_Message = "message.no_forward_admin_message";
|
public static final String MESSAGE_NO_Forward_Admin_Message = "message.no_forward_admin_message";
|
||||||
|
|
||||||
@@ -173,6 +177,7 @@ public final class BrokerConstants {
|
|||||||
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
|
public static final String FRIEND_Repeat_Request_Duration = "friend.repeat_request_duration";
|
||||||
public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration";
|
public static final String FRIEND_Reject_Request_Duration = "friend.reject_request_duration";
|
||||||
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
|
public static final String FRIEND_Request_Expiration_Duration = "friend.request_expiration_duration";
|
||||||
|
public static final String FRIEND_Request_Rate_Limit = "friend.request_rate_limit";
|
||||||
public static final String FRIEND_Request_Robot_Auto_Accept = "friend.robot_auto_accept";
|
public static final String FRIEND_Request_Robot_Auto_Accept = "friend.robot_auto_accept";
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ public class AddFriendHandler extends GroupHandler<WFCMessage.AddFriendRequest>
|
|||||||
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) {
|
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) {
|
||||||
long[] head = new long[1];
|
long[] head = new long[1];
|
||||||
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin;
|
||||||
ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin);
|
boolean isRobot = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Robot;
|
||||||
|
ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin, isRobot);
|
||||||
if (errorCode == ERROR_CODE_SUCCESS) {
|
if (errorCode == ERROR_CODE_SUCCESS) {
|
||||||
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid());
|
||||||
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberReques
|
|||||||
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
|
||||||
} else {
|
} else {
|
||||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).getAddGroupNotifyContent();
|
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).setExtra(request.getExtra()).getAddGroupNotifyContent();
|
||||||
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
|
|||||||
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
|
||||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
|
||||||
} else {
|
} else {
|
||||||
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").getCreateGroupNotifyContent();
|
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").setExtra(request.getMemberExtra()).getCreateGroupNotifyContent();
|
||||||
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
|
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
private Set<Integer> mForwardExcludeMessageTypes = new HashSet<>();
|
private Set<Integer> mForwardExcludeMessageTypes = new HashSet<>();
|
||||||
private String mMentionForwardUrl = null;
|
private String mMentionForwardUrl = null;
|
||||||
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
private int mBlacklistStrategy = 0; //黑名单中时,0失败,1吞掉。
|
||||||
|
private boolean mBlacklistAllowSend2Black = true;
|
||||||
private boolean mNoForwardAdminMessage = false;
|
private boolean mNoForwardAdminMessage = false;
|
||||||
|
|
||||||
private String mRemoteSensitiveServerUrl = null;
|
private String mRemoteSensitiveServerUrl = null;
|
||||||
@@ -69,6 +70,12 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
Utility.printExecption(LOG, e);
|
Utility.printExecption(LOG, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mBlacklistAllowSend2Black = Boolean.parseBoolean(mServer.getConfig().getProperty(BrokerConstants.MESSAGE_Blacklist_Allow_Send, "true"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mRemoteSensitiveServerUrl = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Server_URL);
|
mRemoteSensitiveServerUrl = mServer.getConfig().getProperty(BrokerConstants.SENSITIVE_Remote_Server_URL);
|
||||||
if(!StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
|
if(!StringUtil.isNullOrEmpty(mRemoteSensitiveServerUrl)) {
|
||||||
@@ -154,6 +161,13 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
|
|||||||
return errorCode;
|
return errorCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!mBlacklistAllowSend2Black) {
|
||||||
|
errorCode = m_messagesStore.isBlacked(fromUser, message.getConversation().getTarget());
|
||||||
|
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
return errorCode;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
userStatus = m_messagesStore.getUserStatus(message.getConversation().getTarget());
|
userStatus = m_messagesStore.getUserStatus(message.getConversation().getTarget());
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ import static io.moquette.BrokerConstants.*;
|
|||||||
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
|
||||||
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
|
||||||
import static cn.wildfirechat.pojos.MyInfoType.*;
|
import static cn.wildfirechat.pojos.MyInfoType.*;
|
||||||
import static win.liyufan.im.UserSettingScope.kUserSettingAddFriendNoVerify;
|
import static win.liyufan.im.UserSettingScope.kUserSettingAddFriendStrategy;
|
||||||
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
|
import static win.liyufan.im.UserSettingScope.kUserSettingPCOnline;
|
||||||
|
|
||||||
public class MemoryMessagesStore implements IMessagesStore {
|
public class MemoryMessagesStore implements IMessagesStore {
|
||||||
@@ -155,6 +155,7 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
private long mFriendRequestDuration = 7 * 24 * 60 * 60 * 1000;
|
||||||
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
private long mFriendRejectDuration = 30 * 24 * 60 * 60 * 1000;
|
||||||
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
private long mFriendRequestExpiration = 7 * 24 * 60 * 60 * 1000;
|
||||||
|
private RateLimiter mFriendRateLimiter;
|
||||||
private boolean mFriendRobotAutoAccept = true;
|
private boolean mFriendRobotAutoAccept = true;
|
||||||
|
|
||||||
private long mPushExpiredTimes = 604800000L;
|
private long mPushExpiredTimes = 604800000L;
|
||||||
@@ -166,6 +167,8 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
private Set<String> mAllowStrangerChatSet = new HashSet<>();
|
private Set<String> mAllowStrangerChatSet = new HashSet<>();
|
||||||
private boolean mDisableStrangerAddGroup = false;
|
private boolean mDisableStrangerAddGroup = false;
|
||||||
|
|
||||||
|
private boolean mIDUseUUID = true;
|
||||||
|
|
||||||
private Set<String> mClientSignatureSet = new HashSet<>();
|
private Set<String> mClientSignatureSet = new HashSet<>();
|
||||||
private boolean mRejectEmptySignature = true;
|
private boolean mRejectEmptySignature = true;
|
||||||
|
|
||||||
@@ -342,6 +345,13 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
|
printMissConfigLog(FRIEND_Request_Expiration_Duration, mFriendRequestExpiration + "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
int friendRequestRateLimit = Integer.parseInt(m_Server.getConfig().getProperty(FRIEND_Request_Rate_Limit, "0"));
|
||||||
|
if(friendRequestRateLimit > 0) {
|
||||||
|
mFriendRateLimiter = new RateLimiter(86400, friendRequestRateLimit);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mFriendRobotAutoAccept = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Request_Robot_Auto_Accept, "true"));
|
mFriendRobotAutoAccept = Boolean.parseBoolean(m_Server.getConfig().getProperty(BrokerConstants.FRIEND_Request_Robot_Auto_Accept, "true"));
|
||||||
@@ -614,6 +624,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mIDUseUUID = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ID_USE_UUID, "false"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void printMissConfigLog(String config, String defaultValue) {
|
private void printMissConfigLog(String config, String defaultValue) {
|
||||||
@@ -3229,6 +3244,30 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
return ErrorCode.ERROR_CODE_SUCCESS;
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ErrorCode isBlacked(String fromUser, String userId) {
|
||||||
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
|
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
|
||||||
|
|
||||||
|
Collection<FriendData> friendDatas = friendsMap.get(fromUser);
|
||||||
|
|
||||||
|
if (friendDatas == null || friendDatas.size() == 0) {
|
||||||
|
friendDatas = loadFriend(friendsMap, fromUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (FriendData friendData : friendDatas) {
|
||||||
|
if (friendData.getFriendUid().equals(userId)) {
|
||||||
|
if (friendData.getBlacked() == 1) {
|
||||||
|
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ErrorCode.ERROR_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
synchronized Collection<FriendData> loadFriend(MultiMap<String, FriendData> friendsMap, String userId) {
|
synchronized Collection<FriendData> loadFriend(MultiMap<String, FriendData> friendsMap, String userId) {
|
||||||
Collection<FriendData> friends = databaseStore.getPersistFriends(userId);
|
Collection<FriendData> friends = databaseStore.getPersistFriends(userId);
|
||||||
if (friends != null) {
|
if (friends != null) {
|
||||||
@@ -3346,16 +3385,28 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin) {
|
public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot) {
|
||||||
if (!isAdmin && mDisableFriendRequest) {
|
if (!isAdmin && mDisableFriendRequest) {
|
||||||
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!isRobot && !isAdmin && mFriendRateLimiter != null) {
|
||||||
|
if(!mFriendRateLimiter.isGranted(userId)) {
|
||||||
|
LOG.error("User {} request add friend over frequency", userId);
|
||||||
|
return ErrorCode.ERROR_CODE_OVER_FREQUENCY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
|
||||||
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
|
MultiMap<String, WFCMessage.FriendRequest> requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST);
|
||||||
|
|
||||||
WFCMessage.UserSettingEntry userSettingData = getUserSetting(request.getTargetUid(), kUserSettingAddFriendNoVerify, "");
|
WFCMessage.UserSettingEntry userSettingData = getUserSetting(request.getTargetUid(), kUserSettingAddFriendStrategy, "");
|
||||||
boolean noVerify = userSettingData != null && "1".equals(userSettingData.getValue());
|
boolean noVerify = userSettingData != null && "1".equals(userSettingData.getValue());
|
||||||
|
boolean noAllow = userSettingData != null && "2".equals(userSettingData.getValue());
|
||||||
|
|
||||||
|
if(noAllow) {
|
||||||
|
return ErrorCode.ERROR_CODE_NOT_RIGHT;
|
||||||
|
}
|
||||||
|
|
||||||
Collection<WFCMessage.FriendRequest> requests = requestMap.get(userId);
|
Collection<WFCMessage.FriendRequest> requests = requestMap.get(userId);
|
||||||
if (requests == null || requests.size() == 0) {
|
if (requests == null || requests.size() == 0) {
|
||||||
@@ -4791,9 +4842,11 @@ public class MemoryMessagesStore implements IMessagesStore {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getShortUUID(){
|
public String getShortUUID(){
|
||||||
int id = databaseStore.getGeneratedId();
|
if(!mIDUseUUID) {
|
||||||
if (id > 0) {
|
int id = databaseStore.getGeneratedId();
|
||||||
return IDUtils.toUid(id);
|
if (id > 0) {
|
||||||
|
return IDUtils.toUid(id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return UUIDGenerator.getUUID();
|
return UUIDGenerator.getUUID();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -179,13 +179,14 @@ public interface IMessagesStore {
|
|||||||
void clearUserFriend(String userId);
|
void clearUserFriend(String userId);
|
||||||
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
|
List<WFCMessage.FriendRequest> getFriendRequestList(String userId, long version);
|
||||||
|
|
||||||
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin);
|
ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin, boolean isRobot);
|
||||||
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
|
ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin);
|
||||||
ErrorCode deleteFriend(String userId, String friendUid, long[] head);
|
ErrorCode deleteFriend(String userId, String friendUid, long[] head);
|
||||||
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
|
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
|
||||||
FriendData getFriendData(String fromUser, String targetUserId);
|
FriendData getFriendData(String fromUser, String targetUserId);
|
||||||
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
|
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
|
||||||
ErrorCode isAllowUserMessage(String fromUser, String userId);
|
ErrorCode isAllowUserMessage(String fromUser, String userId);
|
||||||
|
ErrorCode isBlacked(String fromUser, String userId);
|
||||||
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
|
||||||
ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] head);
|
ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] head);
|
||||||
|
|
||||||
|
|||||||
@@ -451,6 +451,7 @@ public class MessagesPublisher {
|
|||||||
WFCMessage.Message message = m_messagesStore.getMessage(messageHead);
|
WFCMessage.Message message = m_messagesStore.getMessage(messageHead);
|
||||||
|
|
||||||
if (message != null) {
|
if (message != null) {
|
||||||
|
message = message.toBuilder().setMessageId(0).build();
|
||||||
for (String user : receivers) {
|
for (String user : receivers) {
|
||||||
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
Collection<Session> sessions = m_sessionsStore.sessionForUser(user);
|
||||||
|
|
||||||
|
|||||||
@@ -20,5 +20,5 @@ public interface UserSettingScope {
|
|||||||
int kUserSettingPttSilent = 25;
|
int kUserSettingPttSilent = 25;
|
||||||
int kUserSettingGroupRemark = 26;
|
int kUserSettingGroupRemark = 26;
|
||||||
int kUserSettingPrivacySearchable = 27;
|
int kUserSettingPrivacySearchable = 27;
|
||||||
int kUserSettingAddFriendNoVerify = 28;
|
int kUserSettingAddFriendStrategy = 28;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.2.8</version>
|
<version>1.3.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -71,6 +71,8 @@ public interface APIPath {
|
|||||||
String Msg_Multicast = "/admin/message/multicast";
|
String Msg_Multicast = "/admin/message/multicast";
|
||||||
String Msg_RecallBroadCast = "/admin/message/recall_broadcast";
|
String Msg_RecallBroadCast = "/admin/message/recall_broadcast";
|
||||||
String Msg_RecallMultiCast = "/admin/message/recall_multicast";
|
String Msg_RecallMultiCast = "/admin/message/recall_multicast";
|
||||||
|
String Msg_DeleteBroadCast = "/admin/message/delete_broadcast";
|
||||||
|
String Msg_DeleteMultiCast = "/admin/message/delete_multicast";
|
||||||
String Msg_ConvRead = "/admin/message/conv_read";
|
String Msg_ConvRead = "/admin/message/conv_read";
|
||||||
String Msg_Delivery = "/admin/message/delivery";
|
String Msg_Delivery = "/admin/message/delivery";
|
||||||
String Conversation_Delete = "/admin/conversation/delete";
|
String Conversation_Delete = "/admin/conversation/delete";
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import cn.wildfirechat.proto.WFCMessage;
|
|||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
|
import io.netty.util.internal.StringUtil;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -32,6 +33,8 @@ public class GroupNotificationBinaryContent {
|
|||||||
//value2(member or something)
|
//value2(member or something)
|
||||||
private String m;
|
private String m;
|
||||||
|
|
||||||
|
private String extra;
|
||||||
|
|
||||||
public GroupNotificationBinaryContent() {
|
public GroupNotificationBinaryContent() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,8 +92,18 @@ public class GroupNotificationBinaryContent {
|
|||||||
this.ms = ms;
|
this.ms = ms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GroupNotificationBinaryContent setExtra(String extra) {
|
||||||
|
this.extra = extra;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public WFCMessage.MessageContent getGroupNotifyContent(int groupContentType) {
|
public WFCMessage.MessageContent getGroupNotifyContent(int groupContentType) {
|
||||||
return WFCMessage.MessageContent.newBuilder().setType(groupContentType).setData(ByteString.copyFromUtf8(new GsonBuilder().disableHtmlEscaping().create().toJson(this))).build();
|
WFCMessage.MessageContent.Builder builder = WFCMessage.MessageContent.newBuilder().setType(groupContentType).setData(ByteString.copyFromUtf8(new GsonBuilder().disableHtmlEscaping().create().toJson(this)));
|
||||||
|
if(!StringUtil.isNullOrEmpty(extra)) {
|
||||||
|
builder.setExtra(extra);
|
||||||
|
}
|
||||||
|
return builder.build();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public WFCMessage.MessageContent getAddGroupNotifyContent() {
|
public WFCMessage.MessageContent getAddGroupNotifyContent() {
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import java.util.List;
|
|||||||
public class InputAddGroupMember extends InputGroupBase {
|
public class InputAddGroupMember extends InputGroupBase {
|
||||||
private String group_id;
|
private String group_id;
|
||||||
private List<PojoGroupMember> members;
|
private List<PojoGroupMember> members;
|
||||||
|
private String member_extra;
|
||||||
|
|
||||||
public String getGroup_id() {
|
public String getGroup_id() {
|
||||||
return group_id;
|
return group_id;
|
||||||
@@ -34,6 +35,14 @@ public class InputAddGroupMember extends InputGroupBase {
|
|||||||
this.members = members;
|
this.members = members;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getMember_extra() {
|
||||||
|
return member_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMemberExtra(String extra) {
|
||||||
|
this.member_extra = extra;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isValide() {
|
public boolean isValide() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -41,6 +50,9 @@ public class InputAddGroupMember extends InputGroupBase {
|
|||||||
public WFCMessage.AddGroupMemberRequest toProtoGroupRequest() {
|
public WFCMessage.AddGroupMemberRequest toProtoGroupRequest() {
|
||||||
WFCMessage.AddGroupMemberRequest.Builder addGroupBuilder = WFCMessage.AddGroupMemberRequest.newBuilder();
|
WFCMessage.AddGroupMemberRequest.Builder addGroupBuilder = WFCMessage.AddGroupMemberRequest.newBuilder();
|
||||||
addGroupBuilder.setGroupId(group_id);
|
addGroupBuilder.setGroupId(group_id);
|
||||||
|
if(!StringUtil.isNullOrEmpty(member_extra)) {
|
||||||
|
addGroupBuilder.setExtra(member_extra);
|
||||||
|
}
|
||||||
for (PojoGroupMember pojoGroupMember : getMembers()) {
|
for (PojoGroupMember pojoGroupMember : getMembers()) {
|
||||||
WFCMessage.GroupMember.Builder groupMemberBuilder = WFCMessage.GroupMember.newBuilder().setMemberId(pojoGroupMember.getMember_id());
|
WFCMessage.GroupMember.Builder groupMemberBuilder = WFCMessage.GroupMember.newBuilder().setMemberId(pojoGroupMember.getMember_id());
|
||||||
if (!StringUtil.isNullOrEmpty(pojoGroupMember.getAlias())) {
|
if (!StringUtil.isNullOrEmpty(pojoGroupMember.getAlias())) {
|
||||||
|
|||||||
@@ -16,9 +16,10 @@ import java.util.List;
|
|||||||
|
|
||||||
public class InputCreateGroup extends InputGroupBase {
|
public class InputCreateGroup extends InputGroupBase {
|
||||||
private PojoGroup group;
|
private PojoGroup group;
|
||||||
|
private String member_extra;
|
||||||
|
|
||||||
public boolean isValide() {
|
public boolean isValide() {
|
||||||
return true;
|
return !StringUtil.isNullOrEmpty(operator) && group != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public WFCMessage.CreateGroupRequest toProtoGroupRequest() {
|
public WFCMessage.CreateGroupRequest toProtoGroupRequest() {
|
||||||
@@ -87,6 +88,9 @@ public class InputCreateGroup extends InputGroupBase {
|
|||||||
|
|
||||||
WFCMessage.CreateGroupRequest.Builder createGroupReqBuilder = WFCMessage.CreateGroupRequest.newBuilder();
|
WFCMessage.CreateGroupRequest.Builder createGroupReqBuilder = WFCMessage.CreateGroupRequest.newBuilder();
|
||||||
createGroupReqBuilder.setGroup(groupBuilder);
|
createGroupReqBuilder.setGroup(groupBuilder);
|
||||||
|
if(!StringUtil.isNullOrEmpty(member_extra)) {
|
||||||
|
createGroupReqBuilder.setMemberExtra(member_extra);
|
||||||
|
}
|
||||||
if (to_lines != null) {
|
if (to_lines != null) {
|
||||||
for (Integer line : to_lines
|
for (Integer line : to_lines
|
||||||
) {
|
) {
|
||||||
@@ -107,4 +111,12 @@ public class InputCreateGroup extends InputGroupBase {
|
|||||||
public void setGroup(PojoGroup group) {
|
public void setGroup(PojoGroup group) {
|
||||||
this.group = group;
|
this.group = group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getMember_extra() {
|
||||||
|
return member_extra;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMember_extra(String member_extra) {
|
||||||
|
this.member_extra = member_extra;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<!--<relativePath>../pom.xml</relativePath>-->
|
<!--<relativePath>../pom.xml</relativePath>-->
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.2.8</version>
|
<version>1.3.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
<artifactId>distribution</artifactId>
|
<artifactId>distribution</artifactId>
|
||||||
|
|||||||
@@ -66,6 +66,10 @@ token.key testim
|
|||||||
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
##是否使用AES256加密。默认客户端和服务器都是AES128加密,如果需要开启AES256,需要客户端和IM服务同时开通。
|
||||||
#encrypt.use_aes256 true
|
#encrypt.use_aes256 true
|
||||||
|
|
||||||
|
##当创建一个对象时(用户,群组,频道,机器人等),如果没有传入ID,野火会为这个对象生成一个ID。如果id.use_uuid为true,会使用uuid作为对象ID,否则会使用野火短ID,默认为false。
|
||||||
|
## 短ID有个很大的风险是容易被人穷举进行攻击。建议用UUID。
|
||||||
|
id.use_uuid true
|
||||||
|
|
||||||
##首次登录,是否接收之前的历史消息。
|
##首次登录,是否接收之前的历史消息。
|
||||||
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
##0 不接收历史消息,只接收${message.compensate_time_limit}毫秒以内的消息,由于服务器没有保存已经收取记录,所以如果有超过${message.compensate_time_limit}毫秒之前未收取的消息也不会收取下拉;
|
||||||
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
##1接收,会接收 message.max_queue 配置的条数的历史消息
|
||||||
@@ -171,6 +175,9 @@ friend.reject_request_duration 2592000000
|
|||||||
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
##好友请求过期时间,单位是毫秒,默认是7天,0为无限长期限。
|
||||||
friend.request_expiration_duration 604800000
|
friend.request_expiration_duration 604800000
|
||||||
|
|
||||||
|
##好友请求限制频率,一个用户24小时之内允许请求好友的次数,默认不限频。
|
||||||
|
#friend.request_rate_limit 30
|
||||||
|
|
||||||
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
##请求添加机器人为好友时,机器人是否自动接受,默认为true
|
||||||
friend.robot_auto_accept true
|
friend.robot_auto_accept true
|
||||||
|
|
||||||
@@ -329,6 +336,10 @@ push.android.server.address http://localhost:8085/android/push
|
|||||||
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
push.ios.server.address http://localhost:8085/ios/push
|
push.ios.server.address http://localhost:8085/ios/push
|
||||||
|
|
||||||
|
##鸿蒙推送服务器地址
|
||||||
|
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
|
||||||
|
push.harmony.server.address http://localhost:8085/harmony/push
|
||||||
|
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
# 监控配置
|
# 监控配置
|
||||||
#*********************************************************************
|
#*********************************************************************
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
|
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>1.2.8</version>
|
<version>1.3.1</version>
|
||||||
<name>Wildfire Chat</name>
|
<name>Wildfire Chat</name>
|
||||||
<description>Wildfire Chat Server</description>
|
<description>Wildfire Chat Server</description>
|
||||||
<inceptionYear>2019</inceptionYear>
|
<inceptionYear>2019</inceptionYear>
|
||||||
|
|||||||
@@ -12,6 +12,26 @@
|
|||||||
|
|
||||||
# 更新记录
|
# 更新记录
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.3.1:
|
||||||
|
1. 透传消息去掉消息ID,减少消息传输大小。
|
||||||
|
2. 修改添加好友策略,可以设置禁止加自己好友。
|
||||||
|
3. Server API创建群组时,检查是否设置operator。
|
||||||
|
4. SDK添加删除广播和组播消息接口
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.3.0:
|
||||||
|
1. 推送信息中添加republish参数,用于标识消息是重新发布的。
|
||||||
|
2. 添加好友请求限频功能,在IM服务配置中可以配置每天限制添加的好友数。
|
||||||
|
3. 添加配置,是否允许用户发送消息给被拉黑的用户。
|
||||||
|
4. 添加鸿蒙回调地址。
|
||||||
|
5. 创建群组或者添加群组成员时,群组成员的Extra会放到通知消息的extra中,这样便于业务处理通知消息。
|
||||||
|
|
||||||
|
--------------
|
||||||
|
Release note 1.2.9:
|
||||||
|
1. 解决server api获取群组信息不全的问题。
|
||||||
|
2. 添加配置使用uuid作为用户群组等ID。
|
||||||
|
|
||||||
--------------
|
--------------
|
||||||
Release note 1.2.8:
|
Release note 1.2.8:
|
||||||
1. server api获取被封禁用户时,过滤掉正常用户。
|
1. server api获取被封禁用户时,过滤掉正常用户。
|
||||||
|
|||||||
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>wildfirechat-parent</artifactId>
|
<artifactId>wildfirechat-parent</artifactId>
|
||||||
<groupId>cn.wildfirechat</groupId>
|
<groupId>cn.wildfirechat</groupId>
|
||||||
<version>1.2.8</version>
|
<version>1.3.1</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,361 @@
|
|||||||
|
package cn.wildfirechat.sdk;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
|
import cn.wildfirechat.pojos.*;
|
||||||
|
import cn.wildfirechat.sdk.model.IMResult;
|
||||||
|
|
||||||
|
import java.io.BufferedWriter;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
|
import java.util.concurrent.ConcurrentSkipListSet;
|
||||||
|
import java.util.concurrent.CountDownLatch;
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成测试数据。本应用生成以下数据:
|
||||||
|
* 1. 创建${totalUserCount}个用户
|
||||||
|
* 2. 每个用户同其他${friendCount}个用户建立好友关系
|
||||||
|
* 3. 确保每个人都加入${smallGroupCount}个群组成员数为${smallGroupMemberSize}的小群组
|
||||||
|
* 4. 确保每个人都加入${middleGroupCount}个群组成员数为${middleGroupMemberSize}的中群组
|
||||||
|
* 5. 确保每个人都加入${bigGroupCount}个群组成员数为${bigGroupMemberSize}的大群组
|
||||||
|
* 6. 把数据分片${splitFileCount}个保存在文件中
|
||||||
|
*
|
||||||
|
* 好友关系和群组关系都是随机生成,有可能会出现最后几个用户无法满足精确好友数或者群组数的问题,但绝大部分数据都能满足需求。
|
||||||
|
*/
|
||||||
|
public class GenerateTestData {
|
||||||
|
//IM服务Server API
|
||||||
|
private static String AdminUrl = "http://10.206.0.5:18080";
|
||||||
|
private static String AdminSecret = "123456";
|
||||||
|
|
||||||
|
private static int totalUserCount = 20000;
|
||||||
|
|
||||||
|
//每个用户的好友数
|
||||||
|
private static int friendCount = 100;
|
||||||
|
|
||||||
|
//每个用户拥有的小群数,和小群的大小。
|
||||||
|
private static int smallGroupCount = 100;
|
||||||
|
private static int smallGroupMemberSize = 20;
|
||||||
|
|
||||||
|
//每个用户拥有的中群数,和中群的大小。
|
||||||
|
private static int middleGroupCount = 100;
|
||||||
|
private static int middleGroupMemberSize = 100;
|
||||||
|
|
||||||
|
//每个用户拥有的大群数,和大群的大小。
|
||||||
|
private static int bigGroupCount = 20;
|
||||||
|
private static int bigGroupMemberSize = 1000;
|
||||||
|
|
||||||
|
//数据文件分割成几个文件存储。
|
||||||
|
private static int splitFileCount = 1;
|
||||||
|
|
||||||
|
|
||||||
|
//统计添加好友数和创建群组数。
|
||||||
|
private static AtomicInteger addFriendCount = new AtomicInteger(0);
|
||||||
|
private static AtomicInteger createGroupCount = new AtomicInteger(0);
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
AdminConfig.initAdmin(AdminUrl, AdminSecret);
|
||||||
|
int addFriendRequestCount = friendCount*totalUserCount/2;
|
||||||
|
int createSmallGroupCount = smallGroupCount * totalUserCount / smallGroupMemberSize;
|
||||||
|
int createMiddleGroupCount = middleGroupCount * totalUserCount / middleGroupMemberSize;
|
||||||
|
int createBigGroupCount = bigGroupCount * totalUserCount / bigGroupMemberSize;
|
||||||
|
System.out.println("根据当前的参数,将创建 " + totalUserCount + " 名用户");
|
||||||
|
System.out.println("添加大概 " + addFriendRequestCount + " 次好友请求");
|
||||||
|
System.out.println("创建大概 " + createSmallGroupCount + " 个小型群组");
|
||||||
|
System.out.println("创建大概 " + createMiddleGroupCount + " 个中等群组");
|
||||||
|
System.out.println("创建大概 " + createBigGroupCount + " 个大型群组");
|
||||||
|
System.out.println("等待10秒开始");
|
||||||
|
Thread.sleep(10*1000);
|
||||||
|
|
||||||
|
List<String> userIds = generateUserIds(totalUserCount);
|
||||||
|
|
||||||
|
CountDownLatch latch = new CountDownLatch(5);
|
||||||
|
|
||||||
|
new Thread(() -> {
|
||||||
|
createUsers(userIds);
|
||||||
|
latch.countDown();
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
Map<String, Integer> unfulfilledFriendMap = new HashMap<>();
|
||||||
|
new Thread(() -> {
|
||||||
|
addFriends(userIds, friendCount, unfulfilledFriendMap);
|
||||||
|
latch.countDown();
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
Map<String, Set<String>> userSmallGroupMap = new HashMap<>();
|
||||||
|
Map<String, Integer> unfulfilledSmallMap = new HashMap<>();
|
||||||
|
new Thread(() ->{
|
||||||
|
for (String userId : userIds) {
|
||||||
|
createGroup(userId, userIds, userSmallGroupMap, smallGroupCount, smallGroupMemberSize, unfulfilledSmallMap);
|
||||||
|
}
|
||||||
|
latch.countDown();
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
Map<String, Set<String>> userMiddleGroupMap = new HashMap<>();
|
||||||
|
Map<String, Integer> unfulfilledMiddleMap = new HashMap<>();
|
||||||
|
new Thread(() ->{
|
||||||
|
for (String userId : userIds) {
|
||||||
|
createGroup(userId, userIds, userMiddleGroupMap, middleGroupCount, middleGroupMemberSize, unfulfilledMiddleMap);
|
||||||
|
}
|
||||||
|
latch.countDown();
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
Map<String, Set<String>> userBigGroupMap = new HashMap<>();
|
||||||
|
Map<String, Integer> unfulfilledBigMap = new HashMap<>();
|
||||||
|
new Thread(() ->{
|
||||||
|
for (String userId : userIds) {
|
||||||
|
createGroup(userId, userIds, userBigGroupMap, bigGroupCount, bigGroupMemberSize, unfulfilledBigMap);
|
||||||
|
}
|
||||||
|
latch.countDown();
|
||||||
|
}).start();
|
||||||
|
|
||||||
|
latch.await();
|
||||||
|
|
||||||
|
System.out.println("数据初始化结束,实际建立好友关系: " + addFriendCount.get() + " 条。");
|
||||||
|
if (!unfulfilledFriendMap.isEmpty()) {
|
||||||
|
System.out.println("有部分用户没有建立" + friendCount + "个好友关系,分别是:");
|
||||||
|
printUnfulfilledMap(unfulfilledFriendMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("数据初始化结束,创建群组: " + createGroupCount.get() + " 个。");
|
||||||
|
if (!unfulfilledSmallMap.isEmpty()) {
|
||||||
|
System.out.println("有部分用户没有建立" + smallGroupMemberSize + "个群组成员的群,分别是:");
|
||||||
|
printUnfulfilledMap(unfulfilledSmallMap);
|
||||||
|
}
|
||||||
|
if (!unfulfilledMiddleMap.isEmpty()) {
|
||||||
|
System.out.println("有部分用户没有建立" + middleGroupMemberSize + "个群组成员的群,分别是:");
|
||||||
|
printUnfulfilledMap(unfulfilledMiddleMap);
|
||||||
|
}
|
||||||
|
if (!unfulfilledBigMap.isEmpty()) {
|
||||||
|
System.out.println("有部分用户没有建立" + bigGroupMemberSize + "个群组成员的群,分别是:");
|
||||||
|
printUnfulfilledMap(unfulfilledBigMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
System.out.println("保存数据到" + splitFileCount + "个文件中。");
|
||||||
|
for (int i = 0; i < splitFileCount; i++) {
|
||||||
|
String filePath = "data"+i+".csv"; // 文件路径
|
||||||
|
BufferedWriter writer = new BufferedWriter(new FileWriter(filePath));
|
||||||
|
int partSize = totalUserCount/splitFileCount;
|
||||||
|
for (int j = 0; j < partSize; j++) {
|
||||||
|
String userId = userIds.get(i*partSize+j);
|
||||||
|
writeDeviceInfo(writer, userId, 3);
|
||||||
|
Set<String> smallGroupIds = userSmallGroupMap.get(userId);
|
||||||
|
writeGroupIds(writer, smallGroupIds);
|
||||||
|
Set<String> middleGroupIds = userMiddleGroupMap.get(userId);
|
||||||
|
writeGroupIds(writer, middleGroupIds);
|
||||||
|
Set<String> bigGroupIds = userBigGroupMap.get(userId);
|
||||||
|
writeGroupIds(writer, bigGroupIds);
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("保存结束。");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void printUnfulfilledMap(Map<String, Integer> map) {
|
||||||
|
if(map.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
map.forEach((s, integer) -> System.out.print(s + ":" + integer + " "));
|
||||||
|
System.out.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeDeviceInfo(BufferedWriter writer, String userId, int platform) throws IOException {
|
||||||
|
writer.write(userId);
|
||||||
|
writer.write(",");
|
||||||
|
writer.write(UUID.randomUUID().toString());
|
||||||
|
writer.write(",");
|
||||||
|
writer.write(""+platform);
|
||||||
|
writer.write("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void writeGroupIds(BufferedWriter writer, Set<String> groupIds) throws IOException {
|
||||||
|
int writeCount = 0;
|
||||||
|
for (String bigGroupId : groupIds) {
|
||||||
|
writer.write(bigGroupId);
|
||||||
|
writeCount++;
|
||||||
|
if(writeCount < groupIds.size()) {
|
||||||
|
writer.write(",");
|
||||||
|
} else {
|
||||||
|
writer.write("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private static void createGroup(String userId, List<String> userIds, Map<String, Set<String>> userGroupMap, int groupCount, int memberSize, Map<String, Integer> unfulfilledUserMap) {
|
||||||
|
Set<String> groupIds = userGroupMap.computeIfAbsent(userId, s -> new HashSet<>());
|
||||||
|
int i = 0;
|
||||||
|
while (groupIds.size() < groupCount){
|
||||||
|
PojoGroupInfo groupInfo = new PojoGroupInfo();
|
||||||
|
groupInfo.setTarget_id(UUID.randomUUID().toString());
|
||||||
|
groupInfo.setOwner(userId);
|
||||||
|
groupInfo.setName("Group_"+userId+i++);
|
||||||
|
groupInfo.setType(2);
|
||||||
|
groupIds.add(groupInfo.getTarget_id());
|
||||||
|
|
||||||
|
List<String> memberCandidates = new ArrayList<>(userIds);
|
||||||
|
List<String> memberIds = new ArrayList<>();
|
||||||
|
memberIds.add(userId);
|
||||||
|
|
||||||
|
while (!memberCandidates.isEmpty() && memberIds.size() < memberSize) {
|
||||||
|
String memberId = memberCandidates.get((int)(Math.random()*memberCandidates.size()));
|
||||||
|
memberCandidates.remove(memberId);
|
||||||
|
if(memberId.equals(userId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (memberIds.contains(memberId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Set<String> memberGroupIds = userGroupMap.computeIfAbsent(memberId, s -> new HashSet<>());
|
||||||
|
if(memberGroupIds.contains(groupInfo.getTarget_id()) || memberGroupIds.size() >= groupCount) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memberGroupIds.add(groupInfo.getTarget_id());
|
||||||
|
memberIds.add(memberId);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<PojoGroupMember> members = new ArrayList<>();
|
||||||
|
for (String memberId : memberIds) {
|
||||||
|
PojoGroupMember member1 = new PojoGroupMember();
|
||||||
|
member1.setMember_id(memberId);
|
||||||
|
members.add(member1);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
IMResult<OutputCreateGroupResult> resultCreateGroup = GroupAdmin.createGroup(groupInfo.getOwner(), groupInfo, members, null, null, null);
|
||||||
|
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("create group success");
|
||||||
|
} else {
|
||||||
|
System.out.println("create group failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("create group failure:" + e);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
createGroupCount.incrementAndGet();
|
||||||
|
if(memberIds.size() < memberSize) {
|
||||||
|
unfulfilledUserMap.put(userId + "'s group " + groupInfo.getTarget_id(), memberIds.size());
|
||||||
|
System.out.println("Error, can not find enough user to create group for user:" + userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void addFriends(List<String> userIds, int count, Map<String, Integer> unfulfilledFriendMap) {
|
||||||
|
ConcurrentLinkedQueue<Pair<String, String>> toAddSet = new ConcurrentLinkedQueue<>();
|
||||||
|
Map<String, Set<String>> userFriends = new HashMap<>();
|
||||||
|
for (String userId : userIds) {
|
||||||
|
List<String> candidates = new ArrayList<>(userIds);
|
||||||
|
Set<String> currentUserFriends = userFriends.computeIfAbsent(userId, s -> new HashSet<>());
|
||||||
|
while (!candidates.isEmpty() && currentUserFriends.size() < count) {
|
||||||
|
String friendId = candidates.get((int) (Math.random()*candidates.size()));
|
||||||
|
candidates.remove(friendId);
|
||||||
|
if(friendId.equals(userId)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!currentUserFriends.contains(friendId)) {
|
||||||
|
Set<String> targetUserFriends = userFriends.computeIfAbsent(friendId, s -> new HashSet<>());
|
||||||
|
if(targetUserFriends.size() < count) {
|
||||||
|
currentUserFriends.add(friendId);
|
||||||
|
targetUserFriends.add(userId);
|
||||||
|
toAddSet.add(new Pair<>(userId, friendId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (currentUserFriends.size() < count) {
|
||||||
|
unfulfilledFriendMap.put(userId, currentUserFriends.size());
|
||||||
|
System.out.println("Error, can not find enough user to add friend for user:" + userId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int threadNum = 5;
|
||||||
|
CountDownLatch latch = new CountDownLatch(threadNum);
|
||||||
|
for (int i = 0; i < threadNum; i++) {
|
||||||
|
new Thread(() -> {
|
||||||
|
while (true) {
|
||||||
|
Pair<String, String> pair = toAddSet.poll();
|
||||||
|
if(pair == null) {
|
||||||
|
latch.countDown();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
IMResult<Void> result = RelationAdmin.setUserFriend(pair.first, pair.second, true, null);
|
||||||
|
if (result != null && (result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS || result.getErrorCode() == ErrorCode.ERROR_CODE_ALREADY_FRIENDS)) {
|
||||||
|
System.out.println("add friend success");
|
||||||
|
addFriendCount.incrementAndGet();
|
||||||
|
} else {
|
||||||
|
System.out.println("failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("failure:" + e);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
latch.await();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
System.out.println("failure:" + e);
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String generateUserId(int index) {
|
||||||
|
return UUID.randomUUID().toString().replace("-", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<String> generateUserIds(int count) {
|
||||||
|
List<String> userIds = new ArrayList<>();
|
||||||
|
for (int i = 0; i < count; i++) {
|
||||||
|
userIds.add(generateUserId(i));
|
||||||
|
}
|
||||||
|
return userIds;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void createUsers(List<String> userIds) {
|
||||||
|
for (int i = 0; i < userIds.size(); i++) {
|
||||||
|
InputOutputUserInfo userInfo = generateUserInfo(userIds.get(i), i);
|
||||||
|
try {
|
||||||
|
IMResult<OutputCreateUser> resultCreateUser = UserAdmin.createUser(userInfo);
|
||||||
|
if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("Create user " + resultCreateUser.getResult().getName() + " success");
|
||||||
|
} else {
|
||||||
|
System.out.println("Create user failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.out.println("Create user failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static InputOutputUserInfo generateUserInfo(String userId, int index) {
|
||||||
|
InputOutputUserInfo userInfo = new InputOutputUserInfo();
|
||||||
|
//用户ID,必须保证唯一性
|
||||||
|
userInfo.setUserId(userId);
|
||||||
|
//用户名,一般是用户登录帐号,也必须保证唯一性。也就是说所有用户的userId必须不能重复,所有用户的name必须不能重复,但可以同一个用户的userId和name是同一个,一般建议userId使用一个uuid,name是"微信号"且可以修改,
|
||||||
|
userInfo.setName(userId);
|
||||||
|
userInfo.setMobile((11000000000L+index) + "");
|
||||||
|
userInfo.setDisplayName("User"+index);
|
||||||
|
|
||||||
|
return userInfo;
|
||||||
|
}
|
||||||
|
static class Pair<K, V> {
|
||||||
|
K first;
|
||||||
|
V second;
|
||||||
|
|
||||||
|
public Pair() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Pair(K first, V second) {
|
||||||
|
this.first = first;
|
||||||
|
this.second = second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,14 +2,13 @@ package cn.wildfirechat.sdk;
|
|||||||
|
|
||||||
import cn.wildfirechat.common.APIPath;
|
import cn.wildfirechat.common.APIPath;
|
||||||
import cn.wildfirechat.pojos.*;
|
import cn.wildfirechat.pojos.*;
|
||||||
import cn.wildfirechat.proto.ProtoConstants;
|
|
||||||
import cn.wildfirechat.sdk.model.IMResult;
|
import cn.wildfirechat.sdk.model.IMResult;
|
||||||
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class GroupAdmin {
|
public class GroupAdmin {
|
||||||
public static IMResult<OutputCreateGroupResult> createGroup(String operator, PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public static IMResult<OutputCreateGroupResult> createGroup(String operator, PojoGroupInfo group_info, List<PojoGroupMember> members, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Create_Group;
|
String path = APIPath.Create_Group;
|
||||||
PojoGroup pojoGroup = new PojoGroup();
|
PojoGroup pojoGroup = new PojoGroup();
|
||||||
pojoGroup.setGroup_info(group_info);
|
pojoGroup.setGroup_info(group_info);
|
||||||
@@ -17,6 +16,7 @@ public class GroupAdmin {
|
|||||||
InputCreateGroup createGroup = new InputCreateGroup();
|
InputCreateGroup createGroup = new InputCreateGroup();
|
||||||
createGroup.setGroup(pojoGroup);
|
createGroup.setGroup(pojoGroup);
|
||||||
createGroup.setOperator(operator);
|
createGroup.setOperator(operator);
|
||||||
|
createGroup.setMember_extra(member_extra);
|
||||||
createGroup.setTo_lines(to_lines);
|
createGroup.setTo_lines(to_lines);
|
||||||
createGroup.setNotify_message(notify_message);
|
createGroup.setNotify_message(notify_message);
|
||||||
|
|
||||||
@@ -85,12 +85,13 @@ public class GroupAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
return AdminHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public static IMResult<Void> addGroupMembers(String operator, String groupId, List<PojoGroupMember> groupMembers, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Group_Member_Add;
|
String path = APIPath.Group_Member_Add;
|
||||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||||
addGroupMember.setGroup_id(groupId);
|
addGroupMember.setGroup_id(groupId);
|
||||||
addGroupMember.setMembers(groupMembers);
|
addGroupMember.setMembers(groupMembers);
|
||||||
addGroupMember.setOperator(operator);
|
addGroupMember.setOperator(operator);
|
||||||
|
addGroupMember.setMemberExtra(member_extra);
|
||||||
addGroupMember.setTo_lines(to_lines);
|
addGroupMember.setTo_lines(to_lines);
|
||||||
addGroupMember.setNotify_message(notify_message);
|
addGroupMember.setNotify_message(notify_message);
|
||||||
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||||
|
|||||||
@@ -503,7 +503,7 @@ public class Main {
|
|||||||
member3.setMember_id("user3");
|
member3.setMember_id("user3");
|
||||||
members.add(member3);
|
members.add(member3);
|
||||||
|
|
||||||
IMResult<OutputCreateGroupResult> resultCreateGroup = GroupAdmin.createGroup(groupInfo.getOwner(), groupInfo, members, null, null);
|
IMResult<OutputCreateGroupResult> resultCreateGroup = GroupAdmin.createGroup(groupInfo.getOwner(), groupInfo, members, null, null, null);
|
||||||
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("create group success");
|
System.out.println("create group success");
|
||||||
} else {
|
} else {
|
||||||
@@ -575,7 +575,7 @@ public class Main {
|
|||||||
m.setMember_id("user1");
|
m.setMember_id("user1");
|
||||||
m.setAlias("hello user1");
|
m.setAlias("hello user1");
|
||||||
|
|
||||||
voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList(m), null, null);
|
voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList(m), null, null, null);
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("add group member success");
|
System.out.println("add group member success");
|
||||||
} else {
|
} else {
|
||||||
@@ -1065,7 +1065,43 @@ public class Main {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
IMResult<Void> voidIMResult = ChannelAdmin.destroyChannel(inputCreateChannel.getTargetId());
|
String subscriber = "aaa";
|
||||||
|
IMResult<Void> voidIMResult = ChannelAdmin.subscribeChannel(inputCreateChannel.getTargetId(), subscriber);
|
||||||
|
if(voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("subscribeChannel success");
|
||||||
|
} else {
|
||||||
|
System.out.println("subscriber channel failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.sleep(100);
|
||||||
|
IMResult<OutputBooleanValue> booleanIMResult = ChannelAdmin.isUserSubscribedChannel(subscriber, inputCreateChannel.getTargetId());
|
||||||
|
if(booleanIMResult != null && booleanIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && booleanIMResult.getResult().value) {
|
||||||
|
System.out.println("subscribe status is correct");
|
||||||
|
} else {
|
||||||
|
System.out.println("subscribe status is incorrect");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
voidIMResult = ChannelAdmin.unsubscribeChannel(inputCreateChannel.getTargetId(), subscriber);
|
||||||
|
if(voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
|
System.out.println("unsubscribeChannel success");
|
||||||
|
} else {
|
||||||
|
System.out.println("unsubscriber channel failure");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
Thread.sleep(100);
|
||||||
|
|
||||||
|
booleanIMResult = ChannelAdmin.isUserSubscribedChannel(subscriber, inputCreateChannel.getTargetId());
|
||||||
|
if(booleanIMResult != null && booleanIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && !booleanIMResult.getResult().value) {
|
||||||
|
System.out.println("subscribe status is correct");
|
||||||
|
} else {
|
||||||
|
System.out.println("subscribe status is incorrect");
|
||||||
|
System.exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
voidIMResult = ChannelAdmin.destroyChannel(inputCreateChannel.getTargetId());
|
||||||
if(voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if(voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("success");
|
System.out.println("success");
|
||||||
} else {
|
} else {
|
||||||
@@ -1442,7 +1478,7 @@ public class Main {
|
|||||||
member3.setMember_id("user3");
|
member3.setMember_id("user3");
|
||||||
members.add(member3);
|
members.add(member3);
|
||||||
|
|
||||||
IMResult<OutputCreateGroupResult> resultCreateGroup = robotService.createGroup(groupInfo, members, null, null);
|
IMResult<OutputCreateGroupResult> resultCreateGroup = robotService.createGroup(groupInfo, members, null, null, null);
|
||||||
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("create group success");
|
System.out.println("create group success");
|
||||||
} else {
|
} else {
|
||||||
@@ -1486,7 +1522,7 @@ public class Main {
|
|||||||
m.setMember_id("user0");
|
m.setMember_id("user0");
|
||||||
m.setAlias("hello user0");
|
m.setAlias("hello user0");
|
||||||
|
|
||||||
voidIMResult = robotService.addGroupMembers(groupInfo.getTarget_id(), Arrays.asList(m), null, null);
|
voidIMResult = robotService.addGroupMembers(groupInfo.getTarget_id(), Arrays.asList(m), null, null, null);
|
||||||
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
|
||||||
System.out.println("add group member success");
|
System.out.println("add group member success");
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -81,13 +81,7 @@ public class MessageAdmin {
|
|||||||
return AdminHttpUtils.httpJsonPost(path, inputMessageUid, OutputMessageData.class);
|
return AdminHttpUtils.httpJsonPost(path, inputMessageUid, OutputMessageData.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
//仅专业版支持
|
||||||
* 撤回群发或者广播的消息
|
|
||||||
* @param operator 操作者
|
|
||||||
* @param messageUid 消息唯一ID
|
|
||||||
* @return
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static IMResult<Void> recallBroadCastMessage(String operator, long messageUid) throws Exception {
|
public static IMResult<Void> recallBroadCastMessage(String operator, long messageUid) throws Exception {
|
||||||
String path = APIPath.Msg_RecallBroadCast;
|
String path = APIPath.Msg_RecallBroadCast;
|
||||||
RecallMessageData messageData = new RecallMessageData();
|
RecallMessageData messageData = new RecallMessageData();
|
||||||
@@ -102,10 +96,28 @@ public class MessageAdmin {
|
|||||||
messageData.operator = operator;
|
messageData.operator = operator;
|
||||||
messageData.messageUid = messageUid;
|
messageData.messageUid = messageUid;
|
||||||
messageData.receivers = receivers;
|
messageData.receivers = receivers;
|
||||||
|
|
||||||
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//仅专业版支持
|
||||||
|
public static IMResult<Void> deleteBroadCastMessage(String operator, long messageUid) throws Exception {
|
||||||
|
String path = APIPath.Msg_DeleteBroadCast;
|
||||||
|
RecallMessageData messageData = new RecallMessageData();
|
||||||
|
messageData.setOperator(operator);
|
||||||
|
messageData.setMessageUid(messageUid);
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IMResult<Void> deleteMultiCastMessage(String operator, long messageUid, List<String> receivers) throws Exception {
|
||||||
|
String path = APIPath.Msg_DeleteMultiCast;
|
||||||
|
RecallMultiCastMessageData messageData = new RecallMultiCastMessageData();
|
||||||
|
messageData.operator = operator;
|
||||||
|
messageData.messageUid = messageUid;
|
||||||
|
messageData.receivers = receivers;
|
||||||
|
return AdminHttpUtils.httpJsonPost(path, messageData, Void.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
//仅专业版支持
|
||||||
public static IMResult<BroadMessageResult> broadcastMessage(String sender, int line, MessagePayload payload) throws Exception {
|
public static IMResult<BroadMessageResult> broadcastMessage(String sender, int line, MessagePayload payload) throws Exception {
|
||||||
String path = APIPath.Msg_Broadcast;
|
String path = APIPath.Msg_Broadcast;
|
||||||
BroadMessageData messageData = new BroadMessageData();
|
BroadMessageData messageData = new BroadMessageData();
|
||||||
|
|||||||
@@ -96,13 +96,14 @@ public class RobotService {
|
|||||||
return robotHttpUtils.httpJsonPost(path, pojo, Void.class);
|
return robotHttpUtils.httpJsonPost(path, pojo, Void.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Robot_Create_Group;
|
String path = APIPath.Robot_Create_Group;
|
||||||
PojoGroup pojoGroup = new PojoGroup();
|
PojoGroup pojoGroup = new PojoGroup();
|
||||||
pojoGroup.setGroup_info(group_info);
|
pojoGroup.setGroup_info(group_info);
|
||||||
pojoGroup.setMembers(members);
|
pojoGroup.setMembers(members);
|
||||||
InputCreateGroup createGroup = new InputCreateGroup();
|
InputCreateGroup createGroup = new InputCreateGroup();
|
||||||
createGroup.setGroup(pojoGroup);
|
createGroup.setGroup(pojoGroup);
|
||||||
|
createGroup.setMember_extra(member_extra);
|
||||||
createGroup.setTo_lines(to_lines);
|
createGroup.setTo_lines(to_lines);
|
||||||
createGroup.setNotify_message(notify_message);
|
createGroup.setNotify_message(notify_message);
|
||||||
|
|
||||||
@@ -163,11 +164,12 @@ public class RobotService {
|
|||||||
return robotHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
return robotHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, String member_extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
|
||||||
String path = APIPath.Robot_Group_Member_Add;
|
String path = APIPath.Robot_Group_Member_Add;
|
||||||
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
InputAddGroupMember addGroupMember = new InputAddGroupMember();
|
||||||
addGroupMember.setGroup_id(groupId);
|
addGroupMember.setGroup_id(groupId);
|
||||||
addGroupMember.setMembers(groupMembers);
|
addGroupMember.setMembers(groupMembers);
|
||||||
|
addGroupMember.setMemberExtra(member_extra);
|
||||||
addGroupMember.setTo_lines(to_lines);
|
addGroupMember.setTo_lines(to_lines);
|
||||||
addGroupMember.setNotify_message(notify_message);
|
addGroupMember.setNotify_message(notify_message);
|
||||||
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package cn.wildfirechat.sdk.utilities;
|
package cn.wildfirechat.sdk.utilities;
|
||||||
|
|
||||||
|
import cn.wildfirechat.common.ErrorCode;
|
||||||
import cn.wildfirechat.sdk.model.IMResult;
|
import cn.wildfirechat.sdk.model.IMResult;
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
import com.google.gson.GsonBuilder;
|
import com.google.gson.GsonBuilder;
|
||||||
@@ -157,7 +158,15 @@ public class AdminHttpUtils extends JsonUtils {
|
|||||||
LOG.info("Request error: " + statusCode + " error msg:" + content);
|
LOG.info("Request error: " + statusCode + " error msg:" + content);
|
||||||
throw new Exception("Http request error with code:" + statusCode);
|
throw new Exception("Http request error with code:" + statusCode);
|
||||||
} else {
|
} else {
|
||||||
return fromJsonObject(content, clazz);
|
IMResult<T> result = fromJsonObject(content, clazz);
|
||||||
|
if(result != null){
|
||||||
|
if(result.getErrorCode() == ErrorCode.ERROR_CODE_AUTH_FAILURE) {
|
||||||
|
LOG.error("鉴权失败,IM服务地址或者密钥配置错误,请检查IM服务{}的配置文件中的http.admin.secret_key是否是{}", adminUrl, adminSecret);
|
||||||
|
} else if(result.getErrorCode() == ErrorCode.ERROR_CODE_SIGN_EXPIRED) {
|
||||||
|
LOG.error("时间验证失败,请确保当前服务和IM服务{}的时间是一致的", adminUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
Reference in New Issue
Block a user