diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AddFriendRequestAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AddFriendRequestAction.java new file mode 100755 index 00000000..4488cf59 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AddFriendRequestAction.java @@ -0,0 +1,87 @@ +/* + * 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 com.xiaoleilu.loServer.action.admin; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.InputAddFriendRequest; +import cn.wildfirechat.pojos.InputUpdateAlias; +import cn.wildfirechat.proto.WFCMessage; +import com.google.gson.Gson; +import com.hazelcast.util.StringUtil; +import com.xiaoleilu.loServer.RestResult; +import com.xiaoleilu.loServer.annotation.HttpMethod; +import com.xiaoleilu.loServer.annotation.Route; +import com.xiaoleilu.loServer.handler.Request; +import com.xiaoleilu.loServer.handler.Response; +import io.moquette.persistence.RPCCenter; +import io.moquette.persistence.TargetEntry; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import win.liyufan.im.IMTopic; + +import java.util.concurrent.Executor; + +@Route(APIPath.Friend_Send_Request) +@HttpMethod("POST") +public class AddFriendRequestAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputAddFriendRequest input = getRequestBody(request.getNettyRequest(), InputAddFriendRequest.class); + + if (StringUtil.isNullOrEmpty(input.getUserId()) || StringUtil.isNullOrEmpty(input.getFriendUid())) { + sendResponse(response, ErrorCode.INVALID_PARAMETER, null); + return true; + } + + WFCMessage.AddFriendRequest addFriendRequest = WFCMessage.AddFriendRequest.newBuilder().setReason(input.getReason()).setTargetUid(input.getFriendUid()).build(); + RPCCenter.getInstance().sendRequest(input.getUserId(), null, IMTopic.AddFriendRequestTopic, addFriendRequest.toByteArray(), input.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { + @Override + public void onSuccess(byte[] result) { + ByteBuf byteBuf = Unpooled.buffer(); + byteBuf.writeBytes(result); + ErrorCode errorCode = ErrorCode.fromCode(byteBuf.readByte()); + if (errorCode == ErrorCode.ERROR_CODE_SUCCESS) { + sendResponse(response, null, null); + } else { + sendResponse(response, errorCode, null); + } + } + + @Override + public void onError(ErrorCode errorCode) { + sendResponse(response, errorCode, null); + } + + @Override + public void onTimeout() { + sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null); + } + + @Override + public Executor getResponseExecutor() { + return command -> { + ctx.executor().execute(command); + }; + } + }, input.isForce()); + return false; + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java index 8e4a50e8..6ac81f58 100644 --- a/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/AddFriendHandler.java @@ -23,7 +23,7 @@ public class AddFriendHandler extends GroupHandler @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.AddFriendRequest request, Qos1PublishHandler.IMCallback callback) { long[] head = new long[1]; - ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head); + ErrorCode errorCode = m_messagesStore.saveAddFriendRequest(fromUser, request, head, isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { WFCMessage.User user = m_messagesStore.getUserInfo(request.getTargetUid()); if (user != null && user.getType() == ProtoConstants.UserType.UserType_Normal) { diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 0781dec2..dd440088 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -2120,7 +2120,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head) { + public ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin) { if (mDisableFriendRequest) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } @@ -2141,7 +2141,7 @@ public class MemoryMessagesStore implements IMessagesStore { } } - if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted) { + if (existRequest != null && existRequest.getStatus() != ProtoConstants.FriendRequestStatus.RequestStatus_Accepted && !isAdmin) { if (mFriendRequestDuration > 0 && System.currentTimeMillis() - existRequest.getUpdateDt() > mFriendRequestDuration) { if (existRequest.getStatus() == ProtoConstants.FriendRequestStatus.RequestStatus_Rejected && System.currentTimeMillis() - existRequest.getUpdateDt() < mFriendRejectDuration) { @@ -2165,7 +2165,7 @@ public class MemoryMessagesStore implements IMessagesStore { break; } } - if (friendData1 != null && friendData1.getBlacked() > 0) { + if (friendData1 != null && friendData1.getBlacked() > 0 && !isAdmin) { return ErrorCode.ERROR_CODE_IN_BLACK_LIST; } diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index f4f25ff6..df7ce139 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -164,7 +164,7 @@ public interface IMessagesStore { void clearUserFriend(String userId); List getFriendRequestList(String userId, long version); - ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head); + ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head, boolean isAdmin); ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin); boolean isNewFriendWelcomeMessage(); ErrorCode deleteFriend(String userId, String friendUid, long[] head); diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index 01e8b113..747cc90e 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -36,6 +36,8 @@ public interface APIPath { String Blacklist_Get_List = "/admin/blacklist/list"; String Friend_Get_Alias = "/admin/friend/get_alias"; String Friend_Set_Alias = "/admin/friend/set_alias"; + String Friend_Send_Request = "/admin/friend/send_request"; + String Friend_Get_Requests = "/admin/friend/get_requests"; String Msg_Send = "/admin/message/send"; String Msg_Recall = "/admin/message/recall"; diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputAddFriendRequest.java b/common/src/main/java/cn/wildfirechat/pojos/InputAddFriendRequest.java new file mode 100755 index 00000000..0d5894b2 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputAddFriendRequest.java @@ -0,0 +1,50 @@ +/* + * 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 cn.wildfirechat.pojos; + + +public class InputAddFriendRequest { + private String userId; + private String friendUid; + private String reason; + private boolean force; + + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getFriendUid() { + return friendUid; + } + + public void setFriendUid(String friendUid) { + this.friendUid = friendUid; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } + + public boolean isForce() { + return force; + } + + public void setForce(boolean force) { + this.force = force; + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 1044f455..a4a9e14c 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -253,6 +253,30 @@ public class Main { System.exit(-1); } + IMResult result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello", true); + if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("send friend request success"); + } else { + System.out.println("failure"); + System.exit(-1); + } + + result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello2", false); + if (result != null && result.getErrorCode() != ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("success"); + } else { + System.out.println("failure"); + System.exit(-1); + } + + result = RelationAdmin.sendFrienRequest("ff1", "ff2", "hello3", true); + if (result != null && result.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("success"); + } else { + System.out.println("send friend request success"); + System.exit(-1); + } + IMResult updateFriendStatusResult = RelationAdmin.setUserFriend("ff1", "ff2", true, "{\"from\":1}"); if (updateFriendStatusResult != null && updateFriendStatusResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("update friend status success"); diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java index 73425938..8c6dadd9 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java @@ -56,11 +56,13 @@ public class RelationAdmin { return AdminHttpUtils.httpJsonPost(path, input, OutputGetAlias.class); } - public static IMResult sendFrienRequest(String operator, String targetId, String reason, String extra) throws Exception { + public static IMResult sendFrienRequest(String userId, String targetId, String reason, boolean force) throws Exception { String path = APIPath.Friend_Send_Request; - InputGetAlias input = new InputGetAlias(); - input.setOperator(operator); - input.setTargetId(targetId); - return AdminHttpUtils.httpJsonPost(path, input, OutputGetAlias.class); + InputAddFriendRequest input = new InputAddFriendRequest(); + input.setUserId(userId); + input.setFriendUid(targetId); + input.setReason(reason); + input.setForce(force); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); } }