mxd 3 жил өмнө
parent
commit
0cb0944c65

+ 6 - 3
magic-api/src/main/java/org/ssssssss/magicapi/config/MessageType.java

@@ -31,8 +31,11 @@ public enum MessageType {
 	RESUME_BREAKPOINT,
 	RESUME_BREAKPOINT,
 	/* 登录 */
 	/* 登录 */
 	LOGIN,
 	LOGIN,
-	/* 获取当前在线用户 */
-	GET_ONLINE,
 	/* 设置当前所在文件 */
 	/* 设置当前所在文件 */
-	SET_FILE_ID
+	SET_FILE_ID,
+
+	/* S <-> S -> C message*/
+	/* 获取当前在线用户 */
+	SEND_ONLINE
+
 }
 }

+ 11 - 4
magic-api/src/main/java/org/ssssssss/magicapi/config/WebSocketSessionManager.java

@@ -65,7 +65,7 @@ public class WebSocketSessionManager {
 
 
 	private static void sendToAll(String content) {
 	private static void sendToAll(String content) {
 		SESSIONS.values().stream().filter(MagicConsoleSession::writeable).forEach(session -> sendBySession(session, content));
 		SESSIONS.values().stream().filter(MagicConsoleSession::writeable).forEach(session -> sendBySession(session, content));
-		sendToMachine(null, content);
+		sendToMachineByClientId(null, content);
 	}
 	}
 
 
 	public static void sendLogs(String sessionId, String message) {
 	public static void sendLogs(String sessionId, String message) {
@@ -102,7 +102,7 @@ public class WebSocketSessionManager {
 		if (session != null && session.writeable()) {
 		if (session != null && session.writeable()) {
 			sendBySession(session, content);
 			sendBySession(session, content);
 		} else {
 		} else {
-			sendToMachine(clientId, content);
+			sendToMachineByClientId(clientId, content);
 		}
 		}
 	}
 	}
 
 
@@ -112,16 +112,23 @@ public class WebSocketSessionManager {
 				.filter(MagicConsoleSession::writeable)
 				.filter(MagicConsoleSession::writeable)
 				.filter(it -> !it.getClientId().equals(excludeClientId))
 				.filter(it -> !it.getClientId().equals(excludeClientId))
 				.forEach(session -> sendBySession(session, content));
 				.forEach(session -> sendBySession(session, content));
-		sendToMachine(null, content);
+		sendToMachineByClientId(null, content);
 	}
 	}
 
 
-	private static void sendToMachine(String clientId, String content) {
+	public static void sendToMachineByClientId(String clientId, String content) {
 		if (magicNotifyService != null) {
 		if (magicNotifyService != null) {
 			// 通知其他机器去发送消息
 			// 通知其他机器去发送消息
 			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_S_C, clientId, content));
 			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_S_C, clientId, content));
 		}
 		}
 	}
 	}
 
 
+	public static void sendToMachine(MessageType messageType, Object ... args) {
+		if (magicNotifyService != null) {
+			// 通知其他机器去发送消息
+			magicNotifyService.sendNotify(new MagicNotify(instanceId, EventAction.WS_S_S, null, buildMessage(messageType, args)));
+		}
+	}
+
 	public static String buildMessage(MessageType messageType, Object... values) {
 	public static String buildMessage(MessageType messageType, Object... values) {
 		StringBuilder builder = new StringBuilder(messageType.name().toLowerCase());
 		StringBuilder builder = new StringBuilder(messageType.name().toLowerCase());
 		if (values != null) {
 		if (values != null) {

+ 5 - 2
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWebSocketDispatcher.java

@@ -91,12 +91,15 @@ public class MagicWebSocketDispatcher extends TextWebSocketHandler {
 		return null;
 		return null;
 	}
 	}
 
 
-	public static void processMessageReceived(String sessionId, String payload) {
-		MagicConsoleSession session = WebSocketSessionManager.findSession(sessionId);
+	public static void processMessageReceived(String clientId, String payload) {
+		MagicConsoleSession session = WebSocketSessionManager.findSession(clientId);
 		if (session != null) {
 		if (session != null) {
 			findHandleAndInvoke(session, payload);
 			findHandleAndInvoke(session, payload);
 		}
 		}
 	}
 	}
+	public static void processWebSocketEventMessage(String payload) {
+		findHandleAndInvoke(null, payload);
+	}
 
 
 	@Override
 	@Override
 	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
 	public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {

+ 16 - 9
magic-api/src/main/java/org/ssssssss/magicapi/controller/MagicWorkbenchHandler.java

@@ -41,6 +41,11 @@ public class MagicWorkbenchHandler {
 				session.setClientId(clientId);
 				session.setClientId(clientId);
 				WebSocketSessionManager.add(session);
 				WebSocketSessionManager.add(session);
 				WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.LOGIN_RESPONSE, "1", session.getAttributes()));
 				WebSocketSessionManager.sendBySession(session, WebSocketSessionManager.buildMessage(MessageType.LOGIN_RESPONSE, "1", session.getAttributes()));
+				List<Map<String, Object>> messages = getOnlineUsers();
+				if(!messages.isEmpty()){
+					WebSocketSessionManager.sendByClientId(session.getClientId(), WebSocketSessionManager.buildMessage(MessageType.ONLINE_USERS, messages));
+				}
+				WebSocketSessionManager.sendToMachine(MessageType.SEND_ONLINE, session.getClientId());
 				WebSocketSessionManager.sendToOther(session.getClientId(), MessageType.USER_LOGIN, session.getAttributes());
 				WebSocketSessionManager.sendToOther(session.getClientId(), MessageType.USER_LOGIN, session.getAttributes());
 			}
 			}
 		} catch (MagicLoginException ignored) {
 		} catch (MagicLoginException ignored) {
@@ -48,15 +53,17 @@ public class MagicWorkbenchHandler {
 		}
 		}
 	}
 	}
 
 
