From d71644c2092fdb5ab600aaf7e16b8444eb66b2bc Mon Sep 17 00:00:00 2001 From: "heavyrain.lee" Date: Sat, 4 Jan 2020 14:30:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BE=E7=BD=AE/=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=A4=87=E6=B3=A8api=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=9C=A8=E7=BA=BF=E7=8A=B6=E6=80=81=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- broker/config/wildfirechat.conf | 2 +- .../loServer/action/admin/AliasGetAction.java | 15 ++++-- .../loServer/action/admin/AliasPutAction.java | 14 ++---- .../server/netty/NettyMQTTHandler.java | 2 +- .../moquette/spi/impl/ProtocolProcessor.java | 45 ++++++++++++----- .../cn/wildfirechat/pojos/InputGetAlias.java | 31 ++++++++++++ .../wildfirechat/pojos/InputUpdateAlias.java | 40 ++++++++++++++++ .../cn/wildfirechat/pojos/OutputGetAlias.java | 48 +++++++++++++++++++ .../src/main/resources/wildfirechat.conf | 8 ++++ .../java/cn/wildfirechat/sdk/FriendAdmin.java | 24 ++++++++-- .../main/java/cn/wildfirechat/sdk/Main.java | 17 +++++++ 11 files changed, 215 insertions(+), 31 deletions(-) create mode 100755 common/src/main/java/cn/wildfirechat/pojos/InputGetAlias.java create mode 100755 common/src/main/java/cn/wildfirechat/pojos/InputUpdateAlias.java create mode 100755 common/src/main/java/cn/wildfirechat/pojos/OutputGetAlias.java diff --git a/broker/config/wildfirechat.conf b/broker/config/wildfirechat.conf index 64b7708c..7aec013c 100755 --- a/broker/config/wildfirechat.conf +++ b/broker/config/wildfirechat.conf @@ -133,7 +133,7 @@ push.ios.server.address http://localhost:8085/ios/push # User online status event callback #********************************************************************* ##用户在线状态事件回调地址 -user.online_status_callback http://localhost:8085/user/online_event +user.online_status_callback http://localhost:8888/user/online_event #********************************************************************* # MongoDB configuration diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasGetAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasGetAction.java index 7db7e564..1225f260 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasGetAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasGetAction.java @@ -9,7 +9,9 @@ package com.xiaoleilu.loServer.action.admin; import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.InputGetAlias; import cn.wildfirechat.pojos.InputGetFriendList; +import cn.wildfirechat.pojos.OutputGetAlias; import cn.wildfirechat.pojos.OutputStringList; import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; @@ -36,16 +38,19 @@ public class AliasGetAction extends AdminAction { @Override public boolean action(Request request, Response response) { if (request.getNettyRequest() instanceof FullHttpRequest) { - InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class); - List dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0); + InputGetAlias input = getRequestBody(request.getNettyRequest(), InputGetAlias.class); + List dataList = messagesStore.getFriendList(input.getOperator(), null, 0); List list = new ArrayList<>(); + OutputGetAlias out = new OutputGetAlias(input.getOperator(), input.getTargetId()); + for (FriendData data : dataList) { - if (data.getState() == inputGetFriendList.getStatus()) { - list.add(data.getFriendUid()); + if (data.getFriendUid().equals(input.getTargetId())) { + out.setAlias(data.getAlias()); + break; } } response.setStatus(HttpResponseStatus.OK); - RestResult result = RestResult.ok(new OutputStringList(list)); + RestResult result = RestResult.ok(out); response.setContent(new Gson().toJson(result)); } return true; diff --git a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasPutAction.java b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasPutAction.java index 4400e487..ccc6253c 100755 --- a/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasPutAction.java +++ b/broker/src/main/java/com/xiaoleilu/loServer/action/admin/AliasPutAction.java @@ -9,7 +9,9 @@ package com.xiaoleilu.loServer.action.admin; import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.common.ErrorCode; import cn.wildfirechat.pojos.InputGetFriendList; +import cn.wildfirechat.pojos.InputUpdateAlias; import cn.wildfirechat.pojos.OutputStringList; import com.google.gson.Gson; import com.xiaoleilu.loServer.RestResult; @@ -36,16 +38,10 @@ public class AliasPutAction extends AdminAction { @Override public boolean action(Request request, Response response) { if (request.getNettyRequest() instanceof FullHttpRequest) { - InputGetFriendList inputGetFriendList = getRequestBody(request.getNettyRequest(), InputGetFriendList.class); - List dataList = messagesStore.getFriendList(inputGetFriendList.getUserId(), null, 0); - List list = new ArrayList<>(); - for (FriendData data : dataList) { - if (data.getState() == inputGetFriendList.getStatus()) { - list.add(data.getFriendUid()); - } - } + InputUpdateAlias input = getRequestBody(request.getNettyRequest(), InputUpdateAlias.class); + ErrorCode errorCode = messagesStore.setFriendAliasRequest(input.getOperator(), input.getTargetId(), input.getAlias(), new long[1]); response.setStatus(HttpResponseStatus.OK); - RestResult result = RestResult.ok(new OutputStringList(list)); + RestResult result = RestResult.resultOf(errorCode); response.setContent(new Gson().toJson(result)); } return true; diff --git a/broker/src/main/java/io/moquette/server/netty/NettyMQTTHandler.java b/broker/src/main/java/io/moquette/server/netty/NettyMQTTHandler.java index 845634eb..f432dde3 100644 --- a/broker/src/main/java/io/moquette/server/netty/NettyMQTTHandler.java +++ b/broker/src/main/java/io/moquette/server/netty/NettyMQTTHandler.java @@ -103,7 +103,7 @@ public class NettyMQTTHandler extends ChannelInboundHandlerAdapter { String clientID = NettyUtils.clientID(ctx.channel()); if (clientID != null && !clientID.isEmpty()) { LOG.info("Notifying connection lost event. MqttClientId = {}.", clientID); - m_processor.processConnectionLost(clientID, ctx.channel()); + m_processor.processConnectionLost(clientID, ctx.channel(), false); } ctx.close(); } diff --git a/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java b/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java index f71858eb..6066a362 100755 --- a/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java +++ b/broker/src/main/java/io/moquette/spi/impl/ProtocolProcessor.java @@ -248,24 +248,36 @@ public class ProtocolProcessor { MemorySessionStore.Session session = m_sessionsStore.getSession(clientId); if(session != null) { session.refreshLastActiveTime(); + forwardOnlineStatusEvent(payload.userName(), clientId, session.getPlatform(), UserOnlineStatus.ONLINE); + } else { + forwardOnlineStatusEvent(payload.userName(), clientId, ProtoConstants.Platform.Platform_UNSET, UserOnlineStatus.ONLINE); } LOG.info("The CONNECT message has been processed. CId={}, username={}", clientId, payload.userName()); } private static class UserOnlineStatus { + public static final int ONLINE = 0; + public static final int OFFLINE = 1; + public static final int LOGOUT = -1; public String userId; - public int status; //0 offline; 1 online; -1 logout + public String clientId; + public int platform; + public int status; + public long timestamp; - public UserOnlineStatus(String userId, int status) { + public UserOnlineStatus(String userId, String clientId, int platform, int status) { this.userId = userId; + this.clientId = clientId; + this.platform = platform; this.status = status; + this.timestamp = System.currentTimeMillis(); } } - public void forwardOnlineStatusEvent(String userId, int status) { + public void forwardOnlineStatusEvent(String userId, String clientId, int platform, int status) { if (!StringUtil.isNullOrEmpty(mUserOnlineStatusCallback)) { - executorCallback.execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, status)))); + executorCallback.execute(() -> HttpUtils.httpJsonPost(mUserOnlineStatusCallback, new Gson().toJson(new UserOnlineStatus(userId, clientId, platform, status)))); } } @@ -526,7 +538,7 @@ public class ProtocolProcessor { } if (!clearSession) { - processConnectionLost(clientID, channel); + processConnectionLost(clientID, channel, clearSession); return; } @@ -567,9 +579,16 @@ public class ProtocolProcessor { LOG.info("The DISCONNECT message has been processed. CId={}", clientID); + String username = NettyUtils.userName(channel); + MemorySessionStore.Session session = m_sessionsStore.getSession(clientID); + if(session != null) { + forwardOnlineStatusEvent(username, clientID, session.getPlatform(), UserOnlineStatus.LOGOUT); + } + channel.closeFuture(); //disconnect the session + m_sessionsStore.sessionForClient(clientID).disconnect(clearSession); } @@ -600,17 +619,21 @@ public class ProtocolProcessor { return true; } - public void processConnectionLost(String clientID, Channel channel) { + public void processConnectionLost(String clientID, Channel channel, boolean clearSession) { LOG.info("Processing connection lost event. CId={}", clientID); + + String username = NettyUtils.userName(channel); + MemorySessionStore.Session session = m_sessionsStore.getSession(clientID); + if(session != null) { + session.refreshLastActiveTime(); + forwardOnlineStatusEvent(username, clientID, session.getPlatform(), clearSession ? UserOnlineStatus.LOGOUT : UserOnlineStatus.OFFLINE); + } + ConnectionDescriptor oldConnDescr = new ConnectionDescriptor(clientID, channel); if(connectionDescriptors.removeConnection(oldConnDescr)) { - MemorySessionStore.Session session = m_sessionsStore.getSession(clientID); - if(session != null) { - session.refreshLastActiveTime(); - } - String username = NettyUtils.userName(channel); m_interceptor.notifyClientConnectionLost(clientID, username); } + } /** diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputGetAlias.java b/common/src/main/java/cn/wildfirechat/pojos/InputGetAlias.java new file mode 100755 index 00000000..6d1ceb3a --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputGetAlias.java @@ -0,0 +1,31 @@ +/* + * 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 InputGetAlias { + private String operator; + private String targetId; + + 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; + } +} diff --git a/common/src/main/java/cn/wildfirechat/pojos/InputUpdateAlias.java b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateAlias.java new file mode 100755 index 00000000..00c71494 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/InputUpdateAlias.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 InputUpdateAlias { + private String operator; + private String targetId; + private String alias; + + 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 getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } +} diff --git a/common/src/main/java/cn/wildfirechat/pojos/OutputGetAlias.java b/common/src/main/java/cn/wildfirechat/pojos/OutputGetAlias.java new file mode 100755 index 00000000..9d1444d2 --- /dev/null +++ b/common/src/main/java/cn/wildfirechat/pojos/OutputGetAlias.java @@ -0,0 +1,48 @@ +/* + * 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 OutputGetAlias { + private String operator; + private String targetId; + private String alias; + + public OutputGetAlias() { + } + + public OutputGetAlias(String operator, String targetId) { + this.operator = operator; + this.targetId = targetId; + } + + 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 getAlias() { + return alias; + } + + public void setAlias(String alias) { + this.alias = alias; + } +} diff --git a/distribution/src/main/resources/wildfirechat.conf b/distribution/src/main/resources/wildfirechat.conf index eefd00b6..9d10820b 100755 --- a/distribution/src/main/resources/wildfirechat.conf +++ b/distribution/src/main/resources/wildfirechat.conf @@ -122,6 +122,14 @@ push.android.server.address http://localhost:8085/android/push ##苹果推送服务器地址 push.ios.server.address http://localhost:8085/ios/push + +#********************************************************************* +# User online status event callback +#********************************************************************* +##用户在线状态事件回调地址 +user.online_status_callback http://localhost:8888/user/online_event + + #********************************************************************* # MongoDB configuration #********************************************************************* diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java index b5bc6f24..2b76939b 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/FriendAdmin.java @@ -6,21 +6,37 @@ 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 { + public static IMResult updateFriendStatus(String operator, String targetId, int status) throws Exception { String path = APIPath.Friend_Update_Status; InputFriendRequest input = new InputFriendRequest(); - input.setUserId(userId); + input.setUserId(operator); input.setFriendUid(targetId); input.setStatus(status); return AdminHttpUtils.httpJsonPost(path, input, Void.class); } - public static IMResult getFriendStatusList(String userId, int status) throws Exception { + public static IMResult getFriendStatusList(String operator, int status) throws Exception { String path = APIPath.Friend_Get_List; InputGetFriendList input = new InputGetFriendList(); - input.setUserId(userId); + input.setUserId(operator); input.setStatus(status); return AdminHttpUtils.httpJsonPost(path, input, OutputStringList.class); } + public static IMResult updateFriendAlias(String operator, String targetId, String alias) throws Exception { + String path = APIPath.Friend_Set_Alias; + InputUpdateAlias input = new InputUpdateAlias(); + input.setOperator(operator); + input.setTargetId(targetId); + input.setAlias(alias); + return AdminHttpUtils.httpJsonPost(path, input, Void.class); + } + + public static IMResult getFriendAlias(String operator, String targetId) throws Exception { + String path = APIPath.Friend_Get_Alias; + InputGetAlias input = new InputGetAlias(); + input.setOperator(operator); + input.setTargetId(targetId); + return AdminHttpUtils.httpJsonPost(path, input, OutputGetAlias.class); + } } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index 9ee7c525..7e09fa19 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -437,6 +437,23 @@ public class Main { System.exit(-1); } + String alias = "hello" + System.currentTimeMillis(); + IMResult updateFriendAlias = FriendAdmin.updateFriendAlias("ff1", "ff2", alias); + if (updateFriendAlias != null && updateFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("update friend status success"); + } else { + System.out.println("update friend status failure"); + System.exit(-1); + } + + IMResult getFriendAlias = FriendAdmin.getFriendAlias("ff1", "ff2"); + if (getFriendAlias != null && getFriendAlias.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS && getFriendAlias.getResult().getAlias().equals(alias)) { + System.out.println("update friend status success"); + } else { + System.out.println("update friend status failure"); + System.exit(-1); + } + //初始化机器人API RobotHttpUtils.init("http://localhost", "robot1", "123456");