diff --git a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java
index d04c31c7..ab2ae616 100755
--- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java
+++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java
@@ -626,8 +626,8 @@ public class MessagesPublisher {
pushContent = "[语音]";
} else if(type == ProtoConstants.ContentType.Video) {
pushContent = "[视频]";
- } else if(type == ProtoConstants.ContentType.RichMedia) {
- pushContent = "[图文]";
+ } else if(type == ProtoConstants.ContentType.Link) {
+ pushContent = "[链接]";
} else if(type == ProtoConstants.ContentType.File) {
pushContent = "[文件]";
} else if(type == ProtoConstants.ContentType.Sticker) {
diff --git a/common/pom.xml b/common/pom.xml
index bbe1ac0e..d9e3a515 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -31,6 +31,12 @@
gson
2.8.2
+
+
+ com.googlecode.json-simple
+ json-simple
+ 1.1.1
+
diff --git a/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MediaMessageContentBuilder.java b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MediaMessageContentBuilder.java
new file mode 100644
index 00000000..80a20deb
--- /dev/null
+++ b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MediaMessageContentBuilder.java
@@ -0,0 +1,19 @@
+package cn.wildfirechat.messagecontentbuilder;
+
+import cn.wildfirechat.pojos.MessagePayload;
+
+abstract public class MediaMessageContentBuilder extends MessageContentBuilder{
+ private String remoteMediaUrl;
+
+ public MediaMessageContentBuilder remoteMediaUrl(String remoteMediaUrl) {
+ this.remoteMediaUrl = remoteMediaUrl;
+ return this;
+ }
+
+ @Override
+ protected MessagePayload encodeBase() {
+ MessagePayload payload = super.encodeBase();
+ payload.setRemoteMediaUrl(remoteMediaUrl);
+ return payload;
+ }
+}
diff --git a/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MessageContentBuilder.java b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MessageContentBuilder.java
new file mode 100644
index 00000000..2f797530
--- /dev/null
+++ b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/MessageContentBuilder.java
@@ -0,0 +1,33 @@
+package cn.wildfirechat.messagecontentbuilder;
+
+import cn.wildfirechat.pojos.MessagePayload;
+
+import java.util.List;
+
+public abstract class MessageContentBuilder {
+ private int mentionedType;
+ private List mentionedTargets;
+ private String extra;
+ public MessageContentBuilder mentionedType(int mentionedType) {
+ this.mentionedType = mentionedType;
+ return this;
+ }
+ public MessageContentBuilder mentionedTargets(List mentionedTargets) {
+ this.mentionedTargets = mentionedTargets;
+ return this;
+ }
+
+ public MessageContentBuilder extra(String extra) {
+ this.extra = extra;
+ return this;
+ }
+
+ protected MessagePayload encodeBase() {
+ MessagePayload payload = new MessagePayload();
+ payload.setMentionedType(mentionedType);
+ payload.setMentionedTarget(mentionedTargets);
+ payload.setExtra(extra);
+ return payload;
+ }
+ abstract public MessagePayload build();
+}
diff --git a/common/src/main/java/cn/wildfirechat/messagecontentbuilder/RichNotificationContentBuilder.java b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/RichNotificationContentBuilder.java
new file mode 100644
index 00000000..01455878
--- /dev/null
+++ b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/RichNotificationContentBuilder.java
@@ -0,0 +1,88 @@
+package cn.wildfirechat.messagecontentbuilder;
+
+import cn.wildfirechat.pojos.MessagePayload;
+import cn.wildfirechat.proto.ProtoConstants;
+import io.netty.util.internal.StringUtil;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+public class RichNotificationContentBuilder extends MessageContentBuilder{
+ private String title;
+ private String desc;
+ private String remark;
+ private JSONArray datas;
+ private String exName;
+ private String exPortrait;
+ private String exUrl;
+ private String appId;
+
+ public static RichNotificationContentBuilder newBuilder(String title, String desc, String exUrl) {
+ RichNotificationContentBuilder builder = new RichNotificationContentBuilder();
+ builder.title = title;
+ builder.desc = desc;
+ builder.exUrl = exUrl;
+ return builder;
+ }
+
+ public RichNotificationContentBuilder remark(String remark) {
+ this.remark = remark;
+ return this;
+ }
+ public RichNotificationContentBuilder exName(String exName) {
+ this.exName = exName;
+ return this;
+ }
+ public RichNotificationContentBuilder exPortrait(String exPortrait) {
+ this.exPortrait = exPortrait;
+ return this;
+ }
+ public RichNotificationContentBuilder appId(String appId) {
+ this.appId = appId;
+ return this;
+ }
+ public RichNotificationContentBuilder addItem(String key, String value) {
+ return addItem(key, value, null);
+ }
+ public RichNotificationContentBuilder addItem(String key, String value, String color) {
+ if(this.datas == null) {
+ this.datas = new JSONArray();
+ }
+ JSONObject item = new JSONObject();
+ item.put("key", key);
+ item.put("value", value);
+ if(!StringUtil.isNullOrEmpty(color)) {
+ item.put("color", color);
+ }
+ this.datas.add(item);
+ return this;
+ }
+
+ @Override
+ public MessagePayload build() {
+ MessagePayload payload = encodeBase();
+ payload.setType(ProtoConstants.ContentType.Rich_Notification);
+ payload.setPersistFlag(ProtoConstants.PersistFlag.Persist_And_Count);
+ payload.setPushContent(title);
+ payload.setContent(desc);
+ JSONObject jsonObject = new JSONObject();
+ if(!StringUtil.isNullOrEmpty(remark))
+ jsonObject.put("remark", remark);
+ if(!StringUtil.isNullOrEmpty(exName))
+ jsonObject.put("exName", exName);
+ if(!StringUtil.isNullOrEmpty(exPortrait))
+ jsonObject.put("exPortrait", exPortrait);
+ if(!StringUtil.isNullOrEmpty(exUrl))
+ jsonObject.put("exUrl", exUrl);
+ if(!StringUtil.isNullOrEmpty(appId))
+ jsonObject.put("appId", appId);
+ if(datas != null && !datas.isEmpty())
+ jsonObject.put("datas", datas);
+
+ payload.setBase64edData(Base64.getEncoder().encodeToString(jsonObject.toJSONString().getBytes(StandardCharsets.UTF_8)));
+
+ return payload;
+ }
+}
diff --git a/common/src/main/java/cn/wildfirechat/messagecontentbuilder/SoundMessageContentBuilder.java b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/SoundMessageContentBuilder.java
new file mode 100644
index 00000000..4005748f
--- /dev/null
+++ b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/SoundMessageContentBuilder.java
@@ -0,0 +1,25 @@
+package cn.wildfirechat.messagecontentbuilder;
+
+import cn.wildfirechat.pojos.MessagePayload;
+import cn.wildfirechat.proto.ProtoConstants;
+import org.json.simple.JSONObject;
+
+public class SoundMessageContentBuilder extends MediaMessageContentBuilder {
+ private int duration;
+ public static SoundMessageContentBuilder newBuilder(int duration) {
+ SoundMessageContentBuilder builder = new SoundMessageContentBuilder();
+ builder.duration = duration;
+ return builder;
+ }
+ @Override
+ public MessagePayload build() {
+ MessagePayload payload = encodeBase();
+ payload.setType(ProtoConstants.ContentType.Voice);
+ payload.setMediaType(ProtoConstants.MessageMediaType.VOICE);
+ payload.setPersistFlag(ProtoConstants.PersistFlag.Persist_And_Count);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("duration", duration);
+ payload.setContent(jsonObject.toJSONString());
+ return payload;
+ }
+}
diff --git a/common/src/main/java/cn/wildfirechat/messagecontentbuilder/TextMessageContentBuilder.java b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/TextMessageContentBuilder.java
new file mode 100644
index 00000000..db71a59c
--- /dev/null
+++ b/common/src/main/java/cn/wildfirechat/messagecontentbuilder/TextMessageContentBuilder.java
@@ -0,0 +1,21 @@
+package cn.wildfirechat.messagecontentbuilder;
+
+import cn.wildfirechat.pojos.MessagePayload;
+import cn.wildfirechat.proto.ProtoConstants;
+
+public class TextMessageContentBuilder extends MessageContentBuilder{
+ private String text;
+ public static TextMessageContentBuilder newBuilder(String text) {
+ TextMessageContentBuilder builder = new TextMessageContentBuilder();
+ builder.text = text;
+ return builder;
+ }
+ @Override
+ public MessagePayload build() {
+ MessagePayload payload = encodeBase();
+ payload.setType(ProtoConstants.ContentType.Text);
+ payload.setPersistFlag(ProtoConstants.PersistFlag.Persist_And_Count);
+ payload.setSearchableContent(text);
+ return payload;
+ }
+}
diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java
index aab8adf3..e42fd3e4 100644
--- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java
+++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java
@@ -84,7 +84,59 @@ public class ProtoConstants {
int File = 5;
int Video = 6;
int Sticker = 7;
- int RichMedia = 8;
+ int Link = 8;
+ int P_TEXT = 9;
+ int Name_Card = 10;
+ int Composited = 11;
+ int Rich_Notification = 12;
+ int Enter_Channel_Chat = 71;
+ int Leave_Channel_Chat = 72;
+ int Recall = 80;
+ int Delete = 81;
+ int Tip = 90;
+ int Typing = 91;
+ int Friend_Greeting = 92;
+ int Friend_Added = 93;
+ int PC_Login_Request = 94;
+ int Create_Group = 104;
+ int Add_Group_Member = 105;
+ int Kickoff_Group_Member = 106;
+ int Quit_Group = 107;
+ int Dismiss_Group = 108;
+ int Transfer_Group_Owner = 109;
+ int Change_Group_Name = 110;;
+ int Modify_Group_Alias = 111;
+ int Change_Group_Portrait = 112;
+ int Change_Group_Mute = 113;
+ int Change_Group_JoinType = 114;
+ int Change_Group_PrivateChat = 115;
+ int Change_Group_Searchable = 116;
+ int Set_Group_Manager = 117;
+ int Mute_Group_Member = 118;
+ int Allow_Group_Member = 119;
+ int Kickoff_Group_Member_Visible_Notification = 120;
+ int Quit_Group_Visible_Notification = 121;
+ int Modify_Group_Extra = 122;
+ int Modify_Group_Member_Extra = 123;
+ }
+
+ public interface MessagePersistFlag {
+ int NOT_PERSIST = 0;
+ int PERSIST = 1;
+ int PERSIST_AND_COUNT = 3;
+ int TRANSPARENT = 4;
+ }
+
+ public interface MessageMediaType {
+ int GENERAL = 0;
+ int IMAGE = 1;
+ int VOICE = 2;
+ int VIDEO = 3;
+ int FILE = 4;
+ int PORTRAIT = 5;
+ int FAVORITE = 6;
+ int STICKER = 7;
+ int MOMENTS = 8;
}
//ModifyGroupInfoRequest -> type
diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java
index 1db19bd3..14c2edc8 100644
--- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java
+++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java
@@ -1,6 +1,8 @@
package cn.wildfirechat.sdk;
import cn.wildfirechat.common.ErrorCode;
+import cn.wildfirechat.messagecontentbuilder.RichNotificationContentBuilder;
+import cn.wildfirechat.messagecontentbuilder.TextMessageContentBuilder;
import cn.wildfirechat.pojos.*;
import cn.wildfirechat.proto.ProtoConstants;
import cn.wildfirechat.sdk.model.IMResult;
@@ -661,13 +663,29 @@ public class Main {
//***********************************************
static void testMessage() throws Exception {
Conversation conversation = new Conversation();
- conversation.setTarget("user2");
+ conversation.setTarget("ff2");
conversation.setType(ProtoConstants.ConversationType.ConversationType_Private);
- MessagePayload payload = new MessagePayload();
- payload.setType(1);
- payload.setSearchableContent("hello world");
+ MessagePayload payload = TextMessageContentBuilder.newBuilder("Hello world").build();
- IMResult resultSendMessage = MessageAdmin.sendMessage("user1", conversation, payload, null);
+ IMResult resultSendMessage = MessageAdmin.sendMessage("ff1", conversation, payload, null);
+ if (resultSendMessage != null && resultSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
+ System.out.println("send message success");
+ } else {
+ System.out.println("send message failure");
+ System.exit(-1);
+ }
+
+ RichNotificationContentBuilder builder = RichNotificationContentBuilder.newBuilder("产品审核通知", "您好,您的SSL证书以审核通过并成功办理,请关注", "https://www.baidu.com")
+ .remark("谢谢惠顾")
+ .exName("证书小助手")
+ .appId("1234567890")
+ .addItem("登陆账户", "野火IM", "#173177")
+ .addItem("产品名称", "域名wildifrechat.cn申请的免费SSL证书", "#173177")
+ .addItem("审核通过", "通过", "#173177")
+ .addItem("说明", "请登陆账户查看处理", "#173177");
+
+
+ resultSendMessage = MessageAdmin.sendMessage("ff1", conversation, builder.build(), null);
if (resultSendMessage != null && resultSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
System.out.println("send message success");
} else {