diff --git a/broker/src/main/java/cn/wildfirechat/push/PushMessage.java b/broker/src/main/java/cn/wildfirechat/push/PushMessage.java index ea671bcb..f2bb3050 100644 --- a/broker/src/main/java/cn/wildfirechat/push/PushMessage.java +++ b/broker/src/main/java/cn/wildfirechat/push/PushMessage.java @@ -46,4 +46,13 @@ public class PushMessage { this.isHiddenDetail = isHiddenDetail; this.language = language; } + public PushMessage(String sender, String target, long serverTime, String senderName, int unReceivedMsg, String language, int pushMessageType) { + this.sender = sender; + this.target = target; + this.senderName = senderName; + this.serverTime = serverTime; + this.unReceivedMsg = unReceivedMsg; + this.pushMessageType = pushMessageType; + this.language = language; + } } diff --git a/broker/src/main/java/cn/wildfirechat/push/PushServer.java b/broker/src/main/java/cn/wildfirechat/push/PushServer.java index 643d1126..bf32221e 100644 --- a/broker/src/main/java/cn/wildfirechat/push/PushServer.java +++ b/broker/src/main/java/cn/wildfirechat/push/PushServer.java @@ -34,6 +34,7 @@ public class PushServer { int PUSH_MESSAGE_TYPE_NORMAL = 0; int PUSH_MESSAGE_TYPE_VOIP_INVITE = 1; int PUSH_MESSAGE_TYPE_VOIP_BYE = 2; + int PUSH_MESSAGE_TYPE_FRIEND_REQUEST = 3; } private static PushServer INSTANCE = new PushServer(); diff --git a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java index 13252b92..8e4a50e8 100644 --- a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java @@ -27,7 +27,7 @@ public class AddFriendHandler extends GroupHandler if (errorCode == ERROR_CODE_SUCCESS) { WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid()); if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) { - publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0]); + publisher.publishNotification(IMTopic.NotifyFriendRequestTopic, request.getTargetUid(), head[0], fromUser, request.getReason()); } else if(user != null && user.getType() == ProtoConstants.UserType.UserType_Robot) { WFCMessage.HandleFriendRequest handleFriendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(fromUser).setStatus(ProtoConstants.FriendRequestStatus.RequestStatus_Accepted).build(); mServer.internalRpcMsg(request.getTargetUid(), null, handleFriendRequest.toByteArray(), 0, fromUser, HandleFriendRequestTopic, false); 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 4c181030..3c6e5c23 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -18,11 +18,13 @@ package io.moquette.spi.impl; import cn.wildfirechat.proto.ProtoConstants; import cn.wildfirechat.proto.WFCMessage; +import cn.wildfirechat.push.PushServer; import com.google.gson.Gson; import com.hazelcast.core.HazelcastInstance; import com.hazelcast.util.StringUtil; import cn.wildfirechat.pojos.OutputNotifyChannelSubscribeStatus; import cn.wildfirechat.pojos.SendMessageData; +import com.xiaoleilu.hutool.system.UserInfo; import com.xiaoleilu.loServer.model.FriendData; import io.moquette.persistence.*; import io.moquette.persistence.MemorySessionStore.Session; @@ -402,12 +404,18 @@ public class MessagesPublisher { } public void publishNotification(String topic, String receiver, long head) { - publishNotificationLocal(topic, receiver, head); + publishNotification(topic, receiver, head, null, null); } - void publishNotificationLocal(String topic, String receiver, long head) { + public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) { + publishNotificationLocal(topic, receiver, head, fromUser, pushContent); + } + + void publishNotificationLocal(String topic, String receiver, long head, String fromUser, String pushContent) { Collection sessions = m_sessionsStore.sessionForUser(receiver); + String fromUserName = null; for (Session targetSession : sessions) { + boolean needPush = !StringUtil.isNullOrEmpty(pushContent); boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID); if (targetIsActive) { ByteBuf payload = Unpooled.buffer(); @@ -418,9 +426,24 @@ public class MessagesPublisher { boolean result = this.messageSender.sendPublish(targetSession.getClientSession(), publishMsg); if (!result) { LOG.warn("Publish friend request failure"); + } else { + needPush = false; } } + if (needPush) { + if (fromUserName == null) { + WFCMessage.User userInfo = m_messagesStore.getUserInfo(fromUser); + if (userInfo == null) { + fromUserName = ""; + } else { + fromUserName = userInfo.getDisplayName(); + } + } + if (IMTopic.NotifyFriendRequestTopic.equals(topic)) { + messageSender.sendPush(fromUser, receiver, targetSession.getClientID(), pushContent, PushServer.PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST, System.currentTimeMillis(), fromUserName, targetSession.getUnReceivedMsgs() + 1, targetSession.getLanguage()); + } + } } } diff --git a/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java b/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java index 2c5c334b..51975555 100755 --- a/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java +++ b/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java @@ -40,6 +40,14 @@ class PersistentQueueMessageSender { void sendPush(String sender, int conversationType, String target, int line, long messageHead, String deviceId, String pushContent, int messageContentType, long serverTime, String senderName, String targetName, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) { LOG.info("Send push to {}, message from {}", deviceId, sender); PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, targetName, unReceivedMsg, mentionType, isHiddenDetail, language); + pushMessage.pushContent = pushContent; + PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent); + } + + void sendPush(String sender, String target, String deviceId, String pushContent, int pushContentType, long serverTime, String senderName, int unReceivedMsg, String language) { + LOG.info("Send push to {}, message from {}", deviceId, sender); + PushMessage pushMessage = new PushMessage(sender, target, serverTime, senderName, unReceivedMsg, language, pushContentType); + pushMessage.pushContent = pushContent; PushServer.getServer().pushMessage(pushMessage, deviceId, pushContent); }