diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/UnknownErrorAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/UnknownErrorAction.java index d0eaf109..40a3ad4d 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/UnknownErrorAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/UnknownErrorAction.java @@ -28,7 +28,7 @@ public class UnknownErrorAction extends Action{ @Override public boolean action(Request request, Response response) { - response.setStatus(HttpResponseStatus.INTERNAL_SERVER_ERROR); + response.setStatus(HttpResponseStatus.NOT_FOUND); return true; } } diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/BlockUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/BlockUserAction.java index 68159743..e2c920fa 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/BlockUserAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/BlockUserAction.java @@ -23,7 +23,7 @@ import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; -@Route(APIPath.User_Status) +@Route(APIPath.User_Update_Block_Status) @HttpMethod("POST") public class BlockUserAction extends AdminAction { @@ -45,7 +45,9 @@ public class BlockUserAction extends AdminAction { result = RestResult.resultOf(errorCode); response.setContent(new Gson().toJson(result)); - RPCCenter.getInstance().sendRequest(null, null, RPCCenter.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), inputUserBlock.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true); + if (inputUserBlock.getStatus() != 0) { + RPCCenter.getInstance().sendRequest(null, null, RPCCenter.KICKOFF_USER_REQUEST, inputUserBlock.getUserId().getBytes(), inputUserBlock.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true); + } sendResponse(response, ErrorCode.ERROR_CODE_SUCCESS, null); } else { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/CheckUserOnlineAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/CheckUserOnlineAction.java index db9ed3fc..23ea382c 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/CheckUserOnlineAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/CheckUserOnlineAction.java @@ -20,7 +20,7 @@ import io.netty.handler.codec.http.FullHttpRequest; import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; -@Route(APIPath.User_Online_Status) +@Route(APIPath.User_Get_Online_Status) @HttpMethod("POST") public class CheckUserOnlineAction extends AdminAction { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DismissGroupAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DismissGroupAction.java index 7ef950e9..3f4cb48b 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DismissGroupAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/DismissGroupAction.java @@ -16,7 +16,7 @@ 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 cn.wildfirechat.pojos.InputDismissGroupMember; +import cn.wildfirechat.pojos.InputDismissGroup; import io.moquette.persistence.RPCCenter; import io.moquette.persistence.TargetEntry; import io.netty.buffer.ByteBuf; @@ -40,9 +40,9 @@ public class DismissGroupAction extends AdminAction { @Override public boolean action(Request request, Response response) { if (request.getNettyRequest() instanceof FullHttpRequest) { - InputDismissGroupMember inputDismissGroup = getRequestBody(request.getNettyRequest(), InputDismissGroupMember.class); + InputDismissGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputDismissGroup.class); if (inputDismissGroup.isValide()) { - RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.AddGroupMemberTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { + RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.DismissGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { @Override public void onSuccess(byte[] result) { ByteBuf byteBuf = Unpooled.buffer(); 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 index 177e3a95..510462ad 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationAction.java @@ -29,7 +29,7 @@ import win.liyufan.im.IMTopic; import java.util.concurrent.Executor; -@Route(APIPath.Friend_Status) +@Route(APIPath.Friend_Update_Status) @HttpMethod("POST") public class FriendRelationAction extends AdminAction { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationGetAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationGetAction.java index 714c4851..c771bb0d 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationGetAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/FriendRelationGetAction.java @@ -23,7 +23,7 @@ import io.netty.handler.codec.http.HttpResponseStatus; import java.util.ArrayList; import java.util.List; -@Route(APIPath.Friend_List) +@Route(APIPath.Friend_Get_List) @HttpMethod("POST") public class FriendRelationGetAction extends AdminAction { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetGroupInfoAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetGroupInfoAction.java new file mode 100755 index 00000000..de97781c --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetGroupInfoAction.java @@ -0,0 +1,71 @@ +/* + * 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.InputGetGroup; +import cn.wildfirechat.pojos.InputGetUserInfo; +import cn.wildfirechat.pojos.InputOutputUserInfo; +import cn.wildfirechat.pojos.PojoGroupInfo; +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 io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; + +@Route(APIPath.Group_Get_Info) +@HttpMethod("POST") +public class GetGroupInfoAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class); + if (inputGetGroup != null + && (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) { + + WFCMessage.GroupInfo groupInfo = messagesStore.getGroupInfo(inputGetGroup.getGroupId()); + + response.setStatus(HttpResponseStatus.OK); + RestResult result; + if (groupInfo == null) { + result = RestResult.resultOf(ErrorCode.ERROR_CODE_NOT_EXIST); + } else { + PojoGroupInfo pojoGroupInfo = new PojoGroupInfo(); + pojoGroupInfo.setExtra(groupInfo.getExtra()); + pojoGroupInfo.setName(groupInfo.getName()); + pojoGroupInfo.setOwner(groupInfo.getOwner()); + pojoGroupInfo.setPortrait(groupInfo.getPortrait()); + pojoGroupInfo.setTarget_id(groupInfo.getTargetId()); + pojoGroupInfo.setType(groupInfo.getType()); + result = RestResult.ok(pojoGroupInfo); + } + + response.setContent(new Gson().toJson(result)); + } 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/action/admin/GetGroupMembersAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetGroupMembersAction.java new file mode 100755 index 00000000..13d32b9e --- /dev/null +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetGroupMembersAction.java @@ -0,0 +1,78 @@ +/* + * 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.InputGetGroup; +import cn.wildfirechat.pojos.OutputGroupMemberList; +import cn.wildfirechat.pojos.PojoGroupInfo; +import cn.wildfirechat.pojos.PojoGroupMember; +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 io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.internal.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +@Route(APIPath.Group_Member_List) +@HttpMethod("POST") +public class GetGroupMembersAction extends AdminAction { + + @Override + public boolean isTransactionAction() { + return true; + } + + @Override + public boolean action(Request request, Response response) { + if (request.getNettyRequest() instanceof FullHttpRequest) { + InputGetGroup inputGetGroup = getRequestBody(request.getNettyRequest(), InputGetGroup.class); + if (inputGetGroup != null + && (!StringUtil.isNullOrEmpty(inputGetGroup.getGroupId()))) { + + List members = new ArrayList<>(); + ErrorCode errorCode = messagesStore.getGroupMembers(inputGetGroup.getGroupId(), 0, members); + + + response.setStatus(HttpResponseStatus.OK); + RestResult result; + if (errorCode != ErrorCode.ERROR_CODE_SUCCESS) { + result = RestResult.resultOf(errorCode); + } else { + OutputGroupMemberList out = new OutputGroupMemberList(); + out.setMembers(new ArrayList<>()); + for (WFCMessage.GroupMember member : members) { + PojoGroupMember pm = new PojoGroupMember(); + pm.setMember_id(member.getMemberId()); + pm.setAlias(member.getAlias()); + pm.setType(member.getType()); + out.getMembers().add(pm); + } + result = RestResult.ok(out); + } + + response.setContent(new Gson().toJson(result)); + } 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/action/admin/GetIMTokenAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetIMTokenAction.java index 978f74f1..45617196 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetIMTokenAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetIMTokenAction.java @@ -25,7 +25,7 @@ import win.liyufan.im.IMTopic; import java.util.Base64; import java.util.concurrent.Executor; -@Route(APIPath.Get_User_Token) +@Route(APIPath.User_Get_Token) @HttpMethod("POST") public class GetIMTokenAction extends AdminAction { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserAction.java index 446455e9..2e8748d1 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserAction.java @@ -23,7 +23,7 @@ import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; -@Route(APIPath.Get_User_Info) +@Route(APIPath.User_Get_Info) @HttpMethod("POST") public class GetUserAction extends AdminAction { @@ -37,7 +37,7 @@ public class GetUserAction extends AdminAction { if (request.getNettyRequest() instanceof FullHttpRequest) { InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class); if (inputUserId != null - && (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()))) { + && (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()) || !StringUtil.isNullOrEmpty(inputUserId.getMobile()))) { WFCMessage.User user = null; if(!StringUtil.isNullOrEmpty(inputUserId.getUserId())) { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockListAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockListAction.java index 0c4bcaa2..0b09ed34 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockListAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockListAction.java @@ -9,6 +9,7 @@ package com.xiaoleilu.loServer.action.admin; import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.OutputUserBlockStatusList; import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; import com.xiaoleilu.loServer.annotation.HttpMethod; @@ -18,7 +19,7 @@ import com.xiaoleilu.loServer.handler.Response; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpResponseStatus; -@Route(APIPath.User_Status_List) +@Route(APIPath.User_Get_Blocked_List) @HttpMethod("POST") public class GetUserBlockListAction extends AdminAction { @@ -31,7 +32,9 @@ public class GetUserBlockListAction extends AdminAction { public boolean action(Request request, Response response) { if (request.getNettyRequest() instanceof FullHttpRequest) { response.setStatus(HttpResponseStatus.OK); - RestResult result = RestResult.ok(messagesStore.getUserStatusList()); + OutputUserBlockStatusList list = new OutputUserBlockStatusList(); + list.setStatusList(messagesStore.getUserStatusList()); + RestResult result = RestResult.ok(list); response.setContent(new Gson().toJson(result)); } return true; diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockStatusAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockStatusAction.java index 1263076c..9cd76f17 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockStatusAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/GetUserBlockStatusAction.java @@ -22,7 +22,7 @@ import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; -@Route(APIPath.User_Check_Status) +@Route(APIPath.User_Check_Block_Status) @HttpMethod("POST") public class GetUserBlockStatusAction extends AdminAction { diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/TransferGroupAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/TransferGroupAction.java index bb4638a3..ad14da79 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/TransferGroupAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/TransferGroupAction.java @@ -28,7 +28,7 @@ import win.liyufan.im.IMTopic; import java.util.concurrent.Executor; -@Route(APIPath.Group_Owner) +@Route(APIPath.Group_Transfer) @HttpMethod("POST") public class TransferGroupAction extends AdminAction { @@ -42,7 +42,7 @@ public class TransferGroupAction extends AdminAction { if (request.getNettyRequest() instanceof FullHttpRequest) { InputTransferGroup inputDismissGroup = getRequestBody(request.getNettyRequest(), InputTransferGroup.class); if (inputDismissGroup.isValide()) { - RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.AddGroupMemberTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { + RPCCenter.getInstance().sendRequest(inputDismissGroup.getOperator(), null, IMTopic.TransferGroupTopic, inputDismissGroup.toProtoGroupRequest().toByteArray(), inputDismissGroup.getOperator(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { @Override public void onSuccess(byte[] result) { ByteBuf byteBuf = Unpooled.buffer(); diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/robot/GetUserAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/robot/GetUserAction.java index eea5bd34..f3432a1a 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/robot/GetUserAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/robot/GetUserAction.java @@ -32,7 +32,7 @@ public class GetUserAction extends RobotAction { if (request.getNettyRequest() instanceof FullHttpRequest) { InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class); if (inputUserId != null - && (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()))) { + && (!StringUtil.isNullOrEmpty(inputUserId.getUserId()) || !StringUtil.isNullOrEmpty(inputUserId.getName()) || !StringUtil.isNullOrEmpty(inputUserId.getMobile()))) { WFCMessage.User user = null; if(!StringUtil.isNullOrEmpty(inputUserId.getUserId())) { diff --git a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java index cf4e2abb..e1ed85bb 100644 --- a/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/CreateGroupHandler.java @@ -10,6 +10,7 @@ package io.moquette.imhandler; import cn.wildfirechat.proto.WFCMessage; import cn.wildfirechat.pojos.GroupNotificationBinaryContent; +import com.hazelcast.util.StringUtil; import io.moquette.spi.impl.Qos1PublishHandler; import io.netty.buffer.ByteBuf; import cn.wildfirechat.common.ErrorCode; @@ -19,6 +20,13 @@ import win.liyufan.im.IMTopic; public class CreateGroupHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.CreateGroupRequest request, Qos1PublishHandler.IMCallback callback) { + + if (!StringUtil.isNullOrEmpty(request.getGroup().getGroupInfo().getTargetId())) { + WFCMessage.GroupInfo existGroupInfo = m_messagesStore.getGroupInfo(request.getGroup().getGroupInfo().getTargetId()); + if (existGroupInfo != null) { + return ErrorCode.ERROR_CODE_GROUP_ALREADY_EXIST; + } + } WFCMessage.GroupInfo groupInfo = m_messagesStore.createGroup(fromUser, request.getGroup().getGroupInfo(), request.getGroup().getMembersList()); if (groupInfo != null) { if(request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { diff --git a/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java b/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java index 3433c03c..4560676a 100644 --- a/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/DismissGroupHandler.java @@ -24,9 +24,9 @@ public class DismissGroupHandler extends GroupHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.TransferGroupRequest request, Qos1PublishHandler.IMCallback callback) { - ErrorCode errorCode = m_messagesStore.transferGroup(fromUser, request.getGroupId(), request.getNewOwner()); + ErrorCode errorCode = m_messagesStore.transferGroup(fromUser, request.getGroupId(), request.getNewOwner(), isAdmin); if (errorCode == ERROR_CODE_SUCCESS) { if (request.hasNotifyContent() && request.getNotifyContent().getType() > 0) { sendGroupNotification(fromUser, request.getGroupId(), request.getToLineList(), request.getNotifyContent()); diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 330e9c27..996aceec 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -749,7 +749,7 @@ public class MemoryMessagesStore implements IMessagesStore { } @Override - public ErrorCode dismissGroup(String operator, String groupId) { + public ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mIMap = hzInstance.getMap(GROUPS_MAP); @@ -762,9 +762,9 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_NOT_EXIST; } - if (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Free || + if (!isAdmin && (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Free || (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) - && (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator))) { + && (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator)))) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } @@ -913,7 +913,7 @@ public class MemoryMessagesStore implements IMessagesStore { @Override - public ErrorCode transferGroup(String operator, String groupId, String newOwner) { + public ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin) { HazelcastInstance hzInstance = m_Server.getHazelcastInstance(); IMap mIMap = hzInstance.getMap(GROUPS_MAP); @@ -924,7 +924,7 @@ public class MemoryMessagesStore implements IMessagesStore { return ErrorCode.ERROR_CODE_NOT_EXIST; } - if ((groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) + if (!isAdmin && (groupInfo.getType() == ProtoConstants.GroupType.GroupType_Restricted || groupInfo.getType() == ProtoConstants.GroupType.GroupType_Normal) && (groupInfo.getOwner() == null || !groupInfo.getOwner().equals(operator))) { return ErrorCode.ERROR_CODE_NOT_RIGHT; } diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 019a696a..50aa372d 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -104,13 +104,13 @@ public interface IMessagesStore { ErrorCode addGroupMembers(String operator, String groupId, List memberList); ErrorCode kickoffGroupMembers(String operator, String groupId, List memberList); ErrorCode quitGroup(String operator, String groupId); - ErrorCode dismissGroup(String operator, String groupId); + ErrorCode dismissGroup(String operator, String groupId, boolean isAdmin); ErrorCode modifyGroupInfo(String operator, String groupId, int modifyType, String value); ErrorCode modifyGroupAlias(String operator, String groupId, String alias); List getGroupInfos(List requests); WFCMessage.GroupInfo getGroupInfo(String groupId); ErrorCode getGroupMembers(String groupId, long maxDt, List members); - ErrorCode transferGroup(String operator, String groupId, String newOwner); + ErrorCode transferGroup(String operator, String groupId, String newOwner, boolean isAdmin); boolean isMemberInGroup(String member, String groupId); boolean isForbiddenInGroup(String member, String groupId); diff --git a/common/src/main/java/cn.wildfirechat.pojos/InputDismissGroupMember.java b/common/src/main/java/cn.wildfirechat.pojos/InputDismissGroup.java similarity index 95% rename from common/src/main/java/cn.wildfirechat.pojos/InputDismissGroupMember.java rename to common/src/main/java/cn.wildfirechat.pojos/InputDismissGroup.java index c1bc1586..050f461d 100755 --- a/common/src/main/java/cn.wildfirechat.pojos/InputDismissGroupMember.java +++ b/common/src/main/java/cn.wildfirechat.pojos/InputDismissGroup.java @@ -14,7 +14,7 @@ import io.netty.util.internal.StringUtil; import java.util.List; -public class InputDismissGroupMember extends InputGroupBase { +public class InputDismissGroup extends InputGroupBase { private String group_id; diff --git a/common/src/main/java/cn.wildfirechat.pojos/InputGetGroup.java b/common/src/main/java/cn.wildfirechat.pojos/InputGetGroup.java new file mode 100755 index 00000000..1908ea90 --- /dev/null +++ b/common/src/main/java/cn.wildfirechat.pojos/InputGetGroup.java @@ -0,0 +1,21 @@ +/* + * 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 InputGetGroup { + private String groupId; + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} diff --git a/common/src/main/java/cn.wildfirechat.pojos/InputGetUserInfo.java b/common/src/main/java/cn.wildfirechat.pojos/InputGetUserInfo.java index 492a1179..efc05a9b 100755 --- a/common/src/main/java/cn.wildfirechat.pojos/InputGetUserInfo.java +++ b/common/src/main/java/cn.wildfirechat.pojos/InputGetUserInfo.java @@ -13,9 +13,10 @@ public class InputGetUserInfo { private String name; private String mobile; - public InputGetUserInfo(String userId, String name) { + public InputGetUserInfo(String userId, String name, String mobile) { this.userId = userId; this.name = name; + this.mobile = mobile; } public String getMobile() { diff --git a/common/src/main/java/cn.wildfirechat.pojos/InputGroupBase.java b/common/src/main/java/cn.wildfirechat.pojos/InputGroupBase.java index ce24f948..62584825 100755 --- a/common/src/main/java/cn.wildfirechat.pojos/InputGroupBase.java +++ b/common/src/main/java/cn.wildfirechat.pojos/InputGroupBase.java @@ -20,6 +20,10 @@ public class InputGroupBase { return operator; } + public void setOperator(String operator) { + this.operator = operator; + } + public List getTo_lines() { return to_lines; } diff --git a/common/src/main/java/cn.wildfirechat.pojos/OutputGroupMemberList.java b/common/src/main/java/cn.wildfirechat.pojos/OutputGroupMemberList.java new file mode 100644 index 00000000..4917c541 --- /dev/null +++ b/common/src/main/java/cn.wildfirechat.pojos/OutputGroupMemberList.java @@ -0,0 +1,23 @@ +/* + * 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; + +import java.util.List; + +public class OutputGroupMemberList { + private List members; + + public List getMembers() { + return members; + } + + public void setMembers(List members) { + this.members = members; + } +} diff --git a/common/src/main/java/cn.wildfirechat.pojos/OutputUserBlockStatusList.java b/common/src/main/java/cn.wildfirechat.pojos/OutputUserBlockStatusList.java new file mode 100755 index 00000000..6dc4a9f1 --- /dev/null +++ b/common/src/main/java/cn.wildfirechat.pojos/OutputUserBlockStatusList.java @@ -0,0 +1,24 @@ +/* + * 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; + + +import java.util.List; + +public class OutputUserBlockStatusList { + private List statusList; + + public List getStatusList() { + return statusList; + } + + public void setStatusList(List statusList) { + this.statusList = statusList; + } +} diff --git a/common/src/main/java/cn/wildfirechat/common/APIPath.java b/common/src/main/java/cn/wildfirechat/common/APIPath.java index 38373513..ff8e5bbd 100644 --- a/common/src/main/java/cn/wildfirechat/common/APIPath.java +++ b/common/src/main/java/cn/wildfirechat/common/APIPath.java @@ -2,10 +2,6 @@ package cn.wildfirechat.common; public interface APIPath { String Create_Chatroom = "/admin/chatroom/create"; - String Create_Group = "/admin/group/create"; - String Create_Robot = "/admin/robot/create"; - String Create_User = "/admin/user/create"; - String Chatroom_Destroy = "/admin/chatroom/del"; String Chatroom_Info = "/admin/chatroom/info"; @@ -14,24 +10,29 @@ public interface APIPath { String Sensitive_Del = "/admin/sensitive/del"; String Sensitive_Query = "/admin/sensitive/query"; - String Get_User_Token = "/admin/user/token"; - String User_Status = "/admin/user/status"; - String Get_User_Info = "/admin/user/info"; - String User_Status_List = "/admin/user/statuslist"; - String User_Check_Status = "/admin/user/checkstatus"; - String User_Online_Status = "/admin/user/onlinestatus"; + String Create_User = "/admin/user/create"; + String Create_Robot = "/admin/robot/create"; + String User_Get_Token = "/admin/user/get_token"; + String User_Update_Block_Status = "/admin/user/update_block_status"; + String User_Get_Info = "/admin/user/get_info"; + String User_Get_Blocked_List = "/admin/user/get_blocked_list"; + String User_Check_Block_Status = "/admin/user/check_block_status"; + String User_Get_Online_Status = "/admin/user/onlinestatus"; - String Friend_Status = "/admin/friend/status"; - String Friend_List = "/admin/friend/list"; + String Friend_Update_Status = "/admin/friend/status"; + String Friend_Get_List = "/admin/friend/list"; String Msg_Send = "/admin/message/send"; String Msg_Recall = "/admin/message/recall"; + String Create_Group = "/admin/group/create"; String Group_Dismiss = "/admin/group/del"; + String Group_Transfer = "/admin/group/transfer"; + String Group_Get_Info = "/admin/group/get_info"; + String Group_Member_List = "/admin/group/member/list"; String Group_Member_Add = "/admin/group/member/add"; String Group_Member_Kickoff = "/admin/group/member/del"; - String Group_Owner = "/admin/group/owner"; String Channel_Message_Send = "/channel/message/send"; diff --git a/common/src/main/java/cn/wildfirechat/common/ErrorCode.java b/common/src/main/java/cn/wildfirechat/common/ErrorCode.java index 0d7421ac..381bbd80 100755 --- a/common/src/main/java/cn/wildfirechat/common/ErrorCode.java +++ b/common/src/main/java/cn/wildfirechat/common/ErrorCode.java @@ -68,7 +68,7 @@ public enum ErrorCode { public static ErrorCode fromCode(int code) { for (ErrorCode errorCode : ErrorCode.values()) { - if(errorCode.code == code) { + if(errorCode.code == (code&0xff)) { return errorCode; } } diff --git a/distribution/src/main/assembly/assembly.xml b/distribution/src/main/assembly/assembly.xml index fda99d71..b16d4c0f 100755 --- a/distribution/src/main/assembly/assembly.xml +++ b/distribution/src/main/assembly/assembly.xml @@ -97,6 +97,12 @@ sdk-${project.version}.jar + + ../sdk/sdk_readme.txt + server_sdk/ + sdk_readme.txt + + ../common/target/common-${project.version}.jar server_sdk/ diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index 68d50d5c..708ec7ad 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -63,9 +63,11 @@ media.server.use_qiniu 0 #Media_Type_FAVORITE = 6 # qiniu media server configuration +## 上传地址,不同的区域,上传地址也不同,请注意现在正确的地址 qiniu.server_url http://up.qbox.me qiniu.access_key tU3vdBK5BL5j4N7jI5N5uZgq_HQDo170w5C9Amnn qiniu.secret_key YfQIJdgp5YGhwEw14vGpaD2HJZsuJldWtqens7i5 +## bucket名字及Domain qiniu.bucket_general_name media qiniu.bucket_general_domain http://cdn.wildfirechat.cn qiniu.bucket_image_name media diff --git a/sdk/sdk_readme.txt b/sdk/sdk_readme.txt new file mode 100644 index 00000000..7730469e --- /dev/null +++ b/sdk/sdk_readme.txt @@ -0,0 +1,68 @@ + SDK使用说明: + 1. 把common.jar和sdk.jar 放到lib目录下(如没有需要手动建)。 + 2. 添加下属依赖,注意本地jar包的路径。 + 3. 修改build plugin,把common和sdk打包进去。 + 4. 使用方法请查看sdk.jar/cn.wildfirechat.sdk/Main.class(没有混淆,可以看到源码) + + + + + com.google.code.gson + gson + 2.8.2 + + + + commons-httpclient + commons-httpclient + 3.1 + + + + org.apache.httpcomponents + httpclient + 4.5.3 + + + + commons-codec + commons-codec + 1.11 + compile + + + + com.google.protobuf + protobuf-java + 2.5.0 + + + + cn.wildfirechat + sdk + 0.20 + system + ${project.basedir}/src/lib/sdk-0.20.jar + + + + cn.wildfirechat + common + 0.20 + system + ${project.basedir}/src/lib/common-0.20.jar + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/ChatConfig.java b/sdk/src/main/java/cn/wildfirechat/sdk/ChatConfig.java index 1b83b60d..fcc3787f 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/ChatConfig.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/ChatConfig.java @@ -1,11 +1,19 @@ package cn.wildfirechat.sdk; -import cn.wildfirechat.common.APIPath; -import cn.wildfirechat.pojos.*; -import cn.wildfirechat.sdk.model.*; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; +import cn.wildfirechat.sdk.utilities.ChannelHttpUtils; +import cn.wildfirechat.sdk.utilities.RobotHttpUtils; public class ChatConfig { - public static void init(String url, String secret) { - HttpUtils.init(url, secret); + public static void initAdmin(String url, String secret) { + AdminHttpUtils.init(url, secret); + } + + public static void initRobot(String url, String robotId, String secret) { + RobotHttpUtils.init(url, robotId, secret); + } + + public static void initChannel(String url, String channelId, String secret) { + ChannelHttpUtils.init(url, channelId, secret); } } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/ChatroomAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/ChatroomAdmin.java new file mode 100644 index 00000000..c13d0a63 --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/ChatroomAdmin.java @@ -0,0 +1,27 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; + +public class ChatroomAdmin { + public static IMResult createChatroom(InputCreateChatroom input) throws Exception { + String path = APIPath.Create_Chatroom; + return AdminHttpUtils.httpJsonPost(path, input, OutputCreateChatroom.class); + } + + public static IMResult destroyChatroom(String chatroomId) throws Exception { + String path = APIPath.Chatroom_Destroy; + InputDestoryChatroom input = new InputDestoryChatroom(); + input.setChatroomId(chatroomId); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + + public static IMResult getChatroomInfo(String chatroomId) throws Exception { + String path = APIPath.Chatroom_Info; + InputGetChatroomInfo input = new InputGetChatroomInfo(chatroomId); + return AdminHttpUtils.httpJsonPost(path, input, OutputGetChatroomInfo.class); + } + +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java new file mode 100644 index 00000000..ad68da9f --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java @@ -0,0 +1,26 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; + +public class FriendAdmin { + public static IMResult updateFriendStatus(String userId, String targetId, int status) throws Exception { + String path = APIPath.Friend_Update_Status; + InputFriendRequest input = new InputFriendRequest(); + input.setUserId(userId); + input.setFriendUid(targetId); + input.setStatus(status); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + + public static IMResult getFriendStatusList(String userId, int status) throws Exception { + String path = APIPath.Friend_Get_List; + InputGetFriendList input = new InputGetFriendList(); + input.setUserId(userId); + input.setStatus(0); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java new file mode 100644 index 00000000..3af0ee5b --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/GroupAdmin.java @@ -0,0 +1,91 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; + +import java.util.ArrayList; +import java.util.List; + +public class GroupAdmin { + public static IMResult createGroup(String operator, PojoGroupInfo group_info, List members, List to_lines, MessagePayload notify_message) throws Exception { + String path = APIPath.Create_Group; + PojoGroup pojoGroup = new PojoGroup(); + pojoGroup.setGroup_info(group_info); + pojoGroup.setMembers(members); + InputCreateGroup createGroup = new InputCreateGroup(); + createGroup.setGroup(pojoGroup); + createGroup.setOperator(operator); + createGroup.setTo_lines(to_lines); + createGroup.setNotify_message(notify_message); + + return AdminHttpUtils.httpJsonPost(path, createGroup, OutputCreateGroupResult.class); + } + + public static IMResult getGroupInfo(String groupId) throws Exception { + String path = APIPath.Group_Get_Info; + InputGetGroup input = new InputGetGroup(); + input.setGroupId(groupId); + + return AdminHttpUtils.httpJsonPost(path, input, PojoGroupInfo.class); + } + + public static IMResult dismissGroup(String operator, String groupId, List to_lines, MessagePayload notify_message) throws Exception { + String path = APIPath.Group_Dismiss; + InputDismissGroup dismissGroup = new InputDismissGroup(); + dismissGroup.setOperator(operator); + dismissGroup.setGroup_id(groupId); + dismissGroup.setTo_lines(to_lines); + dismissGroup.setNotify_message(notify_message); + return AdminHttpUtils.httpJsonPost(path, dismissGroup, Void.class); + } + + public static IMResult transferGroup(String operator, String groupId, String newOwner, List to_lines, MessagePayload notify_message) throws Exception { + String path = APIPath.Group_Transfer; + InputTransferGroup transferGroup = new InputTransferGroup(); + transferGroup.setGroup_id(groupId); + transferGroup.setNew_owner(newOwner); + transferGroup.setOperator(operator); + transferGroup.setTo_lines(to_lines); + transferGroup.setNotify_message(notify_message); + return AdminHttpUtils.httpJsonPost(path, transferGroup, Void.class); + } + + + public static IMResult getGroupMembers(String groupId) throws Exception { + String path = APIPath.Group_Member_List; + InputGetGroup input = new InputGetGroup(); + input.setGroupId(groupId); + return AdminHttpUtils.httpJsonPost(path, input, OutputGroupMemberList.class); + } + + public static IMResult addGroupMembers(String operator, String groupId, List groupMemberIds, List to_lines, MessagePayload notify_message) throws Exception { + String path = APIPath.Group_Member_Add; + InputAddGroupMember addGroupMember = new InputAddGroupMember(); + addGroupMember.setGroup_id(groupId); + List members = new ArrayList<>(); + for (String mid : groupMemberIds) { + PojoGroupMember m = new PojoGroupMember(); + m.setMember_id(mid); + members.add(m); + } + addGroupMember.setMembers(members); + addGroupMember.setOperator(operator); + addGroupMember.setTo_lines(to_lines); + addGroupMember.setNotify_message(notify_message); + return AdminHttpUtils.httpJsonPost(path, addGroupMember, Void.class); + } + + public static IMResult kickoffGroupMembers(String operator, String groupId, List groupMemberIds, List to_lines, MessagePayload notify_message) throws Exception { + String path = APIPath.Group_Member_Kickoff; + InputKickoffGroupMember kickoffGroupMember = new InputKickoffGroupMember(); + kickoffGroupMember.setGroup_id(groupId); + kickoffGroupMember.setMembers(groupMemberIds); + kickoffGroupMember.setOperator(operator); + kickoffGroupMember.setTo_lines(to_lines); + kickoffGroupMember.setNotify_message(notify_message); + return AdminHttpUtils.httpJsonPost(path, kickoffGroupMember, Void.class); + } + +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java new file mode 100644 index 00000000..ccce7e1c --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -0,0 +1,296 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.ErrorCode; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.proto.ProtoConstants; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; +import cn.wildfirechat.sdk.utilities.RobotHttpUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class Main { + public static void main(String[] args) throws Exception { + //初始化服务API + AdminHttpUtils.init("http://localhost:18080", "123456"); + + //*********************************************** + //**** 用户相关的API + //*********************************************** + InputOutputUserInfo userInfo = new InputOutputUserInfo(); + userInfo.setUserId("userId1"); + userInfo.setName("user1"); + userInfo.setMobile("13900000000"); + userInfo.setDisplayName("user 1"); + + IMResult resultCreateUser = UserAdmin.createUser(userInfo); + if (resultCreateUser != null && resultCreateUser.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("Create user " + resultCreateUser.getResult().getName() + " success"); + } else { + System.out.println("Create user failure"); + System.exit(-1); + } + + InputCreateRobot createRobot = new InputCreateRobot(); + createRobot.setUserId("robot1"); + createRobot.setName("robot1"); + createRobot.setDisplayName("机器人"); + createRobot.setSecret("123456"); + createRobot.setCallback("http://127.0.0.1:8883/robot/recvmsg"); + IMResult resultCreateRobot = UserAdmin.createRobot(createRobot); + if (resultCreateRobot != null && resultCreateRobot.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("Create robot " + resultCreateRobot.getResult().getUserId() + " success"); + } else { + System.out.println("Create robot failure"); + System.exit(-1); + } + + IMResult resultGetUserInfo1 = UserAdmin.getUserByName(userInfo.getName()); + if (resultGetUserInfo1 != null && resultGetUserInfo1.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (userInfo.getUserId().equals(resultGetUserInfo1.getResult().getUserId()) + && userInfo.getName().equals(resultGetUserInfo1.getResult().getName()) + && userInfo.getMobile().equals(resultGetUserInfo1.getResult().getMobile()) + && userInfo.getDisplayName().equals(resultGetUserInfo1.getResult().getDisplayName())) { + System.out.println("get user info success"); + } else { + System.out.println("get user info by name failure"); + System.exit(-1); + } + } else { + System.out.println("get user info by name failure"); + System.exit(-1); + } + + IMResult resultGetUserInfo2 = UserAdmin.getUserByMobile(userInfo.getMobile()); + if (resultGetUserInfo2 != null && resultGetUserInfo2.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (userInfo.getUserId().equals(resultGetUserInfo2.getResult().getUserId()) + && userInfo.getName().equals(resultGetUserInfo2.getResult().getName()) + && userInfo.getMobile().equals(resultGetUserInfo2.getResult().getMobile()) + && userInfo.getDisplayName().equals(resultGetUserInfo2.getResult().getDisplayName())) { + System.out.println("get user info success"); + } else { + System.out.println("get user info by mobile failure"); + System.exit(-1); + } + } else { + System.out.println("get user info by mobile failure"); + System.exit(-1); + } + + IMResult resultGetUserInfo3 = UserAdmin.getUserByUserId(userInfo.getUserId()); + if (resultGetUserInfo3 != null && resultGetUserInfo3.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (userInfo.getUserId().equals(resultGetUserInfo3.getResult().getUserId()) + && userInfo.getName().equals(resultGetUserInfo3.getResult().getName()) + && userInfo.getMobile().equals(resultGetUserInfo3.getResult().getMobile()) + && userInfo.getDisplayName().equals(resultGetUserInfo3.getResult().getDisplayName())) { + System.out.println("get user info success"); + } else { + System.out.println("get user info by userId failure"); + System.exit(-1); + } + } else { + System.out.println("get user info by userId failure"); + System.exit(-1); + } + + IMResult resultGetToken = UserAdmin.getUserToken(userInfo.getUserId(), "client111"); + if (resultGetToken != null && resultGetToken.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("get token success: " + resultGetToken.getResult().getToken()); + } else { + System.out.println("get user token failure"); + System.exit(-1); + } + + IMResult resultVoid =UserAdmin.updateUserBlockStatus(userInfo.getUserId(), 1); + if (resultVoid != null && resultVoid.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("block user done"); + } else { + System.out.println("block user failure"); + System.exit(-1); + } + + IMResult resultCheckUserStatus = UserAdmin.checkUserBlockStatus(userInfo.getUserId()); + if (resultCheckUserStatus != null && resultCheckUserStatus.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (resultCheckUserStatus.getResult().getStatus() == 1) { + System.out.println("check user status success"); + } else { + System.out.println("user status not correct"); + System.exit(-1); + } + } else { + System.out.println("block user failure"); + System.exit(-1); + } + + IMResult resultBlockStatusList = UserAdmin.getBlockedList(); + if (resultBlockStatusList != null && resultBlockStatusList.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + boolean success = false; + for (InputOutputUserBlockStatus blockStatus : resultBlockStatusList.getResult().getStatusList()) { + if (blockStatus.getUserId().equals(userInfo.getUserId()) && blockStatus.getStatus() == 1) { + System.out.println("get block list done"); + success = true; + break; + } + } + if (!success) { + System.out.println("block user status is not expected"); + System.exit(-1); + } + } else { + System.out.println("block user failure"); + System.exit(-1); + } + + + //*********************************************** + //**** 群组相关功能 + //*********************************************** + IMResult voidIMResult1 = GroupAdmin.dismissGroup("user1", "groupId1", null, null); + + PojoGroupInfo groupInfo = new PojoGroupInfo(); + groupInfo.setTarget_id("groupId1"); + groupInfo.setOwner("user1"); + groupInfo.setName("test_group"); + groupInfo.setExtra("hello extra"); + groupInfo.setPortrait("http://portrait"); + List members = new ArrayList<>(); + PojoGroupMember member1 = new PojoGroupMember(); + member1.setMember_id(groupInfo.getOwner()); + members.add(member1); + + PojoGroupMember member2 = new PojoGroupMember(); + member2.setMember_id("user2"); + members.add(member2); + + PojoGroupMember member3 = new PojoGroupMember(); + member3.setMember_id("user3"); + members.add(member3); + + IMResult resultCreateGroup = GroupAdmin.createGroup(groupInfo.getOwner(), groupInfo, members, null, null); + if (resultCreateGroup != null && resultCreateGroup.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("create group success"); + } else { + System.out.println("create group failure"); + System.exit(-1); + } + + IMResult resultGetGroupInfo = GroupAdmin.getGroupInfo(groupInfo.getTarget_id()); + if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if (groupInfo.getExtra().equals(resultGetGroupInfo.getResult().getExtra()) + && groupInfo.getName().equals(resultGetGroupInfo.getResult().getName()) + && groupInfo.getOwner().equals(resultGetGroupInfo.getResult().getOwner())) { + System.out.println("get group success"); + } else { + System.out.println("group info is not expected"); + System.exit(-1); + } + } else { + System.out.println("create group failure"); + System.exit(-1); + } + + IMResult voidIMResult = GroupAdmin.transferGroup(groupInfo.getOwner(), groupInfo.getTarget_id(), "user2", null, null); + if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("transfer success"); + } else { + System.out.println("create group failure"); + System.exit(-1); + } + + resultGetGroupInfo = GroupAdmin.getGroupInfo(groupInfo.getTarget_id()); + if (resultGetGroupInfo != null && resultGetGroupInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + if ("user2".equals(resultGetGroupInfo.getResult().getOwner())) { + groupInfo.setOwner("user2"); + } else { + System.out.println("group info is not expected"); + System.exit(-1); + } + } else { + System.out.println("create group failure"); + System.exit(-1); + } + + IMResult resultGetMembers = GroupAdmin.getGroupMembers(groupInfo.getTarget_id()); + if (resultGetMembers != null && resultGetMembers.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("get group member success"); + } else { + System.out.println("create group failure"); + System.exit(-1); + } + + voidIMResult = GroupAdmin.addGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList("use4", "user5"), null, null); + if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("add group member success"); + } else { + System.out.println("add group member failure"); + System.exit(-1); + } + + voidIMResult = GroupAdmin.kickoffGroupMembers("user1", groupInfo.getTarget_id(), Arrays.asList("use2", "user3"), null, null); + if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("kickoff group member success"); + } else { + System.out.println("kickoff group member failure"); + System.exit(-1); + } + + //*********************************************** + //**** 消息相关功能 + //*********************************************** + Conversation conversation = new Conversation(); + conversation.setTarget("user2"); + conversation.setType(ProtoConstants.ConversationType.ConversationType_Private); + MessagePayload payload = new MessagePayload(); + payload.setType(1); + payload.setSearchableContent("hello world"); + + IMResult resultSendMessage = MessageAdmin.sendMessage("user1", conversation, payload); + if (resultSendMessage != null && resultSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("send message success"); + } else { + System.out.println("send message failure"); + System.exit(-1); + } + + + voidIMResult = MessageAdmin.recallMessage("user1", resultSendMessage.getResult().getMessageUid()); + if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("recall message success"); + } else { + System.out.println("recall message failure"); + System.exit(-1); + } + + + + //初始化机器人API + RobotHttpUtils.init("http://localhost:18080", "robot1", "123456"); + //*********************************************** + //**** 机器人API + //*********************************************** + conversation = new Conversation(); + conversation.setTarget("user2"); + conversation.setType(ProtoConstants.ConversationType.ConversationType_Private); + payload = new MessagePayload(); + payload.setType(1); + payload.setSearchableContent("hello world"); + + IMResult resultRobotSendMessage = RobotService.sendMessage("robot1", conversation, payload); + if (resultRobotSendMessage != null && resultRobotSendMessage.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("robot send message success"); + } else { + System.out.println("robot send message failure"); + System.exit(-1); + } + + IMResult resultRobotGetUserInfo = RobotService.getUserInfo("user1"); + if (resultRobotGetUserInfo != null && resultRobotGetUserInfo.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("robot get user info success"); + } else { + System.out.println("robot get user info by userId failure"); + System.exit(-1); + } + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java new file mode 100644 index 00000000..ff297fd9 --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/MessageAdmin.java @@ -0,0 +1,25 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; + +public class MessageAdmin { + public static IMResult sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception { + String path = APIPath.Msg_Send; + SendMessageData messageData = new SendMessageData(); + messageData.setSender(sender); + messageData.setConv(conversation); + messageData.setPayload(payload); + return AdminHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class); + } + + 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); + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/RobotService.java b/sdk/src/main/java/cn/wildfirechat/sdk/RobotService.java new file mode 100644 index 00000000..1065ed04 --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/RobotService.java @@ -0,0 +1,24 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; +import cn.wildfirechat.sdk.utilities.RobotHttpUtils; + +public class RobotService { + public static IMResult sendMessage(String sender, Conversation conversation, MessagePayload payload) throws Exception { + String path = APIPath.Robot_Message_Send; + SendMessageData messageData = new SendMessageData(); + messageData.setSender(sender); + messageData.setConv(conversation); + messageData.setPayload(payload); + return RobotHttpUtils.httpJsonPost(path, messageData, SendMessageResult.class); + } + + public static IMResult getUserInfo(String userId) throws Exception { + String path = APIPath.Robot_User_Info; + InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null); + return RobotHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); + } +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/SensitiveAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/SensitiveAdmin.java new file mode 100644 index 00000000..9be06fb4 --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/SensitiveAdmin.java @@ -0,0 +1,30 @@ +package cn.wildfirechat.sdk; + +import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.*; +import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; + +import java.util.List; + +public class SensitiveAdmin { + public static IMResult addSensitives(List sensitives) throws Exception { + String path = APIPath.Sensitive_Add; + InputOutputSensitiveWords input = new InputOutputSensitiveWords(); + input.setWords(sensitives); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + + public static IMResult removeSensitives(List sensitives) throws Exception { + String path = APIPath.Sensitive_Del; + InputOutputSensitiveWords input = new InputOutputSensitiveWords(); + input.setWords(sensitives); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + + public static IMResult getSensitives(List sensitives) throws Exception { + String path = APIPath.Sensitive_Query; + return AdminHttpUtils.httpJsonPost(path, null, InputOutputSensitiveWords.class); + } + +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index 7abbf558..fd3342e7 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -3,22 +3,68 @@ package cn.wildfirechat.sdk; import cn.wildfirechat.common.APIPath; import cn.wildfirechat.pojos.*; import cn.wildfirechat.sdk.model.IMResult; +import cn.wildfirechat.sdk.utilities.AdminHttpUtils; public class UserAdmin { - public static IMResult getUserByName(String mobile) throws Exception { - String path = APIPath.Get_User_Info; - InputGetUserInfo getUserInfo = new InputGetUserInfo(null, mobile); - return HttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); + public static IMResult getUserByName(String name) throws Exception { + String path = APIPath.User_Get_Info; + InputGetUserInfo getUserInfo = new InputGetUserInfo(null, name, null); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); + } + + public static IMResult getUserByUserId(String userId) throws Exception { + String path = APIPath.User_Get_Info; + InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); + } + + public static IMResult getUserByMobile(String mobile) throws Exception { + String path = APIPath.User_Get_Info; + InputGetUserInfo getUserInfo = new InputGetUserInfo(null, null, mobile); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, InputOutputUserInfo.class); } public static IMResult createUser(InputOutputUserInfo user) throws Exception { String path = APIPath.Create_User; - return HttpUtils.httpJsonPost(path, user, OutputCreateUser.class); + return AdminHttpUtils.httpJsonPost(path, user, OutputCreateUser.class); + } + + public static IMResult createRobot(InputCreateRobot robot) throws Exception { + String path = APIPath.Create_Robot; + return AdminHttpUtils.httpJsonPost(path, robot, OutputCreateRobot.class); } public static IMResult getUserToken(String userId, String clientId) throws Exception { - String path = APIPath.Get_User_Token; + String path = APIPath.User_Get_Token; InputGetToken getToken = new InputGetToken(userId, clientId); - return HttpUtils.httpJsonPost(path, getToken, OutputGetIMTokenData.class); + return AdminHttpUtils.httpJsonPost(path, getToken, OutputGetIMTokenData.class); } + + public static IMResult updateUserBlockStatus(String userId, int block) throws Exception { + String path = APIPath.User_Update_Block_Status; + InputOutputUserBlockStatus blockStatus = new InputOutputUserBlockStatus(userId, block); + return AdminHttpUtils.httpJsonPost(path, blockStatus, Void.class); + } + + public static IMResult checkUserBlockStatus(String userId) throws Exception { + String path = APIPath.User_Check_Block_Status; + InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputUserStatus.class); + } + + public static IMResult getBlockedList() throws Exception { + String path = APIPath.User_Get_Blocked_List; + return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class); + } + + //not implement +// public static IMResult getUserOnlineStatus(String userId) throws Exception { +// String path = APIPath.User_Get_Online_Status; +// InputGetUserInfo inputGetUserInfo = new InputGetUserInfo(userId, null); +// return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class); +// } + + + + } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/model/SendMessageResult.java b/sdk/src/main/java/cn/wildfirechat/sdk/model/SendMessageResult.java deleted file mode 100644 index aeb2152c..00000000 --- a/sdk/src/main/java/cn/wildfirechat/sdk/model/SendMessageResult.java +++ /dev/null @@ -1,30 +0,0 @@ -package cn.wildfirechat.sdk.model; - -public class SendMessageResult { - private long messageUid; - private long timestamp; - - public SendMessageResult() { - } - - public SendMessageResult(long messageUid, long timestamp) { - this.messageUid = messageUid; - this.timestamp = timestamp; - } - - public long getMessageUid() { - return messageUid; - } - - public void setMessageUid(long messageUid) { - this.messageUid = messageUid; - } - - public long getTimestamp() { - return timestamp; - } - - public void setTimestamp(long timestamp) { - this.timestamp = timestamp; - } -} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/HttpUtils.java b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/AdminHttpUtils.java similarity index 88% rename from sdk/src/main/java/cn/wildfirechat/sdk/HttpUtils.java rename to sdk/src/main/java/cn/wildfirechat/sdk/utilities/AdminHttpUtils.java index be9b8c5c..92254d58 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/HttpUtils.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/AdminHttpUtils.java @@ -1,4 +1,4 @@ -package cn.wildfirechat.sdk; +package cn.wildfirechat.sdk.utilities; import cn.wildfirechat.sdk.model.IMResult; import com.google.gson.Gson; @@ -19,18 +19,18 @@ import java.lang.reflect.Type; import java.nio.charset.Charset; -public class HttpUtils { - private static final Logger LOG = LoggerFactory.getLogger(HttpUtils.class); +public class AdminHttpUtils { + private static final Logger LOG = LoggerFactory.getLogger(AdminHttpUtils.class); private static String adminUrl; private static String adminSecret; - static void init(String url, String secret) { + public static void init(String url, String secret) { adminUrl = url; adminSecret = secret; } - static IMResult httpJsonPost(String path, Object object, Class clazz) throws Exception{ + public static IMResult httpJsonPost(String path, Object object, Class clazz) throws Exception{ if (isNullOrEmpty(adminUrl) || isNullOrEmpty(path)) { LOG.error("Not init IM SDK correctly. Do you forget init it?"); throw new Exception("SDK url or secret lack!"); @@ -54,7 +54,10 @@ public class HttpUtils { post.setHeader("timestamp", "" + timestamp); post.setHeader("sign", sign); - String jsonStr = new Gson().toJson(object); + String jsonStr = ""; + if (object != null) { + jsonStr = new Gson().toJson(object); + } LOG.info("http request content: {}", jsonStr); StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8")); diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/utilities/ChannelHttpUtils.java b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/ChannelHttpUtils.java new file mode 100644 index 00000000..ba43730f --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/ChannelHttpUtils.java @@ -0,0 +1,114 @@ +package cn.wildfirechat.sdk.utilities; + +import cn.wildfirechat.sdk.model.IMResult; +import com.google.gson.Gson; +import ikidou.reflect.TypeBuilder; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.nio.charset.Charset; + + +public class ChannelHttpUtils { + private static final Logger LOG = LoggerFactory.getLogger(ChannelHttpUtils.class); + + private static String url; + private static String channelId; + private static String channelSecret; + + public static void init(String url, String channelId, String secret) { + ChannelHttpUtils.url = url; + ChannelHttpUtils.channelId = channelId; + ChannelHttpUtils.channelSecret = secret; + } + + public static IMResult httpJsonPost(String path, Object object, Class clazz) throws Exception{ + if (isNullOrEmpty(url) || isNullOrEmpty(path)) { + LOG.error("Not init IM SDK correctly. Do you forget init it?"); + throw new Exception("SDK url or secret lack!"); + } + + String url = ChannelHttpUtils.url + path; + HttpPost post = null; + try { + HttpClient httpClient = HttpClientBuilder.create().build(); + + int nonce = (int)(Math.random() * 100000 + 3); + long timestamp = System.currentTimeMillis(); + String str = nonce + "|" + channelSecret + "|" + timestamp; + String sign = DigestUtils.sha1Hex(str); + + + post = new HttpPost(url); + post.setHeader("Content-type", "application/json; charset=utf-8"); + post.setHeader("Connection", "Keep-Alive"); + post.setHeader("nonce", nonce + ""); + post.setHeader("timestamp", "" + timestamp); + post.setHeader("sign", sign); + + String jsonStr = null; + if (object != null) { + jsonStr = new Gson().toJson(object); + } + LOG.info("http request content: {}", jsonStr); + + StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8")); + entity.setContentEncoding("UTF-8"); + entity.setContentType("application/json"); + post.setEntity(entity); + HttpResponse response = httpClient.execute(post); + + int statusCode = response.getStatusLine().getStatusCode(); + if(statusCode != HttpStatus.SC_OK){ + LOG.info("Request error: "+statusCode); + throw new Exception("Http request error with code:" + statusCode); + }else{ + BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity() + .getContent(),"utf-8")); + StringBuffer sb = new StringBuffer(); + String line; + String NL = System.getProperty("line.separator"); + while ((line = in.readLine()) != null) { + sb.append(line + NL); + } + + in.close(); + + String content = sb.toString(); + LOG.info("http request response content: {}", content); + + return fromJsonObject(content, clazz); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + }finally{ + if(post != null){ + post.releaseConnection(); + } + } + } + + private static IMResult fromJsonObject(String content, Class clazz) { + Type type = TypeBuilder + .newInstance(IMResult.class) + .addTypeParam(clazz) + .build(); + return new Gson().fromJson(content, type); + } + + private static boolean isNullOrEmpty(String str) { + return str == null || str.isEmpty(); + } + +} diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/utilities/RobotHttpUtils.java b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/RobotHttpUtils.java new file mode 100644 index 00000000..6c7c22d5 --- /dev/null +++ b/sdk/src/main/java/cn/wildfirechat/sdk/utilities/RobotHttpUtils.java @@ -0,0 +1,115 @@ +package cn.wildfirechat.sdk.utilities; + +import cn.wildfirechat.sdk.model.IMResult; +import com.google.gson.Gson; +import ikidou.reflect.TypeBuilder; +import org.apache.commons.codec.digest.DigestUtils; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.nio.charset.Charset; + + +public class RobotHttpUtils { + private static final Logger LOG = LoggerFactory.getLogger(RobotHttpUtils.class); + + private static String url; + private static String robotId; + private static String robotSecret; + + public static void init(String url, String robotId, String secret) { + RobotHttpUtils.url = url; + RobotHttpUtils.robotId = robotId; + RobotHttpUtils.robotSecret = secret; + } + + public static IMResult httpJsonPost(String path, Object object, Class clazz) throws Exception{ + if (isNullOrEmpty(url) || isNullOrEmpty(path)) { + LOG.error("Not init IM SDK correctly. Do you forget init it?"); + throw new Exception("SDK url or secret lack!"); + } + + String url = RobotHttpUtils.url + path; + HttpPost post = null; + try { + HttpClient httpClient = HttpClientBuilder.create().build(); + + int nonce = (int)(Math.random() * 100000 + 3); + long timestamp = System.currentTimeMillis(); + String str = nonce + "|" + robotSecret + "|" + timestamp; + String sign = DigestUtils.sha1Hex(str); + + + post = new HttpPost(url); + post.setHeader("Content-type", "application/json; charset=utf-8"); + post.setHeader("Connection", "Keep-Alive"); + post.setHeader("nonce", nonce + ""); + post.setHeader("timestamp", "" + timestamp); + post.setHeader("rid", robotId); + post.setHeader("sign", sign); + + String jsonStr = null; + if (object != null) { + jsonStr = new Gson().toJson(object); + } + LOG.info("http request content: {}", jsonStr); + + StringEntity entity = new StringEntity(jsonStr, Charset.forName("UTF-8")); + entity.setContentEncoding("UTF-8"); + entity.setContentType("application/json"); + post.setEntity(entity); + HttpResponse response = httpClient.execute(post); + + int statusCode = response.getStatusLine().getStatusCode(); + if(statusCode != HttpStatus.SC_OK){ + LOG.info("Request error: "+statusCode); + throw new Exception("Http request error with code:" + statusCode); + }else{ + BufferedReader in = new BufferedReader(new InputStreamReader(response.getEntity() + .getContent(),"utf-8")); + StringBuffer sb = new StringBuffer(); + String line; + String NL = System.getProperty("line.separator"); + while ((line = in.readLine()) != null) { + sb.append(line + NL); + } + + in.close(); + + String content = sb.toString(); + LOG.info("http request response content: {}", content); + + return fromJsonObject(content, clazz); + } + } catch (Exception e) { + e.printStackTrace(); + throw e; + }finally{ + if(post != null){ + post.releaseConnection(); + } + } + } + + private static IMResult fromJsonObject(String content, Class clazz) { + Type type = TypeBuilder + .newInstance(IMResult.class) + .addTypeParam(clazz) + .build(); + return new Gson().fromJson(content, type); + } + + private static boolean isNullOrEmpty(String str) { + return str == null || str.isEmpty(); + } + +}