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 23ea382c..b0f6f8f7 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 @@ -9,6 +9,10 @@ package com.xiaoleilu.loServer.action.admin; import cn.wildfirechat.common.APIPath; +import cn.wildfirechat.pojos.BroadMessageResult; +import cn.wildfirechat.pojos.OutputCheckUserOnline; +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; @@ -16,10 +20,15 @@ import com.xiaoleilu.loServer.handler.Response; import cn.wildfirechat.pojos.InputGetUserInfo; import io.moquette.persistence.RPCCenter; import io.moquette.persistence.TargetEntry; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpResponseStatus; import io.netty.util.internal.StringUtil; import cn.wildfirechat.common.ErrorCode; +import java.util.concurrent.Executor; + @Route(APIPath.User_Get_Online_Status) @HttpMethod("POST") public class CheckUserOnlineAction extends AdminAction { @@ -34,12 +43,34 @@ public class CheckUserOnlineAction extends AdminAction { if (request.getNettyRequest() instanceof FullHttpRequest) { InputGetUserInfo inputUserId = getRequestBody(request.getNettyRequest(), InputGetUserInfo.class); if (inputUserId == null || !StringUtil.isNullOrEmpty(inputUserId.getUserId())) { - RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, null, true); - return true; + RPCCenter.getInstance().sendRequest(null, null, RPCCenter.CHECK_USER_ONLINE_REQUEST, inputUserId.getUserId().getBytes(), inputUserId.getUserId(), TargetEntry.Type.TARGET_TYPE_USER, new RPCCenter.Callback() { + @Override + public void onSuccess(byte[] res) { + OutputCheckUserOnline out = new Gson().fromJson(new String(res), OutputCheckUserOnline.class); + sendResponse(response, null, out); + } + + @Override + public void onError(ErrorCode errorCode) { + sendResponse(response, errorCode, null); + } + + @Override + public void onTimeout() { + sendResponse(response, ErrorCode.ERROR_CODE_TIMEOUT, null); + } + + @Override + public Executor getResponseExecutor() { + return command -> { + ctx.executor().execute(command); + }; + } + }, true); + return false; } else { sendResponse(response, ErrorCode.INVALID_PARAMETER, null); } - } return true; } diff --git a/broker/src/main/java/io/moquette/spi/impl/Qos1PublishHandler.java b/broker/src/main/java/io/moquette/spi/impl/Qos1PublishHandler.java index 9c55965b..d4d72934 100755 --- a/broker/src/main/java/io/moquette/spi/impl/Qos1PublishHandler.java +++ b/broker/src/main/java/io/moquette/spi/impl/Qos1PublishHandler.java @@ -128,23 +128,25 @@ public class Qos1PublishHandler extends QosPublishHandler { String userId = new String(payloadContent); int status; - ClientSession clientSession = m_sessionStore.sessionForClient(userId); - if (clientSession == null) { - status = 2; - } else { - ConnectionDescriptor descriptor = connectionDescriptors.getConnection(clientSession.clientID); + Collection useSessions = m_sessionStore.sessionForUser(userId); + OutputCheckUserOnline out = new OutputCheckUserOnline(); + + for (MemorySessionStore.Session session : useSessions) { + if (session.getDeleted() > 0) { + continue; + } + + ConnectionDescriptor descriptor = connectionDescriptors.getConnection(session.getClientID()); if (descriptor == null) { status = 1; } else { status = 0; } + + out.addSession(userId, session.getClientID(), session.getPlatform(), status, session.getLastActiveTime()); } - OutputCheckUserOnline out = new OutputCheckUserOnline(); - out.setStatus(status); - RestResult result = RestResult.ok(out); - - callback.onRouteHandled(new Gson().toJson(result).getBytes()); + callback.onRouteHandled(new Gson().toJson(out).getBytes()); }); } diff --git a/common/src/main/java/cn/wildfirechat/pojos/OutputCheckUserOnline.java b/common/src/main/java/cn/wildfirechat/pojos/OutputCheckUserOnline.java index b8ca2524..b93ed2dc 100644 --- a/common/src/main/java/cn/wildfirechat/pojos/OutputCheckUserOnline.java +++ b/common/src/main/java/cn/wildfirechat/pojos/OutputCheckUserOnline.java @@ -8,14 +8,39 @@ package cn.wildfirechat.pojos; -public class OutputCheckUserOnline { - private int status; //0 online, 1 have session offline, 2 no session +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; - public int getStatus() { - return status; +public class OutputCheckUserOnline { + public static class Session { + public String clientId; + public String userId; + public int platform; + public int status; //0 online, 1 have session offline + public long lastSeen; + + public Session(String clientId, String userId, int platform, int status, long lastSeen) { + this.clientId = clientId; + this.userId = userId; + this.platform = platform; + this.status = status; + this.lastSeen = lastSeen; + } } - public void setStatus(int status) { - this.status = status; + public void addSession(String userId, String clientId, int platform, int status, long lastSeen) { + Session session = new Session(clientId, userId, platform, status, lastSeen); + sessions.add(session); + } + + private List sessions = new ArrayList<>(); + + public List getSessions() { + return sessions; + } + + public void setSessions(List sessions) { + this.sessions = sessions; } } diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java index b8b632fe..3d34e417 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/Main.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/Main.java @@ -190,6 +190,14 @@ public class Main { System.exit(-1); } + IMResult outputCheckUserOnline = UserAdmin.checkUserOnlineStatus(userInfo.getUserId()); + if (outputCheckUserOnline != null && outputCheckUserOnline.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { + System.out.println("check user online status success:" + outputCheckUserOnline.getResult().getSessions().size()); + } else { + System.out.println("block user online failure"); + System.exit(-1); + } + //慎用,这个方法可能功能不完全,如果用户不在需要,建议使用block功能屏蔽用户 IMResult voidIMResult = UserAdmin.destroyUser("user11"); if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) { diff --git a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java index c55ac156..4012ec5b 100644 --- a/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java +++ b/sdk/src/main/java/cn/wildfirechat/sdk/UserAdmin.java @@ -58,6 +58,12 @@ public class UserAdmin { return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class); } + public static IMResult checkUserOnlineStatus(String userId) throws Exception { + String path = APIPath.User_Get_Online_Status; + InputGetUserInfo getUserInfo = new InputGetUserInfo(userId, null, null); + return AdminHttpUtils.httpJsonPost(path, getUserInfo, OutputCheckUserOnline.class); + } + public static IMResult destroyUser(String userId) throws Exception { String path = APIPath.Destroy_User; InputDestroyUser inputDestroyUser = new InputDestroyUser();