添加群组成员时支持部分成员失败

This commit is contained in:
heavyrian2012
2025-07-05 16:47:15 +08:00
parent 63f37e8984
commit 6ef6ed2906
10 changed files with 119 additions and 16 deletions
@@ -205,6 +205,7 @@ public final class BrokerConstants {
public static final String GROUP_Forbidden_Client_Operation = "group.forbidden_client_operation";
public static final String GROUP_Disable_Stranger_Invite = "group.disable_stranger_invite";
public static final String GROUP_ADD_MEMBER_ALLOW_PART_SUCCESS = "group.add_member_allow_part_success";
public static final String GROUP_INFO_MARK_DELETION = "group.enable_mark_deletion";
@@ -16,6 +16,10 @@ import io.netty.buffer.ByteBuf;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
@Handler(value = IMTopic.AddGroupMemberTopic)
@@ -38,16 +42,34 @@ public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberReques
}
}
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList(), request.getExtra());
Map<String, Integer> failedMembers = new HashMap<>();
if(requestSourceType == ProtoConstants.RequestSourceType.Request_From_User) {
ErrorCode errorCode = m_messagesStore.canAddGroupMembers(fromUser, request.getAddedMemberList(), failedMembers);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
}
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList(), request.getExtra(), failedMembers);
if (errorCode == ERROR_CODE_SUCCESS) {
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
} else {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, getMemberIdList(request.getAddedMemberList())).setExtra(request.getExtra()).getAddGroupNotifyContent();
List<String> added = getMemberIdList(request.getAddedMemberList());
added.removeAll(failedMembers.keySet());
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, added).setExtra(request.getExtra()).getAddGroupNotifyContent();
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
}
}
if (errorCode == ERROR_CODE_SUCCESS && !failedMembers.isEmpty()) {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").setMi(failedMembers).getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_REJECT_JOIN_GROUP);
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content);
}
if(errorCode == ERROR_CODE_SUCCESS && !failedMembers.isEmpty()) {
return ErrorCode.ERROR_CODE_PARTLY_SUCCESS;
}
return errorCode;
}
}
@@ -17,6 +17,9 @@ import io.netty.buffer.ByteBuf;
import cn.wildfirechat.common.ErrorCode;
import win.liyufan.im.IMTopic;
import java.util.HashMap;
import java.util.Map;
@Handler(value = IMTopic.CreateGroupTopic)
public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupRequest> {
@Override
@@ -51,14 +54,21 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
}
}
Map<String, Integer> failedMembers = new HashMap<>();
if(requestSourceType == ProtoConstants.RequestSourceType.Request_From_User) {
ErrorCode errorCode = m_messagesStore.canAddGroupMembers(fromUser, request.getGroup().getMembersList());
ErrorCode errorCode = m_messagesStore.canAddGroupMembers(fromUser, request.getGroup().getMembersList(), failedMembers);
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
}
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), request.getMemberExtra(), isAdmin);
if (request.getGroup().getGroupInfo().getTargetId().length() > 64
|| request.getGroup().getGroupInfo().getName().length() > 64
|| request.getGroup().getGroupInfo().getPortrait().length() > 1024) {
return ErrorCode.INVALID_PARAMETER;
}
WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList(), request.getMemberExtra(), isAdmin, failedMembers);
if (groupInfo != null && groupInfo.getDeleted() == 0) {
if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), request.getNotifyContent());
@@ -66,9 +76,19 @@ public class CreateGroupHandler extends GroupHandler<WFCMessage.CreateGroupReque
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, groupInfo.getName(), "").setExtra(request.getMemberExtra()).getCreateGroupNotifyContent();
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
}
if(!failedMembers.isEmpty()) {
WFCMessage.MessageContent content = new GroupNotificationBinaryContent(groupInfo.getTargetId(), fromUser, null, "").setMi(failedMembers).getGroupNotifyContent(ProtoConstants.MESSAGE_CONTENT_TYPE_REJECT_JOIN_GROUP);
sendGroupNotification(fromUser, groupInfo.getTargetId(), request.getToLineList(), content);
}
}
byte[] data = groupInfo.getTargetId().getBytes();
ackPayload.ensureWritable(data.length).writeBytes(data);
return ErrorCode.ERROR_CODE_SUCCESS;
if(failedMembers.isEmpty()) {
return ErrorCode.ERROR_CODE_SUCCESS;
} else {
return ErrorCode.ERROR_CODE_PARTLY_SUCCESS;
}
}
}
@@ -167,6 +167,7 @@ public class MemoryMessagesStore implements IMessagesStore {
private Set<String> mAllowStrangerChatSet = new HashSet<>();
private Set<Integer> mAllowStrangerLineSet = new HashSet<>();
private boolean mDisableStrangerAddGroup = false;
private boolean mGroupAllowPartSuccess = false;
private boolean mIDUseUUID = true;
@@ -630,6 +631,11 @@ public class MemoryMessagesStore implements IMessagesStore {
}
try {
mGroupAllowPartSuccess = "true".equals(server.getConfig().getProperty(BrokerConstants.GROUP_ADD_MEMBER_ALLOW_PART_SUCCESS, "false"));
} catch (Exception e) {
}
try {
mRobotCallbackWithClientInfo = Boolean.parseBoolean(server.getConfig().getProperty(BrokerConstants.ROBOT_Callback_With_Client_Info, "false"));
} catch (Exception e) {}
@@ -1282,7 +1288,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public ErrorCode canAddGroupMembers(String fromUser, List<WFCMessage.GroupMember> memberList) {
public ErrorCode canAddGroupMembers(String fromUser, List<WFCMessage.GroupMember> memberList, Map<String, Integer> failedMembers) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, FriendData> friendsMap = hzInstance.getMultiMap(USER_FRIENDS);
IMap<String, WFCMessage.User> mUserMap = hzInstance.getMap(USERS);
@@ -1308,7 +1314,12 @@ public class MemoryMessagesStore implements IMessagesStore {
for (FriendData friendData : friendDatas) {
if (friendData.getFriendUid().equals(fromUser)) {
if (friendData.getBlacked() == 1) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
LOG.error("Add group member failure, because inviter {} is blocked by invitee {}", fromUser, targetUser);
if(isGroupAllowPartSuccess()) {
failedMembers.put(targetUser, 1); //black
} else {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
}
} else {
if (friendData.getState() == 0) {
allow = true;
@@ -1332,7 +1343,11 @@ public class MemoryMessagesStore implements IMessagesStore {
continue;
}
return ErrorCode.ERROR_CODE_NOT_RIGHT;
if(isGroupAllowPartSuccess()) {
failedMembers.put(targetUser, 2);//stranger
} else {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
}
} else {
for (WFCMessage.GroupMember groupMember : memberList) {
@@ -1349,7 +1364,12 @@ public class MemoryMessagesStore implements IMessagesStore {
for (FriendData friendData : friendDatas) {
if (friendData.getFriendUid().equals(fromUser)) {
if (friendData.getBlacked() == 1) {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
LOG.error("Add group member failure, because inviter {} is blocked by invitee {}", fromUser, targetUser);
if(isGroupAllowPartSuccess()) {
failedMembers.put(targetUser, 1); //black
} else {
return ErrorCode.ERROR_CODE_IN_BLACK_LIST;
}
} else {
break;
}
@@ -1361,7 +1381,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin) {
public WFCMessage.GroupInfo createGroup(String fromUser, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin, Map<String, Integer> failedMembers) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
@@ -1383,6 +1403,9 @@ public class MemoryMessagesStore implements IMessagesStore {
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
boolean hasOwnerMember = false;
for (WFCMessage.GroupMember member : memberList) {
if(failedMembers.containsKey(member.getMemberId())) {
continue;
}
WFCMessage.GroupMember.Builder builder = member.toBuilder();
builder.setUpdateDt(dt).setCreateDt(dt);
if (member.getMemberId().equals(owner)) {
@@ -1577,7 +1600,7 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra) {
public ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra, Map<String, Integer> failedMembers) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
@@ -1650,6 +1673,10 @@ public class MemoryMessagesStore implements IMessagesStore {
List<WFCMessage.GroupMember> tmp = new ArrayList<>();
int newMemberCount = 0;
for (WFCMessage.GroupMember member : memberList) {
if(failedMembers.containsKey(member.getMemberId())) {
continue;
}
if (existMemberIds.contains(member.getMemberId()) && member.getType() != GroupMemberType_Removed) {
if(!isAdmin)
continue;
@@ -1682,7 +1709,11 @@ public class MemoryMessagesStore implements IMessagesStore {
if (memberList.size() == 0) {
if (!isAdmin) {
return ErrorCode.ERROR_CODE_ALREADY_IN_GROUP;
if(failedMembers.isEmpty()) {
return ErrorCode.ERROR_CODE_ALREADY_IN_GROUP;
} else {
return ErrorCode.ERROR_CODE_SUCCESS;
}
} else {
return ErrorCode.ERROR_CODE_SUCCESS;
}
@@ -1701,6 +1732,10 @@ public class MemoryMessagesStore implements IMessagesStore {
List<String> memberIds = new ArrayList<>();
for (WFCMessage.GroupMember member : memberList) {
if(failedMembers.containsKey(member.getMemberId())) {
continue;
}
if (member.getType() != GroupMemberType_Removed) {
memberIds.add(member.getMemberId());
}
@@ -4748,6 +4783,11 @@ public class MemoryMessagesStore implements IMessagesStore {
return mGroupVisibleQuitKickoffNotification;
}
@Override
public boolean isGroupAllowPartSuccess() {
return mGroupAllowPartSuccess;
}
@Override
public int getGroupForbiddenClientOperation() {
return mGroupForbiddenClientOperation;
@@ -102,9 +102,9 @@ public interface IMessagesStore {
WFCMessage.PullMessageResult fetchMessage(String user, String exceptClientId, long fromMessageId, int pullType);
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count, Collection<Integer> contentTypes);
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId, boolean directing);
ErrorCode canAddGroupMembers(String operator, List<WFCMessage.GroupMember> memberList);
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin);
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra);
ErrorCode canAddGroupMembers(String operator, List<WFCMessage.GroupMember> memberList, Map<String, Integer> failedMembers);
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList, String memberExtra, boolean isAdmin, Map<String, Integer> failedMembers);
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList, String extra, Map<String, Integer> failedMembers);
ErrorCode kickoffGroupMembers(String operator, boolean isAdmin, String groupId, List<String> memberList);
ErrorCode quitGroup(String operator, String groupId, boolean admin);
void clearUserGroups(String userId);
@@ -253,7 +253,7 @@ public interface IMessagesStore {
boolean isChannelCallbackWithSenderInfo();
boolean isChannelCallbackWithTargetInfo();
boolean isChannelNewCallbackFeature();
boolean isGroupAllowPartSuccess();
boolean isRobotAutoAcceptFriendRequest();
long getPushExpiredTimes();