diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendExtraPutAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendExtraPutAction.java new file mode 100755 index 00000000..f1782abd --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendExtraPutAction.java @@ -0,0 +1,40 @@ +/* + * 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.InputUpdateAlias; +import cn.wildfirechat.pojos.InputUpdateExtra; +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.netty.handler.codec.http.FullHttpRequest; + +@Route(APIPath.Friend_Set_Extra) +@HttpMethod("POST") +public class FriendExtraPutAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputUpdateExtra input = getRequestBody(request.getNettyRequest(), InputUpdateExtra.class); + ErrorCode errorCode = messagesStore.setFriendExtraRequest(input.getOperator(), input.getTargetId(), input.getExtra(), new long[1]); + setResponseContent(RestResult.resultOf(errorCode), response); + } + return true; + } +} diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 9a307931..46c1f530 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -3079,6 +3079,43 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_SUCCESS; } + @Override + public ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] heads){ + HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); + MultiMap friendsMap = hzInstance.getMultiMap(USER_FRIENDS); + + FriendData friendData = null; + Collection friends = friendsMap.get(fromUser); + if (friends == null || friends.size() == 0) { + friends = loadFriend(friendsMap, fromUser); + } + + for (FriendData fd:friends) { + if (fd.getFriendUid().equals(targetUserId)) { + friendData = fd; + break; + } + } + + if (friendData == null) { + friendData = new FriendData(); + friendData.setUserId(fromUser); + friendData.setFriendUid(targetUserId); + } + + friendData.setExtra(extra); + friendData.setTimestamp(System.currentTimeMillis()); + + databaseStore.persistOrUpdateFriendData(friendData); + + heads[0] = friendData.getTimestamp(); + + friendsMap.remove(fromUser); + + callbackRelationEvent(fromUser, targetUserId, 3, extra); + return ErrorCode.ERROR_CODE_SUCCESS; + } + @Override public ErrorCode handleJoinChatroom(String userId, String clientId, String chatroomId) { IMap chatroomInfoMap = m_Server.getHazelcastInstance().getMap(CHATROOMS); diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 3dbad0c9..d686eba6 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -182,6 +182,7 @@ public interface IMessagesStore { ErrorCode SyncFriendRequestUnread(String userId, long unreadDt, long[] head); ErrorCode isAllowUserMessage(String fromUser, String userId); ErrorCode setFriendAliasRequest(String fromUser, String targetUserId, String alias, long[] head); + ErrorCode setFriendExtraRequest(String fromUser, String targetUserId, String extra, long[] head); ErrorCode handleJoinChatroom(String userId, String clientId, String chatroomId); ErrorCode handleQuitChatroom(String userId, String clientId, String chatroomId); diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index fb388883..b99a5d2f 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -39,6 +39,7 @@ 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_Set_Extra = "/admin/friend/set_extra"; String Friend_Send_Request = "/admin/friend/send_request"; String Friend_Get_Requests = "/admin/friend/get_requests"; String Relation_Get = "/admin/relation/get"; diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputUpdateExtra.java b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateExtra.java new file mode 100755 index 00000000..80fb5157 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateExtra.java @@ -0,0 +1,40 @@ +/* + * 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 InputUpdateExtra { + private String operator; + private String targetId; + private String extra; + + public String getTargetId() { + return targetId; + } + + public void setTargetId(String targetId) { + this.targetId = targetId; + } + + public String getOperator() { + return operator; + } + + public void setOperator(String operator) { + this.operator = operator; + } + + public String getExtra() { + return extra; + } + + public void setExtra(String extra) { + this.extra = extra; + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index b4beec1f..a69dd74a 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -381,6 +381,15 @@ public class Main { System.exit(-1); } + String friendExtra = "hello friend extra"; + IMResult setExtraResult = RelationAdmin.updateFriendExtra("ff1", "ff2", friendExtra); + if (setExtraResult != null && setExtraResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("set friend extra success"); + } else { + System.out.println("set friend extra failure"); + System.exit(-1); + } + IMResult getRelation = RelationAdmin.getRelation("ff1", "ff2"); if (getRelation != null && getRelation.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { System.out.println("get friend relation success"); @@ -388,6 +397,11 @@ public class Main { System.out.println("get friend relation failure"); System.exit(-1); } + + if(!friendExtra.equals(getRelation.getResult().extra)) { + System.out.println("set friend extra failure"); + System.exit(-1); + } } //*********************************************** //**** 群组相关功能 diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java index 1530d855..db43a3b8 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/RelationAdmin.java @@ -56,6 +56,14 @@ public class RelationAdmin { return AdminHttpUtils.httpJsonPost(path, input, OutputGetAlias.class); } + public static IMResult updateFriendExtra(String operator, String targetId, String extra) throws Exception { + String path = APIPath.Friend_Set_Extra; + InputUpdateExtra input = new InputUpdateExtra(); + input.setOperator(operator); + input.setTargetId(targetId); + input.setExtra(extra); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } public static IMResult sendFriendRequest(String userId, String targetId, String reason, boolean force) throws Exception { String path = APIPath.Friend_Send_Request; InputAddFriendRequest input = new InputAddFriendRequest();