diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationAction.java new file mode 100755 index 00000000..e970a8d1 --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationAction.java @@ -0,0 +1,88 @@ +/* + * 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.proto.WFCMessage; +import com.google.gson.Gson; +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 com.xiaoleilu.loServer.pojos.InputFriendRequest; +import com.xiaoleilu.loServer.pojos.OutputCreateGroupResult; +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 io.netty.util.internal.StringUtil; +import win.liyufan.im.ErrorCode; +import win.liyufan.im.IMTopic; + +import java.util.concurrent.Executor; + +@Route("admin/friend/status") +@HttpMethod("POST") +public class FriendRelationAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputFriendRequest friendAdd = getRequestBody(request.getNettyRequest(), InputFriendRequest.class); + if (friendAdd != null + && !StringUtil.isNullOrEmpty(friendAdd.getUserId()) + && !StringUtil.isNullOrEmpty(friendAdd.getFriendUid()) + ) { + WFCMessage.HandleFriendRequest friendRequest = WFCMessage.HandleFriendRequest.newBuilder().setTargetUid(friendAdd.getFriendUid()).setStatus(friendAdd.getStatus()).build(); + RPCCenter.getInstance().sendRequest(friendAdd.getUserId(), null, IMTopic.HandleFriendRequestTopic, friendRequest.toByteArray(), friendAdd.getFriendUid(), 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); + } + }, true); + return false; + } else { + response.setStatus(HttpResponseStatus.OK); + RestResult result = RestResult.resultOf(ErrorCode.INVALID_PARAMETER); + response.setContent(new Gson().toJson(result)); + } + + } + return true; + } +} diff --git a/broker/src/main/java/com/xiaoleilu/loServer/pojos/InputFriendRequest.java b/broker/src/main/java/com/xiaoleilu/loServer/pojos/InputFriendRequest.java new file mode 100755 index 00000000..0ebd5d3e --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/pojos/InputFriendRequest.java @@ -0,0 +1,41 @@ +/* + * 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.pojos; + + +public class InputFriendRequest { + private String userId; + private String friendUid; + private int status; + + + 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 int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } +} diff --git a/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java b/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java index ad8d1570..846411ba 100644 --- a/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/HandleFriendRequestHandler.java @@ -25,9 +25,9 @@ public class HandleFriendRequestHandler extends IMHandler friendsMap = hzInstance.getMultiMap(USER_FRIENDS); + + FriendData friendData1 = null; + Collection friendDatas = friendsMap.get(userId); + for (FriendData fd : friendDatas) { + if (fd.getFriendUid().equals(request.getTargetUid())) { + friendData1 = fd; + break; + } + } + if (friendData1 == null) { + friendData1 = new FriendData(userId, request.getTargetUid(), "", request.getStatus(), System.currentTimeMillis()); + } else { + friendsMap.remove(userId, friendData1); + friendData1.setState(request.getStatus()); + friendData1.setTimestamp(System.currentTimeMillis()); + } + + friendsMap.put(userId, friendData1); + databaseStore.persistOrUpdateFriendData(friendData1); + + FriendData friendData2 = null; + + friendDatas = friendsMap.get(request.getTargetUid()); + for (FriendData fd : friendDatas) { + if (fd.getFriendUid().equals(userId)) { + friendData2 = fd; + break; + } + } + if (friendData2 == null) { + friendData2 = new FriendData(request.getTargetUid(), userId, "", request.getStatus(), friendData1.getTimestamp()); + } else { + friendsMap.remove(request.getTargetUid(), friendData2); + friendData2.setState(request.getStatus()); + friendData2.setTimestamp(System.currentTimeMillis()); + } + + + friendsMap.put(request.getTargetUid(), friendData2); + databaseStore.persistOrUpdateFriendData(friendData2); + + heads[0] = friendData2.getTimestamp(); + heads[1] = friendData1.getTimestamp(); + return ErrorCode.ERROR_CODE_SUCCESS; + } + MultiMap requestMap = hzInstance.getMultiMap(USER_FRIENDS_REQUEST); Collection requests = requestMap.get(userId); if (requests == null || requests.size() == 0) { diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 0535a88c..32a6db06 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -152,7 +152,7 @@ public interface IMessagesStore { List getFriendRequestList(String userId, long version); ErrorCode saveAddFriendRequest(String userId, WFCMessage.AddFriendRequest request, long[] head); - ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads); + ErrorCode handleFriendRequest(String userId, WFCMessage.HandleFriendRequest request, WFCMessage.Message.Builder msgBuilder, long[] heads, boolean isAdmin); ErrorCode deleteFriend(String userId, String friendUid); ErrorCode blackUserRequest(String fromUser, String targetUserId, int status, long[] head); ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head);