feat: add PlayroomWebSocketHandler
All checks were successful
dev middleware install / deploy (push) Successful in 52s

This commit is contained in:
2026-04-04 17:41:28 +08:00
parent 9f22f33a9a
commit c58ad923c5
14 changed files with 208 additions and 6 deletions

View File

@@ -14,7 +14,9 @@ import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import xin.merlin.myplayerbackend.config.RabbitMQConfig;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Set;
@Slf4j
@Component
@@ -32,7 +34,7 @@ public class PlayroomWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
Integer userId = (Integer) session.getAttributes().get("id");
String payload = "{\"cmd\": \"PING\", \"to\": "+ userId +", \"time\":\""+ LocalDateTime.now() +"\"}";
String payload = "{\"cmd\": \"PING\", \"to\": "+ userId +", \"time\":\""+ LocalDateTime.now() +"\", \"playroom\":"+ session.getAttributes().get("r_id")+ "}";
sessionManager.addSession(userId, session);
rabbitTemplate.convertAndSend(RabbitMQConfig.WS_VIDEO_QUEUE,payload);
}
@@ -42,18 +44,53 @@ public class PlayroomWebSocketHandler extends TextWebSocketHandler {
JSONObject payload = JSONObject.parseObject(message.getPayload());
Integer userId = (Integer) session.getAttributes().get("id");
if(payload.get("cmd").equals("PONG")) {
if(Boolean.TRUE.equals(redis.opsForSet().isMember(IN_ROOM_BASE_KEY + session.getAttributes().get("r_id") + ":", String.valueOf(userId)))){
if(Boolean.TRUE.equals(redis.opsForSet().isMember(IN_ROOM_BASE_KEY + session.getAttributes().get("r_id"), String.valueOf(userId)))){
return;
}
redis.opsForSet().add(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", String.valueOf(userId));
redis.opsForSet().add(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"), String.valueOf(userId));
}
if (payload.get("cmd").equals("VIDEO_SYNC")){
String url = payload.getString("url");
String timestamp = payload.getString("timestamp");
// Integer playroom = (Integer) session.getAttributes().get("r_id");
String sending = "{\"cmd\": \"VIDEO_SYNC\", \"from\": "+
userId
+", \"time\":\""+
LocalDateTime.now()
+"\", \"url\":\""+
url
+"\", \"timestamp\":\""+
timestamp
+"\", \"playroom\":"+
session.getAttributes().get("r_id")
+"}";
Set<String> members = redis.opsForSet().members(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"));
try {
for (String member : members) {
sessionManager.sendToUser(Integer.valueOf(member),sending);
}
} catch (IOException | NumberFormatException e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
if(payload.get("cmd").equals("VIDEO_PLAY") || payload.get("cmd").equals("VIDEO_PAUSE")){
Set<String> members = redis.opsForSet().members(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"));
try {
for (String member : members) {
sessionManager.sendToUser(Integer.valueOf(member),message.getPayload());
}
} catch (IOException | NumberFormatException e) {
log.error(e.getMessage());
throw new RuntimeException(e);
}
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
Integer userId = (Integer) session.getAttributes().get("id");
redis.opsForSet().remove(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id")+":", userId.toString());
redis.opsForSet().remove(IN_ROOM_BASE_KEY+session.getAttributes().get("r_id"), userId.toString());
sessionManager.removeSession(userId);
}