diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/RecallMessageAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/RecallMessageAction.java index 5ae2c457..58e7c73d 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/RecallMessageAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/RecallMessageAction.java @@ -25,6 +25,9 @@ import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; import win.liyufan.im.IMTopic; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + @Route(APIPath.Msg_Recall) @HttpMethod("POST") public class RecallMessageAction extends AdminAction { @@ -42,10 +45,9 @@ public class RecallMessageAction extends AdminAction { WFCMessage.INT64Buf idBuf = WFCMessage.INT64Buf.newBuilder().setId(recallMessageData.getMessageUid()).build(); sendApiMessage(response, recallMessageData.getOperator(), IMTopic.RecallMessageTopic, idBuf.toByteArray(), result -> { - ByteBuf byteBuf = Unpooled.buffer(); - byteBuf.writeBytes(result); - ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte()); - return new Result(errorCode); + ErrorCode errorCode = ErrorCode.fromCode(result[0]); + byte[] data = Arrays.copyOfRange(result,1, result.length); + return new Result(errorCode, new String(data, StandardCharsets.UTF_8)); }); return false; } else { diff --git a/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java b/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java index 79197d1b..0a091173 100644 --- a/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/RecallMessageHandler.java @@ -23,7 +23,7 @@ public class RecallMessageHandler extends IMHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, ProtoConstants.RequestSourceType requestSourceType, WFCMessage.INT64Buf int64Buf, Qos1PublishHandler.IMCallback callback) { boolean isAdmin = requestSourceType == ProtoConstants.RequestSourceType.Request_From_Admin; - ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin); + ErrorCode errorCode = m_messagesStore.recallMessage(int64Buf.getId(), fromUser, clientID, isAdmin, ackPayload); if(errorCode != ErrorCode.ERROR_CODE_SUCCESS) { 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 24c69411..c7dc3025 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -35,6 +35,7 @@ import io.moquette.spi.IMessagesStore; import io.moquette.spi.impl.security.AES; import io.moquette.spi.security.Tokenor; import io.moquette.spi.impl.subscriptions.Topic; +import io.netty.buffer.ByteBuf; import io.netty.handler.codec.mqtt.MqttVersion; import org.apache.commons.codec.digest.DigestUtils; import org.json.simple.JSONObject; @@ -44,6 +45,7 @@ import win.liyufan.im.*; import java.net.MalformedURLException; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; @@ -2177,7 +2179,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin) { + public ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mIMap = hzInstance.getMap(MESSAGES_MAP); @@ -2303,6 +2305,7 @@ public class MemoryMessagesStore implements IMessagesStore { databaseStore.deleteMessage(messageUid); mIMap.put(messageUid, messageBundle, 7, TimeUnit.DAYS); + ackPayload.writeBytes(recalledContent.getBytes(StandardCharsets.UTF_8)); return ErrorCode.ERROR_CODE_SUCCESS; } else { return ErrorCode.ERROR_CODE_NOT_EXIST; diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index c25c315a..a40ef573 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -128,7 +128,7 @@ public interface IMessagesStore { ErrorCode canSendMessageInGroup(String member, String groupId); Set getGroupManagers(String groupId, boolean includeOwner); - ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin); + ErrorCode recallMessage(long messageUid, String operatorId, String clientId, boolean isAdmin, ByteBuf ackPayload); ErrorCode recallCastMessage(long messageUid, String operatorId); void clearUserMessages(String userId); diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 2ecd2098..8c638ae5 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -747,8 +747,8 @@ public class Main { System.exit(-1); } - IMResult voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid()); - if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + IMResult stringIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid()); + if (stringIMResult != null && stringIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("recall message success"); } else { System.out.println("recall message failure"); @@ -756,7 +756,7 @@ public class Main { } if (commercialServer) { - voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid()); + IMResult voidIMResult = MessageAdmin.deleteMessage(resultSendMessage.getResult().getMessageUid()); if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("delete message success"); } else { @@ -832,7 +832,7 @@ public class Main { System.exit(-1); } - voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers); + IMResult voidIMResult = MessageAdmin.recallMultiCastMessage("user1", resultMulticastMessage.result.getMessageUid(), multicastReceivers); if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("Success"); } else { diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java index a4839ad8..e7cda592 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java @@ -25,12 +25,12 @@ public class MessageAdmin { return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class); } - public static IMResult recallMessage(String operator, long messageUid) throws Exception { + public static IMResult recallMessage(String operator, long messageUid) throws Exception { String path = APIPath.Msg_Recall; RecallMessageData messageData = new RecallMessageData(); messageData.setOperator(operator); messageData.setMessageUid(messageUid); - return AdminHttpUtils.httpJsonPost(path, messageData, Void.class); + return AdminHttpUtils.httpJsonPost(path, messageData, String.class); } //仅专业版支持