获取用户状态接口

This commit is contained in:
heavyrain.lee
2020-03-25 10:25:18 +08:00
parent 310b2e1016
commit 2f554bd046
5 changed files with 91 additions and 19 deletions
@@ -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;
}
@@ -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<MemorySessionStore.Session> 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());
});
}
@@ -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<Session> sessions = new ArrayList<>();
public List<Session> getSessions() {
return sessions;
}
public void setSessions(List<Session> sessions) {
this.sessions = sessions;
}
}
@@ -190,6 +190,14 @@ public class Main {
System.exit(-1);
}
IMResult<OutputCheckUserOnline> 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<Void> voidIMResult = UserAdmin.destroyUser("user11");
if (voidIMResult != null && voidIMResult.getErrorCode() == ErrorCode.ERROR_CODE_SUCCESS) {
@@ -58,6 +58,12 @@ public class UserAdmin {
return AdminHttpUtils.httpJsonPost(path, null, OutputUserBlockStatusList.class);
}
public static IMResult<OutputCheckUserOnline> 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<Void> destroyUser(String userId) throws Exception {
String path = APIPath.Destroy_User;
InputDestroyUser inputDestroyUser = new InputDestroyUser();