From 7e73c2880bf045656f2eb7a1de60cae0ed9a7387 Mon Sep 17 00:00:00 2001 From: heavyrian2012 Date: Tue, 29 Jul 2025 11:51:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=9C=AC=E5=9C=B0=E8=A7=92=E6=A0=87=EF=BC=8C?= =?UTF-8?q?=E5=BD=93=E9=9C=80=E8=A6=81=E6=8E=A8=E9=80=81=E6=97=B6=E4=BC=9A?= =?UTF-8?q?=E6=8A=8A=E8=A7=92=E6=A0=87=E6=95=B0=E5=AD=97=E5=B8=A6=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/wildfirechat/push/PushMessage.java | 1 + .../java/cn/wildfirechat/push/PushServer.java | 5 ----- .../persistence/MemoryMessagesStore.java | 15 +++++++++++++- .../persistence/MemorySessionStore.java | 4 ---- .../java/io/moquette/spi/IMessagesStore.java | 3 +++ .../moquette/spi/impl/MessagesPublisher.java | 20 +++++++++++++++---- .../impl/PersistentQueueMessageSender.java | 5 +++-- .../java/win/liyufan/im/UserSettingScope.java | 1 + 8 files changed, 38 insertions(+), 16 deletions(-) diff --git a/broker/src/main/java/cn/wildfirechat/push/PushMessage.java b/broker/src/main/java/cn/wildfirechat/push/PushMessage.java index 4595adde..0424064e 100644 --- a/broker/src/main/java/cn/wildfirechat/push/PushMessage.java +++ b/broker/src/main/java/cn/wildfirechat/push/PushMessage.java @@ -37,6 +37,7 @@ public class PushMessage { public boolean republish; public long messageId; public long callStartUid; + public int existBadgeNumber; public PushMessage(String sender, int conversationType, String target, int line, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionedType, boolean isHiddenDetail, String language) { this.sender = sender; diff --git a/broker/src/main/java/cn/wildfirechat/push/PushServer.java b/broker/src/main/java/cn/wildfirechat/push/PushServer.java index f06951c1..3c795429 100644 --- a/broker/src/main/java/cn/wildfirechat/push/PushServer.java +++ b/broker/src/main/java/cn/wildfirechat/push/PushServer.java @@ -81,10 +81,6 @@ public class PushServer { } MemorySessionStore.Session session = sessionsStore.getSession(deviceId); - int badge = session.getUnReceivedMsgs(); - if (badge <= 0) { - badge = 1; - } if (StringUtil.isNullOrEmpty(session.getDeviceToken())) { LOG.warn("Device token is empty for device {}", deviceId); return; @@ -94,7 +90,6 @@ public class PushServer { pushMessage.pushType = session.getPushType(); pushMessage.pushContent = pushContent; pushMessage.deviceToken = session.getDeviceToken(); - pushMessage.unReceivedMsg = badge; pushMessage.userId = session.getUsername(); if (session.getPlatform() == ProtoConstants.Platform.Platform_iOS || session.getPlatform() == ProtoConstants.Platform.Platform_iPad || diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index e519258f..d0183c37 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -56,6 +56,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import java.util.function.BiFunction; import java.util.function.Consumer; import static cn.wildfirechat.common.IMExceptionEvent.EventType.EVENT_CALLBACK_Exception; @@ -844,6 +845,18 @@ public class MemoryMessagesStore implements IMessagesStore { return pullType; } + private final Map unreceivedMsgCount = new ConcurrentHashMap<>(); + + @Override + public void increaseUnreceivedMsgCount(String user) { + unreceivedMsgCount.compute(user, (s, integer) -> integer == null ? 1 : integer+1); + } + + @Override + public int getUnreceivedMsgCount(String user) { + return unreceivedMsgCount.getOrDefault(user, 0); + } + @Override public Set getAllEnds() { return databaseStore.getAllEnds(mBroadcastTargetFromUserTable); @@ -858,7 +871,7 @@ public class MemoryMessagesStore implements IMessagesStore { MemorySessionStore.Session session = m_Server.getStore().sessionsStore().getSession(exceptClientId); session.refreshLastActiveTime(); if (pullType != ProtoConstants.PullType.Pull_ChatRoom) { - session.setUnReceivedMsgs(0); + unreceivedMsgCount.put(user, 0); } else { session.refreshLastChatroomActiveTime(); } diff --git a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java index a1622f6c..3b44b7d9 100755 --- a/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemorySessionStore.java @@ -92,10 +92,6 @@ public class MemorySessionStore implements ISessionsStore { return unReceivedMsgs; } - public void setUnReceivedMsgs(int unReceivedMsgs) { - this.unReceivedMsgs = unReceivedMsgs; - } - public int getPushType() { return pushType; } diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index a4537d02..f3064d08 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -235,6 +235,9 @@ public interface IMessagesStore { WFCMessage.Message getMessage(long messageId); + void increaseUnreceivedMsgCount(String user); + int getUnreceivedMsgCount(String user); + boolean isAllowClientCustomGroupNotification(); boolean isAllowRobotCustomGroupNotification(); int getVisibleQuitKickoffNotification(); 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 cc9e9569..00898879 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -324,7 +324,7 @@ public class MessagesPublisher { if (!StringUtil.isNullOrEmpty(pushContent) || messageContentType == 400) { if (!isConvSilent && (persistFlag & 0x02) > 0) { - targetSession.setUnReceivedMsgs(targetSession.getUnReceivedMsgs() + 1); + m_messagesStore.increaseUnreceivedMsgCount(user); } } } @@ -423,13 +423,25 @@ public class MessagesPublisher { name = fd.getAlias(); } } - this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, callStartUid, messageContentType, serverTime, name, senderPortrait, targetName, targetPortrait, targetSession.getUnReceivedMsgs(), curMentionType, isHiddenDetail, targetSession.getLanguage()); + + this.messageSender.sendPush(sender, conversationType, target, line, messageId, targetSession.getClientID(), pushContent, pushData, callStartUid, messageContentType, serverTime, name, senderPortrait, targetName, targetPortrait, m_messagesStore.getUnreceivedMsgCount(user), curMentionType, isHiddenDetail, targetSession.getLanguage(), getExistBadgeNumber(user)); } } } } - + + private int getExistBadgeNumber(String user) { + int existBadgeNumber = 0; + WFCMessage.UserSettingEntry userSettingData = m_messagesStore.getUserSetting(user, UserSettingScope.kUserSettingScopeSyncBadge, ""); + if(userSettingData != null && !StringUtil.isNullOrEmpty(userSettingData.getValue())) { + try { + existBadgeNumber = Integer.parseInt(userSettingData.getValue()); + } catch (NumberFormatException e) {} + } + return existBadgeNumber; + } + public boolean sendOfflineNotify(String clientId) { boolean targetIsActive = this.connectionDescriptors.isConnected(clientId); if (targetIsActive) { @@ -595,7 +607,7 @@ public class MessagesPublisher { } 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()); + messageSender.sendPush(fromUser, receiver, targetSession.getClientID(), pushContent, PushServer.PushMessageType.PUSH_MESSAGE_TYPE_FRIEND_REQUEST, System.currentTimeMillis(), fromUserName, m_messagesStore.getUnreceivedMsgCount(receiver) + 1, targetSession.getLanguage(), getExistBadgeNumber(receiver)); } } } 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 eed05bf9..a9eae488 100755 --- a/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java +++ b/broker/src/main/java/io/moquette/spi/impl/PersistentQueueMessageSender.java @@ -37,17 +37,18 @@ class PersistentQueueMessageSender { this.connectionDescriptorStore = connectionDescriptorStore; } - void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, long callStartUid, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language) { + void sendPush(String sender, int conversationType, String target, int line, long messageId, String deviceId, String pushContent, String pushData, long callStartUid, int messageContentType, long serverTime, String senderName, String senderPortrait, String targetName, String targetPortrait, int unReceivedMsg, int mentionType, boolean isHiddenDetail, String language, int existBadgeNumber) { LOG.info("Send push to {}, message from {}", deviceId, sender); PushMessage pushMessage = new PushMessage(sender, conversationType, target, line, messageContentType, serverTime, senderName, senderPortrait, targetName, targetPortrait, unReceivedMsg, mentionType, isHiddenDetail, language); pushMessage.pushContent = pushContent; pushMessage.pushData = pushData; pushMessage.messageId = messageId; pushMessage.callStartUid = callStartUid; + pushMessage.existBadgeNumber = existBadgeNumber; 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) { + void sendPush(String sender, String target, String deviceId, String pushContent, int pushContentType, long serverTime, String senderName, int unReceivedMsg, String language, int existBadgeNumber) { LOG.info("Send push to {}, message from {}", deviceId, sender); PushMessage pushMessage = new PushMessage(sender, target, serverTime, senderName, unReceivedMsg, language, pushContentType); pushMessage.pushContent = pushContent; diff --git a/broker/src/main/java/win/liyufan/im/UserSettingScope.java b/broker/src/main/java/win/liyufan/im/UserSettingScope.java index 7ab18494..66668ff0 100644 --- a/broker/src/main/java/win/liyufan/im/UserSettingScope.java +++ b/broker/src/main/java/win/liyufan/im/UserSettingScope.java @@ -21,4 +21,5 @@ public interface UserSettingScope { int kUserSettingGroupRemark = 26; int kUserSettingPrivacySearchable = 27; int kUserSettingAddFriendStrategy = 28; + int kUserSettingScopeSyncBadge = 29; }