Compare commits

...
24 Commits
Author SHA1 Message Date
heavyrian2012 d1232abe39 version and release note 2025-03-05 19:20:54 +08:00
heavyrian2012 1df192f730 解决分段拉取消息时可能丢消息的问题 2025-03-05 19:13:29 +08:00
heavyrian2012 f897e640fc SDK添加超时配置 2025-03-03 12:11:19 +08:00
heavyrian2012 ee6e4f96fb 配置允许撤回消息时间小于等于0时可以允许用户任意时间撤回消息 2025-02-21 19:28:57 +08:00
heavyrian2012 d14dc74566 sdk添加注册消息的接口,可以允许sdk注册自定义消息 2025-02-19 19:27:42 +08:00
heavyrian2012 ff75379779 优化server sdk 2025-02-18 09:53:34 +08:00
heavyrian2012 b95a6b7785 更新版本号和Release note 2025-02-13 19:00:39 +08:00
heavyrian2012 5acb3044ac Revert "serveri api获取用户信息时返回deleted字段"
This reverts commit ae084063f4.
2025-01-24 10:34:53 +08:00
heavyrian2012 ae084063f4 serveri api获取用户信息时返回deleted字段 2025-01-23 16:27:36 +08:00
heavyrian2012 cb3a82559d 机器人API添加定向消息参数 2025-01-17 20:17:18 +08:00
heavyrian2012 9191204bb0 nginx配置注释 2025-01-15 10:07:37 +08:00
heavyrian2012 6587a88ca9 修改注释 2025-01-14 11:07:39 +08:00
heavyrian2012 86c1a2e140 转移群主时检查目标用户是否在群组中 2025-01-03 21:33:46 +08:00
heavyrian2012 83e9679339 SDK的地址和密钥添加trim,避免空格换行等问题 2025-01-02 14:23:23 +08:00
heavyrian2012 dafb0cd4d9 修改nginx配置示例中上传文件的大小为200MB 2024-12-26 08:42:24 +08:00
heavyrian2012 cbcc8310c4 敏感词过滤类型默认改成2 2024-12-15 10:47:45 +08:00
heavyrian2012 ade58efc11 更新版本号和release note内容 2024-12-11 16:28:51 +08:00
heavyrian2012 d45da9674e 默认开启支持支持踢出事件的开关 2024-12-11 16:24:19 +08:00
heavyrian2012 f603a677ea 当禁止私聊时可以配置例外的线路 2024-12-06 16:06:04 +08:00
heavyrian2012 03894aea9a 修改启动成功的提示语 2024-12-06 08:02:30 +08:00
heavyrian2012 8635153e59 解决聊天室定向消息问题 2024-11-20 12:47:11 +08:00
heavyrian2012 3d98d17b0d 机器人接口添加更新朋友圈接口 2024-11-14 12:51:05 +08:00
heavyrian2012 0549bc502f 添加批量获取用户信息的接口 2024-11-14 12:50:38 +08:00
heavyrian2012 1b8cf3e5f9 添加机器人的朋友圈接口 2024-11-03 10:06:10 +08:00
60 changed files with 809 additions and 84 deletions
+8 -2
View File
@@ -95,6 +95,9 @@ message.disable_stranger_chat false
##当禁止陌生人聊天时,允许聊天的用户id,比如管理员或者文件传输助手等。用户id以英文逗号分割。
message.allow_stranger_chat_list admin,FireRobot,wfc_file_transfer
##当禁止陌生人聊天时,允许聊天的线路。
#message.allow_stranger_line 100,101
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
message.blacklist.strategy 0
@@ -327,7 +330,7 @@ server.mobile_default_silent_when_pc_online true
## 客户端是否支持kickoff事件。当客户端被其他端登录踢出时,如果此开关为false时,客户端协议栈上报secret_mismatch。如果此开关为ture时,客户端协议栈上报kicked_off。
## 客户端被踢时上报kicked_off是在2021.9.15之后才加上的。如果客户端协议栈全部为此日期之后的版本才可以打开此开关。
server.client_support_kickoff_event false
server.client_support_kickoff_event true
#*********************************************************************
# Push server configuration
@@ -418,7 +421,10 @@ push.harmony.server.address http://localhost:8085/harmony/push
## 内置文本敏感词过滤处理方法,当命中敏感词后,消息会被记录到t_sensitive_messages表中,然后根据type类型做不同的处理,处理方式如下:
## 0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***然后正常发送;3 正常发送。
## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址
sensitive.filter.type 0
sensitive.filter.type 2
## 敏感词添加或者删除有2种方式,一种是通过Server API进行,这种方式会立即生效。另外一种方法是修改数据库,直接中数据库的t_sensitive_word表中处理
## 修改数据库的方法不会立即生效,IM服务会2个小时重新加载一次敏感词。所以如果直接修改敏感词表,需要等2个小时,或者重启才能生效。
## 如果内置敏感词库无法满足您的需求,可以开发部署独立敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址,内置的敏感词审核和敏感词转发功能就不再起作用了。
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
+10 -1
View File
@@ -9,6 +9,7 @@ server {
root html;
index index.html index.htm index.php;
#同步服务设置
location /route {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
@@ -16,7 +17,7 @@ server {
proxy_pass http://imserver;
}
#社区版需要启用下面一段,专业版不能用
#客户端短连接业务
location /im {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
@@ -24,14 +25,21 @@ server {
proxy_pass http://imserver;
}
#版本检查/api/version,可以删掉
location /api {
proxy_pass http://imserver;
}
#内置文件上传和下载
location /fs {
client_max_body_size 200M;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://imserver;
}
#机器人API
location /robot {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
@@ -39,6 +47,7 @@ server {
proxy_pass http://imserver;
}
#频道API
location /channel {
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
+1 -1
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.1</version>
<version>1.3.4</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -0,0 +1,61 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
package com.xiaoleilu.loServer.action.admin;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.WFCMessage;
import com.xiaoleilu.loServer.RestResult;
import com.xiaoleilu.loServer.annotation.HttpMethod;
import com.xiaoleilu.loServer.annotation.Route;
import com.xiaoleilu.loServer.handler.Request;
import com.xiaoleilu.loServer.handler.Response;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.netty.util.internal.StringUtil;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@Route(APIPath.User_Batch_Get_Infos)
@HttpMethod("POST")
public class GetBatchUserAction extends AdminAction {
@Override
public boolean isTransactionAction() {
return true;
}
@Override
public boolean action(Request request, Response response) {
if (request.getNettyRequest() instanceof FullHttpRequest) {
InputStringList inputUserId = getRequestBody(request.getNettyRequest(), InputStringList.class);
if (inputUserId != null && inputUserId.getList() != null && !inputUserId.getList().isEmpty()) {
OutputUserInfoList res = new OutputUserInfoList();
res.userInfos = new ArrayList<>();
for (String userId : inputUserId.getList()) {
WFCMessage.User user = messagesStore.getUserInfo(userId);
if(user == null || StringUtil.isNullOrEmpty(user.getName())) {
continue;
}
InputOutputUserInfo inputOutputUserInfo = InputOutputUserInfo.fromPbUser(user);
res.userInfos.add(inputOutputUserInfo);
}
RestResult result = RestResult.ok(res);
setResponseContent(result, response);
} else {
setResponseContent(RestResult.resultOf(ErrorCode.INVALID_PARAMETER), response);
}
}
return true;
}
}
@@ -152,6 +152,7 @@ public final class BrokerConstants {
public static final String MESSAGE_Disable_Stranger_Chat = "message.disable_stranger_chat";
public static final String MESSAGE_Allow_Stranger_Chat_List = "message.allow_stranger_chat_list";
public static final String MESSAGE_Allow_Stranger_Line = "message.allow_stranger_line";
public static final String MESSAGE_Blacklist_Strategy = "message.blacklist.strategy";
public static final String MESSAGE_Blacklist_Allow_Send = "message.blacklist.allow_send_to_black";
@@ -152,7 +152,7 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Private) {
if(!m_messagesStore.getBlackListExceptionTypes().contains(message.getContent().getType())) {
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser);
errorCode = m_messagesStore.isAllowUserMessage(message.getConversation().getTarget(), fromUser, message.getConversation().getLine());
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
if (errorCode == ErrorCode.ERROR_CODE_IN_BLACK_LIST && mBlacklistStrategy != ProtoConstants.BlacklistStrategy.Message_Reject) {
ignoreMsg = true;
@@ -165,6 +165,7 @@ public class MemoryMessagesStore implements IMessagesStore {
private boolean mMobileDefaultSilentWhenPCOnline = true;
private boolean mDisableStrangerChat = false;
private Set<String> mAllowStrangerChatSet = new HashSet<>();
private Set<Integer> mAllowStrangerLineSet = new HashSet<>();
private boolean mDisableStrangerAddGroup = false;
private boolean mIDUseUUID = true;
@@ -265,6 +266,18 @@ public class MemoryMessagesStore implements IMessagesStore {
e.printStackTrace();
}
try {
String allowStrangerList = m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Allow_Stranger_Line);
if(!StringUtil.isNullOrEmptyAfterTrim(allowStrangerList)) {
allowStrangerList = allowStrangerList.replace(",", ",");
for (String s : allowStrangerList.split(",")) {
mAllowStrangerLineSet.add(Integer.parseInt(s.trim()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
try {
String forcePushTypes = m_Server.getConfig().getProperty(BrokerConstants.MESSAGE_Force_Push_Types);
if(!StringUtil.isNullOrEmptyAfterTrim(forcePushTypes)) {
@@ -733,7 +746,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
pullType = ProtoConstants.PullType.Pull_Normal;
} else if (type == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
boolean isDirect = !StringUtil.isNullOrEmpty(message.getToUser());
boolean isDirect = !StringUtil.isNullOrEmpty(message.getToUser()) || !message.getToList().isEmpty();
Collection<UserClientEntry> entries = getChatroomMembers(message.getConversation().getTarget());
for (UserClientEntry entry : entries) {
if (isDirect) {
@@ -741,6 +754,9 @@ public class MemoryMessagesStore implements IMessagesStore {
notifyReceivers.add(message.getToUser());
break;
}
if (message.getToList().contains(entry.userId)) {
notifyReceivers.add(entry.userId);
}
} else {
notifyReceivers.add(entry.userId);
}
@@ -884,11 +900,13 @@ public class MemoryMessagesStore implements IMessagesStore {
session.setPullHistoryMsg(true);
}
long previousCurrent;
while (true) {
Map.Entry<Long, Long> entry = maps.higherEntry(current);
if (entry == null) {
break;
}
previousCurrent = current;
current = entry.getKey();
long targetMessageId = entry.getValue();
@@ -917,6 +935,8 @@ public class MemoryMessagesStore implements IMessagesStore {
if (size >= 512 * 1024) { //3M
if(builder.getMessageCount() == 0){
builder.addMessage(bundle.getMessage());
} else {
current = previousCurrent;
}
break;
}
@@ -2250,15 +2270,29 @@ public class MemoryMessagesStore implements IMessagesStore {
}
//check the new owner is in member list? is that necessary?
long updateDt = System.currentTimeMillis();
groupInfo = groupInfo.toBuilder().setOwner(newOwner).setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build();
mIMap.set(groupId, groupInfo);
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
if (members == null || members.size() == 0) {
members = loadGroupMemberFromDB(hzInstance, groupId);
}
boolean isNewOwnerInGroup = false;
for (WFCMessage.GroupMember member : members) {
if (member.getMemberId().equals(newOwner)) {
if(member.getType() != GroupMemberType_Removed) {
isNewOwnerInGroup = true;
}
break;
}
}
if(!isNewOwnerInGroup) {
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
}
long updateDt = System.currentTimeMillis();
groupInfo = groupInfo.toBuilder().setOwner(newOwner).setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build();
mIMap.set(groupId, groupInfo);
int modifyMemeberCount = 0;
for (WFCMessage.GroupMember member : members) {
if (modifyMemeberCount == 2) {
@@ -2424,7 +2458,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
boolean isExpired = false;
if (!canRecall && message.getFromUser().equals(operatorId)) {
if (now - message.getServerTimestamp() > mRecallTimeLimit * 1000) {
if (mRecallTimeLimit > 0 && now - message.getServerTimestamp() > mRecallTimeLimit * 1000) {
isExpired = true;
} else {
canRecall = true;
@@ -3193,7 +3227,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public ErrorCode isAllowUserMessage(String targetUser, String fromUser) {
public ErrorCode isAllowUserMessage(String targetUser, String fromUser, int line) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
@@ -3220,7 +3254,7 @@ public class MemoryMessagesStore implements IMessagesStore {
if (mDisableStrangerChat) {
//在禁止私聊时,是否是允许私聊的用户id
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser)) {
if(mAllowStrangerChatSet.contains(targetUser) || mAllowStrangerChatSet.contains(fromUser) || mAllowStrangerLineSet.contains(line)) {
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -140,7 +140,7 @@ public class Server {
Runtime.getRuntime().addShutdownHook(new Thread(instance::stopServer));
Runtime.getRuntime().addShutdownHook(new Thread(httpServer::shutdown));
System.out.println("Wildfire IM server start success...");
System.out.println("Wildfire IM server start success.");
}
/**
@@ -185,7 +185,7 @@ public interface IMessagesStore {
ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head);
FriendData getFriendData(String fromUser, String targetUserId);
ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);
ErrorCode isAllowUserMessage(String fromUser, String userId);
ErrorCode isAllowUserMessage(String fromUser, String userId, int line);
ErrorCode isBlacked(String fromUser, String userId);
ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head);
ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] head);
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.1</version>
<version>1.3.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
@@ -157,5 +157,17 @@ public interface APIPath {
String Robot_Group_Transfer = "/robot/group/transfer";
String Robot_Group_Set_Manager = "/robot/group/manager/set";
String Robot_Moments_Post_Feed = "/robot/moments/feed/post";
String Robot_Moments_Pull_Feeds = "/robot/moments/feed/pull";
String Robot_Moments_Update_Feed = "/robot/moments/feed/update";
String Robot_Moments_Post_Comment = "/robot/moments/comment/post";
String Robot_Moments_Pull_Comment = "/robot/moments/comment/pull";
String Robot_Moments_Fetch_Feed = "/robot/moments/feed/pull_one";
String Robot_Moments_Fetch_Profiles = "/robot/moments/profiles/pull";
String Robot_Moments_Recall_Comment = "/robot/moments/comment/recall";
String Robot_Moments_Recall_Feed = "/robot/moments/feed/recall";
String Robot_Moments_Update_Profiles_List_Value = "/robot/moments/profiles/list/push";
String Robot_Moments_Update_Profiles_Value = "/robot/moments/profiles/value/push";
String Robot_Conference_Request = "/robot/conference/request";
}
@@ -0,0 +1,22 @@
package cn.wildfirechat.pojos;
import java.util.List;
public class InputStringList {
private List<String> list;
public InputStringList() {
}
public InputStringList(List<String> list) {
this.list = list;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
@@ -0,0 +1,38 @@
package cn.wildfirechat.pojos.moments;
import java.util.List;
public class CommentMsgPojo {
//commentId;
public long commentId;
//sender;
public String sender;
//timestamp
public long serverTime;
//feedId
public long feedId;
//type
public int type;
//content
public String text;
//to replyTo
public String replyTo;
//extra
public String extra;
public int ftype;
public String fcontent;
public String fsender;
public List<MediaEntry> fmedias;
}
@@ -0,0 +1,30 @@
package cn.wildfirechat.pojos.moments;
public class CommentPojo {
//commentId;
public long commentId;
//replyId;
public long replyId;
//sender;
public String sender;
//timestamp
public long timestamp;
//feedId
public long feedId;
//type
public int type;
//content
public String text;
//to replyTo
public String replyTo;
//extra
public String extra;
}
@@ -0,0 +1,38 @@
package cn.wildfirechat.pojos.moments;
import java.util.List;
public class FeedPojo {
//feedid
public long feedId;
//sender
public String sender;
//timestamp
public long timestamp;
//type
public int type;
//content
public String text;
//media urls
public List<MediaEntry> medias;
//to users
public List<String> to;
//excloud users
public List<String> ex;
//mentioned users
public List<String> mu;
//extra
public String extra;
public List<CommentPojo> comments;
}
@@ -0,0 +1,7 @@
package cn.wildfirechat.pojos.moments;
import java.util.List;
public class FeedsPojo {
public List<FeedPojo> feeds;
}
@@ -0,0 +1,9 @@
package cn.wildfirechat.pojos.moments;
public class IdPojo {
//feedid
public long id;
//feedid
public long id2;
}
@@ -0,0 +1,8 @@
package cn.wildfirechat.pojos.moments;
public class MediaEntry {
public String m;
public String t;
public int w;
public int h;
}
@@ -0,0 +1,14 @@
package cn.wildfirechat.pojos.moments;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class MomentProfilePojo {
public String bgUrl;
public List<String> blackList;
public List<String> blockList;
//stranger visiable count
public int svc;
public int visiableScope;
}
@@ -0,0 +1,11 @@
package cn.wildfirechat.pojos.moments;
public class PostFeedResult {
public long id;
public long timestamp;
public PostFeedResult(long id, long timestamp) {
this.id = id;
this.timestamp = timestamp;
}
}
@@ -0,0 +1,11 @@
package cn.wildfirechat.pojos.moments;
import java.util.List;
public class PullCommentsRequestPojo {
public static class IdPair {
public long fid;
public long cid;
}
public List<IdPair> ids;
}
@@ -0,0 +1,8 @@
package cn.wildfirechat.pojos.moments;
public class PullFeedRequestPojo {
//feedid
public long feedId;
public int count;
public String user;
}
@@ -0,0 +1,5 @@
package cn.wildfirechat.pojos.moments;
public class PullOneFeedRequestPojo {
public long feedId;
}
@@ -0,0 +1,9 @@
package cn.wildfirechat.pojos.moments;
public class PullProfileRequestPojo {
//userId
public String u;
//update date
public long d;
}
@@ -0,0 +1,14 @@
package cn.wildfirechat.pojos.moments;
import java.util.List;
public class PushProfileListRequestPojo {
//block or black
public boolean b;
//add user list
public List<String> al;
//remove user list
public List<String> rl;
}
@@ -0,0 +1,16 @@
package cn.wildfirechat.pojos.moments;
public class PushProfileValueRequestPojo {
/*
WFMUpdateUserProfileType_BackgroudUrl,
WFMUpdateUserProfileType_StrangerVisiableCount,
WFMUpdateUserProfileType_VisiableScope
*/
public int t;
//string value depends on t
public String v;
//int value depends on t
public int i;
}
@@ -347,6 +347,25 @@ public class ProtoConstants {
int Forbidden_Mute_Group_Member = 0x800;
}
public interface MomentsContentType {
int Moments_Content_Text_Type = 0;
int Moments_Content_Image_Type = 1;
int Moments_Content_Video_Type = 2;
int Moments_Content_Link_Type = 3;
}
public interface MomentsCommentType {
int Moments_Comment_Text_Type = 0;
int Moments_Comment_Thumbup_Type = 1;
}
public interface MomentsVisibleScope {
int Moments_VisibleScope_NoLimit = 0;
int Moments_VisibleScope_3Days = 1;
int Moments_VisibleScope_1Month = 2;
int Moments_VisibleScope_6Months = 3;
};
public static final int MESSAGE_CONTENT_TYPE_CREATE_GROUP = 104;
public static final int MESSAGE_CONTENT_TYPE_ADD_GROUP_MEMBER = 105;
public static final int MESSAGE_CONTENT_TYPE_KICKOF_GROUP_MEMBER = 106;
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.1</version>
<version>1.3.4</version>
</parent>
<artifactId>distribution</artifactId>
@@ -93,6 +93,9 @@ message.disable_stranger_chat false
##当禁止陌生人聊天时,允许聊天的用户id,比如管理员或者文件传输助手等。用户id以英文逗号分割。
message.allow_stranger_chat_list admin,FireRobot,wfc_file_transfer
##当禁止陌生人聊天时,允许聊天的线路。
#message.allow_stranger_line 100,101
##黑名单策略,0 发送失败,返回被拉黑的错误码;1 发送成功但消息被服务器直接丢弃
message.blacklist.strategy 0
@@ -322,7 +325,7 @@ server.mobile_default_silent_when_pc_online true
## 客户端是否支持kickoff事件。当客户端被其他端登录踢出时,如果此开关为false时,客户端协议栈上报secret_mismatch。如果此开关为ture时,客户端协议栈上报kicked_off。
## 客户端被踢时上报kicked_off是在2021.9.15之后才加上的。如果客户端协议栈全部为此日期之后的版本才可以打开此开关。
server.client_support_kickoff_event false
server.client_support_kickoff_event true
#*********************************************************************
# Push server configuration
@@ -423,7 +426,10 @@ push.harmony.server.address http://localhost:8085/harmony/push
## 内置文本敏感词过滤处理方法,当命中敏感词后,消息会被记录到t_sensitive_messages表中,然后根据type类型做不同的处理,处理方式如下:
## 0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成***然后正常发送;3 正常发送。
## 如果开启 message.sensitive.forward.url 配置,命中敏感词的消息还会被回调到这个地址
sensitive.filter.type 0
sensitive.filter.type 2
## 敏感词添加或者删除有2种方式,一种是通过Server API进行,这种方式会立即生效。另外一种方法是修改数据库,直接中数据库的t_sensitive_word表中处理
## 修改数据库的方法不会立即生效,IM服务会2个小时重新加载一次敏感词。所以如果直接修改敏感词表,需要等2个小时,或者重启才能生效。
## 如果内置敏感词库无法满足您的需求,可以开发部署独立敏感词审核服务。配置如下地址和消息类型,IM服务会把指定消息类型的消息回调到指定地址,内置的敏感词审核和敏感词转发功能就不再起作用了。
## 审核服务返回状态码200表示继续发送,如果需要替换内容,返回状态码200并且内容为替换后的内容。返回403表示不允许发送。其它错误继续发送。
@@ -90,7 +90,8 @@ JAVA_OPTS="$JAVA_OPTS -XX:MaxGCPauseMillis=500"
#JAVA_OPTS="$JAVA_OPTS --add-modules java.se --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.management/sun.management=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED"
echo "警告:没有设置JVM内存参数!"
echo "请设置JVM参数Xmx和Xms,设置为您为IM服务预留的内存大小,注意需要刨除操作系统占用,如果有其它系统也需要相应去除占用。"
echo "请设置JVM参数Xmx和Xms,设置为您为IM服务预留的内存大小,注意需要刨除操作系统占用,如果有其它系统也需要相应去除占用,还需要减去堆外内存占用。"
echo "建议设置为总内存的60%以下,比如16G总内存,Xmx可以设置为9G"
echo ""
#JAVA_OPTS="$JAVA_OPTS -Xmx2G"
#JAVA_OPTS="$JAVA_OPTS -Xms2G"
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>1.3.1</version>
<version>1.3.4</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+20
View File
@@ -12,6 +12,26 @@
# 更新记录
--------------
Release note 1.3.4:
1. 优化Server SDK中消息内容的处理方式。
2. Server SDK中添加注册消息接口,在使用自定义消息时,不需要修改Server SDK源码。
3. 用户撤回时间配置允许为负数,为负数时可以任意时间撤回。
4. Server SDK添加超时参数。
5. 解决当分段拉取消息时,可能丢失消息的问题。
--------------
Release note 1.3.3:
1. 转移群组时检查新群主是否在群中。
2. 机器人API添加定向消息接口。
--------------
Release note 1.3.2:
1. 机器人Server SDK添加朋友圈相关接口。
2. Server API添加批量获取用户接口。
3. 解决聊天室定向消息无效的问题。
4. 添加配置,可以在禁止私聊时添加例外聊天线路。
--------------
Release note 1.3.1:
1. 透传消息去掉消息ID,减少消息传输大小。
+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.1</version>
<version>1.3.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
File diff suppressed because one or more lines are too long
@@ -1,7 +1,9 @@
package cn.wildfirechat.sdk;
import cn.wildfirechat.common.APIPath;
import cn.wildfirechat.common.ErrorCode;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.pojos.moments.*;
import cn.wildfirechat.sdk.model.IMResult;
import cn.wildfirechat.sdk.utilities.RobotHttpUtils;
import org.apache.commons.codec.digest.DigestUtils;
@@ -22,10 +24,15 @@ public class RobotService {
}
public IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception {
return sendMessage(sender, conversation, payload, null);
}
public IMResult<SendMessageResult> sendMessage(String sender, Conversation conversation, MessagePayload payload, List<String> toUsers) throws Exception {
String path = APIPath.Robot_Message_Send;
SendMessageData messageData = new SendMessageData();
messageData.setSender(sender);
messageData.setConv(conversation);
messageData.setToUsers(toUsers);
messageData.setPayload(payload);
return robotHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class);
}
@@ -96,7 +103,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, pojo, Void.class);
}
public IMResult<OutputCreateGroupResult> createGroup(PojoGroupInfo group_info, List<PojoGroupMember> members, String member_extra, 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;
PojoGroup pojoGroup = new PojoGroup();
pojoGroup.setGroup_info(group_info);
@@ -118,7 +125,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class);
}
public IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> dismissGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Dismiss;
InputDismissGroup dismissGroup = new InputDismissGroup();
dismissGroup.setGroup_id(groupId);
@@ -127,7 +134,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, dismissGroup, Void.class);
}
public IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> transferGroup(String groupId, String newOwner, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Transfer;
InputTransferGroup transferGroup = new InputTransferGroup();
transferGroup.setGroup_id(groupId);
@@ -137,7 +144,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, transferGroup, Void.class);
}
public IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> modifyGroupInfo(String groupId, /*ModifyGroupInfoType*/int type, String value, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Modify_Info;
InputModifyGroupInfo modifyGroupInfo = new InputModifyGroupInfo();
modifyGroupInfo.setGroup_id(groupId);
@@ -164,7 +171,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, input, PojoGroupMember.class);
}
public IMResult<Void> addGroupMembers(String groupId, List<PojoGroupMember> groupMembers, String member_extra, 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;
InputAddGroupMember addGroupMember = new InputAddGroupMember();
addGroupMember.setGroup_id(groupId);
@@ -175,7 +182,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> setGroupManager(String groupId, List<String> groupMemberIds, boolean isManager, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Set_Manager;
InputSetGroupManager addGroupMember = new InputSetGroupManager();
addGroupMember.setGroup_id(groupId);
@@ -186,7 +193,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> muteGroupMember(String groupId, List<String> groupMemberIds, boolean isMute, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Mute_Member;
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
addGroupMember.setGroup_id(groupId);
@@ -197,7 +204,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> allowGroupMember(String groupId, List<String> groupMemberIds, boolean isAllow, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Allow_Member;
InputMuteGroupMember addGroupMember = new InputMuteGroupMember();
addGroupMember.setGroup_id(groupId);
@@ -208,7 +215,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, addGroupMember, Void.class);
}
public IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> kickoffGroupMembers(String groupId, List<String> groupMemberIds, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Member_Kickoff;
InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember();
kickoffGroupMember.setGroup_id(groupId);
@@ -218,7 +225,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class);
}
public IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> quitGroup(String groupId, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Member_Quit;
InputQuitGroup quitGroup = new InputQuitGroup();
quitGroup.setGroup_id(groupId);
@@ -227,7 +234,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, quitGroup, Void.class);
}
public IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> setGroupMemberAlias(String groupId, String memberId, String alias, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Set_Member_Alias;
InputSetGroupMemberAlias input = new InputSetGroupMemberAlias();
input.setGroup_id(groupId);
@@ -238,7 +245,7 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, input, Void.class);
}
public IMResult<Void> setGroupMemberExtra(String groupId, String memberId, String extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
public IMResult<Void> setGroupMemberExtra(String groupId, String memberId, String extra, List<Integer> to_lines, MessagePayload notify_message) throws Exception {
String path = APIPath.Robot_Group_Set_Member_Extra;
InputSetGroupMemberExtra input = new InputSetGroupMemberExtra();
input.setGroup_id(groupId);
@@ -276,4 +283,144 @@ public class RobotService {
return robotHttpUtils.httpJsonPost(path, input, String.class);
}
public IMResult<FeedPojo> postMomentsFeed(int/*MomentsContentType*/ type, String text, List<MediaEntry> medias, List<String> toUsers, List<String> excludeUsers, List<String> mentionedUsers, String extra) throws Exception {
String path = APIPath.Robot_Moments_Post_Feed;
FeedPojo feedPojo = new FeedPojo();
feedPojo.type = type;
feedPojo.text = text;
feedPojo.medias = medias;
feedPojo.to = toUsers;
feedPojo.ex = excludeUsers;
feedPojo.mu = mentionedUsers;
feedPojo.extra = extra;
IMResult<PostFeedResult> imResult = robotHttpUtils.httpJsonPost(path, feedPojo, PostFeedResult.class);
IMResult<FeedPojo> feedResult = new IMResult<>();
if(imResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
feedPojo.feedId = imResult.result.id;
feedPojo.timestamp = imResult.result.timestamp;
feedResult.setCode(ErrorCode.ERROR_CODE_SUCCESS.getCode());
feedResult.setResult(feedPojo);
} else {
feedResult.setCode(imResult.getCode());
feedResult.setMsg(imResult.getMsg());
}
return feedResult;
}
public IMResult<Void> updateMomentsFeed(long feedId, int/*MomentsContentType*/ type, String text, List<MediaEntry> medias, List<String> toUsers, List<String> excludeUsers, List<String> mentionedUsers, String extra) throws Exception {
String path = APIPath.Robot_Moments_Update_Feed;
FeedPojo feedPojo = new FeedPojo();
feedPojo.feedId = feedId;
feedPojo.type = type;
feedPojo.text = text;
feedPojo.medias = medias;
feedPojo.to = toUsers;
feedPojo.ex = excludeUsers;
feedPojo.mu = mentionedUsers;
feedPojo.extra = extra;
return robotHttpUtils.httpJsonPost(path, feedPojo, Void.class);
}
public IMResult<FeedsPojo> getMomentsFeeds(long feedId, int count, String user) throws Exception {
String path = APIPath.Robot_Moments_Pull_Feeds;
PullFeedRequestPojo requestPojo = new PullFeedRequestPojo();
requestPojo.feedId = feedId;
requestPojo.count = count;
requestPojo.user = user;
return robotHttpUtils.httpJsonPost(path, requestPojo, FeedsPojo.class);
}
public IMResult<FeedPojo> getMomentsFeed(long feedId) throws Exception {
String path = APIPath.Robot_Moments_Fetch_Feed;
PullOneFeedRequestPojo requestPojo = new PullOneFeedRequestPojo();
requestPojo.feedId = feedId;
return robotHttpUtils.httpJsonPost(path, requestPojo, FeedPojo.class);
}
public IMResult<Void> deleteMomentsFeed(long feedId) throws Exception {
String path = APIPath.Robot_Moments_Recall_Feed;
IdPojo requestPojo = new IdPojo();
requestPojo.id = feedId;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<CommentPojo> postMomentsComment(long feedId, long replyId, int/*MomentsCommentType*/ type, String text, String replyTo, String extra) throws Exception {
String path = APIPath.Robot_Moments_Post_Comment;
CommentPojo commentPojo = new CommentPojo();
commentPojo.type = type;
commentPojo.text = text;
commentPojo.replyId = replyId;
commentPojo.feedId = feedId;
commentPojo.replyTo = replyTo;
commentPojo.extra = extra;
IMResult<PostFeedResult> imResult = robotHttpUtils.httpJsonPost(path, commentPojo, PostFeedResult.class);
IMResult<CommentPojo> feedResult = new IMResult<>();
if(imResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
commentPojo.commentId = imResult.result.id;
commentPojo.timestamp = imResult.result.timestamp;
feedResult.setCode(ErrorCode.ERROR_CODE_SUCCESS.getCode());
feedResult.setResult(commentPojo);
} else {
feedResult.setCode(imResult.getCode());
feedResult.setMsg(imResult.getMsg());
}
return feedResult;
}
public IMResult<Void> deleteMomentsComment(long feedId, long commentId) throws Exception {
String path = APIPath.Robot_Moments_Recall_Comment;
IdPojo requestPojo = new IdPojo();
requestPojo.id = commentId;
requestPojo.id2 = feedId;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<MomentProfilePojo> getUserMomentsProfile(String userId) throws Exception {
String path = APIPath.Robot_Moments_Fetch_Profiles;
PullProfileRequestPojo requestPojo = new PullProfileRequestPojo();
requestPojo.u = userId;
return robotHttpUtils.httpJsonPost(path, requestPojo, MomentProfilePojo.class);
}
public IMResult<Void> updateMomentsBackgroundUrl(String url) throws Exception {
String path = APIPath.Robot_Moments_Update_Profiles_Value;
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
requestPojo.t = 0;
requestPojo.v = url;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<Void> updateMomentsStrangerVisibleCount(int count) throws Exception {
String path = APIPath.Robot_Moments_Update_Profiles_Value;
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
requestPojo.t = 1;
requestPojo.i = count;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<Void> updateMomentsVisibleScope(int/*MomentsVisibleScope*/ scope) throws Exception {
String path = APIPath.Robot_Moments_Update_Profiles_Value;
PushProfileValueRequestPojo requestPojo = new PushProfileValueRequestPojo();
requestPojo.t = 2;
requestPojo.i = scope;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<Void> updateMomentsBlackList(List<String> addList, List<String> removeList) throws Exception {
String path = APIPath.Robot_Moments_Update_Profiles_List_Value;
PushProfileListRequestPojo requestPojo = new PushProfileListRequestPojo();
requestPojo.b = false;
requestPojo.al = addList;
requestPojo.rl = removeList;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
public IMResult<Void> updateMomentsBlockList(List<String> addList, List<String> removeList) throws Exception {
String path = APIPath.Robot_Moments_Update_Profiles_List_Value;
PushProfileListRequestPojo requestPojo = new PushProfileListRequestPojo();
requestPojo.b = true;
requestPojo.al = addList;
requestPojo.rl = removeList;
return robotHttpUtils.httpJsonPost(path, requestPojo, Void.class);
}
}
@@ -5,6 +5,8 @@ import cn.wildfirechat.pojos.*;
import cn.wildfirechat.sdk.model.IMResult;
import cn.wildfirechat.sdk.utilities.AdminHttpUtils;
import java.util.List;
public class UserAdmin {
public static IMResult<InputOutputUserInfo> getUserByName(String name) throws Exception {
String path = APIPath.User_Get_Info;
@@ -37,6 +39,13 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, input, OutputGetUserList.class);
}
public static IMResult<OutputUserInfoList> getBatchUsers(List<String> userIds) throws Exception {
String path = APIPath.User_Batch_Get_Infos;
InputStringList input = new InputStringList();
input.setList(userIds);
return AdminHttpUtils.httpJsonPost(path, input, OutputUserInfoList.class);
}
public static IMResult<OutputCreateUser> createUser(InputOutputUserInfo user) throws Exception {
String path = APIPath.Create_User;
return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class);
@@ -32,7 +32,7 @@ public class ArticlesMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(topArticle.title);
JSONObject object = new JSONObject();
@@ -53,6 +53,7 @@ public class ArticlesMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
try {
super.decode(payload);
JSONObject object = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
JSONObject topObj = (JSONObject) object.get("top");
this.topArticle = Article.fromJson(topObj);
@@ -133,7 +133,7 @@ public class CallStartMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setContent(callId);
payload.setPushContent("音视频通话邀请");
@@ -175,6 +175,7 @@ public class CallStartMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
callId = payload.getContent();
try {
@@ -100,7 +100,7 @@ public class CardMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setContent(target);
JSONObject objWrite = new JSONObject();
objWrite.put("t", type);
@@ -116,6 +116,7 @@ public class CardMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
target = payload.getContent();
try {
if (!StringUtil.isNullOrEmpty(payload.getBase64edData())) {
@@ -26,7 +26,7 @@ public class FileMessageContent extends MediaMessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(name);
payload.setContent(size + "");
@@ -51,7 +51,7 @@ public class FileMessageContent extends MediaMessageContent {
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
if (payload.getSearchableContent().startsWith(FILE_NAME_PREFIX)) {
name = payload.getSearchableContent().substring(payload.getSearchableContent().indexOf(FILE_NAME_PREFIX) + FILE_NAME_PREFIX.length());
@@ -34,7 +34,7 @@ public class ImageMessageContent extends MediaMessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent("[图片]");
payload.setBase64edData(Base64.getEncoder().encodeToString(thumbnailBytes));
@@ -44,7 +44,7 @@ public class ImageMessageContent extends MediaMessageContent {
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
thumbnailBytes = Base64.getDecoder().decode(payload.getBase64edData());
}
@@ -72,9 +72,7 @@ public class LinkMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(title);
JSONObject objWrite = new JSONObject();
objWrite.put("d", contentDigest);
@@ -88,9 +86,8 @@ public class LinkMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
title = payload.getSearchableContent();
try {
if (!StringUtil.isNullOrEmpty(payload.getBase64edData())) {
JSONObject jsonObject = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
@@ -66,7 +66,7 @@ public class LocationMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(title);
payload.setBase64edData(Base64.getEncoder().encodeToString(this.thumbnailByte));
@@ -82,6 +82,7 @@ public class LocationMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
if (!StringUtil.isNullOrEmpty(payload.getBase64edData())) {
this.thumbnailByte = Base64.getDecoder().decode(payload.getBase64edData());
}
@@ -14,12 +14,18 @@ abstract public class MediaMessageContent extends MessageContent {
}
@Override
protected MessagePayload encodeBase() {
MessagePayload payload = super.encodeBase();
public MessagePayload encode() {
MessagePayload payload = super.encode();
payload.setRemoteMediaUrl(remoteMediaUrl);
payload.setMediaType(getMediaType());
return payload;
}
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
remoteMediaUrl = payload.getRemoteMediaUrl();
}
protected abstract int getMediaType();
}
@@ -22,7 +22,7 @@ public abstract class MessageContent {
return this;
}
protected MessagePayload encodeBase() {
public MessagePayload encode() {
MessagePayload payload = new MessagePayload();
payload.setType(getContentType());
payload.setPersistFlag(getPersistFlag());
@@ -32,13 +32,11 @@ public abstract class MessageContent {
return payload;
}
protected void decodeBase(MessagePayload payload) {
protected void decode(MessagePayload payload) {
this.mentionedType = payload.getMentionedType();
this.mentionedTargets = payload.getMentionedTarget();
this.extra = payload.getExtra();
}
abstract public int getContentType();
abstract public int getPersistFlag();
abstract public MessagePayload encode();
abstract public void decode(MessagePayload payload);
}
@@ -12,7 +12,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MessageContentFactory {
private static final Map<Integer, Class<MessageContent>> contentClassMap = new ConcurrentHashMap<>();
private static final Map<Integer, Class<? extends MessageContent>> contentClassMap = new ConcurrentHashMap<>();
static {
registerAllMessageContent();
@@ -36,7 +36,7 @@ public class MessageContentFactory {
}
public static MessageContent decodeMessageContent(MessagePayload messagePayload) {
Class<MessageContent> cls = contentClassMap.get(messagePayload.getType());
Class<? extends MessageContent> cls = contentClassMap.get(messagePayload.getType());
MessageContent messageContent;
if(cls != null) {
try {
@@ -49,11 +49,15 @@ public class MessageContentFactory {
} else {
messageContent = new UnknownMessageContent();
}
messageContent.decodeBase(messagePayload);
messageContent.decode(messagePayload);
return messageContent;
}
public static void registerCustomMessageContent(Class<? extends MessageContent> cls) throws Exception {
MessageContent content = cls.newInstance();
contentClassMap.put(content.getContentType(), cls);
}
private static void registerAllMessageContent() {
try {
for (Class cls : ClassUtil.getAllAssignedClass(MessageContent.class)) {
@@ -43,7 +43,7 @@ public class MultiCallOngoingMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setContent(callId);
JSONObject object = new JSONObject();
object.put("initiator", this.initiator);
@@ -60,6 +60,7 @@ public class MultiCallOngoingMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
this.callId = payload.getContent();
try {
JSONObject object = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
@@ -57,7 +57,7 @@ public class NotDeliveredMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
JSONObject obj = new JSONObject();
obj.put("mid", this.messageUid);
obj.put("all", this.allFailure);
@@ -74,7 +74,7 @@ public class NotDeliveredMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
try {
super.decode(payload);
JSONObject obj = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
this.messageUid = (long) obj.get("mid");
this.allFailure = (boolean) obj.get("all");
@@ -89,7 +89,7 @@ public class RichNotificationMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = encodeBase();
MessagePayload payload = super.encode();
payload.setPushContent(title);
payload.setContent(desc);
JSONObject jsonObject = new JSONObject();
@@ -113,5 +113,6 @@ public class RichNotificationMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
}
}
@@ -35,11 +35,12 @@ public class SoundMessageContent extends MediaMessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
}
@Override
public MessagePayload encode() {
MessagePayload payload = encodeBase();
MessagePayload payload = super.encode();
JSONObject jsonObject = new JSONObject();
jsonObject.put("duration", duration);
payload.setContent(jsonObject.toJSONString());
@@ -34,7 +34,7 @@ public class StickerMessageContent extends MediaMessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent("[动态表情]");
JSONObject objWrite = new JSONObject();
objWrite.put("x", width);
@@ -47,8 +47,7 @@ public class StickerMessageContent extends MediaMessageContent {
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
try {
JSONObject jsonObject = (JSONObject) new JSONParser().parse(new String(Base64.getDecoder().decode(payload.getBase64edData())));
width = (int) jsonObject.get("x");
@@ -38,13 +38,14 @@ public class StreamTextGeneratedMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
this.streamId = payload.getContent();
this.text = payload.getSearchableContent();
}
@Override
public MessagePayload encode() {
MessagePayload payload = encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(text);
payload.setContent(streamId);
return payload;
@@ -38,13 +38,14 @@ public class StreamTextGeneratingMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
streamId = payload.getContent();
text = payload.getSearchableContent();
}
@Override
public MessagePayload encode() {
MessagePayload payload = encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(text);
payload.setContent(streamId);
return payload;
@@ -56,7 +56,7 @@ public class TextMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent(text);
if(quoteInfo != null) {
payload.setBase64edData(Base64.getEncoder().encodeToString(quoteInfo.encode().toJSONString().getBytes(StandardCharsets.UTF_8)));
@@ -66,6 +66,7 @@ public class TextMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decode(payload);
text = payload.getSearchableContent();
if(!TextUtils.isEmpty(payload.getBase64edData())) {
String jsonStr = new String(Base64.getDecoder().decode(payload.getBase64edData()), StandardCharsets.UTF_8);
@@ -24,7 +24,7 @@ public class TipNotificationMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setContent(tip);
return payload;
@@ -32,7 +32,7 @@ public class TipNotificationMessageContent extends MessageContent {
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
tip = payload.getContent();
}
@@ -43,14 +43,14 @@ public class TypingMessageContent extends MessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setContent(typingType + "");
return payload;
}
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
typingType = Integer.parseInt(payload.getContent());
}
}
@@ -58,7 +58,7 @@ public class VideoMessageContent extends MediaMessageContent {
@Override
public MessagePayload encode() {
MessagePayload payload = super.encodeBase();
MessagePayload payload = super.encode();
payload.setSearchableContent("[视频]");
payload.setBase64edData(Base64.getEncoder().encodeToString(thumbnailBytes));
@@ -73,7 +73,7 @@ public class VideoMessageContent extends MediaMessageContent {
@Override
public void decode(MessagePayload payload) {
super.decodeBase(payload);
super.decode(payload);
thumbnailBytes = Base64.getDecoder().decode(payload.getBase64edData());
try {
JSONObject jsonObject = (JSONObject) new JSONParser().parse(payload.getContent());
@@ -38,11 +38,24 @@ public class AdminHttpUtils extends JsonUtils {
private static CloseableHttpClient httpClient;
public static void init(String url, String secret) {
adminUrl = url;
adminSecret = secret;
init(url, secret, 15000);
}
public static void init(String url, String secret, int timeout) {
adminUrl = url.trim();
adminSecret = secret.trim();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setValidateAfterInactivity(1000);
int connectTimeout = 5000; // 连接超时时间
int connectionRequestTimeout = 3000; // 从连接池获取连接的超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(timeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.evictExpiredConnections()
.evictIdleConnections(60L, TimeUnit.SECONDS)
@@ -8,6 +8,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
@@ -35,12 +36,21 @@ public class ChannelHttpUtils extends JsonUtils {
private final CloseableHttpClient httpClient;
public ChannelHttpUtils(String imurl, String channelId, String secret) {
this.imurl = imurl;
this.channelId = channelId;
this.channelSecret = secret;
this.imurl = imurl.trim();
this.channelId = channelId.trim();
this.channelSecret = secret.trim();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setValidateAfterInactivity(1000);
int connectTimeout = 5000; // 连接超时时间
int socketTimeout = 15000; // 请求超时时间
int connectionRequestTimeout = 3000; // 从连接池获取连接的超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(socketTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.evictExpiredConnections()
.evictIdleConnections(60L, TimeUnit.SECONDS)
@@ -9,6 +9,7 @@ import org.apache.commons.codec.digest.DigestUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
@@ -36,12 +37,21 @@ public class RobotHttpUtils extends JsonUtils {
private final CloseableHttpClient httpClient;
public RobotHttpUtils(String url, String robotId, String robotSecret) {
this.url = url;
this.robotId = robotId;
this.robotSecret = robotSecret;
this.url = url.trim();
this.robotId = robotId.trim();
this.robotSecret = robotSecret.trim();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setValidateAfterInactivity(1000);
int connectTimeout = 5000; // 连接超时时间
int socketTimeout = 15000; // 请求超时时间
int connectionRequestTimeout = 3000; // 从连接池获取连接的超时时间
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(socketTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.build();
httpClient = HttpClients.custom()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(cm)
.evictExpiredConnections()
.evictIdleConnections(60L, TimeUnit.SECONDS)