Skip to content

Commit

Permalink
支持群主或管理员修改成员昵称
Browse files Browse the repository at this point in the history
  • Loading branch information
imhao183 committed Oct 11, 2020
1 parent c26e98b commit 4a8500b
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
public class ModifyGroupAliasHandler extends GroupHandler<WFCMessage.ModifyGroupMemberAlias> {
@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());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*
* This file is part of the Wildfire Chat package.
* (c) Heavyrain2012 <[email protected]>
*
* 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<WFCMessage.ModifyGroupMemberAlias> {
@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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1172,7 +1172,7 @@ else if(modifyType == Modify_Group_Searchable)
}

@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<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
Expand All @@ -1186,25 +1186,72 @@ public ErrorCode modifyGroupAlias(String operator, String groupId, String alias)
}
}

long updateDt = System.currentTimeMillis();
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> 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;
}

Expand Down
2 changes: 1 addition & 1 deletion broker/src/main/java/io/moquette/spi/IMessagesStore.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ public String toString() {
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<WFCMessage.GroupInfo> getGroupInfos(List<WFCMessage.UserRequest> requests);
WFCMessage.GroupInfo getGroupInfo(String groupId);
Set<String> getUserGroupIds(String userId);
Expand Down
1 change: 1 addition & 0 deletions broker/src/main/java/win/liyufan/im/IMTopic.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down

0 comments on commit 4a8500b

Please sign in to comment.