添加撤回群发消息功能

This commit is contained in:
imhao183
2020-11-11 18:32:16 +08:00
parent ca1cf03cc3
commit e621bea8fa
6 changed files with 151 additions and 0 deletions
@@ -268,4 +268,13 @@ abstract public class IMHandler<T> {
mServer.getImBusinessScheduler().execute(() -> publisher.publish2Receivers(updatedMessage, notifyReceivers, clientID, ProtoConstants.PullType.Pull_Normal));
return notifyReceivers.size();
}
protected long publishRecallMultiCastMsg(long messageUid, List<String> receivers) {
WFCMessage.Message updatedMessage = m_messagesStore.getMessage(messageUid);
Set<String> notifyReceivers = new HashSet<>(receivers);
LOG.info("Multicast recall receiver count: {}", notifyReceivers.size());
mServer.getImBusinessScheduler().execute(() -> publisher.publish2Receivers(updatedMessage, notifyReceivers, null, ProtoConstants.PullType.Pull_Normal, false));
return notifyReceivers.size();
}
}
@@ -0,0 +1,36 @@
/*
* 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.proto.WFCMessage;
import io.moquette.spi.impl.Qos1PublishHandler;
import io.netty.buffer.ByteBuf;
import win.liyufan.im.IMTopic;
@Handler(value = IMTopic.RecallMultiCastMessageTopic)
public class RecallMultiCastMessageHandler extends IMHandler<WFCMessage.RecallMultiCastMessageRequest> {
@Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.RecallMultiCastMessageRequest request, Qos1PublishHandler.IMCallback callback) {
if (!isAdmin) {
return ErrorCode.ERROR_CODE_NOT_RIGHT;
}
ErrorCode errorCode = m_messagesStore.recallCastMessage(request.getMessageId(), fromUser);
if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) {
return errorCode;
}
publishRecallMultiCastMsg(request.getMessageId(), request.getReceiverList());
return errorCode;
}
}
@@ -1754,6 +1754,26 @@ public class MemoryMessagesStore implements IMessagesStore {
}
}
public ErrorCode recallCastMessage(long messageUid, String operatorId) {
HazelcastInstance hzInstance = m_Server.getHazelcastInstance();
IMap<Long, MessageBundle> mIMap = hzInstance.getMap(MESSAGES_MAP);
MessageBundle messageBundle = mIMap.get(messageUid);
if (messageBundle != null) {
WFCMessage.Message message = messageBundle.getMessage();
message = message.toBuilder().setContent(WFCMessage.MessageContent.newBuilder().setContent(operatorId).setType(80).setData(ByteString.copyFrom(String.valueOf(messageUid).getBytes()))).build();
messageBundle.setMessage(message);
messageBundle.setFromClientId(null);
databaseStore.deleteMessage(messageUid);
mIMap.set(messageUid, messageBundle, 7, TimeUnit.DAYS);
return ErrorCode.ERROR_CODE_SUCCESS;
} else {
return ErrorCode.ERROR_CODE_NOT_EXIST;
}
}
@Override
public void clearUserMessages(String userId) {
mWriteLock.lock();
@@ -124,6 +124,7 @@ public interface IMessagesStore {
ErrorCode canSendMessageInGroup(String member, String groupId);
ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin);
ErrorCode recallCastMessage(long messageUid, String operatorId);
void clearUserMessages(String userId);