diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java index a701150b..e4b85376 100644 --- a/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupAliasHandler.java @@ -21,7 +21,7 @@ import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; public class ModifyGroupAliasHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) { - ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias()); + ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), null, isAdmin); if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) { if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); diff --git a/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java new file mode 100644 index 00000000..50e02174 --- /dev/null +++ b/broker/src/main/java/io/moquette/imhandler/ModifyGroupMemberAliasHandler.java @@ -0,0 +1,35 @@ +/* + * This file is part of the Wildfire Chat package. + * (c) Heavyrain2012 + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +package io.moquette.imhandler; + +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.GroupNotificationBinaryContent; +import cn.wildfirechat.proto.WFCMessage; +import io.moquette.spi.impl.Qos1PublishHandler; +import io.netty.buffer.ByteBuf; +import win.liyufan.im.IMTopic; + +import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS; + +@Handler(IMTopic.ModifyGroupMemberAliasTopic) +public class ModifyGroupMemberAliasHandler extends GroupHandler { + @Override + public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.ModifyGroupMemberAlias request, Qos1PublishHandler.IMCallback callback) { + ErrorCode errorCode = m_messagesStore.modifyGroupAlias(fromUser, request.getGroupId(), request.getAlias(), request.getMemberId(), isAdmin); + if (errorCode == ERROR_CODE_SUCCESS && request.hasNotifyContent()) { + if (request.hasNotifyContent()&& request.getNotifyContent().getType() > 0) { + sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); + } else { + WFCMessage.MessageContent content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getAlias(), request.getMemberId()).getModifyGroupMemberAliasNotifyContent(); + sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), content); + } + } + return errorCode; + } +} diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 5347092b..2a039cbe 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -1172,7 +1172,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode modifyGroupAlias(String operator, String groupId, String alias) { + public ErrorCode modifyGroupAlias(String operator, String groupId, String alias, String memberId, boolean isAdmin) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mIMap = hzInstance.getMap(GROUPS_MAP); @@ -1186,25 +1186,72 @@ public class MemoryMessagesStore implements IMessagesStore { } } - long updateDt = System.currentTimeMillis(); MultiMap groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS); Collection members = groupMembers.get(groupId); if (members == null || members.size() == 0) { members = loadGroupMemberFromDB(hzInstance, groupId); } + + if (StringUtil.isNullOrEmpty(memberId)) { + memberId = operator; + } else { + if (!isAdmin && !operator.equals(groupInfo.getOwner())) { + WFCMessage.GroupMember operatorMember = null; + WFCMessage.GroupMember targetMember = null; + for (WFCMessage.GroupMember member : members) { + if (member.getMemberId().equals(operator)) { + operatorMember = member; + if (targetMember != null) { + break; + } + } + if ((member.getMemberId().equals(memberId))) { + targetMember = member; + if (operatorMember != null) { + break; + } + } + } + + if (operatorMember == null) { + LOG.error("Modify group member alias error, the operator {} is not in group", operator); + return ErrorCode.ERROR_CODE_NOT_IN_GROUP; + } + + if (targetMember == null) { + LOG.error("Modify group member alias error, the member {} is not in group", memberId); + return ErrorCode.ERROR_CODE_NOT_IN_GROUP; + } + + if (operatorMember.getType() == GroupMemberType_Manager && targetMember.getType() != GroupMemberType_Manager) { + LOG.error("Modify group member alias error, the operator {} type is {} and the member {} type is {}", operator, operatorMember.getType(), memberId, targetMember.getType()); + return ErrorCode.ERROR_CODE_NOT_RIGHT; + } + } + } + + long updateDt = System.currentTimeMillis(); + + boolean inGroup = false; for (WFCMessage.GroupMember member : members) { - if (member.getMemberId().equals(operator)) { + if (member.getMemberId().equals(memberId)) { groupMembers.remove(groupId, member); member = member.toBuilder().setAlias(alias).setUpdateDt(updateDt).build(); databaseStore.persistGroupMember(groupId, Arrays.asList(member)); databaseStore.updateGroupMemberCountDt(groupId, -1, updateDt); groupMembers.put(groupId, member); - mIMap.put(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build()); + mIMap.set(groupId, groupInfo.toBuilder().setUpdateDt(updateDt).setMemberUpdateDt(updateDt).build()); + inGroup = true; break; } } + if (!inGroup) { + LOG.error("Modify group member alias error, the member {} is not in group", memberId); + return ErrorCode.ERROR_CODE_NOT_IN_GROUP; + } + return ErrorCode.ERROR_CODE_SUCCESS; } diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index c3847b3b..547a69fa 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -111,7 +111,7 @@ public interface IMessagesStore { void clearUserGroups(String userId); ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin); ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value, boolean isAdmin); - ErrorCode modifyGroupAlias(String operator, String groupId, String alias); + ErrorCode modifyGroupAlias(String operator, String groupId, String alias, String memberId, boolean isAdmin); List getGroupInfos(List requests); WFCMessage.GroupInfo getGroupInfo(String groupId); Set getUserGroupIds(String userId); diff --git a/broker/src/main/java/win/liyufan/im/IMTopic.java b/broker/src/main/java/win/liyufan/im/IMTopic.java index aa1fe9d1..8d6ded54 100755 --- a/broker/src/main/java/win/liyufan/im/IMTopic.java +++ b/broker/src/main/java/win/liyufan/im/IMTopic.java @@ -28,6 +28,7 @@ public interface IMTopic { String DismissGroupTopic = "GD"; String ModifyGroupInfoTopic = "GMI"; String ModifyGroupAliasTopic = "GMA"; + String ModifyGroupMemberAliasTopic = "GMMA"; String GetGroupInfoTopic = "GPGI"; String GetGroupMemberTopic = "GPGM"; String TransferGroupTopic = "GTG";