Compare commits

...
6 Commits
32 changed files with 125 additions and 46 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<relativePath>../</relativePath>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.3</version>
<version>1.3.4</version>
</parent>
<artifactId>moquette-broker</artifactId>
@@ -900,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();
@@ -933,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;
}
@@ -2454,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;
+1 -1
View File
@@ -5,7 +5,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.3</version>
<version>1.3.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -6,7 +6,7 @@
<!--<relativePath>../pom.xml</relativePath>-->
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.3</version>
<version>1.3.4</version>
</parent>
<artifactId>distribution</artifactId>
+1 -1
View File
@@ -12,7 +12,7 @@
<artifactId>wildfirechat-parent</artifactId>
<packaging>pom</packaging>
<version>1.3.3</version>
<version>1.3.4</version>
<name>Wildfire Chat</name>
<description>Wildfire Chat Server</description>
<inceptionYear>2019</inceptionYear>
+8
View File
@@ -12,6 +12,14 @@
# 更新记录
--------------
Release note 1.3.4:
1. 优化Server SDK中消息内容的处理方式。
2. Server SDK中添加注册消息接口,在使用自定义消息时,不需要修改Server SDK源码。
3. 用户撤回时间配置允许为负数,为负数时可以任意时间撤回。
4. Server SDK添加超时参数。
5. 解决当分段拉取消息时,可能丢失消息的问题。
--------------
Release note 1.3.3:
1. 转移群组时检查新群主是否在群中。
+1 -1
View File
@@ -3,7 +3,7 @@
<parent>
<artifactId>wildfirechat-parent</artifactId>
<groupId>cn.wildfirechat</groupId>
<version>1.3.3</version>
<version>1.3.4</version>
</parent>
<modelVersion>4.0.0</modelVersion>
File diff suppressed because one or more lines are too long
@@ -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) {
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;
@@ -40,7 +41,16 @@ public class ChannelHttpUtils extends JsonUtils {
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;
@@ -41,7 +42,16 @@ public class RobotHttpUtils extends JsonUtils {
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)