From 139042c8e7f230cf103726a966f22c20a57d2b54 Mon Sep 17 00:00:00 2001 From: imhao183 Date: Wed, 28 Oct 2020 09:51:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=85=8D=E6=89=93=E6=89=B0?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=8F=8A=E4=BC=98=E5=8C=96=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/MemoryMessagesStore.java | 40 +++++++++++++++- .../java/io/moquette/spi/IMessagesStore.java | 7 +-- .../moquette/spi/impl/MessagesPublisher.java | 47 ++++++++++--------- .../java/win/liyufan/im/UserSettingScope.java | 7 +-- 4 files changed, 69 insertions(+), 32 deletions(-) diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 80e2a4e1..9a63e636 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -2914,7 +2914,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public boolean getUserGlobalSlient(String userId) { + public boolean getUserGlobalSilent(String userId) { Boolean slient = userGlobalSlientMap.get(userId); if (slient == null) { WFCMessage.UserSettingEntry entry = getUserSetting(userId, UserSettingScope.kUserSettingGlobalSilent, null); @@ -2944,7 +2944,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public boolean getUserConversationSlient(String userId, WFCMessage.Conversation conversation) { + public boolean getUserConversationSilent(String userId, WFCMessage.Conversation conversation) { String key = userId + "|" + conversation.getType() + "|" + conversation.getTarget() + "|" + conversation.getLine(); Boolean slient = userConvSlientMap.get(key); if (slient == null) { @@ -2969,6 +2969,42 @@ public class MemoryMessagesStore implements IMessagesStore { return false; } } + private Date getTodayDate() { + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + int year = calendar.get(Calendar.YEAR); + int month = calendar.get(Calendar.MONTH); + int day = calendar.get(Calendar.DATE); + calendar.set(year, month, day, 0, 0, 0); + return calendar.getTime(); + } + + @Override + public boolean isUserNoDisturbing(String userId) { + WFCMessage.UserSettingEntry entry = getUserSetting(userId, UserSettingScope.kUserSettingNoDisturbing, ""); + if (entry != null && !StringUtil.isNullOrEmpty(entry.getValue())) { + String[] arr = entry.getValue().split("\\|"); + + if (arr.length == 2) { + int nowMins = (int)((System.currentTimeMillis() - getTodayDate().getTime())/1000/60); + try { + int startMins = Integer.parseInt(arr[0]); + int endMins = Integer.parseInt(arr[1]); + if (endMins > startMins) { + if (endMins > nowMins && nowMins > startMins) { + return true; + } + } else { + if (endMins > nowMins || nowMins > startMins) { + return true; + } + } + } catch (NumberFormatException e) { + e.printStackTrace(); + } + } + } + return false; + } @Override public ErrorCode createChannel(String operator, WFCMessage.ChannelInfo channelInfo) { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 547a69fa..b62d8f82 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -30,6 +30,7 @@ import io.netty.handler.codec.mqtt.MqttQoS; import cn.wildfirechat.common.ErrorCode; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Set; @@ -184,12 +185,12 @@ public interface IMessagesStore { List getUserSetting(String userId, int scope); long updateUserSettings(String userId, WFCMessage.ModifyUserSettingReq request); void clearUserSettings(String userId); + boolean getUserGlobalSilent(String userId); - boolean getUserGlobalSlient(String userId); boolean getUserPushHiddenDetail(String userId); - boolean getUserConversationSlient(String userId, WFCMessage.Conversation conversation); + boolean getUserConversationSilent(String userId, WFCMessage.Conversation conversation); boolean getSilentWhenPcOnline(String userId); - + boolean isUserNoDisturbing(String userId); ErrorCode createChannel(String operator, WFCMessage.ChannelInfo channelInfo); void clearUserChannels(String userId); ErrorCode modifyChannelInfo(String operator, String channelId, int modifyType, String value); 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 1abc15ab..9f08a1d8 100755 --- a/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java +++ b/broker/src/main/java/io/moquette/spi/impl/MessagesPublisher.java @@ -244,11 +244,13 @@ public class MessagesPublisher { } } - boolean isSlient; + boolean isSilent; + boolean isConvSilent = false; if (pullType == ProtoConstants.PullType.Pull_ChatRoom) { - isSlient = true; + isSilent = true; + isConvSilent = true; } else { - isSlient = false; + isSilent = false; if (!user.equals(sender)) { WFCMessage.Conversation conversation; @@ -258,34 +260,32 @@ public class MessagesPublisher { conversation = WFCMessage.Conversation.newBuilder().setType(conversationType).setLine(line).setTarget(target).build(); } - - if (m_messagesStore.getUserConversationSlient(user, conversation)) { + if (m_messagesStore.getUserConversationSilent(user, conversation)) { LOG.info("The conversation {}-{}-{} is slient", conversation.getType(), conversation.getTarget(), conversation.getLine()); - isSlient = true; + isConvSilent = true; } - if (m_messagesStore.getUserGlobalSlient(user)) { + if (m_messagesStore.getUserGlobalSilent(user)) { LOG.info("The user {} is global sliented", user); - isSlient = true; + isSilent = true; } - if (isPcOnline && m_messagesStore.getSilentWhenPcOnline(user)) { + if (!isSilent && isPcOnline && m_messagesStore.getSilentWhenPcOnline(user)) { LOG.info("The user {} pc online and silent when pc online", user); - isSlient = true; + isSilent = true; + } + + if (!isSilent && m_messagesStore.isUserNoDisturbing(user)) { + LOG.info("The user {} is no disturbing", user); + isSilent = true; } } if (!StringUtil.isNullOrEmpty(pushContent) || messageContentType == 400) { - if (!isSlient && (persistFlag & 0x02) > 0) { + if (!isConvSilent && (persistFlag & 0x02) > 0) { targetSession.setUnReceivedMsgs(targetSession.getUnReceivedMsgs() + 1); } } - - if (isSlient) { - if (mentionType == 2 || (mentionType == 1 && mentionTargets.contains(user))) { - isSlient = false; - } - } } boolean needPush = !user.equals(sender); @@ -316,11 +316,11 @@ public class MessagesPublisher { int curMentionType = 0; if (mentionType == 2) { curMentionType = 2; - isSlient = false; + isConvSilent = false; } else if (mentionType == 1){ if (mentionTargets != null && mentionTargets.contains(user)) { curMentionType = 1; - isSlient = false; + isConvSilent = false; } } @@ -334,8 +334,13 @@ public class MessagesPublisher { continue; } - if (isSlient) { - LOG.info("Slient of user or conversation"); + if (isConvSilent) { + LOG.info("Silent of user or conversation"); + continue; + } + + if (isSilent) { + LOG.info("Silent of user"); continue; } diff --git a/broker/src/main/java/win/liyufan/im/UserSettingScope.java b/broker/src/main/java/win/liyufan/im/UserSettingScope.java index 96ab013f..0362048a 100644 --- a/broker/src/main/java/win/liyufan/im/UserSettingScope.java +++ b/broker/src/main/java/win/liyufan/im/UserSettingScope.java @@ -3,16 +3,11 @@ package win.liyufan.im; public interface UserSettingScope { int kUserSettingConversationSilent = 1; int kUserSettingGlobalSilent = 2; - int kUserSettingConversationTop = 3; - int kUserSettingHiddenNotificationDetail = 4; - int kUserSettinGroupHideNickname = 5; - int kUserSettingFavouriteGroup = 6; int kUserSettingConversationSync = 7; int kUserSettingMyChannels = 8; int kUserSettingListenedChannels = 9; int kUserSettingPCOnline = 10; int kUserSettingMuteWhenPCOnline = 15; - - int kUserSettingCustomBegin = 1000; + int kUserSettingNoDisturbing = 17; }