update code

This commit is contained in:
heavyrain.lee
2019-06-29 12:01:37 +08:00
committed by heavyrain lee
parent c8769808b5
commit 8dfc23b61d
11 changed files with 156 additions and 35 deletions
@@ -22,7 +22,7 @@ public class AddGroupMember extends GroupHandler<WFCMessage.AddGroupMemberReques
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddGroupMemberRequest request, Qos1PublishHandler.IMCallback callback) {
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, request.getGroupId(), request.getAddedMemberList());
ErrorCode errorCode = m_messagesStore.addGroupMembers(fromUser, isAdmin, request.getGroupId(), request.getAddedMemberList());
if (errorCode == ERROR_CODE_SUCCESS) {
if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) {
sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent());
@@ -14,9 +14,8 @@ import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import cn.wildfirechat.common.ErrorCode;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.Modify_Group_Name;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.Modify_Group_Portrait;
import static cn.wildfirechat.common.ErrorCode.ERROR_CODE_SUCCESS;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
import static win.liyufan.im.IMTopic.ModifyGroupInfoTopic;
@Handler(value = ModifyGroupInfoTopic)
@@ -33,6 +32,14 @@ public class ModifyGroupInfoHandler extends GroupHandler<WFCMessage.ModifyGroupI
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupNameNotifyContent();
} else if(request.getType() == Modify_Group_Portrait) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, null, "").getChangeGroupPortraitNotifyContent();
} else if(request.getType() == Modify_Group_Mute) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupMuteNotifyContent();
} else if(request.getType() == Modify_Group_JoinType) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupJointypeNotifyContent();
} else if(request.getType() == Modify_Group_PrivateChat) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupPrivatechatNotifyContent();
} else if(request.getType() == Modify_Group_Searchable) {
content = new GroupNotificationBinaryContent(request.getGroupId(), fromUser, request.getValue(), "").getChangeGroupSearchableNotifyContent();
}
if (content != null) {
@@ -58,14 +58,19 @@ public class SendMessageHandler extends IMHandler<WFCMessage.Message> {
}
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group && !m_messagesStore.isMemberInGroup(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group && m_messagesStore.isForbiddenInGroup(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_ChatRoom && !m_messagesStore.checkUserClientInChatroom(fromUser, clientID, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHATROOM;
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel && !m_messagesStore.checkUserInChannel(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Group ) {
errorCode = m_messagesStore.canSendMessageInGroup(fromUser, message.getConversation().getTarget());
if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_ChatRoom) {
if(!m_messagesStore.checkUserClientInChatroom(fromUser, clientID, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHATROOM;
}
} else if (message.getConversation().getType() == ProtoConstants.ConversationType.ConversationType_Channel) {
if(!m_messagesStore.checkUserInChannel(fromUser, message.getConversation().getTarget())) {
return ErrorCode.ERROR_CODE_NOT_IN_CHANNEL;
}
}
}
@@ -793,7 +793,11 @@ public class DatabaseStore {
", `_extra`" +
", `_dt`" +
", `_member_count`" +
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?)" +
", `_mute`" +
", `_join_type`" +
", `_private_chat`" +
", `_searchable`" +
", `_member_dt`) values(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
" ON DUPLICATE KEY UPDATE " +
"`_name` = ?," +
"`_portrait` = ?," +
@@ -802,6 +806,10 @@ public class DatabaseStore {
"`_extra` = ?," +
"`_dt` = ?," +
"`_member_count` = ?," +
"`_mute` = ?" +
", `_join_type` = ?" +
", `_private_chat` = ?" +
", `_searchable` = ?, " +
"`_member_dt` = ?";
@@ -816,6 +824,10 @@ public class DatabaseStore {
statement.setString(index++, groupInfo.getExtra());
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
statement.setInt(index++, groupInfo.getMemberCount());
statement.setInt(index++, groupInfo.getMute());
statement.setInt(index++, groupInfo.getJoinType());
statement.setInt(index++, groupInfo.getPrivateChat());
statement.setInt(index++, groupInfo.getSearchable());
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
statement.setString(index++, groupInfo.getName());
@@ -825,6 +837,10 @@ public class DatabaseStore {
statement.setString(index++, groupInfo.getExtra());
statement.setLong(index++, groupInfo.getUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
statement.setInt(index++, groupInfo.getMemberCount());
statement.setInt(index++, groupInfo.getMute());
statement.setInt(index++, groupInfo.getJoinType());
statement.setInt(index++, groupInfo.getPrivateChat());
statement.setInt(index++, groupInfo.getSearchable());
statement.setLong(index++, groupInfo.getMemberUpdateDt() == 0 ? System.currentTimeMillis() : groupInfo.getUpdateDt());
int count = statement.executeUpdate();
LOG.info("Update rows {}", count);
@@ -1155,6 +1171,10 @@ public class DatabaseStore {
", `_dt`" +
", `_member_count`" +
", `_member_dt`" +
", `_mute`" +
", `_join_type`" +
", `_private_chat`" +
", `_searchable`" +
" from t_group where `_gid` = ?";
statement = connection.prepareStatement(sql);
@@ -1190,18 +1210,27 @@ public class DatabaseStore {
strValue = (strValue == null ? "" : strValue);
builder.setExtra(strValue);
long longValue = rs.getLong(index++);
builder.setUpdateDt(longValue);
intValue = rs.getInt(index++);
builder.setMemberCount(intValue);
longValue = rs.getLong(index++);
builder.setMemberUpdateDt(longValue);
intValue = rs.getInt(index++);
builder.setMute(intValue);
intValue = rs.getInt(index++);
builder.setJoinType(intValue);
intValue = rs.getInt(index++);
builder.setPrivateChat(intValue);
intValue = rs.getInt(index++);
builder.setSearchable(intValue);
return builder.build();
}
} catch (SQLException e) {
@@ -49,10 +49,9 @@ import java.util.function.Consumer;
import static cn.wildfirechat.proto.ProtoConstants.ChannelStatus.Channel_Status_Destoryed;
import static cn.wildfirechat.proto.ProtoConstants.GroupMemberType.*;
import static cn.wildfirechat.proto.ProtoConstants.ModifyChannelInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.Modify_Group_Extra;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.Modify_Group_Name;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.Modify_Group_Portrait;
import static cn.wildfirechat.proto.ProtoConstants.ModifyGroupInfoType.*;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static io.moquette.BrokerConstants.*;
import static io.moquette.server.Constants.MAX_CHATROOM_MESSAGE_QUEUE;
@@ -197,7 +196,7 @@ public class MemoryMessagesStore implements IMessagesStore {
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
for (WFCMessage.GroupMember member : members) {
if (member.getType() != ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
if (member.getType() != GroupMemberType_Removed) {
notifyReceivers.add(member.getMemberId());
}
}
@@ -603,19 +602,25 @@ public class MemoryMessagesStore implements IMessagesStore {
mIMap.put(groupId, groupInfo);
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
List<WFCMessage.GroupMember> updatedMemberList = new ArrayList<>();
for (WFCMessage.GroupMember member : memberList) {
member = member.toBuilder().setUpdateDt(dt).build();
if (member.getMemberId().equals(groupInfo.getOwner())) {
member = member.toBuilder().setUpdateDt(dt).setType(ProtoConstants.GroupMemberType.GroupMemberType_Owner).build();
} else {
member = member.toBuilder().setUpdateDt(dt).build();
}
groupMembers.put(groupId, member);
updatedMemberList.add(member);
}
databaseStore.persistGroupMember(groupId, memberList);
databaseStore.persistGroupMember(groupId, updatedMemberList);
return groupInfo;
}
@Override
public ErrorCode addGroupMembers(String operator, String groupId, List<WFCMessage.GroupMember> memberList) {
public ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<String, WFCMessage.GroupInfo> mIMap = hzInstance.getMap(GROUPS_MAP);
@@ -629,6 +634,22 @@ public class MemoryMessagesStore implements IMessagesStore {
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
if (!isAdmin) {
boolean isMember = false;
for (WFCMessage.GroupMember member : memberList) {
if (member.getType() == GroupMemberType_Removed) {
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
} else if(member.getType() == GroupMemberType_Silent) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
isMember = true;
break;
}
if (!isMember) {
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
}
}
long updateDt = System.currentTimeMillis();
List<WFCMessage.GroupMember> tmp = new ArrayList<>();
@@ -652,7 +673,7 @@ public class MemoryMessagesStore implements IMessagesStore {
int count = 0;
for (WFCMessage.GroupMember member : groupMembers.get(groupId)) {
if (member.getType() != ProtoConstants.GroupMemberType.GroupMemberType_Removed) {
if (member.getType() != GroupMemberType_Removed) {
count++;
}
}
@@ -688,7 +709,7 @@ public class MemoryMessagesStore implements IMessagesStore {
boolean removed = groupMembers.remove(groupId, member);
if (removed) {
removeCount++;
member = member.toBuilder().setType(ProtoConstants.GroupMemberType.GroupMemberType_Removed).setUpdateDt(updateDt).build();
member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build();
groupMembers.put(groupId, member);
list.add(member);
}
@@ -739,7 +760,7 @@ public class MemoryMessagesStore implements IMessagesStore {
databaseStore.persistGroupMember(groupId, list);
databaseStore.updateGroupMemberCountDt(groupId, groupInfo.getMemberCount()-1, updateDt);
member = member.toBuilder().setType(ProtoConstants.GroupMemberType.GroupMemberType_Removed).setUpdateDt(updateDt).build();
member = member.toBuilder().setType(GroupMemberType_Removed).setUpdateDt(updateDt).build();
groupMembers.put(groupId, member);
}
break;
@@ -818,6 +839,16 @@ public class MemoryMessagesStore implements IMessagesStore {
newInfoBuilder.setPortrait(value);
else if(modifyType == Modify_Group_Extra)
newInfoBuilder.setExtra(value);
else if(modifyType == Modify_Group_Mute)
newInfoBuilder.setMute(Integer.parseInt(value));
else if(modifyType == Modify_Group_JoinType)
newInfoBuilder.setJoinType(Integer.parseInt(value));
else if(modifyType == Modify_Group_PrivateChat)
newInfoBuilder.setPrivateChat(Integer.parseInt(value));
else if(modifyType == Modify_Group_Searchable)
newInfoBuilder.setSearchable(Integer.parseInt(value));
else
return ErrorCode.INVALID_PARAMETER;
newInfoBuilder.setUpdateDt(System.currentTimeMillis());
@@ -951,7 +982,7 @@ public class MemoryMessagesStore implements IMessagesStore {
for (WFCMessage.GroupMember member : members
) {
if (member.getMemberId().equals(memberId) && member.getType() != ProtoConstants.GroupMemberType.GroupMemberType_Removed)
if (member.getMemberId().equals(memberId) && member.getType() != GroupMemberType_Removed)
return true;
}
@@ -959,19 +990,37 @@ public class MemoryMessagesStore implements IMessagesStore {
}
@Override
public boolean isForbiddenInGroup(String memberId, String groupId) {
public ErrorCode canSendMessageInGroup(String memberId, String groupId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
MultiMap<String, WFCMessage.GroupMember> groupMembers = hzInstance.getMultiMap(GROUP_MEMBERS);
IMap<String, WFCMessage.GroupInfo> groups = hzInstance.getMap(GROUPS_MAP);
WFCMessage.GroupInfo groupInfo = groups.get(groupId);
boolean isMute = false;
if (groupInfo != null) {
isMute = groupInfo.getMute()>0;
}
Collection<WFCMessage.GroupMember> members = groupMembers.get(groupId);
for (WFCMessage.GroupMember member : members
) {
if (member.getMemberId().equals(memberId) && member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Silent)
return true;
if (member.getMemberId().equals(memberId)) {
if (member.getType() == GroupMemberType_Silent) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
if (isMute && member.getType() != GroupMemberType_Manager && member.getType() != GroupMemberType_Owner) {
return ErrorCode.ERROR_CODE_GROUP_MUTED;
}
if (member.getMemberId().equals(memberId) && member.getType() != GroupMemberType_Removed) {
return ErrorCode.ERROR_CODE_NOT_IN_GROUP;
}
}
}
return false;
return ErrorCode.ERROR_CODE_SUCCESS;
}
@Override
@@ -1002,7 +1051,7 @@ public class MemoryMessagesStore implements IMessagesStore {
Collection<WFCMessage.GroupMember> members = groupMembers.get(message.getConversation().getTarget());
for (WFCMessage.GroupMember member : members) {
if (member.getMemberId().equals(operatorId)) {
if (member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Manager || member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Owner) {
if (member.getType() == GroupMemberType_Manager || member.getType() == ProtoConstants.GroupMemberType.GroupMemberType_Owner) {
canRecall = true;
}
break;
@@ -103,7 +103,7 @@ public interface IMessagesStore {
WFCMessage.PullMessageResult loadRemoteMessages(String user, WFCMessage.Conversation conversation, long beforeUid, int count);
long insertUserMessages(String sender, int conversationType, String target, int line, int messageContentType, String userId, long messageId);
WFCMessage.GroupInfo createGroup(String operator, WFCMessage.GroupInfo groupInfo, List<WFCMessage.GroupMember> memberList);
ErrorCode addGroupMembers(String operator, String groupId, List<WFCMessage.GroupMember> memberList);
ErrorCode addGroupMembers(String operator, boolean isAdmin, String groupId, List<WFCMessage.GroupMember> memberList);
ErrorCode kickoffGroupMembers(String operator, String groupId, List<String> memberList);
ErrorCode quitGroup(String operator, String groupId);
ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin);
@@ -114,7 +114,7 @@ public interface IMessagesStore {
ErrorCode getGroupMembers(String groupId, long maxDt, List<WFCMessage.GroupMember> members);
ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin);
boolean isMemberInGroup(String member, String groupId);
boolean isForbiddenInGroup(String member, String groupId);
ErrorCode canSendMessageInGroup(String member, String groupId);
ErrorCode recallMessage(long messageUid, String operatorId);