diff --git a/broker/src/main/java/io/moquette/imhandler/PutUserSettingHandler.java b/broker/src/main/java/io/moquette/imhandler/PutUserSettingHandler.java index 02bf1a3c..9b040390 100644 --- a/broker/src/main/java/io/moquette/imhandler/PutUserSettingHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/PutUserSettingHandler.java @@ -18,7 +18,7 @@ import win.liyufan.im.IMTopic; public class PutUserSettingHandler extends IMHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyUserSettingReq request, Qos1PublishHandler.IMCallback callback) { - m_messagesStore.updateUserSettings(fromUser, request); + m_messagesStore.updateUserSettings(fromUser, request, clientID); return ErrorCode.ERROR_CODE_SUCCESS; } } diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 9566fd15..1635aec1 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -2112,7 +2112,7 @@ public class MemoryMessagesStore implements IMessagesStore { } if (session.getPlatform() == Platform_LINUX || session.getPlatform() == Platform_Windows || session.getPlatform() == Platform_OSX) { - updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(online ? (System.currentTimeMillis() + "|" + session.getPlatform() + "|" + session.getClientID() + "|" + session.getPhoneName()) : "").build()); + updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(online ? (System.currentTimeMillis() + "|" + session.getPlatform() + "|" + session.getClientID() + "|" + session.getPhoneName()) : "").build(), session.clientID); } else { String value = null; for (MemorySessionStore.Session s : m_Server.getStore().sessionsStore().sessionForUser(session.username)) { @@ -2138,11 +2138,11 @@ public class MemoryMessagesStore implements IMessagesStore { WFCMessage.UserSettingEntry pcentry = getUserSetting(session.getUsername(), kUserSettingPCOnline, "PC"); if (value != null) { if (pcentry == null || StringUtil.isNullOrEmpty(pcentry.getValue())) { - updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(value).build()); + updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue(value).build(), session.clientID); } } else { if (pcentry != null && !StringUtil.isNullOrEmpty(pcentry.getValue())) { - updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build()); + updateUserSettings(session.username, WFCMessage.ModifyUserSettingReq.newBuilder().setScope(kUserSettingPCOnline).setKey("PC").setValue("").build(), session.clientID); } } } @@ -3143,7 +3143,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request) { + public long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request, String clientId) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); MultiMap userSettingMap = hzInstance.getMultiMap(USER_SETTING); @@ -3183,7 +3183,7 @@ public class MemoryMessagesStore implements IMessagesStore { } else if(request.getScope() == UserSettingScope.kUserSettingHiddenNotificationDetail) { userPushHiddenDetail.remove(userId); } - IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt); + IMHandler.getPublisher().publishNotification(IMTopic.NotifyUserSettingTopic, userId, updateDt, clientId); return updateDt; } diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 99e7b26a..6653fe75 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -190,7 +190,7 @@ public interface IMessagesStore { ErrorCode getUserSettings(String userId, long version, WFCMessage.GetUserSettingResult.Builder builder); WFCMessage.UserSettingEntry getUserSetting(String userId, int scope, String key); List getUserSetting(String userId, int scope); - long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request); + long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request, String clientId); void clearUserSettings(String userId); boolean getUserGlobalSilent(String userId); 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 3d595974..9ef6d74f 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -465,14 +465,21 @@ public class MessagesPublisher { publishNotification(topic, receiver, head, null, null); } - public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) { - publishNotificationLocal(topic, receiver, head, fromUser, pushContent); + public void publishNotification(String topic, String receiver, long head, String exceptClientId) { + publishNotification(topic, receiver, head, null, null, exceptClientId); } - void publishNotificationLocal(String topic, String receiver, long head, String fromUser, String pushContent) { + public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent) { + publishNotification(topic, receiver, head, fromUser, pushContent, null); + } + public void publishNotification(String topic, String receiver, long head, String fromUser, String pushContent, String exceptClientId) { Collection sessions = m_sessionsStore.sessionForUser(receiver); String fromUserName = null; for (Session targetSession : sessions) { + if(targetSession.getClientID().equals(exceptClientId)) { + continue; + } + boolean needPush = !StringUtil.isNullOrEmpty(pushContent); boolean targetIsActive = this.connectionDescriptors.isConnected(targetSession.getClientSession().clientID); if (targetIsActive) {