-	@Message(MessageType.GET_ONLINE)
-	public boolean getOnline(MagicConsoleSession session) {
-		List<MagicConsoleSession> sessions = WebSocketSessionManager.getSessions();
-		if(sessions.size() > 0){
-			List<Map<String, Object>> messages = sessions.stream()
-					.map(MagicConsoleSession::getAttributes)
-					.collect(Collectors.toList());
-			WebSocketSessionManager.sendByClientId(session.getClientId(), WebSocketSessionManager.buildMessage(MessageType.ONLINE_USERS, messages));
+	@Message(MessageType.SEND_ONLINE)
+	public void sendOnline(String clientId){
+		List<Map<String, Object>> messages = getOnlineUsers();
+		if(!messages.isEmpty()){
+			WebSocketSessionManager.sendToMachineByClientId(clientId, WebSocketSessionManager.buildMessage(MessageType.ONLINE_USERS, messages));
 		}
 		}
-		return false;
+	}
+
+	private List<Map<String, Object>> getOnlineUsers(){
+		return WebSocketSessionManager.getSessions().stream()
+				.map(MagicConsoleSession::getAttributes)
+				.collect(Collectors.toList());
 	}
 	}
 }
 }

+ 1 - 1
magic-api/src/main/java/org/ssssssss/magicapi/event/EventAction.java

@@ -2,5 +2,5 @@ package org.ssssssss.magicapi.event;
 
 
 public enum EventAction {
 public enum EventAction {
 
 
-	CREATE, SAVE, DELETE, MOVE, LOAD, WS_C_S, WS_S_C, RELOAD, CLEAR
+	CREATE, SAVE, DELETE, MOVE, LOAD, WS_C_S, WS_S_C, RELOAD, CLEAR, WS_S_S
 }
 }

+ 6 - 0
magic-api/src/main/java/org/ssssssss/magicapi/provider/impl/DefaultMagicAPIService.java

@@ -188,6 +188,8 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 				return processWebSocketMessageReceived(magicNotify.getClientId(), magicNotify.getContent());
 				return processWebSocketMessageReceived(magicNotify.getClientId(), magicNotify.getContent());
 			case WS_S_C:
 			case WS_S_C:
 				return processWebSocketSendMessage(magicNotify.getClientId(), magicNotify.getContent());
 				return processWebSocketSendMessage(magicNotify.getClientId(), magicNotify.getContent());
+			case WS_S_S:
+				return processWebSocketEventMessage(magicNotify.getContent());
 			case CLEAR:
 			case CLEAR:
 				publisher.publishEvent(new MagicEvent("clear", EventAction.CLEAR, Constants.EVENT_SOURCE_NOTIFY));
 				publisher.publishEvent(new MagicEvent("clear", EventAction.CLEAR, Constants.EVENT_SOURCE_NOTIFY));
 		}
 		}
@@ -213,4 +215,8 @@ public class DefaultMagicAPIService implements MagicAPIService, JsonCodeConstant
 		MagicWebSocketDispatcher.processMessageReceived(clientId, content);
 		MagicWebSocketDispatcher.processMessageReceived(clientId, content);
 		return true;
 		return true;
 	}
 	}
+	private boolean processWebSocketEventMessage(String content) {
+		MagicWebSocketDispatcher.processWebSocketEventMessage(content);
+		return true;
+	}
 }
 }