diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 378c0454..88461975 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -1300,11 +1300,31 @@ public class MemoryMessagesStore implements IMessagesStore { } } + MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); + Collection members = groupMembers.get(groupId); + if (members == null || members.size() == 0) { + members = loadGroupMemberFromDB(hzInstance, groupId); + } + + ArrayList existMemberIds = new ArrayList<>(); + for (WFCMessage.GroupMember member : members) { + if (member.getType() != GroupMemberType_Removed) { + existMemberIds.add(member.getMemberId()); + } + } + long updateDt = System.currentTimeMillis(); List tmp = new ArrayList<>(); - ArrayList newInviteUsers = new ArrayList<>(); + int newMemberCount = 0; for (WFCMessage.GroupMember member : memberList) { + if (existMemberIds.contains(member.getMemberId()) && member.getType() != GroupMemberType_Removed) { + if(!isAdmin) + continue; + } else { + newMemberCount++; + } + WFCMessage.GroupMember.Builder builder = member.toBuilder(); builder.setUpdateDt(updateDt).setCreateDt(updateDt); if (member.getMemberId().equals(groupInfo.getOwner())) { @@ -1324,29 +1344,23 @@ public class MemoryMessagesStore implements IMessagesStore { } member = builder.build(); tmp.add(member); - newInviteUsers.add(member.getMemberId()); updateDt++; } memberList = tmp; - MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); - Collection members = groupMembers.get(groupId); - if (members == null || members.size() == 0) { - members = loadGroupMemberFromDB(hzInstance, groupId); - } - - if (maxCount != Integer.MAX_VALUE) { - int existCount = 0; - for (WFCMessage.GroupMember member : members) { - if (member.getType() != GroupMemberType_Removed) { - existCount++; - } + if (memberList.size() == 0) { + if (!isAdmin) { + return ErrorCode.ERROR_CODE_ALREADY_IN_GROUP; + } else { + return ErrorCode.ERROR_CODE_SUCCESS; } - if (existCount + newInviteUsers.size() > maxCount) { + } else { + if (existMemberIds.size() + newMemberCount > maxCount) { return ErrorCode.ERROR_CODE_GROUP_EXCEED_MAX_MEMBER_COUNT; } } + databaseStore.persistGroupMember(groupId, memberList, true); databaseStore.updateGroupMemberCountDt(groupId); diff --git a/common/src/main/java/cn/wildfirechat/common/ErrorCode.java b/common/src/main/java/cn/wildfirechat/common/ErrorCode.java index d8c29137..393cd0f6 100755 --- a/common/src/main/java/cn/wildfirechat/common/ErrorCode.java +++ b/common/src/main/java/cn/wildfirechat/common/ErrorCode.java @@ -29,6 +29,7 @@ public enum ErrorCode { //Group error ERROR_CODE_GROUP_ALREADY_EXIST(11, "group already exist"), + ERROR_CODE_ALREADY_IN_GROUP(12, "member already in group"), //user error ERROR_CODE_FRIEND_ALREADY_REQUEST(16, "already send request"),