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 {