From 6a6c59bdf2d2d314689be1d78f97d70303b404cc Mon Sep 17 00:00:00 2001 From: imhao183 Date: Mon, 17 Feb 2020 16:06:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E5=8F=91=E9=80=81=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=BB=99=E6=8C=87=E5=AE=9A=E9=A2=91=E9=81=93=E7=9B=AE?= =?UTF-8?q?=E6=A0=87=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/channel/SendMessageAction.java | 7 ++++- .../persistence/MemoryMessagesStore.java | 27 ++++++++++++++----- .../wildfirechat/pojos/SendMessageData.java | 27 ++++++++++++++++--- 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java index 4a69af88..9940d609 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/channel/SendMessageAction.java @@ -10,6 +10,7 @@ package com.xiaoleilu.loServer.action.channel; import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.SendChannelMessageData; import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; import com.xiaoleilu.loServer.annotation.HttpMethod; @@ -44,11 +45,15 @@ public class SendMessageAction extends ChannelAction { @Override public boolean action(Request request, Response response) { if (request.getNettyRequest() instanceof FullHttpRequest) { - SendMessageData sendMessageData = getRequestBody(request.getNettyRequest(), SendMessageData.class); + SendChannelMessageData sendChannelMessageData = getRequestBody(request.getNettyRequest(), SendChannelMessageData.class); + SendMessageData sendMessageData = new SendMessageData(); sendMessageData.setConv(new Conversation()); sendMessageData.getConv().setType(ConversationType_Channel); sendMessageData.getConv().setTarget(channelInfo.getTargetId()); + sendMessageData.getConv().setLine(sendChannelMessageData.getLine()); sendMessageData.setSender(channelInfo.getOwner()); + sendMessageData.setPayload(sendChannelMessageData.getPayload()); + sendMessageData.setToUsers(sendChannelMessageData.getTargets()); if (SendMessageData.isValide(sendMessageData)) { RPCCenter.getInstance().sendRequest(sendMessageData.getSender(), null, IMTopic.SendMessageTopic, sendMessageData.toProtoMessage().toByteArray(), sendMessageData.getSender(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { @Override diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 18aa8ec0..2c00cd2a 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -258,8 +258,17 @@ public class MemoryMessagesStore implements IMessagesStore { if (!StringUtil.isNullOrEmpty(message.getToUser())) { notifyReceivers.add(message.getToUser()); - } else if(!message.getToList().isEmpty()) { - notifyReceivers.addAll(message.getToList()); + } else if(message.getToList()!=null && !message.getToList().isEmpty()) { + MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + Collection members = groupMembers.get(message.getConversation().getTarget()); + if (members == null || members.size() == 0) { + members = loadGroupMemberFromDB(hzInstance, message.getConversation().getTarget()); + } + for (WFCMessage.GroupMember member : members) { + if (member.getType() != GroupMemberType_Removed && message.getToList().contains(member.getMemberId())) { + notifyReceivers.add(member.getMemberId()); + } + } } else { MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); Collection members = groupMembers.get(message.getConversation().getTarget()); @@ -296,14 +305,20 @@ public class MemoryMessagesStore implements IMessagesStore { if (channelInfo != null) { notifyReceivers.add(fromUser); if (channelInfo.getOwner().equals(fromUser)) { + MultiMap listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS); if (StringUtil.isNullOrEmpty(message.getToUser())) { - MultiMap listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS); - notifyReceivers.addAll(listeners.get(message.getConversation().getTarget())); - } else { - MultiMap listeners = hzInstance.getMultiMap(CHANNEL_LISTENERS); if (listeners.values().contains(message.getToUser())) { notifyReceivers.add(message.getToUser()); } + } else if(message.getToList() != null && !message.getToList().isEmpty()) { + Collection ls = listeners.get(message.getConversation().getTarget()); + for (String to:message.getToList()) { + if (ls.contains(to)) { + notifyReceivers.add(to); + } + } + } else { + notifyReceivers.addAll(listeners.get(message.getConversation().getTarget())); } } else { if (StringUtil.isNullOrEmpty(channelInfo.getCallback()) || channelInfo.getAutomatic() == 0) { diff --git a/common/src/main/java/cn/wildfirechat/pojos/SendMessageData.java b/common/src/main/java/cn/wildfirechat/pojos/SendMessageData.java index 55a362cc..697c1322 100644 --- a/common/src/main/java/cn/wildfirechat/pojos/SendMessageData.java +++ b/common/src/main/java/cn/wildfirechat/pojos/SendMessageData.java @@ -12,10 +12,13 @@ import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; import io.netty.util.internal.StringUtil; +import java.util.List; + public class SendMessageData { private String sender; private Conversation conv; private MessagePayload payload; + private List toUsers; public String getSender() { return sender; @@ -41,6 +44,14 @@ public class SendMessageData { this.payload = payload; } + public List getToUsers() { + return toUsers; + } + + public void setToUsers(List toUsers) { + this.toUsers = toUsers; + } + public static boolean isValide(SendMessageData sendMessageData) { if(sendMessageData == null || sendMessageData.getConv() == null || @@ -55,10 +66,18 @@ public class SendMessageData { } public WFCMessage.Message toProtoMessage() { - return WFCMessage.Message.newBuilder().setFromUser(sender) - .setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine())) - .setContent(payload.toProtoMessageContent()) - .build(); + if (toUsers != null && toUsers.size() > 0) { + return WFCMessage.Message.newBuilder().setFromUser(sender) + .setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine())) + .setContent(payload.toProtoMessageContent()) + .addAllTo(toUsers) + .build(); + } else { + return WFCMessage.Message.newBuilder().setFromUser(sender) + .setConversation(WFCMessage.Conversation.newBuilder().setType(conv.getType()).setTarget(conv.getTarget()).setLine(conv.getLine())) + .setContent(payload.toProtoMessageContent()) + .build(); + } } public static SendMessageData fromProtoMessage(WFCMessage.Message protoMessage) {